mirror of
https://github.com/JezuzLizard/T4SP-Server-Plugin.git
synced 2025-10-12 09:19:03 +00:00
Compare commits
4 Commits
thar-be-vm
...
main
Author | SHA1 | Date | |
---|---|---|---|
|
25f827da0d | ||
|
afbbdd2d11 | ||
|
d417f41992 | ||
|
812a7424fe |
7
.github/dependabot.yml
vendored
7
.github/dependabot.yml
vendored
@@ -1,7 +0,0 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: gitsubmodule
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: daily
|
||||
open-pull-requests-limit: 10
|
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@@ -53,7 +53,7 @@ jobs:
|
||||
run: msbuild /m /v:minimal /p:Configuration=${{matrix.configuration}} /p:PlatformTarget=x86 build/t4sp-server-plugin.sln
|
||||
|
||||
- name: Upload ${{matrix.configuration}} binaries
|
||||
uses: actions/upload-artifact@v3.1.0
|
||||
uses: actions/upload-artifact@v4.6.2
|
||||
with:
|
||||
name: ${{matrix.configuration}} binaries
|
||||
path: |
|
||||
@@ -71,7 +71,7 @@ jobs:
|
||||
uses: actions/checkout@v3.5.3
|
||||
|
||||
- name: Download Binaries
|
||||
uses: actions/download-artifact@v3.0.2
|
||||
uses: actions/download-artifact@v4.3.0
|
||||
with:
|
||||
name: Release binaries
|
||||
|
||||
|
103
README.md
103
README.md
@@ -1,5 +1,5 @@
|
||||
# T4SP-Server-Plugin
|
||||
A plugin that has code that hopefully compiles and the game will load it to do things. Stability not guaranteed.
|
||||
A plugin that has no code that hopefully compiles and the game will load it to do nothing. Stability not guaranteed.
|
||||
|
||||
Requires Git (https://git-scm.com/), Premake5 (https://premake.github.io/), and MSVC 2022 (https://visualstudio.microsoft.com/vs/features/cplusplus/) to build.
|
||||
|
||||
@@ -8,107 +8,8 @@ Move the `t4sp-server-plugin.dll` to `%LOCALAPPDATA%\Plutonium\plugins\`, the pl
|
||||
|
||||
# Features
|
||||
|
||||
Detours and reimplements the entire GSC VM + compiler.
|
||||
Nothing.
|
||||
|
||||
Adds custom GSC functions.
|
||||
|
||||
## FileIO
|
||||
This plugin provides FileIO interface to GSC for reading and writing files, this is exact to [CoD4x's](https://github.com/callofduty4x/CoD4x_Server/blob/master/scriptdocumentation/script_functions_reference.md#file-operations) interface.
|
||||
|
||||
However, all reads and writes will take place strictly and only in the `scriptdata` folder, no up directory traversal allowed.
|
||||
|
||||
All files will be closed upon GSC restart (map_restart or fast_restart or missionfailed, etc), only a maximum of 10 files may be opened at once.
|
||||
|
||||
* `<bool> FS_TestFile(<filename string>)` Returns `true` if the file exists, `false` otherwise.
|
||||
* `<bool> FS_Remove(<filename string>, <(optional) use_global bool>)` Deletes the file, return `true` if successful, `false` otherwise. `use_global` will use non mod specific folder.
|
||||
```gsc
|
||||
// test to see if "scriptdata/test.txt" file exists
|
||||
if (FS_TestFile("test.txt")) // not a typo, all file io will take place inside the "scriptdata" folder
|
||||
{
|
||||
PrintConsole("Found test.txt!");
|
||||
|
||||
// delete it!
|
||||
if (FS_Remove("test.txt"))
|
||||
{
|
||||
PrintConsole("test.txt was deleted!");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
* `FS_FCloseAll()` Closes every full file.
|
||||
```gsc
|
||||
// open some files
|
||||
|
||||
FS_FCloseAll(); // close them all
|
||||
```
|
||||
|
||||
* `<int> FS_FOpen(<filename string>, <mode string>, <(optional) use_global bool>)` Tries to open the file, mode must be one of `read`, `write` (clears the file), `append` (appends to the file), returns the filehandle. Will return `0` if failed to open. `use_global` will use non mod specific folder (only applies to `write` mode).
|
||||
* `FS_FClose(<filehandle int>)` Closes the file pointed by the filehandle given, which was returned from `FS_FOpen`.
|
||||
```gsc
|
||||
// opens "scriptdata/test.txt", all io will take place inside the "scriptdata" folder
|
||||
f = FS_FOpen("test.txt", "read"); // can be "read" "write", or "append"
|
||||
|
||||
if (!f)
|
||||
{
|
||||
PrintConsole("test.txt failed to be opened for reading!");
|
||||
}
|
||||
else
|
||||
{
|
||||
// do stuff with the file
|
||||
|
||||
FS_FClose(f); // make sure to close it
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
* `<string> FS_ReadLine(<filehandle int>)` Reads a line from the file pointed by the filehandle, removes the newline char. Returns `undefined` when nothing is left to read. Will not read more than 65536 characters at once. Filehandle must be opened for reading.
|
||||
* `<string> FS_Read(<filehandle int>, <bytes int>(optional))` Reads number of bytes from the file. If bytes is `undefined`, reads the entire file. No more than 65536 characters will be read at once. Returns `undefined` if there are nothing left to read.
|
||||
```gsc
|
||||
// open the file for reading
|
||||
|
||||
line = FS_ReadLine(f);
|
||||
while (isDefined(line))
|
||||
{
|
||||
// do something with line
|
||||
|
||||
line = FS_ReadLine(f);
|
||||
}
|
||||
|
||||
// entire file is read
|
||||
|
||||
// close the file
|
||||
```
|
||||
|
||||
* `<bool> FS_WriteLine(<filehandle int>, <contents string>)` Writes to the file pointed by the filehandle. Appends a newline character. Returns `true` if successful, `false` otherwise. Filehandle must be opened for writing.
|
||||
* `<bool> FS_Write(<filehandle int>, <contents string>)` Same as above, does not add a newline character.
|
||||
```gsc
|
||||
// open the file for writing
|
||||
|
||||
FS_WriteLine(f, "writing some text with newline added");
|
||||
|
||||
FS_Write(f, "no newline here");
|
||||
FS_Write(f, "i manually add a newline\n");
|
||||
|
||||
// close the file
|
||||
```
|
||||
|
||||
* `<array of strings> FS_ListFiles(<folder string>)` Returns a list of files inside of the folder given.
|
||||
```gsc
|
||||
folder = "testfolder/";
|
||||
files = FS_ListFiles(folder);
|
||||
|
||||
for (i = 0; i < files.size; i++)
|
||||
{
|
||||
filename = files[i];
|
||||
|
||||
// do something with the filename
|
||||
filepath = folder + filename;
|
||||
}
|
||||
```
|
||||
|
||||
* `<int> FS_Length(<filehandle int>)` Returns the length in bytes of the open'd file.
|
||||
* `<int> FS_GetSeek(<filehandle int>)` Returns the seek of the open'd file (only for reading).
|
||||
* `<int> FS_Seek(<filehandle int>, <seek int>)` Sets the seek of the open'd file (only for reading).
|
||||
|
||||
# Credits
|
||||
- momo5502 (https://github.com/momo5502)
|
||||
|
@@ -1,2 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "clientscript_public.hpp"
|
@@ -1,13 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "cscr_compiler.hpp"
|
||||
#include "cscr_main.hpp"
|
||||
#include "cscr_memorytree.hpp"
|
||||
#include "cscr_parser.hpp"
|
||||
#include "cscr_parsetree.hpp"
|
||||
#include "cscr_readwrite.hpp"
|
||||
#include "cscr_stringlist.hpp"
|
||||
#include "cscr_tempmemory.hpp"
|
||||
#include "cscr_variable.hpp"
|
||||
#include "cscr_vm.hpp"
|
||||
#include "cscr_yacc.hpp"
|
File diff suppressed because it is too large
Load Diff
@@ -1,202 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
void RemoveRefToValue(game::scriptInstance_t inst, game::VariableValue* value);
|
||||
void Scr_CompileRemoveRefToString(game::scriptInstance_t inst, unsigned int stringVal);
|
||||
void EmitCanonicalString(game::scriptInstance_t inst, unsigned int stringVal);
|
||||
void CompileTransferRefToString(unsigned int stringValue, game::scriptInstance_t inst, unsigned int user);
|
||||
void EmitOpcode(game::scriptInstance_t inst, game::OpcodeVM op, int offset, int callType);
|
||||
void EmitEnd(game::scriptInstance_t inst);
|
||||
void EmitReturn(game::scriptInstance_t inst);
|
||||
void EmitCodepos(game::scriptInstance_t inst, int codepos);
|
||||
void EmitShort(game::scriptInstance_t inst, int value);
|
||||
void EmitByte(game::scriptInstance_t inst, int value);
|
||||
void EmitGetInteger(game::scriptInstance_t inst, int value, game::sval_u sourcePos);
|
||||
void EmitGetFloat(game::scriptInstance_t inst, float value, game::sval_u sourcePos);
|
||||
void EmitAnimTree(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
int Scr_FindLocalVarIndex(game::scriptInstance_t inst, unsigned int name, game::sval_u sourcePos, int create, game::scr_block_s* block);
|
||||
void EmitCreateLocalVars(game::scriptInstance_t inst, game::scr_block_s* block);
|
||||
void EmitRemoveLocalVars(game::scriptInstance_t inst, game::scr_block_s* outerBlock, game::scr_block_s* block);
|
||||
void EmitNOP2(game::scr_block_s* block, game::scriptInstance_t inst, int lastStatement, unsigned int endSourcePos);
|
||||
void Scr_InitFromChildBlocks(game::scr_block_s** childBlocks, int childCount, game::scr_block_s* block);
|
||||
void Scr_AppendChildBlocks(game::scr_block_s* block, game::scr_block_s** childBlocks, int childCount);
|
||||
void Scr_MergeChildBlocks(game::scr_block_s** childBlocks, int childCount, game::scr_block_s* block);
|
||||
void Scr_TransferBlock(game::scr_block_s* to, game::scr_block_s* from);
|
||||
void EmitSafeSetVariableField(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos);
|
||||
void EmitSafeSetWaittillVariableField(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos);
|
||||
void EmitGetString(unsigned int value, game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitGetIString(unsigned int value, game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitGetVector(const float* value, game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitValue(game::scriptInstance_t inst, game::VariableCompileValue* constValue);
|
||||
void Scr_PushValue(game::scriptInstance_t inst, game::VariableCompileValue* constValue);
|
||||
void EmitCastBool(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitBoolNot(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitBoolComplement(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitSize(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos);
|
||||
void EmitSelf(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitLevel(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitGame(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitAnim(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitSelfObject(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitLevelObject(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitAnimObject(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitLocalVariable(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos);
|
||||
void EmitLocalVariableRef(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos);
|
||||
void Scr_RegisterLocalVar(unsigned int name, game::sval_u sourcePos, game::scr_block_s* block);
|
||||
void EmitGameRef(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitClearArray(game::scriptInstance_t inst, game::sval_u sourcePos, game::sval_u indexSourcePos);
|
||||
void EmitEmptyArray(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitAnimation(game::scriptInstance_t inst, game::sval_u anim, game::sval_u sourcePos);
|
||||
void EmitFieldVariable(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u field, game::sval_u sourcePos);
|
||||
void EmitClearFieldVariable(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u field, game::sval_u sourcePos, game::sval_u rhsSourcePos);
|
||||
void EmitObject(game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos);
|
||||
void EmitDecTop(game::scriptInstance_t inst);
|
||||
void EmitCastFieldObject(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitArrayVariable(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u index, game::sval_u sourcePos, game::sval_u indexSourcePos);
|
||||
void EmitArrayVariableRef(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u index, game::sval_u sourcePos, game::sval_u indexSourcePos);
|
||||
void EmitClearArrayVariable(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u index, game::sval_u sourcePos, game::sval_u indexSourcePos);
|
||||
void EmitVariableExpression(game::scriptInstance_t inst, game::sval_u expr, game::scr_block_s* block);
|
||||
int EmitExpressionList(game::scriptInstance_t inst, game::sval_u exprlist, game::scr_block_s* block);
|
||||
void AddExpressionListOpcodePos(game::scriptInstance_t inst, game::sval_u exprlist);
|
||||
void AddFilePrecache(game::scriptInstance_t inst, unsigned int filename, unsigned int sourcePos, bool include, unsigned int* filePosId, unsigned int* fileCountId);
|
||||
void EmitFunction(game::scriptInstance_t inst, game::sval_u func, game::sval_u sourcePos);
|
||||
void EmitGetFunction(game::scriptInstance_t inst, game::sval_u func, game::sval_u sourcePos);
|
||||
int AddFunction(game::scriptInstance_t inst, int func);
|
||||
void EmitPostScriptFunction(game::scriptInstance_t inst, game::sval_u func, int param_count, int bMethod, game::sval_u nameSourcePos);
|
||||
void EmitPostScriptFunctionPointer(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, int param_count, int bMethod, game::sval_u nameSourcePos, game::sval_u sourcePos);
|
||||
void EmitPostScriptThread(game::scriptInstance_t inst, game::sval_u func, int param_count, int bMethod, game::sval_u sourcePos);
|
||||
void EmitPostScriptThreadPointer(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, int param_count, int bMethod, game::sval_u sourcePos);
|
||||
void EmitPostScriptFunctionCall(game::scriptInstance_t inst, int bMethod, int param_count, game::sval_u func_name, game::sval_u nameSourcePos, game::scr_block_s* block);
|
||||
void EmitPostScriptThreadCall(game::scriptInstance_t inst, int isMethod, int param_count, game::sval_u func_name, game::sval_u sourcePos, game::sval_u nameSourcePos, game::scr_block_s* block);
|
||||
void EmitPreFunctionCall(game::scriptInstance_t inst);
|
||||
void EmitPostFunctionCall(game::scriptInstance_t inst, int bMethod, game::sval_u func_name, int param_count, game::scr_block_s* block);
|
||||
void Scr_BeginDevScript(game::scriptInstance_t isnt, int* type, char** savedPos);
|
||||
void Scr_EndDevScript(game::scriptInstance_t inst, char** savedPos);
|
||||
void EmitCallBuiltinOpcode(game::scriptInstance_t inst, int param_count, game::sval_u sourcePos);
|
||||
void EmitCallBuiltinMethodOpcode(game::scriptInstance_t inst, int param_count, game::sval_u sourcePos);
|
||||
void EmitCall(game::scriptInstance_t inst, game::sval_u func_name, game::sval_u params, int bStatement, game::scr_block_s* block);
|
||||
void EmitMethod(game::scriptInstance_t inst, game::sval_u expr, game::sval_u func_name, game::sval_u params, game::sval_u methodSourcePos, int bStatement, game::scr_block_s* block);
|
||||
void LinkThread(game::scriptInstance_t inst, unsigned int threadCountId, game::VariableValue* pos, int allowFarCall);
|
||||
void LinkFile(game::scriptInstance_t inst, unsigned int filePosId, unsigned int fileCountId);
|
||||
void CheckThreadPosition(game::scriptInstance_t inst, unsigned int posId, unsigned int name, unsigned int sourcePos);
|
||||
void EmitCallExpression(game::scriptInstance_t inst, game::scr_block_s* block, game::sval_u expr, int bStatement);
|
||||
void EmitCallExpressionFieldObject(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr);
|
||||
void Scr_CreateVector(game::scriptInstance_t inst, game::VariableCompileValue* constValue, game::VariableValue* value);
|
||||
bool EvalPrimitiveExpressionList(game::scriptInstance_t inst, game::sval_u exprlist, game::sval_u sourcePos, game::VariableCompileValue* constValue);
|
||||
bool EmitOrEvalPrimitiveExpressionList(game::scriptInstance_t inst, game::sval_u exprlist, game::sval_u sourcePos, game::VariableCompileValue* constValue, game::scr_block_s* a5);
|
||||
void EmitExpressionListFieldObject(game::scriptInstance_t inst, game::sval_u exprlist, game::sval_u sourcePos, game::scr_block_s* block);
|
||||
bool EvalPrimitiveExpression(game::scriptInstance_t inst, game::sval_u expr, game::VariableCompileValue* constValue);
|
||||
bool EmitOrEvalPrimitiveExpression(game::scriptInstance_t inst, game::sval_u expr, game::VariableCompileValue* constValue, game::scr_block_s* block);
|
||||
void EmitBoolOrExpression(game::scriptInstance_t inst, game::sval_u expr1, game::sval_u expr2, game::sval_u expr1sourcePos, game::sval_u expr2sourcePos, game::scr_block_s* block);
|
||||
void EmitBoolAndExpression(game::scriptInstance_t inst, game::sval_u expr1, game::sval_u expr2, game::sval_u expr1sourcePos, game::sval_u expr2sourcePos, game::scr_block_s* a6);
|
||||
bool EvalBinaryOperatorExpression(game::scriptInstance_t inst, game::sval_u expr1, game::sval_u expr2, game::sval_u opcode, game::sval_u sourcePos, game::VariableCompileValue* constValue);
|
||||
bool EmitOrEvalBinaryOperatorExpression(game::scriptInstance_t inst, game::sval_u expr1, game::sval_u expr2, game::sval_u opcode, game::sval_u sourcePos, game::VariableCompileValue* constValue, game::scr_block_s* a8);
|
||||
void EmitBinaryEqualsOperatorExpression(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u lhs, game::sval_u rhs, game::sval_u opcode, game::sval_u sourcePos);
|
||||
void Scr_CalcLocalVarsVariableExpressionRef(game::scr_block_s* block, game::sval_u expr);
|
||||
bool EvalExpression(game::VariableCompileValue* constValue, game::scriptInstance_t inst, game::sval_u expr);
|
||||
bool EmitOrEvalExpression(game::scriptInstance_t inst, game::sval_u expr, game::VariableCompileValue* constValue, game::scr_block_s* block);
|
||||
void EmitExpression(game::scriptInstance_t inst, game::sval_u expr, game::scr_block_s* block);
|
||||
void EmitVariableExpressionRef(game::scriptInstance_t inst, game::sval_u expr, game::scr_block_s* block);
|
||||
void EmitArrayPrimitiveExpressionRef(game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos, game::scr_block_s* block);
|
||||
void Scr_CalcLocalVarsArrayVariableRef(game::sval_u expr, game::scr_block_s* block);
|
||||
void EmitPrimitiveExpressionFieldObject(game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos, game::scr_block_s* block);
|
||||
void ConnectBreakStatements(game::scriptInstance_t inst);
|
||||
void ConnectContinueStatements(game::scriptInstance_t inst);
|
||||
bool EmitClearVariableExpression(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u rhsSourcePos);
|
||||
void EmitAssignmentStatement(game::scriptInstance_t inst, game::sval_u lhs, game::sval_u rhs, game::sval_u sourcePos, game::sval_u rhsSourcePos, game::scr_block_s* block);
|
||||
void EmitCallExpressionStatement(game::scriptInstance_t inst, game::scr_block_s* block, game::sval_u expr);
|
||||
void EmitReturnStatement(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos);
|
||||
void EmitWaitStatement(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos, game::sval_u waitSourcePos);
|
||||
void EmitWaittillFrameEnd(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitIfStatement(game::scriptInstance_t inst, game::sval_u expr, game::sval_u stmt, game::sval_u sourcePos, int lastStatement, unsigned int endSourcePos, game::scr_block_s* block, game::sval_u* ifStatBlock);
|
||||
void Scr_CalcLocalVarsIfStatement(game::scriptInstance_t inst, game::sval_u stmt, game::scr_block_s* block, game::sval_u* ifStatBlock);
|
||||
void EmitIfElseStatement(game::scriptInstance_t inst, game::sval_u expr, game::sval_u stmt1, game::sval_u stmt2, game::sval_u sourcePos, game::sval_u elseSourcePos, int lastStatement, unsigned int endSourcePos, game::scr_block_s* block, game::sval_u* ifStatBlock, game::sval_u* elseStatBlock);
|
||||
void Scr_CalcLocalVarsIfElseStatement(game::scriptInstance_t inst, game::sval_u stmt1, game::sval_u stmt2, game::scr_block_s* block, game::sval_u* ifStatBlock, game::sval_u* elseStatBlock);
|
||||
void Scr_AddBreakBlock(game::scriptInstance_t inst, game::scr_block_s* block);
|
||||
void Scr_AddContinueBlock(game::scriptInstance_t inst, game::scr_block_s* block);
|
||||
void EmitWhileStatement(game::scriptInstance_t inst, game::sval_u expr, game::sval_u stmt, game::sval_u sourcePos, game::sval_u whileSourcePos, game::scr_block_s* block, game::sval_u* whileStatBlock);
|
||||
void Scr_CalcLocalVarsWhileStatement(game::scriptInstance_t inst, game::sval_u expr, game::sval_u stmt, game::scr_block_s* block, game::sval_u* whileStatBlock);
|
||||
void EmitForStatement(game::scriptInstance_t inst, game::sval_u stmt1, game::sval_u expr, game::sval_u stmt2, game::sval_u stmt, game::sval_u sourcePos, game::sval_u forSourcePos, game::scr_block_s* block, game::sval_u* forStatBlock, game::sval_u* forStatPostBlock);
|
||||
void Scr_CalcLocalVarsForStatement(game::scriptInstance_t inst, game::sval_u stmt1, game::sval_u expr, game::sval_u stmt2, game::sval_u stmt, game::scr_block_s* block, game::sval_u* forStatBlock, game::sval_u* forStatPostBlock);
|
||||
void EmitIncStatement(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos);
|
||||
void EmitDecStatement(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos);
|
||||
void Scr_CalcLocalVarsFormalParameterListInternal(game::sval_u* node, game::scr_block_s* block);
|
||||
void EmitWaittillStatement(game::scriptInstance_t inst, game::sval_u obj, game::sval_u exprlist, game::sval_u sourcePos, game::sval_u waitSourcePos, game::scr_block_s* block);
|
||||
void EmitWaittillmatchStatement(game::scriptInstance_t inst, game::sval_u obj, game::sval_u exprlist, game::sval_u sourcePos, game::sval_u waitSourcePos, game::scr_block_s* block);
|
||||
void EmitNotifyStatement(game::scriptInstance_t inst, game::sval_u obj, game::sval_u exprlist, game::sval_u sourcePos, game::sval_u notifySourcePos, game::scr_block_s* block);
|
||||
void EmitEndOnStatement(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u obj, game::sval_u expr, game::sval_u sourcePos, game::sval_u exprSourcePos);
|
||||
int CompareCaseInfo(const void* elem1, const void* elem2);
|
||||
void EmitCaseStatement(game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos);
|
||||
void EmitSwitchStatementList(game::scriptInstance_t inst, game::sval_u val, int lastStatement, unsigned int endSourcePos, game::scr_block_s* block);
|
||||
void Scr_CalcLocalVarsSwitchStatement(game::scriptInstance_t inst, game::sval_u stmtlist, game::scr_block_s* block);
|
||||
void EmitSwitchStatement(game::scriptInstance_t inst, game::sval_u expr, game::sval_u stmtlist, game::sval_u sourcePos, int lastStatement, unsigned int endSourcePos, game::scr_block_s* block);
|
||||
void EmitCaseStatementInfo(game::scriptInstance_t inst, unsigned int name, game::sval_u sourcePos);
|
||||
void EmitBreakStatement(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitContinueStatement(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitProfStatement(game::scriptInstance_t inst, game::sval_u profileName, game::sval_u sourcePos, game::OpcodeVM op);
|
||||
void EmitStatement(game::scriptInstance_t inst, game::sval_u val, int lastStatement, unsigned int endSourcePos, game::scr_block_s* block);
|
||||
void Scr_CalcLocalVarsStatement(game::scriptInstance_t inst, game::sval_u val, game::scr_block_s* block);
|
||||
void EmitStatementList(game::scriptInstance_t inst, game::sval_u val, int lastStatement, unsigned int endSourcePos, game::scr_block_s* block);
|
||||
void Scr_CalcLocalVarsStatementList(game::scr_block_s* block, game::scriptInstance_t inst, game::sval_u val);
|
||||
void Scr_CalcLocalVarsDeveloperStatementList(game::scriptInstance_t inst, game::sval_u val, game::scr_block_s* block, game::sval_u* devStatBlock);
|
||||
void EmitDeveloperStatementList(game::scriptInstance_t inst, game::sval_u val, game::sval_u sourcePos, game::scr_block_s* block, game::sval_u* devStatBlock);
|
||||
void EmitFormalParameterList(game::scriptInstance_t inst, game::sval_u exprlist, game::sval_u sourcePos, game::scr_block_s* block);
|
||||
void SpecifyThread(game::scriptInstance_t inst, game::sval_u val);
|
||||
void EmitThreadInternal(game::scriptInstance_t inst, game::sval_u val, game::sval_u sourcePos, game::sval_u endSourcePos, game::scr_block_s* block);
|
||||
void Scr_CalcLocalVarsThread(game::sval_u* stmttblock, game::scriptInstance_t inst, game::sval_u exprlist, game::sval_u stmtlist);
|
||||
void InitThread(int type, game::scriptInstance_t inst);
|
||||
void EmitNormalThread(game::scriptInstance_t inst, game::sval_u val, game::sval_u* stmttblock);
|
||||
void EmitDeveloperThread(game::scriptInstance_t inst, game::sval_u val, game::sval_u* stmttblock);
|
||||
void EmitThread(game::scriptInstance_t inst, game::sval_u val);
|
||||
void EmitThreadList(game::scriptInstance_t inst, game::sval_u val);
|
||||
void EmitInclude(game::scriptInstance_t inst, game::sval_u val);
|
||||
void ScriptCompile(game::scriptInstance_t inst, game::sval_u val, unsigned int filePosId, unsigned int fileCountId, unsigned int scriptId, game::PrecacheEntry* entries, int entriesCount);
|
||||
|
||||
void EmitFloat(game::scriptInstance_t inst, float value);
|
||||
void EmitCanonicalStringConst(game::scriptInstance_t inst, unsigned int stringValue);
|
||||
int Scr_FindLocalVar(game::scr_block_s* block, int startIndex, unsigned int name);
|
||||
void Scr_CheckLocalVarsCount(int localVarsCount);
|
||||
void EmitGetUndefined(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitPrimitiveExpression(game::scriptInstance_t inst, game::sval_u expr, game::scr_block_s* block);
|
||||
void Scr_EmitAnimation(game::scriptInstance_t inst, char* pos, unsigned int animName, unsigned int sourcePos);
|
||||
void EmitEvalArray(game::scriptInstance_t inst, game::sval_u sourcePos, game::sval_u indexSourcePos);
|
||||
void EmitEvalArrayRef(game::scriptInstance_t inst, game::sval_u sourcePos, game::sval_u indexSourcePos);
|
||||
unsigned int Scr_GetBuiltin(game::scriptInstance_t inst, game::sval_u func_name);
|
||||
int Scr_GetUncacheType(int type);
|
||||
int Scr_GetCacheType(int type);
|
||||
game::BuiltinFunction Scr_GetFunction(const char** pName, int* type);
|
||||
game::BuiltinFunction GetFunction(game::scriptInstance_t inst, const char** pName, int* type);
|
||||
game::BuiltinMethod GetMethod(game::scriptInstance_t inst, const char** pName, int* type);
|
||||
unsigned int GetVariableName(game::scriptInstance_t inst, unsigned int id);
|
||||
int GetExpressionCount(game::sval_u exprlist);
|
||||
game::sval_u* GetSingleParameter(game::sval_u exprlist);
|
||||
void EmitExpressionFieldObject(game::scriptInstance_t inst, game::sval_u expr, game::sval_u sourcePos, game::scr_block_s* block);
|
||||
void EvalInteger(int value, game::sval_u sourcePos, game::VariableCompileValue* constValue);
|
||||
void EvalFloat(float value, game::sval_u sourcePos, game::VariableCompileValue* constValue);
|
||||
void EvalString(unsigned int value, game::sval_u sourcePos, game::VariableCompileValue* constValue);
|
||||
void EvalIString(unsigned int value, game::sval_u sourcePos, game::VariableCompileValue* constValue);
|
||||
void EvalUndefined(game::sval_u sourcePos, game::VariableCompileValue* constValue);
|
||||
void Scr_PopValue(game::scriptInstance_t inst);
|
||||
void EmitSetVariableField(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
void EmitFieldVariableRef(game::scriptInstance_t inst, game::sval_u expr, game::sval_u field, game::sval_u sourcePos, game::scr_block_s* block);
|
||||
void Scr_CalcLocalVarsArrayPrimitiveExpressionRef(game::sval_u expr, game::scr_block_s* block);
|
||||
BOOL IsUndefinedPrimitiveExpression(game::sval_u expr);
|
||||
bool IsUndefinedExpression(game::sval_u expr);
|
||||
void Scr_CopyBlock(game::scr_block_s* from, game::scr_block_s** to);
|
||||
void Scr_CheckMaxSwitchCases(int count);
|
||||
void Scr_CalcLocalVarsSafeSetVariableField(game::sval_u expr, game::sval_u sourcePos, game::scr_block_s* block);
|
||||
void EmitFormalWaittillParameterListRefInternal(game::scriptInstance_t inst, game::sval_u* node, game::scr_block_s* block);
|
||||
void EmitDefaultStatement(game::scriptInstance_t inst, game::sval_u sourcePos);
|
||||
char Scr_IsLastStatement(game::scriptInstance_t inst, game::sval_u* node);
|
||||
void EmitEndStatement(game::scriptInstance_t inst, game::sval_u sourcePos, game::scr_block_s* block);
|
||||
void EmitProfBeginStatement(game::scriptInstance_t inst, game::sval_u profileName, game::sval_u sourcePos);
|
||||
void EmitProfEndStatement(game::scriptInstance_t inst, game::sval_u profileName, game::sval_u sourcePos);
|
||||
void Scr_CalcLocalVarsIncStatement(game::sval_u expr, game::scr_block_s* block);
|
||||
void Scr_CalcLocalVarsWaittillStatement(game::sval_u exprlist, game::scr_block_s* block);
|
||||
void EmitFormalParameterListInternal(game::scriptInstance_t inst, game::sval_u* node, game::scr_block_s* block);
|
||||
unsigned int SpecifyThreadPosition(game::scriptInstance_t inst, unsigned int posId, unsigned int name, unsigned int sourcePos, int type);
|
||||
void Scr_CalcLocalVarsFormalParameterList(game::sval_u exprlist, game::scr_block_s* block);
|
||||
void SetThreadPosition(game::scriptInstance_t inst, unsigned int posId);
|
||||
void EmitIncludeList(game::scriptInstance_t inst, game::sval_u val);
|
||||
}
|
@@ -1,450 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "clientscript_public.hpp"
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
// Restored inlined function
|
||||
int Scr_IsInOpcodeMemory(game::scriptInstance_t inst, const char* pos)
|
||||
{
|
||||
assert(game::gScrVarPub[inst].programBuffer);
|
||||
assert(pos);
|
||||
|
||||
return (unsigned int)(pos - game::gScrVarPub[inst].programBuffer) < game::gScrCompilePub[inst].programLen;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
bool Scr_IsIdentifier(char* token)
|
||||
{
|
||||
while ( *token )
|
||||
{
|
||||
if (!iscsym(*token))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
++token;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int Scr_GetFunctionHandle(const char* file, game::scriptInstance_t inst, const char* handle)
|
||||
{
|
||||
assert(game::gScrCompilePub[inst].scriptsPos);
|
||||
assert(strlen(file) < 0x40);
|
||||
|
||||
unsigned int fileNameHash = game::Scr_CreateCanonicalFilename(inst, file);
|
||||
int id = game::FindVariable(fileNameHash, game::gScrCompilePub[inst].scriptsPos, inst);
|
||||
|
||||
game::SL_RemoveRefToString(fileNameHash, inst);
|
||||
|
||||
if (!id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int posId = game::FindObject(inst, id);
|
||||
unsigned int str = game::SL_FindLowercaseString(handle, inst);
|
||||
if (!str)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int filePosId = game::FindVariable(str, posId, inst);
|
||||
if (!filePosId)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
game::VariableValue val = game::Scr_EvalVariable(inst, filePosId);
|
||||
|
||||
assert(val.type == game::VAR_CODEPOS);
|
||||
|
||||
const char* pos = val.u.codePosValue;
|
||||
if (!game::Scr_IsInOpcodeMemory(inst, pos))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
assert(pos - game::gScrVarPub[inst].programBuffer);
|
||||
|
||||
assert(pos > game::gScrVarPub[inst].programBuffer);
|
||||
|
||||
return pos - game::gScrVarPub[inst].programBuffer;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int SL_TransferToCanonicalString(game::scriptInstance_t inst, unsigned int stringValue)
|
||||
{
|
||||
assert(stringValue);
|
||||
|
||||
game::SL_TransferRefToUser(stringValue, 2u, inst);
|
||||
|
||||
if ( game::gScrCompilePub[inst].canonicalStrings[stringValue] )
|
||||
{
|
||||
return game::gScrCompilePub[inst].canonicalStrings[stringValue];
|
||||
}
|
||||
|
||||
game::gScrCompilePub[inst].canonicalStrings[stringValue] = ++game::gScrVarPub[inst].canonicalStrCount;
|
||||
|
||||
return game::gScrVarPub[inst].canonicalStrCount;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
unsigned int SL_GetCanonicalString(char* token, game::scriptInstance_t inst)
|
||||
{
|
||||
unsigned int str;
|
||||
|
||||
str = game::SL_FindString(token, inst);
|
||||
|
||||
if ( game::gScrCompilePub[inst].canonicalStrings[str] )
|
||||
{
|
||||
return game::gScrCompilePub[inst].canonicalStrings[str];
|
||||
}
|
||||
|
||||
str = game::SL_GetString_(token, inst, 0);
|
||||
|
||||
return game::SL_TransferToCanonicalString(inst, str);
|
||||
}
|
||||
|
||||
// Restored
|
||||
void SL_BeginLoadScripts(game::scriptInstance_t inst)
|
||||
{
|
||||
memset(game::gScrCompilePub[inst].canonicalStrings, 0, sizeof(game::gScrCompilePub[inst].canonicalStrings));
|
||||
game::gScrVarPub[inst].canonicalStrCount = 0;
|
||||
}
|
||||
|
||||
// Restored
|
||||
void Scr_SetLoadedImpureScript(bool loadedImpureScript)
|
||||
{
|
||||
*game::loadedImpureScript = loadedImpureScript;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void Scr_BeginLoadScripts(game::scriptInstance_t inst, int user)
|
||||
{
|
||||
assert(!game::gScrCompilePub[inst].script_loading);
|
||||
|
||||
game::gScrCompilePub[inst].script_loading = 1;
|
||||
|
||||
game::Scr_InitOpcodeLookup(inst);
|
||||
|
||||
assert(!game::gScrCompilePub[inst].loadedscripts);
|
||||
|
||||
game::gScrCompilePub[inst].loadedscripts = game::Scr_AllocArray(inst);
|
||||
|
||||
assert(!game::gScrCompilePub[inst].scriptsPos);
|
||||
|
||||
game::gScrCompilePub[inst].scriptsPos = game::Scr_AllocArray(inst);
|
||||
|
||||
assert(!game::gScrCompilePub[inst].scriptsCount);
|
||||
|
||||
game::gScrCompilePub[inst].scriptsCount = game::Scr_AllocArray(inst);
|
||||
|
||||
assert(!game::gScrCompilePub[inst].builtinFunc);
|
||||
|
||||
game::gScrCompilePub[inst].builtinFunc = game::Scr_AllocArray(inst);
|
||||
|
||||
assert(!game::gScrCompilePub[inst].builtinMeth);
|
||||
|
||||
game::gScrCompilePub[inst].builtinMeth = game::Scr_AllocArray(inst);
|
||||
|
||||
game::gScrVarPub[inst].programHunkUser = game::Hunk_UserCreate(0x100000, "Scr_BeginLoadScripts", 1, 0, 0, 7);
|
||||
game::TempMemoryReset(game::gScrVarPub[inst].programHunkUser);
|
||||
game::gScrVarPub[inst].programBuffer = game::TempMalloc(0);
|
||||
|
||||
assert(((int)game::gScrVarPub[inst].programBuffer & 0x1F) == 0);
|
||||
|
||||
game::gScrCompilePub[inst].programLen = 0;
|
||||
game::gScrVarPub[inst].endScriptBuffer = 0;
|
||||
|
||||
game::SL_BeginLoadScripts(inst);
|
||||
|
||||
game::gScrVarPub[inst].fieldBuffer = 0;
|
||||
game::gScrCompilePub[inst].value_count = 0;
|
||||
game::gScrVarPub[inst].error_message = 0;
|
||||
game::gScrVmGlob[inst].dialog_error_message = 0;
|
||||
game::gScrVarPub[inst].error_index = 0;
|
||||
game::gScrCompilePub[inst].func_table_size = 0;
|
||||
|
||||
game::Scr_SetLoadedImpureScript(false);
|
||||
|
||||
game::gScrAnimPub[inst].animTreeNames = 0;
|
||||
game::Scr_BeginLoadAnimTrees(inst, user);
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void Scr_BeginLoadAnimTrees(game::scriptInstance_t inst, int user)
|
||||
{
|
||||
assert(!game::gScrAnimPub[inst].animtree_loading);
|
||||
|
||||
game::gScrAnimPub[inst].animtree_loading = 1;
|
||||
game::gScrAnimPub[inst].xanim_num[user] = 0;
|
||||
game::gScrAnimPub[inst].xanim_lookup[user][0].anims = 0;
|
||||
|
||||
assert(!game::gScrAnimPub[inst].animtrees);
|
||||
|
||||
game::gScrAnimPub[inst].animtrees = game::Scr_AllocArray(inst);
|
||||
game::gScrAnimPub[inst].animtree_node = 0;
|
||||
game::gScrCompilePub[inst].developer_statement = 0;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
int Scr_ScanFile(int max_size, char* buf)
|
||||
{
|
||||
char c;
|
||||
int n;
|
||||
game::scriptInstance_t inst;
|
||||
|
||||
inst = *game::gInst;
|
||||
|
||||
c = '*';
|
||||
for ( n = 0;
|
||||
n < max_size;
|
||||
++n )
|
||||
{
|
||||
c = *game::gScrCompilePub[inst].in_ptr++;
|
||||
|
||||
if ( !c || c == '\n')
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
buf[n] = c;
|
||||
}
|
||||
if ( c == '\n')
|
||||
{
|
||||
buf[n++] = c;
|
||||
}
|
||||
else if ( !c )
|
||||
{
|
||||
if ( game::gScrCompilePub[inst].parseBuf )
|
||||
{
|
||||
game::gScrCompilePub[inst].in_ptr = game::gScrCompilePub[inst].parseBuf;
|
||||
game::gScrCompilePub[inst].parseBuf = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
--game::gScrCompilePub[inst].in_ptr;
|
||||
}
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
unsigned int Scr_LoadScriptInternal(game::scriptInstance_t inst, const char* filename, game::PrecacheEntry* entries, int entriesCount)
|
||||
{
|
||||
unsigned int scriptPosVar;
|
||||
unsigned int scriptCountVar;
|
||||
const char *codepos;
|
||||
char extFilename[64];
|
||||
unsigned int fileCountId;
|
||||
unsigned int filePosPtr;
|
||||
char *sourceBuffer;
|
||||
const char *oldFilename;
|
||||
unsigned int name;
|
||||
unsigned int oldAnimTreeNames;
|
||||
const char *oldSourceBuf;
|
||||
unsigned int scriptId;
|
||||
unsigned int filePosId;
|
||||
const char *formatExtString;
|
||||
game::sval_u parseData;
|
||||
|
||||
assert(game::gScrCompilePub[inst].script_loading);
|
||||
|
||||
assert(strlen(filename) < 0x40);
|
||||
|
||||
name = game::Scr_CreateCanonicalFilename(inst, filename);
|
||||
if ( game::FindVariable(name, game::gScrCompilePub[inst].loadedscripts, inst) )
|
||||
{
|
||||
game::SL_RemoveRefToString(name, inst);
|
||||
filePosPtr = game::FindVariable(name, game::gScrCompilePub[inst].scriptsPos, inst);
|
||||
if ( filePosPtr )
|
||||
{
|
||||
return game::FindObject(inst, filePosPtr);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
scriptId = game::GetNewVariable(inst, name, game::gScrCompilePub[inst].loadedscripts);
|
||||
game::SL_RemoveRefToString(name, inst);
|
||||
formatExtString = "%s.gsc";
|
||||
|
||||
if ( inst == game::SCRIPTINSTANCE_CLIENT && !strncmp(filename, "clientscripts", 13) )
|
||||
{
|
||||
formatExtString = "%s.csc";
|
||||
}
|
||||
|
||||
snprintf(extFilename, 64, formatExtString, filename);
|
||||
oldSourceBuf = game::gScrParserPub[inst].sourceBuf;
|
||||
codepos = (const char *)game::TempMalloc(0);
|
||||
sourceBuffer = game::Scr_AddSourceBuffer(inst, (int)filename, extFilename, codepos);
|
||||
|
||||
if (!sourceBuffer)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
oldAnimTreeNames = game::gScrAnimPub[inst].animTreeNames;
|
||||
game::gScrAnimPub[inst].animTreeNames = 0;
|
||||
game::gScrCompilePub[inst].far_function_count = 0;
|
||||
|
||||
game::Scr_InitAllocNode(inst);
|
||||
|
||||
oldFilename = game::gScrParserPub[inst].scriptfilename;
|
||||
game::gScrParserPub[inst].scriptfilename = extFilename;
|
||||
game:: gScrCompilePub[inst].in_ptr = "+";
|
||||
game::gScrCompilePub[inst].parseBuf = sourceBuffer;
|
||||
|
||||
// pluto
|
||||
if (game::plutonium::script_preprocess != nullptr)
|
||||
{
|
||||
game::plutonium::script_preprocess(sourceBuffer, inst, &parseData); // the pluto hook will call ScriptParse, so we dont have to
|
||||
}
|
||||
//
|
||||
else
|
||||
{
|
||||
game::ScriptParse(inst, &parseData);
|
||||
}
|
||||
|
||||
scriptPosVar = game::GetVariable(inst, game::gScrCompilePub[inst].scriptsPos, name);
|
||||
filePosId = game::GetObject(inst, scriptPosVar);
|
||||
scriptCountVar = game::GetVariable(inst, game::gScrCompilePub[inst].scriptsCount, name);
|
||||
fileCountId = game::GetObject(inst, scriptCountVar);
|
||||
|
||||
game::ScriptCompile(inst, parseData, filePosId, fileCountId, scriptId, entries, entriesCount);
|
||||
|
||||
game::gScrParserPub[inst].scriptfilename = oldFilename;
|
||||
game::gScrParserPub[inst].sourceBuf = oldSourceBuf;
|
||||
game::gScrAnimPub[inst].animTreeNames = oldAnimTreeNames;
|
||||
|
||||
return filePosId;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
unsigned int Scr_LoadScript(const char* file, game::scriptInstance_t inst)
|
||||
{
|
||||
game::PrecacheEntry entries[1024];
|
||||
|
||||
return game::Scr_LoadScriptInternal(inst, file, entries, 0);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void Scr_EndLoadScripts(game::scriptInstance_t inst)
|
||||
{
|
||||
// pluto
|
||||
if (game::plutonium::load_custom_script_func != nullptr)
|
||||
{
|
||||
game::plutonium::load_custom_script_func(inst);
|
||||
}
|
||||
//
|
||||
|
||||
game::SL_ShutdownSystem(inst, 2u);
|
||||
game::gScrCompilePub[inst].script_loading = 0;
|
||||
|
||||
assert(game::gScrCompilePub[inst].loadedscripts);
|
||||
|
||||
game::ClearObject(game::gScrCompilePub[inst].loadedscripts, inst);
|
||||
game::RemoveRefToObject(game::gScrCompilePub[inst].loadedscripts, inst);
|
||||
game::gScrCompilePub[inst].loadedscripts = 0;
|
||||
|
||||
assert(game::gScrCompilePub[inst].scriptsPos);
|
||||
|
||||
game::ClearObject(game::gScrCompilePub[inst].scriptsPos, inst);
|
||||
game::RemoveRefToObject(game::gScrCompilePub[inst].scriptsPos, inst);
|
||||
game::gScrCompilePub[inst].scriptsPos = 0;
|
||||
|
||||
assert(game::gScrCompilePub[inst].scriptsCount);
|
||||
|
||||
game::ClearObject(game::gScrCompilePub[inst].scriptsCount, inst);
|
||||
game::RemoveRefToObject(game::gScrCompilePub[inst].scriptsCount, inst);
|
||||
game::gScrCompilePub[inst].scriptsCount = 0;
|
||||
|
||||
assert(game::gScrCompilePub[inst].builtinFunc);
|
||||
|
||||
game::ClearObject(game::gScrCompilePub[inst].builtinFunc, inst);
|
||||
game::RemoveRefToObject(game::gScrCompilePub[inst].builtinFunc, inst);
|
||||
game::gScrCompilePub[inst].builtinFunc = 0;
|
||||
|
||||
assert(game::gScrCompilePub[inst].builtinMeth);
|
||||
|
||||
game::ClearObject(game::gScrCompilePub[inst].builtinMeth, inst);
|
||||
game::RemoveRefToObject(game::gScrCompilePub[inst].builtinMeth, inst);
|
||||
game::gScrCompilePub[inst].builtinMeth = 0;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void Scr_PrecacheAnimTrees(game::scriptInstance_t inst, void* (__cdecl *Alloc)(int), int user, int modChecksum)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 1; i <= game::gScrAnimPub[inst].xanim_num[user]; ++i)
|
||||
{
|
||||
game::Scr_LoadAnimTreeAtIndex(inst, user, i, Alloc, modChecksum);
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void Scr_EndLoadAnimTrees(game::scriptInstance_t inst)
|
||||
{
|
||||
unsigned int animtreeNode;
|
||||
|
||||
assert(game::gScrAnimPub[inst].animtrees);
|
||||
|
||||
game::ClearObject(game::gScrAnimPub[inst].animtrees, inst);
|
||||
game::RemoveRefToObject(game::gScrAnimPub[inst].animtrees, inst);
|
||||
animtreeNode = game::gScrAnimPub[inst].animtree_node;
|
||||
game::gScrAnimPub[inst].animtrees = 0;
|
||||
|
||||
if (animtreeNode)
|
||||
{
|
||||
game::RemoveRefToObject(animtreeNode, inst);
|
||||
}
|
||||
|
||||
game::SL_ShutdownSystem(inst, 2u);
|
||||
|
||||
if (game::gScrVarPub[inst].programBuffer && !game::gScrVarPub[inst].endScriptBuffer)
|
||||
{
|
||||
game::gScrVarPub[inst].endScriptBuffer = game::TempMalloc(0);
|
||||
}
|
||||
|
||||
game::gScrAnimPub[inst].animtree_loading = 0;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void Scr_FreeScripts(game::scriptInstance_t inst)
|
||||
{
|
||||
//char sys = 1;
|
||||
|
||||
//assert(sys == SCR_SYS_GAME);
|
||||
|
||||
if (game::gScrCompilePub[inst].script_loading)
|
||||
{
|
||||
game::gScrCompilePub[inst].script_loading = 0;
|
||||
game::Scr_EndLoadScripts(inst);
|
||||
}
|
||||
|
||||
if (game::gScrAnimPub[inst].animtree_loading)
|
||||
{
|
||||
game::gScrAnimPub[inst].animtree_loading = 0;
|
||||
game::Scr_EndLoadAnimTrees(inst);
|
||||
}
|
||||
|
||||
game::SL_ShutdownSystem(inst, 1u);
|
||||
game::Scr_ShutdownOpcodeLookup(inst);
|
||||
|
||||
if (game::gScrVarPub[inst].programHunkUser)
|
||||
{
|
||||
game::Hunk_UserDestroy(game::gScrVarPub[inst].programHunkUser);
|
||||
game::gScrVarPub[inst].programHunkUser = 0;
|
||||
}
|
||||
|
||||
game::gScrVarPub[inst].programBuffer = 0;
|
||||
game::gScrVarPub[inst].endScriptBuffer = 0;
|
||||
game::gScrVarPub[inst].checksum = 0;
|
||||
game::gScrCompilePub[inst].programLen = 0;
|
||||
}
|
||||
}
|
@@ -1,21 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
int Scr_IsInOpcodeMemory(game::scriptInstance_t inst, const char* pos);
|
||||
bool Scr_IsIdentifier(char * token);
|
||||
unsigned int Scr_GetFunctionHandle(const char * file, game::scriptInstance_t inst, const char * handle);
|
||||
unsigned int SL_TransferToCanonicalString(game::scriptInstance_t inst, unsigned int stringValue);
|
||||
unsigned int SL_GetCanonicalString(char * token, game::scriptInstance_t inst);
|
||||
void Scr_BeginLoadScripts(game::scriptInstance_t inst, int user);
|
||||
void Scr_BeginLoadAnimTrees(game::scriptInstance_t inst, int user);
|
||||
int Scr_ScanFile(int max_size, char * buf);
|
||||
unsigned int Scr_LoadScriptInternal(game::scriptInstance_t inst, const char * file, game::PrecacheEntry * entries, int entriesCount);
|
||||
unsigned int Scr_LoadScript(const char * file, game::scriptInstance_t inst);
|
||||
void Scr_EndLoadScripts(game::scriptInstance_t inst);
|
||||
void Scr_EndLoadAnimTrees(game::scriptInstance_t inst);
|
||||
void Scr_FreeScripts(game::scriptInstance_t inst);
|
||||
void Scr_PrecacheAnimTrees(game::scriptInstance_t inst, void* (__cdecl* Alloc)(int), int user, int modChecksum);
|
||||
void Scr_SetLoadedImpureScript(bool loadedImpureScript);
|
||||
void SL_BeginLoadScripts(game::scriptInstance_t inst);
|
||||
}
|
@@ -1,525 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "clientscript_public.hpp"
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
// Restored
|
||||
game::RefVector* GetRefVector(game::scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
assert(id);
|
||||
|
||||
assert((id * MT_NODE_SIZE) < MT_SIZE);
|
||||
|
||||
return (game::RefVector*)&game::gScrMemTreePub[inst].mt_buffer->nodes[id];
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
int MT_GetSubTreeSize(game::scriptInstance_t inst, int nodeNum)
|
||||
{
|
||||
int treeSize;
|
||||
|
||||
if (nodeNum)
|
||||
{
|
||||
treeSize = game::MT_GetSubTreeSize(inst, game::gScrMemTreeGlob[inst].nodes[nodeNum].next);
|
||||
return treeSize + game::MT_GetSubTreeSize(inst, game::gScrMemTreeGlob[inst].nodes[nodeNum].prev) + 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void MT_DumpTree(game::scriptInstance_t inst)
|
||||
{
|
||||
int size;
|
||||
|
||||
//assert(game::gScrMemTreeGlob[inst].totalAlloc == totalAlloc);
|
||||
//assert(game::gScrMemTreeGlob[inst].totalAllocBuckets == totalAllocBuckets);
|
||||
|
||||
game::Com_Printf(game::CON_CHANNEL_PARSERSCRIPT, "********************************\n");
|
||||
for (int i = 0; i <= MT_NODE_BITS; ++i)
|
||||
{
|
||||
size = game::MT_GetSubTreeSize(inst, game::gScrMemTreeGlob[inst].head[i]);
|
||||
game::Com_Printf(game::CON_CHANNEL_PARSERSCRIPT, "%d subtree has %d * %d = %d free buckets\n", i, size, 1 << i, size << i);
|
||||
}
|
||||
game::Com_Printf(game::CON_CHANNEL_PARSERSCRIPT, "********************************\n");
|
||||
game::Com_Printf(game::CON_CHANNEL_PARSERSCRIPT, "********************************\n");
|
||||
game::Com_Printf(game::CON_CHANNEL_PARSERSCRIPT, "********************************\n");
|
||||
|
||||
//assert(totalBuckets == (1 << MEMORY_NODE_BITS) - 1);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void MT_InitBits(game::scriptInstance_t inst)
|
||||
{
|
||||
char bits;
|
||||
int temp;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MT_NUM_BUCKETS; ++i)
|
||||
{
|
||||
bits = 0;
|
||||
|
||||
for (temp = i; temp; temp >>= 1)
|
||||
{
|
||||
if (temp & 1)
|
||||
{
|
||||
++bits;
|
||||
}
|
||||
}
|
||||
|
||||
game::gScrMemTreeGlob[inst].numBits[i] = bits;
|
||||
|
||||
for (bits = 8; i & ((1 << bits) - 1); --bits);
|
||||
|
||||
game::gScrMemTreeGlob[inst].leftBits[i] = bits;
|
||||
bits = 0;
|
||||
|
||||
for (temp = i; temp; temp >>= 1)
|
||||
{
|
||||
++bits;
|
||||
}
|
||||
|
||||
game::gScrMemTreeGlob[inst].logBits[i] = bits;
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
int MT_GetScore(game::scriptInstance_t inst, int num)
|
||||
{
|
||||
char bits;
|
||||
|
||||
union MTnum_t
|
||||
{
|
||||
int i;
|
||||
uint8_t b[4];
|
||||
};
|
||||
|
||||
assert(num);
|
||||
|
||||
assert(MT_NODE_COUNT - num);
|
||||
|
||||
MTnum_t mtnum;
|
||||
|
||||
mtnum.i = MT_NODE_COUNT - num;
|
||||
|
||||
bits = game::gScrMemTreeGlob[inst].leftBits[mtnum.b[0]];
|
||||
|
||||
if (!mtnum.b[0])
|
||||
{
|
||||
bits += game::gScrMemTreeGlob[inst].leftBits[mtnum.b[1]];
|
||||
}
|
||||
|
||||
return mtnum.i - (game::gScrMemTreeGlob[inst].numBits[mtnum.b[1]] + game::gScrMemTreeGlob[inst].numBits[mtnum.b[0]]) + (1 << bits);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void MT_AddMemoryNode(game::scriptInstance_t inst, int newNode, int size)
|
||||
{
|
||||
int node;
|
||||
int nodeNum;
|
||||
int newScore;
|
||||
uint16_t* parentNode;
|
||||
int level;
|
||||
int score;
|
||||
|
||||
assert(size >= 0 && size <= MT_NODE_BITS);
|
||||
|
||||
parentNode = &game::gScrMemTreeGlob[inst].head[size];
|
||||
node = game::gScrMemTreeGlob[inst].head[size];
|
||||
if (game::gScrMemTreeGlob[inst].head[size])
|
||||
{
|
||||
newScore = game::MT_GetScore(inst, newNode);
|
||||
nodeNum = 0;
|
||||
level = MT_NODE_COUNT;
|
||||
do
|
||||
{
|
||||
assert(newNode != node);
|
||||
|
||||
score = game::MT_GetScore(inst, node);
|
||||
|
||||
assert(score != newScore);
|
||||
|
||||
if (score < newScore)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
*parentNode = (short)newNode;
|
||||
game::gScrMemTreeGlob[inst].nodes[newNode] = game::gScrMemTreeGlob[inst].nodes[node];
|
||||
if (!node)
|
||||
{
|
||||
break;
|
||||
}
|
||||
level >>= 1;
|
||||
|
||||
assert(node != nodeNum);
|
||||
|
||||
if (node >= nodeNum)
|
||||
{
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[newNode].next;
|
||||
nodeNum += level;
|
||||
}
|
||||
else
|
||||
{
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[newNode].prev;
|
||||
nodeNum -= level;
|
||||
}
|
||||
|
||||
newNode = node;
|
||||
node = *parentNode;
|
||||
}
|
||||
return;
|
||||
}
|
||||
level >>= 1;
|
||||
|
||||
assert(newNode != nodeNum);
|
||||
|
||||
if (newNode >= nodeNum)
|
||||
{
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[node].next;
|
||||
nodeNum += level;
|
||||
}
|
||||
else
|
||||
{
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[node].prev;
|
||||
nodeNum -= level;
|
||||
}
|
||||
|
||||
node = *parentNode;
|
||||
} while (node);
|
||||
}
|
||||
|
||||
*parentNode = (short)newNode;
|
||||
|
||||
game::gScrMemTreeGlob[inst].nodes[newNode].prev = 0;
|
||||
game::gScrMemTreeGlob[inst].nodes[newNode].next = 0;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
char MT_RemoveMemoryNode(game::scriptInstance_t inst, int oldNode, int size)
|
||||
{
|
||||
game::MemoryNode tempNodeValue;
|
||||
int node;
|
||||
game::MemoryNode oldNodeValue;
|
||||
int nodeNum;
|
||||
uint16_t* parentNode;
|
||||
int prevScore;
|
||||
int nextScore;
|
||||
int level;
|
||||
|
||||
assert(size >= 0 && size <= MT_NODE_BITS);
|
||||
|
||||
nodeNum = 0;
|
||||
level = MT_NODE_COUNT;
|
||||
parentNode = &game::gScrMemTreeGlob[inst].head[size];
|
||||
|
||||
for (node = *parentNode; node; node = *parentNode)
|
||||
{
|
||||
if (oldNode == node)
|
||||
{
|
||||
oldNodeValue = game::gScrMemTreeGlob[inst].nodes[oldNode];
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (oldNodeValue.prev)
|
||||
{
|
||||
if (oldNodeValue.next)
|
||||
{
|
||||
prevScore = game::MT_GetScore(inst, oldNodeValue.prev);
|
||||
nextScore = game::MT_GetScore(inst, oldNodeValue.next);
|
||||
|
||||
assert(prevScore != nextScore);
|
||||
|
||||
if (prevScore >= nextScore)
|
||||
{
|
||||
oldNode = oldNodeValue.prev;
|
||||
*parentNode = oldNodeValue.prev;
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[oldNodeValue.prev].prev;
|
||||
}
|
||||
else
|
||||
{
|
||||
oldNode = oldNodeValue.next;
|
||||
*parentNode = oldNodeValue.next;
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[oldNodeValue.next].next;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
oldNode = oldNodeValue.prev;
|
||||
*parentNode = oldNodeValue.prev;
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[oldNodeValue.prev].prev;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
oldNode = oldNodeValue.next;
|
||||
*parentNode = oldNodeValue.next;
|
||||
|
||||
if (!oldNodeValue.next)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[oldNodeValue.next].next;
|
||||
}
|
||||
|
||||
assert(oldNode);
|
||||
|
||||
tempNodeValue = oldNodeValue;
|
||||
oldNodeValue = game::gScrMemTreeGlob[inst].nodes[oldNode];
|
||||
game::gScrMemTreeGlob[inst].nodes[oldNode] = tempNodeValue;
|
||||
}
|
||||
}
|
||||
|
||||
if (oldNode == nodeNum)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
level >>= 1;
|
||||
|
||||
if (oldNode >= nodeNum)
|
||||
{
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[node].next;
|
||||
nodeNum += level;
|
||||
}
|
||||
else
|
||||
{
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[node].prev;
|
||||
nodeNum -= level;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void MT_RemoveHeadMemoryNode(game::scriptInstance_t inst, int size)
|
||||
{
|
||||
game::MemoryNode tempNodeValue;
|
||||
int oldNode;
|
||||
game::MemoryNode oldNodeValue;
|
||||
uint16_t* parentNode;
|
||||
int prevScore;
|
||||
int nextScore;
|
||||
|
||||
assert(size >= 0 && size <= MT_NODE_BITS);
|
||||
|
||||
parentNode = &game::gScrMemTreeGlob[inst].head[size];
|
||||
oldNodeValue = game::gScrMemTreeGlob[inst].nodes[*parentNode];
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (!oldNodeValue.prev)
|
||||
{
|
||||
oldNode = oldNodeValue.next;
|
||||
*parentNode = oldNodeValue.next;
|
||||
if (!oldNode)
|
||||
{
|
||||
break;
|
||||
}
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[oldNode].next;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (oldNodeValue.next)
|
||||
{
|
||||
prevScore = game::MT_GetScore(inst, oldNodeValue.prev);
|
||||
nextScore = game::MT_GetScore(inst, oldNodeValue.next);
|
||||
|
||||
assert(prevScore != nextScore);
|
||||
|
||||
if (prevScore >= nextScore)
|
||||
{
|
||||
oldNode = oldNodeValue.prev;
|
||||
*parentNode = (short)oldNode;
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[oldNode].prev;
|
||||
}
|
||||
else
|
||||
{
|
||||
oldNode = oldNodeValue.next;
|
||||
*parentNode = (short)oldNode;
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[oldNode].next;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
oldNode = oldNodeValue.prev;
|
||||
*parentNode = (short)oldNode;
|
||||
parentNode = &game::gScrMemTreeGlob[inst].nodes[oldNode].prev;
|
||||
}
|
||||
}
|
||||
assert(oldNode != 0);
|
||||
|
||||
tempNodeValue = oldNodeValue;
|
||||
oldNodeValue = game::gScrMemTreeGlob[inst].nodes[oldNode];
|
||||
game::gScrMemTreeGlob[inst].nodes[oldNode] = tempNodeValue;
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void MT_Init(game::scriptInstance_t inst)
|
||||
{
|
||||
game::Sys_EnterCriticalSection(game::CRITSECT_MEMORY_TREE);
|
||||
|
||||
game::scrMemTreeGlob_t* memTreeBuffer = &game::gScrMemTreeGlob[inst];
|
||||
game::gScrMemTreePub[inst].mt_buffer = memTreeBuffer;
|
||||
|
||||
game::MT_InitBits(inst);
|
||||
|
||||
for (int i = 0; i <= MT_NODE_BITS; ++i)
|
||||
{
|
||||
memTreeBuffer->head[i] = 0;
|
||||
}
|
||||
|
||||
memTreeBuffer->nodes[0].next = 0;
|
||||
memTreeBuffer->nodes[0].prev = 0;
|
||||
|
||||
for (int i = 0; i < MT_NODE_BITS; ++i)
|
||||
{
|
||||
game::MT_AddMemoryNode(inst, 1 << i, i);
|
||||
}
|
||||
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_MEMORY_TREE);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void MT_Error(game::scriptInstance_t inst, const char* funcName, int numBytes)
|
||||
{
|
||||
game::MT_DumpTree(inst);
|
||||
game::Com_Printf(game::CON_CHANNEL_PARSERSCRIPT, "%s: failed memory allocation of %d bytes for script usage\n", funcName, numBytes);
|
||||
game::Scr_DumpScriptThreads(inst);
|
||||
game::gScrVmPub[inst].terminal_error = 1;
|
||||
game::Scr_Error("failed memory allocation for script usage", inst, 0);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
int MT_GetSize(int numBytes, game::scriptInstance_t inst)
|
||||
{
|
||||
int numBuckets;
|
||||
int result;
|
||||
|
||||
assert(numBytes > 0);
|
||||
|
||||
if (numBytes >= MT_NODE_COUNT)
|
||||
{
|
||||
game::MT_Error(inst, "MT_GetSize: max allocation exceeded", numBytes);
|
||||
result = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
numBuckets = (numBytes + MT_NODE_SIZE - 1) / MT_NODE_SIZE - 1;
|
||||
if (numBuckets > MT_NUM_BUCKETS - 1)
|
||||
{
|
||||
result = game::gScrMemTreeGlob[inst].logBits[numBuckets >> 8] + 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = game::gScrMemTreeGlob[inst].logBits[numBuckets];
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
unsigned __int16 MT_AllocIndex(game::scriptInstance_t inst, int numBytes)
|
||||
{
|
||||
int nodeNum;
|
||||
int size = game::MT_GetSize(numBytes, inst);
|
||||
int newSize;
|
||||
|
||||
assert(size >= 0 && size <= MT_NODE_BITS);
|
||||
|
||||
game::Sys_EnterCriticalSection(game::CRITSECT_MEMORY_TREE);
|
||||
|
||||
for (newSize = size; ; ++newSize)
|
||||
{
|
||||
if (newSize > MT_NODE_BITS)
|
||||
{
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_MEMORY_TREE);
|
||||
game::MT_Error(inst, "MT_AllocIndex", numBytes);
|
||||
return 0;
|
||||
}
|
||||
nodeNum = game::gScrMemTreeGlob[inst].head[newSize];
|
||||
if (game::gScrMemTreeGlob[inst].head[newSize])
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
game::MT_RemoveHeadMemoryNode(inst, newSize);
|
||||
|
||||
while (newSize != size)
|
||||
{
|
||||
--newSize;
|
||||
game::MT_AddMemoryNode(inst, nodeNum + (1 << newSize), newSize);
|
||||
}
|
||||
|
||||
//assert(type);
|
||||
|
||||
//assert(!game::gScrMemTreeDebugGlob[inst].mt_usage[nodeNum]);
|
||||
|
||||
//assert(!game::gScrMemTreeDebugGlob[inst].mt_usage_size[nodeNum]);
|
||||
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_MEMORY_TREE);
|
||||
return (short)nodeNum;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void MT_FreeIndex(int numBytes, game::scriptInstance_t inst, int nodeNum)
|
||||
{
|
||||
int size = game::MT_GetSize(numBytes, inst);
|
||||
|
||||
assert(size >= 0 && size <= MT_NODE_BITS);
|
||||
|
||||
assert(nodeNum > 0 && nodeNum < MT_NODE_COUNT);
|
||||
|
||||
game::Sys_EnterCriticalSection(game::CRITSECT_MEMORY_TREE);
|
||||
|
||||
//assert(game::gScrMemTreeDebugGlob[inst].mt_usage[nodeNum]);
|
||||
|
||||
//assert(game::gScrMemTreeDebugGlob[inst].mt_usage_size[nodeNum] == size);
|
||||
|
||||
for (int i = 1 << size; size != MT_NODE_BITS; i = 1 << ++size)
|
||||
{
|
||||
assert(size <= MT_NODE_BITS);
|
||||
|
||||
assert(nodeNum == (nodeNum & ~((1 << size) - 1)));
|
||||
|
||||
if (!game::MT_RemoveMemoryNode(inst, nodeNum ^ i, size))
|
||||
{
|
||||
break;
|
||||
}
|
||||
nodeNum &= ~i;
|
||||
}
|
||||
game::MT_AddMemoryNode(inst, nodeNum, size);
|
||||
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_MEMORY_TREE);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
char* MT_Alloc(int numBytes, game::scriptInstance_t inst)
|
||||
{
|
||||
return (char*)(game::gScrMemTreeGlob[inst].nodes + game::MT_AllocIndex(inst, numBytes));
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void MT_Free(void* p, int numBytes, game::scriptInstance_t inst)
|
||||
{
|
||||
assert((game::MemoryNode*)p - game::gScrMemTreeGlob[inst].nodes >= 0 && (game::MemoryNode*)p - game::gScrMemTreeGlob[inst].nodes < MT_NODE_COUNT);
|
||||
|
||||
game::MT_FreeIndex(numBytes, inst, (game::MemoryNode*)p - game::gScrMemTreeGlob[inst].nodes);
|
||||
}
|
||||
|
||||
// Restored inlined function
|
||||
char* MT_GetRefByIndex(game::scriptInstance_t inst, int index)
|
||||
{
|
||||
if (index > MT_NODE_COUNT)
|
||||
{
|
||||
game::MT_Error(inst, "MT_GetRefByIndex: out of bounds index", index);
|
||||
return NULL;
|
||||
}
|
||||
return (char*)&game::gScrMemTreeGlob[inst].nodes[index];
|
||||
}
|
||||
}
|
@@ -1,21 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
game::RefVector* GetRefVector(game::scriptInstance_t inst, unsigned int id);
|
||||
int MT_GetSubTreeSize(game::scriptInstance_t inst, int nodeNum);
|
||||
void MT_DumpTree(game::scriptInstance_t inst);
|
||||
void MT_InitBits(game::scriptInstance_t inst);
|
||||
int MT_GetScore(game::scriptInstance_t inst, int num);
|
||||
void MT_AddMemoryNode(game::scriptInstance_t inst, int newNode, int size);
|
||||
char MT_RemoveMemoryNode(game::scriptInstance_t inst, int oldNode, int size);
|
||||
void MT_RemoveHeadMemoryNode(game::scriptInstance_t inst, int size);
|
||||
void MT_Init(game::scriptInstance_t inst);
|
||||
void MT_Error(game::scriptInstance_t inst, const char* funcName, int numBytes);
|
||||
int MT_GetSize(int numBytes, game::scriptInstance_t inst);
|
||||
unsigned __int16 MT_AllocIndex(game::scriptInstance_t inst, int numBytes);
|
||||
void MT_FreeIndex(int numBytes, game::scriptInstance_t inst, int nodeNum);
|
||||
char* MT_Alloc(int numBytes, game::scriptInstance_t inst);
|
||||
void MT_Free(void* p, int numBytes, game::scriptInstance_t inst);
|
||||
const char* MT_NodeInfoString(game::scriptInstance_t inst, unsigned int nodeNum);
|
||||
}
|
@@ -1,940 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "clientscript_public.hpp"
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
// Decomp Status: Tested, Completed
|
||||
void Scr_InitOpcodeLookup(game::scriptInstance_t inst)
|
||||
{
|
||||
unsigned int opcodeLookupMaxLen;
|
||||
game::OpcodeLookup* opcodeLookup;
|
||||
unsigned int sourcePosLookupMaxLen;
|
||||
game::HunkUser* debugHunkUser;
|
||||
unsigned int sourceBufferLookupMaxLen;
|
||||
|
||||
assert(!game::gScrParserGlob[inst].opcodeLookup);
|
||||
|
||||
assert(!game::gScrParserGlob[inst].sourcePosLookup);
|
||||
|
||||
assert(!game::gScrParserPub[inst].sourceBufferLookup);
|
||||
|
||||
if (game::gScrVarPub[inst].developer)
|
||||
{
|
||||
debugHunkUser = (game::HunkUser*)game::g_DebugHunkUser.get();
|
||||
opcodeLookupMaxLen = inst != game::SCRIPTINSTANCE_CLIENT ? 0x40000 : 0x4000;
|
||||
game::gScrParserGlob[inst].opcodeLookupMaxLen = opcodeLookupMaxLen;
|
||||
game::gScrParserGlob[inst].delayedSourceIndex = -1;
|
||||
game::gScrParserGlob[inst].opcodeLookupLen = 0;
|
||||
opcodeLookup = (game::OpcodeLookup*)game::Hunk_UserAlloc(debugHunkUser, 24 * opcodeLookupMaxLen, 4);
|
||||
game::gScrParserGlob[inst].opcodeLookup = opcodeLookup;
|
||||
|
||||
memset(opcodeLookup, 0, sizeof(game::OpcodeLookup) * game::gScrParserGlob[inst].opcodeLookupMaxLen);
|
||||
|
||||
sourcePosLookupMaxLen = inst != game::SCRIPTINSTANCE_CLIENT ? 0x60000 : 0x10;
|
||||
game::gScrParserGlob[inst].sourcePosLookupMaxLen = sourcePosLookupMaxLen;
|
||||
game::gScrParserGlob[inst].sourcePosLookupLen = 0;
|
||||
game::gScrParserGlob[inst].sourcePosLookup = (game::SourceLookup*)game::Hunk_UserAlloc(debugHunkUser, 8 * sourcePosLookupMaxLen, 4);
|
||||
sourceBufferLookupMaxLen = inst != game::SCRIPTINSTANCE_CLIENT ? 0x100 : 0x10;
|
||||
game::gScrParserGlob[inst].sourceBufferLookupMaxLen = sourceBufferLookupMaxLen;
|
||||
game::gScrParserGlob[inst].currentCodePos = 0;
|
||||
game::gScrParserGlob[inst].currentSourcePosCount = 0;
|
||||
game::gScrParserPub[inst].sourceBufferLookupLen = 0;
|
||||
game::gScrParserPub[inst].sourceBufferLookup = (game::SourceBufferInfo*)game::Hunk_UserAlloc(debugHunkUser, 24 * sourceBufferLookupMaxLen, 4);
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void Scr_ShutdownOpcodeLookup(game::scriptInstance_t inst)
|
||||
{
|
||||
if (game::gScrParserGlob[inst].opcodeLookup)
|
||||
{
|
||||
game::gScrParserGlob[inst].opcodeLookup = 0;
|
||||
}
|
||||
if (game::gScrParserGlob[inst].sourcePosLookup)
|
||||
{
|
||||
game::gScrParserGlob[inst].sourcePosLookup = 0;
|
||||
}
|
||||
if (game::gScrParserPub[inst].sourceBufferLookup != 0)
|
||||
{
|
||||
game::gScrParserPub[inst].sourceBufferLookup = 0;
|
||||
}
|
||||
if (game::gScrParserGlob[inst].saveSourceBufferLookup)
|
||||
{
|
||||
game::gScrParserGlob[inst].saveSourceBufferLookup = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void AddOpcodePos(game::scriptInstance_t inst, unsigned int sourcePos, int type)
|
||||
{
|
||||
game::OpcodeLookup* newOpcodeLookup;
|
||||
game::SourceLookup* newSourcePosLookup;
|
||||
char* compilerOpcodePos;
|
||||
game::OpcodeLookup* opcodeLookup;
|
||||
int posIndex;
|
||||
game::SourceLookup* sourcePosLookup;
|
||||
int delayedSourceIndex;
|
||||
int allocSize;
|
||||
|
||||
if (game::gScrVarPub[inst].developer)
|
||||
{
|
||||
if (game::gScrCompilePub[inst].developer_statement != 2)
|
||||
{
|
||||
if (!game::gScrCompilePub[inst].allowedBreakpoint)
|
||||
{
|
||||
type &= ~1u;
|
||||
}
|
||||
|
||||
assert(game::gScrParserGlob[inst].opcodeLookup);
|
||||
|
||||
assert(game::gScrParserGlob[inst].opcodeLookupMaxLen);
|
||||
|
||||
assert(game::gScrParserGlob[inst].sourcePosLookup);
|
||||
|
||||
assert(game::gScrCompilePub[inst].opcodePos);
|
||||
|
||||
if (game::gScrParserGlob[inst].opcodeLookupLen >= game::gScrParserGlob[inst].opcodeLookupMaxLen)
|
||||
{
|
||||
allocSize = (sizeof(game::OpcodeLookup) * 2) * game::gScrParserGlob[inst].opcodeLookupMaxLen;
|
||||
game::gScrParserGlob[inst].opcodeLookupMaxLen *= 2;
|
||||
|
||||
assert(game::gScrParserGlob[inst].opcodeLookupLen < game::gScrParserGlob[inst].opcodeLookupMaxLen);
|
||||
|
||||
newOpcodeLookup = (game::OpcodeLookup*)game::Hunk_UserAlloc((game::HunkUser*)game::g_DebugHunkUser.get(), allocSize, 4);
|
||||
memcpy(newOpcodeLookup, game::gScrParserGlob[inst].opcodeLookup, sizeof(game::OpcodeLookup) * game::gScrParserGlob[inst].opcodeLookupLen);
|
||||
game::gScrParserGlob[inst].opcodeLookup = newOpcodeLookup;
|
||||
}
|
||||
|
||||
if (game::gScrParserGlob[inst].sourcePosLookupLen >= game::gScrParserGlob[inst].sourcePosLookupMaxLen)
|
||||
{
|
||||
allocSize = (sizeof(game::SourceLookup) * 2) * game::gScrParserGlob[inst].sourcePosLookupMaxLen;
|
||||
game::gScrParserGlob[inst].sourcePosLookupMaxLen *= 2;
|
||||
|
||||
assert(game::gScrParserGlob[inst].sourcePosLookupLen < game::gScrParserGlob[inst].sourcePosLookupMaxLen);
|
||||
|
||||
newSourcePosLookup = (game::SourceLookup*)game::Hunk_UserAlloc((game::HunkUser*)game::g_DebugHunkUser.get(), allocSize, 4);
|
||||
memcpy(newSourcePosLookup, game::gScrParserGlob[inst].sourcePosLookup, sizeof(game::SourceLookup) * game::gScrParserGlob[inst].sourcePosLookupLen);
|
||||
game::gScrParserGlob[inst].sourcePosLookup = newSourcePosLookup;
|
||||
}
|
||||
|
||||
compilerOpcodePos = game::gScrCompilePub[inst].opcodePos;
|
||||
if ((char*)game::gScrParserGlob[inst].currentCodePos == compilerOpcodePos)
|
||||
{
|
||||
//assert(game::gScrParserGlob[inst].currentSourcePosCount);
|
||||
|
||||
opcodeLookup = &game::gScrParserGlob[inst].opcodeLookup[--game::gScrParserGlob[inst].opcodeLookupLen];
|
||||
|
||||
//assert(opcodeLookup->sourcePosIndex + game::gScrParserGlob[inst].currentSourcePosCount == game::gScrParserGlob[inst].sourcePosLookupLen);
|
||||
|
||||
//assert(opcodeLookup->codePos == (char*)game::gScrParserGlob[inst].currentCodePos);
|
||||
}
|
||||
else
|
||||
{
|
||||
game::gScrParserGlob[inst].currentCodePos = (const unsigned char*)compilerOpcodePos;
|
||||
opcodeLookup = &game::gScrParserGlob[inst].opcodeLookup[game::gScrParserGlob[inst].opcodeLookupLen];
|
||||
game::gScrParserGlob[inst].currentSourcePosCount = 0;
|
||||
opcodeLookup->sourcePosIndex = game::gScrParserGlob[inst].sourcePosLookupLen;
|
||||
opcodeLookup->codePos = (const char*)game::gScrParserGlob[inst].currentCodePos;
|
||||
}
|
||||
|
||||
posIndex = game::gScrParserGlob[inst].currentSourcePosCount + opcodeLookup->sourcePosIndex;
|
||||
sourcePosLookup = &game::gScrParserGlob[inst].sourcePosLookup[posIndex];
|
||||
sourcePosLookup->sourcePos = sourcePos;
|
||||
if (sourcePos == -1)
|
||||
{
|
||||
assert(game::gScrParserGlob[inst].delayedSourceIndex == -1);
|
||||
|
||||
assert(type & game::SOURCE_TYPE_BREAKPOINT);
|
||||
|
||||
game::gScrParserGlob[inst].delayedSourceIndex = posIndex;
|
||||
}
|
||||
else if (sourcePos == -2)
|
||||
{
|
||||
game::gScrParserGlob[inst].threadStartSourceIndex = posIndex;
|
||||
}
|
||||
else
|
||||
{
|
||||
delayedSourceIndex = game::gScrParserGlob[inst].delayedSourceIndex;
|
||||
if (delayedSourceIndex >= 0 && (type & 1) != 0)
|
||||
{
|
||||
game::gScrParserGlob[inst].sourcePosLookup[delayedSourceIndex].sourcePos = sourcePos;
|
||||
game::gScrParserGlob[inst].delayedSourceIndex = -1;
|
||||
}
|
||||
}
|
||||
|
||||
sourcePosLookup->type |= type;
|
||||
opcodeLookup->sourcePosCount = ++game::gScrParserGlob[inst].currentSourcePosCount;
|
||||
++game::gScrParserGlob[inst].opcodeLookupLen;
|
||||
++game::gScrParserGlob[inst].sourcePosLookupLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(!game::gScrVarPub[inst].developer_script);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void RemoveOpcodePos(game::scriptInstance_t inst)
|
||||
{
|
||||
game::OpcodeLookup* opcodeLookup;
|
||||
|
||||
if (game::gScrVarPub[inst].developer)
|
||||
{
|
||||
if (game::gScrCompilePub[inst].developer_statement == 2)
|
||||
{
|
||||
assert(!game::gScrVarPub[inst].developer_script);
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(game::gScrParserGlob[inst].opcodeLookup);
|
||||
|
||||
assert(game::gScrParserGlob[inst].opcodeLookupMaxLen);
|
||||
|
||||
assert(game::gScrParserGlob[inst].sourcePosLookup);
|
||||
|
||||
assert(game::gScrCompilePub[inst].opcodePos);
|
||||
|
||||
assert(game::gScrParserGlob[inst].sourcePosLookupLen);
|
||||
|
||||
--game::gScrParserGlob[inst].sourcePosLookupLen;
|
||||
|
||||
assert(game::gScrParserGlob[inst].opcodeLookupLen);
|
||||
|
||||
--game::gScrParserGlob[inst].opcodeLookupLen;
|
||||
|
||||
assert(game::gScrParserGlob[inst].currentSourcePosCount);
|
||||
|
||||
--game::gScrParserGlob[inst].currentSourcePosCount;
|
||||
opcodeLookup = &game::gScrParserGlob[inst].opcodeLookup[game::gScrParserGlob[inst].opcodeLookupLen];
|
||||
|
||||
assert((char*)game::gScrParserGlob[inst].currentCodePos == game::gScrCompilePub[inst].opcodePos);
|
||||
|
||||
assert(opcodeLookup->sourcePosIndex + game::gScrParserGlob[inst].currentSourcePosCount == game::gScrParserGlob[inst].sourcePosLookupLen);
|
||||
|
||||
assert(opcodeLookup->codePos == (char*)game::gScrParserGlob[inst].currentCodePos);
|
||||
|
||||
if (game::gScrParserGlob[inst].currentSourcePosCount == 1)
|
||||
{
|
||||
game::gScrParserGlob[inst].currentCodePos = 0;
|
||||
}
|
||||
|
||||
game::gScrParserGlob[inst].opcodeLookup[game::gScrParserGlob[inst].opcodeLookupLen].sourcePosCount = game::gScrParserGlob[inst].currentSourcePosCount;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void AddThreadStartOpcodePos(game::scriptInstance_t inst, unsigned int sourcePos)
|
||||
{
|
||||
game::SourceLookup* sourcePosLookup;
|
||||
|
||||
if (game::gScrVarPub[inst].developer)
|
||||
{
|
||||
if (game::gScrCompilePub[inst].developer_statement == 2)
|
||||
{
|
||||
assert(!game::gScrVarPub[inst].developer_script);
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(game::gScrParserGlob[inst].threadStartSourceIndex >= 0);
|
||||
|
||||
sourcePosLookup = &game::gScrParserGlob[inst].sourcePosLookup[game::gScrParserGlob[inst].threadStartSourceIndex];
|
||||
sourcePosLookup->sourcePos = sourcePos;
|
||||
|
||||
assert(!sourcePosLookup->type);
|
||||
|
||||
sourcePosLookup->type = 4;
|
||||
game::gScrParserGlob[inst].threadStartSourceIndex = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int Scr_GetSourceBuffer(game::scriptInstance_t inst, const char* codePos)
|
||||
{
|
||||
unsigned int bufferIndex;
|
||||
|
||||
assert(game::Scr_IsInOpcodeMemory(inst, codePos));
|
||||
|
||||
assert(game::gScrParserPub[inst].sourceBufferLookupLen > 0);
|
||||
|
||||
for ( bufferIndex = game::gScrParserPub[inst].sourceBufferLookupLen - 1;
|
||||
bufferIndex && (!game::gScrParserPub[inst].sourceBufferLookup[bufferIndex].codePos || game::gScrParserPub[inst].sourceBufferLookup[bufferIndex].codePos > codePos);
|
||||
--bufferIndex )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
return bufferIndex;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
unsigned int Scr_GetLineNumInternal(const char** startLine, const char* buf, const char* sourcePos, int* col)
|
||||
{
|
||||
unsigned int lineNum;
|
||||
|
||||
assert(buf);
|
||||
|
||||
lineNum = 0;
|
||||
for (*startLine = buf; sourcePos; --sourcePos)
|
||||
{
|
||||
if (!*buf)
|
||||
{
|
||||
*startLine = buf + 1;
|
||||
++lineNum;
|
||||
}
|
||||
++buf;
|
||||
}
|
||||
*col = buf - *startLine;
|
||||
return lineNum;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::SourceBufferInfo* Scr_GetNewSourceBuffer(game::scriptInstance_t inst)
|
||||
{
|
||||
unsigned int* sourceBufferLookupMaxLen;
|
||||
int allocSize;
|
||||
game::SourceBufferInfo* newSourceBufferInfo;
|
||||
|
||||
assert(game::gScrParserPub[inst].sourceBufferLookup);
|
||||
|
||||
assert(game::gScrParserGlob[inst].sourceBufferLookupMaxLen);
|
||||
|
||||
if (game::gScrParserPub[inst].sourceBufferLookupLen < game::gScrParserGlob[inst].sourceBufferLookupMaxLen)
|
||||
{
|
||||
return &game::gScrParserPub[inst].sourceBufferLookup[game::gScrParserPub[inst].sourceBufferLookupLen++];
|
||||
}
|
||||
|
||||
//assert(gScrParserPub[inst].sourceBufferLookupLen >= gScrParserGlob[inst].sourceBufferLookupMaxLen);
|
||||
|
||||
sourceBufferLookupMaxLen = &game::gScrParserGlob[inst].sourceBufferLookupMaxLen;
|
||||
allocSize = 2 * *sourceBufferLookupMaxLen;
|
||||
*sourceBufferLookupMaxLen = allocSize;
|
||||
newSourceBufferInfo = (game::SourceBufferInfo*)game::Hunk_UserAlloc((game::HunkUser*)game::g_DebugHunkUser.get(), sizeof(game::OpcodeLookup) * allocSize, 4);
|
||||
memcpy(newSourceBufferInfo, game::gScrParserPub[inst].sourceBufferLookup, sizeof(game::OpcodeLookup) * game::gScrParserPub[inst].sourceBufferLookupLen);
|
||||
game::gScrParserPub[inst].sourceBufferLookup = newSourceBufferInfo;
|
||||
return &game::gScrParserPub[inst].sourceBufferLookup[game::gScrParserPub[inst].sourceBufferLookupLen++];
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void Scr_AddSourceBufferInternal(const char* filename, game::scriptInstance_t inst, const char* codepos, char* buffer, int len, int archive)
|
||||
{
|
||||
game::SourceBufferInfo* newBuffer;
|
||||
const char* source;
|
||||
char* buf;
|
||||
char c;
|
||||
int i;
|
||||
char* tmp;
|
||||
size_t size;
|
||||
char* dest;
|
||||
|
||||
if (game::gScrParserPub[inst].sourceBufferLookup)
|
||||
{
|
||||
size = strlen(filename);
|
||||
dest = (char*)game::Hunk_UserAlloc((struct game::HunkUser*)game::g_DebugHunkUser.get(), size + len + 3, 4);
|
||||
memcpy(dest, filename, size + 1);
|
||||
if (buffer)
|
||||
{
|
||||
source = &dest[size + 1];
|
||||
}
|
||||
else
|
||||
{
|
||||
source = 0;
|
||||
}
|
||||
buf = buffer;
|
||||
tmp = (char*)source;
|
||||
if (len >= 0)
|
||||
{
|
||||
for (i = 0; i <= len; ++i)
|
||||
{
|
||||
c = *buf++;
|
||||
if (c == '\n' || c == '\r' && *buf != '\n')
|
||||
*tmp = 0;
|
||||
else
|
||||
*tmp = c;
|
||||
++tmp;
|
||||
}
|
||||
}
|
||||
newBuffer = game::Scr_GetNewSourceBuffer(inst);
|
||||
newBuffer->codePos = codepos;
|
||||
newBuffer->buf = dest;
|
||||
newBuffer->sourceBuf = source;
|
||||
newBuffer->len = len;
|
||||
newBuffer->sortedIndex = -1;
|
||||
newBuffer->archive = archive;
|
||||
if (source)
|
||||
{
|
||||
game::gScrParserPub[inst].sourceBuf = source;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
game::gScrParserPub[inst].sourceBuf = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
char* Scr_ReadFile_FastFile(game::scriptInstance_t inst, [[maybe_unused]] int unused, char* filename, const char* codepos, int archive)
|
||||
{
|
||||
char* buffer;
|
||||
game::RawFile* scriptFile;
|
||||
|
||||
scriptFile = game::DB_FindXAssetHeader(game::ASSET_TYPE_RAWFILE, filename, 1, -1).rawfile;
|
||||
if ((*game::useFastFile)->current.enabled && scriptFile != 0)
|
||||
{
|
||||
game::Scr_AddSourceBufferInternal(filename, inst, codepos, scriptFile->buffer, strlen(scriptFile->buffer), archive);
|
||||
buffer = scriptFile->buffer;
|
||||
}
|
||||
else
|
||||
{
|
||||
game::Scr_AddSourceBufferInternal(filename, inst, codepos, 0, -1, archive);
|
||||
buffer = 0;
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
char* Scr_ReadFile_LoadObj(game::scriptInstance_t inst, [[maybe_unused]] int unused_arg1, const char* filename, const char* codepos, int archive)
|
||||
{
|
||||
int fileLen;
|
||||
int fh;
|
||||
char* buffer;
|
||||
|
||||
fileLen = game::FS_FOpenFileRead(filename, &fh);
|
||||
if (fh)
|
||||
{
|
||||
game::fsh[fh].fileSize = fileLen;
|
||||
game::fsh[fh].streamed = 0;
|
||||
}
|
||||
|
||||
game::fsh[fh].handleSync = 0;
|
||||
if (fileLen >= 0)
|
||||
{
|
||||
if (!(*game::fs_game)->current.string)
|
||||
{
|
||||
game::Scr_SetLoadedImpureScript(true);
|
||||
}
|
||||
buffer = (char*)game::Hunk_AllocateTempMemoryHigh(fileLen + 1);
|
||||
game::FS_Read(buffer, fileLen, fh);
|
||||
buffer[fileLen] = 0;
|
||||
game::FS_FCloseFile(fh);
|
||||
game::Scr_AddSourceBufferInternal(filename, inst, codepos, buffer, fileLen, archive);
|
||||
}
|
||||
else
|
||||
{
|
||||
game::Scr_AddSourceBufferInternal(filename, inst, codepos, 0, -1, archive);
|
||||
buffer = 0;
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
char* Scr_ReadFile(const char* codepos, char* filename, game::scriptInstance_t inst, int unused)
|
||||
{
|
||||
char* buffer;
|
||||
int fh;
|
||||
|
||||
// pluto
|
||||
if (true)
|
||||
// if (*(*game::fs_game)->current.string || (*game::com_developer)->current.enabled)
|
||||
//
|
||||
{
|
||||
*game::statmon_related_bool = 1;
|
||||
if (game::FS_FOpenFileByMode(filename, &fh, game::FS_READ) < 0)
|
||||
{
|
||||
buffer = game::Scr_ReadFile_FastFile(inst, unused, filename, codepos, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
game::FS_FCloseFile(fh);
|
||||
buffer = game::Scr_ReadFile_LoadObj(inst, unused, filename, codepos, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(*game::useFastFile)->current.enabled)
|
||||
{
|
||||
buffer = game::Scr_ReadFile_LoadObj(inst, unused, filename, codepos, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer = game::Scr_ReadFile_FastFile(inst, unused, filename, codepos, 1);
|
||||
}
|
||||
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
char* Scr_AddSourceBuffer(game::scriptInstance_t inst, int unused_arg1, char* filename, const char* codepos)
|
||||
{
|
||||
unsigned int saveSourceBufferLookupLen;
|
||||
int len;
|
||||
game::SaveSourceBufferInfo* saveSourceBuffer;
|
||||
char* dest;
|
||||
char* sourceBuf;
|
||||
char* source;
|
||||
int len2;
|
||||
char c;
|
||||
|
||||
if (!game::gScrParserGlob[inst].saveSourceBufferLookup)
|
||||
{
|
||||
return game::Scr_ReadFile(codepos, filename, inst, unused_arg1);
|
||||
}
|
||||
|
||||
assert(game::gScrParserGlob[inst].saveSourceBufferLookupLen > 0);
|
||||
|
||||
saveSourceBufferLookupLen = --game::gScrParserGlob[inst].saveSourceBufferLookupLen;
|
||||
len = game::gScrParserGlob[inst].saveSourceBufferLookup[saveSourceBufferLookupLen].len;
|
||||
saveSourceBuffer = &game::gScrParserGlob[inst].saveSourceBufferLookup[saveSourceBufferLookupLen];
|
||||
|
||||
assert(len >= -1);
|
||||
|
||||
if (len >= 0)
|
||||
{
|
||||
sourceBuf = (char*)game::Hunk_AllocateTempMemoryHigh(len + 1);
|
||||
source = (char*)saveSourceBuffer->sourceBuf;
|
||||
dest = sourceBuf;
|
||||
if (len > 0)
|
||||
{
|
||||
len2 = len;
|
||||
do
|
||||
{
|
||||
c = *source++;
|
||||
if (!c)
|
||||
{
|
||||
c = '\n';
|
||||
}
|
||||
*dest++ = c;
|
||||
--len2;
|
||||
} while (len2);
|
||||
}
|
||||
*dest = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
dest = 0;
|
||||
}
|
||||
|
||||
game::Scr_AddSourceBufferInternal(filename, inst, codepos, dest, len, 1);
|
||||
return dest;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void Scr_CopyFormattedLine(const char* rawLine, char* line)
|
||||
{
|
||||
char cleanChar;
|
||||
int len;
|
||||
int i;
|
||||
|
||||
len = strlen(rawLine);
|
||||
if ( len >= 1024 )
|
||||
{
|
||||
len = 1023;
|
||||
}
|
||||
|
||||
for ( i = 0;
|
||||
i < len;
|
||||
++i )
|
||||
{
|
||||
if ( rawLine[i] == '\t' )
|
||||
{
|
||||
cleanChar = ' ';
|
||||
}
|
||||
else
|
||||
{
|
||||
cleanChar = rawLine[i];
|
||||
}
|
||||
|
||||
line[i] = cleanChar;
|
||||
}
|
||||
|
||||
if ( line[len - 1] == '\r' )
|
||||
{
|
||||
line[len - 1] = 0;
|
||||
}
|
||||
|
||||
line[len] = 0;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int Scr_GetLineInfo(int* col, const char* buf, unsigned int sourcePos, char* line)
|
||||
{
|
||||
const char *startLine;
|
||||
unsigned int lineNum;
|
||||
|
||||
if ( buf )
|
||||
{
|
||||
lineNum = game::Scr_GetLineNumInternal(&startLine, buf, (const char*)sourcePos, col);
|
||||
}
|
||||
else
|
||||
{
|
||||
lineNum = 0;
|
||||
startLine = "";
|
||||
*col = 0;
|
||||
}
|
||||
|
||||
game::Scr_CopyFormattedLine(startLine, line);
|
||||
return lineNum;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void Scr_PrintSourcePos(unsigned int sourcePos, const char* buf, game::con_channel_e channel, game::scriptInstance_t inst, const char* file)
|
||||
{
|
||||
const char *fileVaLine;
|
||||
const char *lineStr;
|
||||
const char *savegameStr;
|
||||
unsigned int lineNum;
|
||||
char line[1024];
|
||||
int i;
|
||||
int col;
|
||||
|
||||
assert(file);
|
||||
|
||||
lineNum = game::Scr_GetLineInfo(&col, buf, sourcePos, line);
|
||||
|
||||
if ( game::gScrParserGlob[inst].saveSourceBufferLookup )
|
||||
{
|
||||
savegameStr = " (savegame)";
|
||||
}
|
||||
else
|
||||
{
|
||||
savegameStr = "";
|
||||
}
|
||||
|
||||
fileVaLine = game::va("(file '%s'%s, line %d)\n", file, savegameStr, lineNum + 1);
|
||||
game::Com_PrintMessage(channel, fileVaLine, 0);
|
||||
|
||||
lineStr = game::va("%s\n", line);
|
||||
game::Com_PrintMessage(channel, lineStr, 0);
|
||||
|
||||
for ( i = 0;
|
||||
i < col;
|
||||
++i )
|
||||
{
|
||||
game::Com_PrintMessage(channel, " ", 0);
|
||||
}
|
||||
|
||||
game::Com_PrintMessage(channel, "*\n", 0);
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
game::OpcodeLookup* Scr_GetPrevSourcePosOpcodeLookup(game::scriptInstance_t inst, const char* codePos)
|
||||
{
|
||||
unsigned int low;
|
||||
unsigned int middle;
|
||||
unsigned int high;
|
||||
|
||||
assert(game::Scr_IsInOpcodeMemory(inst, codePos));
|
||||
|
||||
assert(game::gScrParserGlob[inst].opcodeLookup);
|
||||
|
||||
low = 0;
|
||||
high = game::gScrParserGlob[inst].opcodeLookupLen - 1;
|
||||
while ( low <= high )
|
||||
{
|
||||
middle = (high + low) >> 1;
|
||||
if ( codePos < game::gScrParserGlob[inst].opcodeLookup[middle].codePos )
|
||||
{
|
||||
high = middle - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
low = middle + 1;
|
||||
if ( middle + 1 == game::gScrParserGlob[inst].opcodeLookupLen || codePos < game::gScrParserGlob[inst].opcodeLookup[low].codePos )
|
||||
{
|
||||
return &game::gScrParserGlob[inst].opcodeLookup[middle];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assert(false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Restored
|
||||
unsigned int Scr_GetPrevSourcePos(game::scriptInstance_t inst, const char *codePos, unsigned int index)
|
||||
{
|
||||
return game::gScrParserGlob[inst].sourcePosLookup[index + game::Scr_GetPrevSourcePosOpcodeLookup(inst, codePos)->sourcePosIndex].sourcePos;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void Scr_GetTextSourcePos(char* line, const char* codePos, game::scriptInstance_t inst)
|
||||
{
|
||||
unsigned int prevsourcePos;
|
||||
unsigned int bufferIndex;
|
||||
int col;
|
||||
|
||||
if ( game::gScrVarPub[inst].developer
|
||||
&& codePos
|
||||
&& codePos != game::g_EndPos.get()
|
||||
&& game::gScrVarPub[inst].programBuffer
|
||||
&& game::Scr_IsInOpcodeMemory(inst, codePos) )
|
||||
{
|
||||
bufferIndex = game::Scr_GetSourceBuffer(inst, codePos - 1);
|
||||
prevsourcePos = game::Scr_GetPrevSourcePos(inst, codePos - 1, 0);
|
||||
game::Scr_GetLineInfo(&col, game::gScrParserPub[inst].sourceBufferLookup[bufferIndex].sourceBuf, prevsourcePos, line);
|
||||
}
|
||||
else
|
||||
{
|
||||
*line = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void Scr_PrintPrevCodePos(const char* codepos, game::scriptInstance_t scriptInstance, game::con_channel_e channel, unsigned int index)
|
||||
{
|
||||
unsigned int bufferIndex; // esi
|
||||
unsigned int prevSourcepos; // eax
|
||||
|
||||
if (!codepos)
|
||||
{
|
||||
game::Com_PrintMessage(channel, "<frozen thread>\n", 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (codepos == game::g_EndPos.get())
|
||||
{
|
||||
game::Com_PrintMessage(channel, "<removed thread>\n", 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (game::gScrVarPub[scriptInstance].developer)
|
||||
{
|
||||
if (game::gScrVarPub[scriptInstance].programBuffer && game::Scr_IsInOpcodeMemory(scriptInstance, codepos))
|
||||
{
|
||||
bufferIndex = game::Scr_GetSourceBuffer(scriptInstance, codepos - 1);
|
||||
prevSourcepos = game::Scr_GetPrevSourcePos(scriptInstance, codepos - 1, index);
|
||||
|
||||
game::Scr_PrintSourcePos(
|
||||
prevSourcepos,
|
||||
game::gScrParserPub[scriptInstance].sourceBufferLookup[bufferIndex].sourceBuf,
|
||||
channel,
|
||||
scriptInstance,
|
||||
game::gScrParserPub[scriptInstance].sourceBufferLookup[bufferIndex].buf);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (game::Scr_IsInOpcodeMemory(scriptInstance, codepos - 1))
|
||||
{
|
||||
const char* s;
|
||||
|
||||
// pluto
|
||||
if (game::plutonium::at_codepose_va != nullptr)
|
||||
{
|
||||
s = game::plutonium::at_codepose_va(scriptInstance, codepos - game::gScrVarPub[scriptInstance].programBuffer);
|
||||
}
|
||||
//
|
||||
else
|
||||
{
|
||||
s = game::va("@ %d\n", codepos - game::gScrVarPub[scriptInstance].programBuffer);
|
||||
}
|
||||
|
||||
game::Com_PrintMessage(channel, s, 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
game::Com_PrintMessage(channel, game::va("%s\n\n", codepos), 0);
|
||||
}
|
||||
}
|
||||
|
||||
// Restored
|
||||
void Scr_ShutdownAllocNode(game::scriptInstance_t inst)
|
||||
{
|
||||
if (game::g_allocNodeUser[inst])
|
||||
{
|
||||
game::Hunk_UserDestroy(game::g_allocNodeUser[inst]);
|
||||
game::g_allocNodeUser[inst] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void CompileError(game::scriptInstance_t inst, unsigned int codePos, const char* msg, ...)
|
||||
{
|
||||
const char* instStr;
|
||||
int col;
|
||||
int lineNumber;
|
||||
char text[1024];
|
||||
char line[1024];
|
||||
va_list va;
|
||||
|
||||
va_start(va, msg);
|
||||
vsnprintf(text, 0x400u, msg, va);
|
||||
va_end(va);
|
||||
|
||||
instStr = "Server";
|
||||
if (inst)
|
||||
{
|
||||
instStr = "Client";
|
||||
}
|
||||
|
||||
if (game::gScrVarPub[inst].evaluate)
|
||||
{
|
||||
if (!game::gScrVarPub[inst].error_message)
|
||||
{
|
||||
game::gScrVarPub[inst].error_message = (char*)game::va("%s", text);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
game::Scr_ShutdownAllocNode(inst);
|
||||
|
||||
game::Com_PrintError(game::CON_CHANNEL_PARSERSCRIPT, "\n");
|
||||
game::Com_PrintError(game::CON_CHANNEL_PARSERSCRIPT, "******* %s script compile error *******\n", instStr);
|
||||
|
||||
if (game::gScrVarPub[inst].developer && game::gScrParserPub[inst].sourceBuf)
|
||||
{
|
||||
game::Com_PrintError(game::CON_CHANNEL_PARSERSCRIPT, "%s: ", text);
|
||||
game::Scr_PrintSourcePos(
|
||||
codePos,
|
||||
game::gScrParserPub[inst].sourceBuf,
|
||||
game::CON_CHANNEL_PARSERSCRIPT,
|
||||
inst,
|
||||
game::gScrParserPub[inst].scriptfilename);
|
||||
lineNumber = game::Scr_GetLineInfo(&col, game::gScrParserPub[inst].sourceBuf, codePos, line);
|
||||
}
|
||||
else
|
||||
{
|
||||
game::Com_PrintError(game::CON_CHANNEL_PARSERSCRIPT, "%s\n", text);
|
||||
line[0] = 0;
|
||||
lineNumber = 0;
|
||||
}
|
||||
game::Com_Printf(game::CON_CHANNEL_PARSERSCRIPT, "************************************\n");
|
||||
game::Com_Error(game::ERR_SCRIPT_DROP, "\x15" "%s script compile error\n%s\n%s\n(see console for details)\n", instStr, text, line);
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void CompileError2(const char* codePos, game::scriptInstance_t inst, const char* msg, ...)
|
||||
{
|
||||
const char* instStr;
|
||||
char text[1024];
|
||||
char line[1024];
|
||||
va_list va;
|
||||
|
||||
va_start(va, msg);
|
||||
|
||||
assert(!game::gScrVarPub[inst].evaluate);
|
||||
|
||||
assert(game::Scr_IsInOpcodeMemory(inst, codePos));
|
||||
|
||||
vsnprintf(text, 0x400u, msg, va);
|
||||
va_end(va);
|
||||
|
||||
instStr = "Server";
|
||||
if (inst)
|
||||
{
|
||||
instStr = "Client";
|
||||
}
|
||||
|
||||
game::Com_PrintError(game::CON_CHANNEL_PARSERSCRIPT, "\n");
|
||||
game::Com_PrintError(game::CON_CHANNEL_PARSERSCRIPT, "******* %s script compile error *******\n", instStr);
|
||||
game::Com_PrintError(game::CON_CHANNEL_PARSERSCRIPT, "%s: ", text);
|
||||
game::Scr_PrintPrevCodePos(codePos, inst, game::CON_CHANNEL_PARSERSCRIPT, 0);
|
||||
game::Com_Printf(game::CON_CHANNEL_PARSERSCRIPT, "************************************\n");
|
||||
game::Scr_GetTextSourcePos(line, codePos, inst);
|
||||
game::Com_Error(game::ERR_SCRIPT_DROP, "\x15" "%s script compile error\n%s\n%s\n(see console for details)\n", instStr, text, line);
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void RuntimeErrorInternal(const char* msg, game::scriptInstance_t inst, game::con_channel_e channel, const char* codepos, int index)
|
||||
{
|
||||
int functionCount;
|
||||
int i;
|
||||
|
||||
assert(game::Scr_IsInOpcodeMemory(inst, codepos));
|
||||
|
||||
game::Com_PrintError(channel, "\n******* script runtime error *******\n%s: ", msg);
|
||||
game::Scr_PrintPrevCodePos(codepos, inst, channel, index);
|
||||
functionCount = game::gScrVmPub[inst].function_count;
|
||||
if (functionCount)
|
||||
{
|
||||
for (i = game::gScrVmPub[inst].function_count - 1;
|
||||
i >= 1;
|
||||
--i)
|
||||
{
|
||||
game::Com_PrintError(channel, "called from:\n");
|
||||
game::Scr_PrintPrevCodePos(game::gScrVmPub[inst].function_frame_start[i].fs.pos, inst, game::CON_CHANNEL_DONT_FILTER, game::gScrVmPub[inst].function_frame_start[i].fs.localId == 0);
|
||||
}
|
||||
|
||||
game::Com_PrintError(channel, "started from:\n");
|
||||
game::Scr_PrintPrevCodePos(game::gScrVmPub[inst].function_frame_start[0].fs.pos, inst, game::CON_CHANNEL_DONT_FILTER, 1u);
|
||||
}
|
||||
game::Com_PrintError(channel, "************************************\n");
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void RuntimeError(game::scriptInstance_t inst, const char* codePos, int index, const char* msg, const char* dialogMessage)
|
||||
{
|
||||
bool abort_or_terminal;
|
||||
const char* errNewline;
|
||||
const char* errNewline2;
|
||||
|
||||
if (!game::gScrVarPub[inst].developer)
|
||||
{
|
||||
assert(game::Scr_IsInOpcodeMemory(inst, codePos));
|
||||
|
||||
if (!game::gScrVmPub[inst].terminal_error)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (game::gScrVmPub[inst].debugCode)
|
||||
{
|
||||
game::Com_Printf(game::CON_CHANNEL_PARSERSCRIPT, "%s\n", msg);
|
||||
|
||||
if (!game::gScrVmPub[inst].terminal_error)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
abort_or_terminal = game::gScrVmPub[inst].abort_on_error || game::gScrVmPub[inst].terminal_error;
|
||||
game::RuntimeErrorInternal(
|
||||
msg,
|
||||
inst,
|
||||
abort_or_terminal ? game::CON_CHANNEL_PARSERSCRIPT : game::CON_CHANNEL_LOGFILEONLY,
|
||||
codePos,
|
||||
index);
|
||||
|
||||
if (!abort_or_terminal)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// pluto
|
||||
if (!game::gScrVmPub[inst].terminal_error)
|
||||
{
|
||||
return;
|
||||
}
|
||||
//
|
||||
|
||||
errNewline = dialogMessage;
|
||||
if (dialogMessage)
|
||||
{
|
||||
errNewline2 = "\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
errNewline = "";
|
||||
errNewline2 = "";
|
||||
}
|
||||
|
||||
game::Com_Error(
|
||||
game::gScrVmPub[inst].terminal_error ? game::ERR_FATAL : game::ERR_SCRIPT,
|
||||
"\x15" "script runtime error\n(see console for details)\n%s%s%s",
|
||||
msg,
|
||||
errNewline2,
|
||||
errNewline);
|
||||
}
|
||||
}
|
@@ -1,31 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
void Scr_InitOpcodeLookup(game::scriptInstance_t a1);
|
||||
void Scr_ShutdownOpcodeLookup(game::scriptInstance_t a1);
|
||||
void AddOpcodePos(game::scriptInstance_t a1, unsigned int sourcePos, int type);
|
||||
void RemoveOpcodePos(game::scriptInstance_t result);
|
||||
void AddThreadStartOpcodePos(game::scriptInstance_t result, unsigned int sourcePos);
|
||||
unsigned int Scr_GetSourceBuffer(game::scriptInstance_t a1, const char* codePos);
|
||||
unsigned int Scr_GetLineNumInternal(const char** startLine, const char* buf, const char* sourcePos, int* col);
|
||||
game::SourceBufferInfo* Scr_GetNewSourceBuffer(game::scriptInstance_t a1);
|
||||
void Scr_AddSourceBufferInternal(const char* filename, game::scriptInstance_t inst, const char* codepos, char* buffer, int len, int archive);
|
||||
char* Scr_ReadFile_FastFile(game::scriptInstance_t inst, int unused, char* filename, const char* codepos, int archive);
|
||||
char* Scr_ReadFile_LoadObj(game::scriptInstance_t inst, int unused_arg1, const char* filename, const char* codepos, int archive);
|
||||
char* Scr_ReadFile(const char* codepos, char* filename, game::scriptInstance_t inst, int unused);
|
||||
char* Scr_AddSourceBuffer(game::scriptInstance_t inst, int unused_arg1, char* filename, const char* codepos);
|
||||
void Scr_CopyFormattedLine(const char* rawLine, char* line);
|
||||
unsigned int Scr_GetLineInfo(int* col, const char* buf, unsigned int sourcePos, char* line);
|
||||
void Scr_PrintSourcePos(unsigned int sourcePos, const char* buf, game::con_channel_e channel, game::scriptInstance_t a4, const char* file);
|
||||
game::OpcodeLookup * Scr_GetPrevSourcePosOpcodeLookup(game::scriptInstance_t a1, const char* codePos);
|
||||
void Scr_GetTextSourcePos(char* line, const char* codePos, game::scriptInstance_t a3);
|
||||
void Scr_PrintPrevCodePos(const char* codepos, game::scriptInstance_t scriptInstance, game::con_channel_e channel, unsigned int index);
|
||||
void CompileError(game::scriptInstance_t a1, unsigned int codePos, const char* msg, ...);
|
||||
void CompileError2(const char* codePos, game::scriptInstance_t a2, const char* msg, ...);
|
||||
void RuntimeErrorInternal(const char* msg, game::scriptInstance_t inst, game::con_channel_e channel, const char* codepos, int index);
|
||||
void RuntimeError(game::scriptInstance_t inst, const char* pos, int error_index, const char* err, const char* err2);
|
||||
|
||||
unsigned int Scr_GetPrevSourcePos(game::scriptInstance_t inst, const char* codePos, unsigned int index);
|
||||
void Scr_ShutdownAllocNode(game::scriptInstance_t inst);
|
||||
}
|
@@ -1,191 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "clientscript_public.hpp"
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
// Decomp Status: Tested, Completed
|
||||
void Scr_InitAllocNode(game::scriptInstance_t inst)
|
||||
{
|
||||
game::HunkUser* nodeUser;
|
||||
|
||||
assert(!game::g_allocNodeUser[inst]);
|
||||
|
||||
nodeUser = game::Hunk_UserCreate(0x10000, "Scr_InitAllocNode", false, true, false, 7);
|
||||
game::g_allocNodeUser[inst] = nodeUser;
|
||||
}
|
||||
|
||||
// Restored function
|
||||
game::sval_u* Scr_AllocNode(game::scriptInstance_t inst, int size)
|
||||
{
|
||||
assert(game::g_allocNodeUser[inst]);
|
||||
|
||||
return (game::sval_u*)game::Hunk_UserAlloc(game::g_allocNodeUser[inst], 4 * size, 4);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::sval_u node0()
|
||||
{
|
||||
game::sval_u result;
|
||||
|
||||
result.node = game::Scr_AllocNode(*game::gInst, 1);
|
||||
result.node[0].intValue = game::ENUM_NOP;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::sval_u node1(game::scr_enum_t type, game::sval_u val1)
|
||||
{
|
||||
game::sval_u result;
|
||||
|
||||
result.node = game::Scr_AllocNode(*game::gInst, 2);
|
||||
result.node[0].intValue = type;
|
||||
result.node[1].node = val1.node;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::sval_u node2(game::scr_enum_t type, game::sval_u val1, game::sval_u val2)
|
||||
{
|
||||
game::sval_u result;
|
||||
|
||||
result.node = game::Scr_AllocNode(*game::gInst, 3);
|
||||
result.node[0].intValue = type;
|
||||
result.node[1].node = val1.node;
|
||||
result.node[2].node = val2.node;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::sval_u node3(game::scr_enum_t type, game::sval_u val1, game::sval_u val2, game::sval_u val3)
|
||||
{
|
||||
game::sval_u result;
|
||||
|
||||
result.node = game::Scr_AllocNode(*game::gInst,4);
|
||||
result.node[0].intValue = type;
|
||||
result.node[1].node = val1.node;
|
||||
result.node[2].node = val2.node;
|
||||
result.node[3].node = val3.node;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::sval_u node4(game::scr_enum_t type, game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4)
|
||||
{
|
||||
game::sval_u result;
|
||||
|
||||
result.node = game::Scr_AllocNode(*game::gInst, 5);
|
||||
result.node[0].intValue = type;
|
||||
result.node[1].node = val1.node;
|
||||
result.node[2].node = val2.node;
|
||||
result.node[3].node = val3.node;
|
||||
result.node[4].node = val4.node;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::sval_u node5(game::scr_enum_t type, game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4, game::sval_u val5)
|
||||
{
|
||||
game::sval_u result;
|
||||
|
||||
result.node = game::Scr_AllocNode(*game::gInst, 6);
|
||||
result.node[0].intValue = type;
|
||||
result.node[1].node = val1.node;
|
||||
result.node[2].node = val2.node;
|
||||
result.node[3].node = val3.node;
|
||||
result.node[4].node = val4.node;
|
||||
result.node[5].node = val5.node;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::sval_u node6(game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4, game::sval_u val5, game::sval_u val6)
|
||||
{
|
||||
game::sval_u result;
|
||||
|
||||
result.node = game::Scr_AllocNode(*game::gInst, 7);
|
||||
result.node[0].intValue = game::ENUM_thread;
|
||||
result.node[1].node = val1.node;
|
||||
result.node[2].node = val2.node;
|
||||
result.node[3].node = val3.node;
|
||||
result.node[4].node = val4.node;
|
||||
result.node[5].node = val5.node;
|
||||
result.node[6].node = val6.node;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::sval_u node7(game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4, game::sval_u val5, game::sval_u val6, game::sval_u val7)
|
||||
{
|
||||
game::sval_u result;
|
||||
|
||||
result.node = game::Scr_AllocNode(*game::gInst, 8);
|
||||
result.node[0].intValue = game::ENUM_if_else;
|
||||
result.node[1].node = val1.node;
|
||||
result.node[2].node = val2.node;
|
||||
result.node[3].node = val3.node;
|
||||
result.node[4].node = val4.node;
|
||||
result.node[5].node = val5.node;
|
||||
result.node[6].node = val6.node;
|
||||
result.node[7].node = val7.node;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::sval_u node8(game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4, game::sval_u val5, game::sval_u val6, game::sval_u val7, game::sval_u val8)
|
||||
{
|
||||
game::sval_u result;
|
||||
|
||||
result.node = game::Scr_AllocNode(*game::gInst, 9);
|
||||
result.node[0].intValue = game::ENUM_for;
|
||||
result.node[1].node = val1.node;
|
||||
result.node[2].node = val2.node;
|
||||
result.node[3].node = val3.node;
|
||||
result.node[4].node = val4.node;
|
||||
result.node[5].node = val5.node;
|
||||
result.node[6].node = val6.node;
|
||||
result.node[7].node = val7.node;
|
||||
result.node[8].node = val8.node;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::sval_u linked_list_end(game::sval_u val1)
|
||||
{
|
||||
game::sval_u* node;
|
||||
game::sval_u result;
|
||||
|
||||
node = game::Scr_AllocNode(*game::gInst, 2);
|
||||
node[0].node = val1.node;
|
||||
node[1].stringValue = 0;
|
||||
result.node = game::Scr_AllocNode(*game::gInst, 2);
|
||||
result.node[0].node = node;
|
||||
result.node[1].node = node;
|
||||
return result;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::sval_u prepend_node(game::sval_u val1, game::sval_u val2)
|
||||
{
|
||||
game::sval_u* node;
|
||||
|
||||
node = game::Scr_AllocNode(*game::gInst, 2);
|
||||
node[0] = val1;
|
||||
node[1] = *val2.node;
|
||||
val2.node->node = node;
|
||||
return val2;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
game::sval_u append_node(game::sval_u val1, game::sval_u val2)
|
||||
{
|
||||
game::sval_u* node;
|
||||
|
||||
node = game::Scr_AllocNode(*game::gInst, 2);
|
||||
node[0] = val2;
|
||||
node[1].stringValue = 0;
|
||||
val1.node[1].node[1].stringValue = (unsigned int)node;
|
||||
val1.node[1].node = node;
|
||||
return val1;
|
||||
}
|
||||
|
||||
}
|
@@ -1,19 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
void Scr_InitAllocNode(game::scriptInstance_t inst);
|
||||
game::sval_u* Scr_AllocNode(game::scriptInstance_t inst, int size);
|
||||
game::sval_u node0();
|
||||
game::sval_u node1(game::scr_enum_t type, game::sval_u val1);
|
||||
game::sval_u node2(game::scr_enum_t type, game::sval_u val1, game::sval_u val2);
|
||||
game::sval_u node3(game::scr_enum_t type, game::sval_u val1, game::sval_u val2, game::sval_u val3);
|
||||
game::sval_u node4(game::scr_enum_t type, game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4);
|
||||
game::sval_u node5(game::scr_enum_t type, game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4, game::sval_u val5);
|
||||
game::sval_u node6(game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4, game::sval_u val5, game::sval_u val6);
|
||||
game::sval_u node7(game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4, game::sval_u val5, game::sval_u val6, game::sval_u val7);
|
||||
game::sval_u node8(game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4, game::sval_u val5, game::sval_u val6, game::sval_u val7, game::sval_u val8);
|
||||
game::sval_u linked_list_end(game::sval_u val1);
|
||||
game::sval_u prepend_node(game::sval_u val1, game::sval_u val2);
|
||||
game::sval_u append_node(game::sval_u val1, game::sval_u val2);
|
||||
}
|
@@ -1,117 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "clientscript_public.hpp"
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
// Restored
|
||||
unsigned int FindVariableIndexInternal(game::scriptInstance_t inst, unsigned int parentId, unsigned int name)
|
||||
{
|
||||
game::VariableValueInternal* parentValue;
|
||||
|
||||
assert(parentId);
|
||||
|
||||
parentValue = &game::gScrVarGlob[inst].parentVariables[parentId + 1];
|
||||
|
||||
assert((parentValue->w.status & VAR_STAT_MASK) == VAR_STAT_EXTERNAL);
|
||||
|
||||
assert((parentValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(IsObject(parentValue));
|
||||
|
||||
return game::FindVariableIndexInternal2(inst, name, (parentId + name) % 0xFFFD + 1);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
unsigned int FindVariableIndexInternal2(game::scriptInstance_t inst, unsigned int name, unsigned int index)
|
||||
{
|
||||
unsigned int newIndex;
|
||||
game::VariableValueInternal* newEntryValue;
|
||||
game::VariableValueInternal* entryValue;
|
||||
game::Variable* entry;
|
||||
|
||||
entry = &game::gScrVarGlob[inst].childVariables[index].hash;
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].childVariables[entry->id];
|
||||
|
||||
assert((name & VAR_NAME_LOW_MASK) == 0);
|
||||
|
||||
assert(index < VARIABLELIST_CHILD_SIZE);
|
||||
|
||||
assert(entry->id < VARIABLELIST_CHILD_SIZE);
|
||||
|
||||
if ((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_HEAD)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(!IsObject(entryValue));
|
||||
|
||||
if (entryValue->w.status >> VAR_NAME_BIT_SHIFT == name)
|
||||
{
|
||||
return index;
|
||||
}
|
||||
|
||||
newIndex = entryValue->v.next;
|
||||
|
||||
for (entryValue = &game::gScrVarGlob[inst].childVariables[newIndex];
|
||||
entryValue != &game::gScrVarGlob[inst].childVariables[index];
|
||||
entryValue = &game::gScrVarGlob[inst].childVariables[newIndex])
|
||||
{
|
||||
newEntryValue = &game::gScrVarGlob[inst].childVariables[entryValue->hash.id];
|
||||
|
||||
assert((newEntryValue->w.status & VAR_STAT_MASK) == VAR_STAT_MOVABLE);
|
||||
|
||||
assert((newEntryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(!IsObject(newEntryValue));
|
||||
|
||||
if (newEntryValue->w.status >> VAR_NAME_BIT_SHIFT == name)
|
||||
{
|
||||
return newIndex;
|
||||
}
|
||||
|
||||
newIndex = newEntryValue->v.next;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
unsigned int FindLastSibling(unsigned int parentId, game::scriptInstance_t inst)
|
||||
{
|
||||
game::VariableValueInternal* parentValue;
|
||||
unsigned int nextParentVarIndex;
|
||||
unsigned int id;
|
||||
unsigned int childVarName;
|
||||
unsigned int index;
|
||||
|
||||
assert(parentId);
|
||||
|
||||
parentValue = &game::gScrVarGlob[inst].parentVariables[parentId + 1];
|
||||
|
||||
assert((parentValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(IsObject(parentValue));
|
||||
|
||||
assert(((parentValue->w.status & VAR_STAT_MASK) == VAR_STAT_EXTERNAL));
|
||||
|
||||
nextParentVarIndex = parentValue->v.next + 1;
|
||||
|
||||
id = game::gScrVarGlob[inst].parentVariables[nextParentVarIndex].hash.u.prev;
|
||||
|
||||
if (!id)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
childVarName = game::gScrVarGlob[inst].childVariables[id].w.status >> VAR_NAME_BIT_SHIFT;
|
||||
|
||||
index = game::FindVariableIndexInternal(inst, parentId, childVarName);
|
||||
|
||||
assert(index);
|
||||
|
||||
return index;
|
||||
}
|
||||
}
|
@@ -1,8 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
unsigned int FindVariableIndexInternal2(game::scriptInstance_t inst, unsigned int name, unsigned int index);
|
||||
unsigned int FindLastSibling(unsigned int parentId, game::scriptInstance_t inst);
|
||||
unsigned int FindVariableIndexInternal(game::scriptInstance_t inst, unsigned int parentId, unsigned int name);
|
||||
}
|
@@ -1,828 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "clientscript_public.hpp"
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
// Restored
|
||||
game::RefString* GetRefString(game::scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
assert(id);
|
||||
|
||||
assert((id * MT_NODE_SIZE) < MT_SIZE);
|
||||
|
||||
return (game::RefString*)&game::gScrMemTreePub[inst].mt_buffer->nodes[id];
|
||||
}
|
||||
|
||||
// Restored
|
||||
game::RefString * GetRefString_0([[maybe_unused]] game::scriptInstance_t inst, const char *str)
|
||||
{
|
||||
assert(str >= (char*)game::gScrMemTreePub[inst].mt_buffer && str < (char*)(game::gScrMemTreePub[inst].mt_buffer + MT_SIZE));
|
||||
|
||||
return (game::RefString *)(str - 4);
|
||||
}
|
||||
|
||||
// Restored
|
||||
int SL_ConvertFromRefString(game::scriptInstance_t inst, game::RefString *refString)
|
||||
{
|
||||
return ((char *)refString - (char *)game::gScrMemTreePub[inst].mt_buffer) / MT_NODE_SIZE;
|
||||
}
|
||||
|
||||
// Restored
|
||||
int SL_ConvertFromString(game::scriptInstance_t inst, const char *str)
|
||||
{
|
||||
game::RefString *v2;
|
||||
|
||||
assert(str);
|
||||
|
||||
v2 = game::GetRefString_0(inst, str);
|
||||
return game::SL_ConvertFromRefString(inst, v2);
|
||||
}
|
||||
|
||||
// Restored
|
||||
const char* SL_ConvertToStringSafe(unsigned int id, game::scriptInstance_t inst)
|
||||
{
|
||||
if (!id)
|
||||
{
|
||||
return "(NULL)";
|
||||
}
|
||||
|
||||
return game::GetRefString(inst, id)->str;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
char* SL_ConvertToString(unsigned int id, game::scriptInstance_t inst)
|
||||
{
|
||||
//assert((!id || !game::gScrStringDebugGlob[inst] || game::gScrStringDebugGlob[inst]->refCount[id]));
|
||||
|
||||
if (!id)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return game::GetRefString(inst, id)->str;
|
||||
}
|
||||
|
||||
// Restored
|
||||
int SL_GetRefStringLen(game::RefString* refString)
|
||||
{
|
||||
int len;
|
||||
|
||||
if (!refString->u.s.byteLen)
|
||||
{
|
||||
len = 256 - 1; //Bugfix for 256 % 256 = 0 or 512 % 256 = 0 or... Just promote it to 256
|
||||
}
|
||||
else
|
||||
{
|
||||
len = refString->u.s.byteLen - 1;
|
||||
}
|
||||
|
||||
while (refString->str[len])
|
||||
{
|
||||
len += 256;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
int SL_GetStringLen(unsigned int stringValue, game::scriptInstance_t inst)
|
||||
{
|
||||
game::RefString *refString;
|
||||
|
||||
assert(stringValue);
|
||||
|
||||
refString = game::GetRefString(inst, stringValue);
|
||||
|
||||
return game::SL_GetRefStringLen(refString);
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int GetHashCode(unsigned int len, const char* str)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (len >= 0x100)
|
||||
{
|
||||
return (len >> 2) % 0x61A7 + 1;
|
||||
}
|
||||
for (i = 0; len; --len)
|
||||
{
|
||||
i = 31 * i + *str++;
|
||||
}
|
||||
return i % 0x61A7 + 1;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void SL_Init(game::scriptInstance_t inst)
|
||||
{
|
||||
unsigned int hash;
|
||||
game::HashEntry *entry;
|
||||
unsigned int prev;
|
||||
|
||||
assert(!game::gScrStringGlob[inst].inited);
|
||||
|
||||
game::MT_Init(inst);
|
||||
game::Sys_EnterCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
|
||||
game::gScrStringGlob[inst].hashTable[0].status_next = 0;
|
||||
|
||||
prev = 0;
|
||||
for (hash = 1;
|
||||
hash < HASH_MAX_HASHES;
|
||||
++hash)
|
||||
{
|
||||
assert(!(hash & HASH_STAT_MASK));
|
||||
|
||||
entry = &game::gScrStringGlob[inst].hashTable[hash];
|
||||
entry->status_next = 0;
|
||||
game::gScrStringGlob[inst].hashTable[prev].status_next |= hash;
|
||||
entry->u.prev = prev;
|
||||
prev = hash;
|
||||
}
|
||||
|
||||
assert(!(game::gScrStringGlob[inst].hashTable[prev].status_next));
|
||||
|
||||
game::gScrStringGlob[inst].hashTable[0].u.prev = prev;
|
||||
game::gScrStringGlob[inst].inited = 1;
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int SL_FindStringOfSize(game::scriptInstance_t inst, const char* str, unsigned int len)
|
||||
{
|
||||
unsigned int stringValue;
|
||||
game::HashEntry *entry;
|
||||
int hash;
|
||||
unsigned int newIndex;
|
||||
game::RefString *refStr;
|
||||
game::RefString *refStra;
|
||||
unsigned int prev;
|
||||
game::HashEntry *newEntry;
|
||||
|
||||
assert(str);
|
||||
|
||||
hash = game::GetHashCode(len, str);
|
||||
game::Sys_EnterCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
entry = &game::gScrStringGlob[inst].hashTable[hash];
|
||||
|
||||
if ( (entry->status_next & HASH_STAT_MASK) != HASH_STAT_HEAD )
|
||||
{
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
return 0;
|
||||
}
|
||||
|
||||
refStr = game::GetRefString(inst, entry->u.prev);
|
||||
if ( (unsigned char)refStr->u.s.byteLen != (unsigned char)len || memcmp(refStr->str, str, len) )
|
||||
{
|
||||
prev = hash;
|
||||
newIndex = (unsigned short)entry->status_next;
|
||||
|
||||
for ( newEntry = &game::gScrStringGlob[inst].hashTable[newIndex];
|
||||
newEntry != entry;
|
||||
newEntry = &game::gScrStringGlob[inst].hashTable[newIndex] )
|
||||
{
|
||||
assert((newEntry->status_next & HASH_STAT_MASK) == HASH_STAT_MOVABLE);
|
||||
|
||||
refStra = game::GetRefString(inst, newEntry->u.prev);
|
||||
|
||||
if ( (unsigned char)refStra->u.s.byteLen == (unsigned char)len && !memcmp(refStra->str, str, len) )
|
||||
{
|
||||
game::gScrStringGlob[inst].hashTable[prev].status_next = (unsigned short)newEntry->status_next | game::gScrStringGlob[inst].hashTable[prev].status_next & HASH_STAT_MASK;
|
||||
newEntry->status_next = (unsigned short)entry->status_next | newEntry->status_next & HASH_STAT_MASK;
|
||||
entry->status_next = newIndex | entry->status_next & HASH_STAT_MASK;
|
||||
stringValue = newEntry->u.prev;
|
||||
newEntry->u.prev = entry->u.prev;
|
||||
entry->u.prev = stringValue;
|
||||
|
||||
assert((newEntry->status_next & HASH_STAT_MASK) != HASH_STAT_FREE);
|
||||
|
||||
assert((entry->status_next & HASH_STAT_MASK) != HASH_STAT_FREE);
|
||||
|
||||
assert(refStra->str == game::SL_ConvertToString(stringValue, inst));
|
||||
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
return stringValue;
|
||||
}
|
||||
|
||||
prev = newIndex;
|
||||
newIndex = (unsigned short)newEntry->status_next;
|
||||
}
|
||||
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
return 0;
|
||||
}
|
||||
|
||||
assert((entry->status_next & HASH_STAT_MASK) != HASH_STAT_FREE);
|
||||
|
||||
stringValue = entry->u.prev;
|
||||
|
||||
assert(refStr->str == game::SL_ConvertToString(stringValue, inst));
|
||||
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
return stringValue;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int SL_FindString(const char* str, game::scriptInstance_t inst)
|
||||
{
|
||||
return game::SL_FindStringOfSize(inst, str, strlen(str) + 1);
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int SL_FindLowercaseString(const char* str, game::scriptInstance_t inst)
|
||||
{
|
||||
char stra[8196];
|
||||
unsigned int len;
|
||||
int i;
|
||||
|
||||
len = strlen(str) + 1;
|
||||
|
||||
if ( (int)len > 0x2000 )
|
||||
return 0;
|
||||
|
||||
for ( i = 0;
|
||||
i < (int)len;
|
||||
++i )
|
||||
{
|
||||
stra[i] = (char)tolower(str[i]);
|
||||
}
|
||||
|
||||
return game::SL_FindStringOfSize(inst, stra, len);
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void SL_AddUserInternal(unsigned int user, game::RefString* refStr)
|
||||
{
|
||||
unsigned __int32 data;
|
||||
|
||||
if ( ((unsigned __int8)user & (unsigned __int8)refStr->u.s.user) == 0 )
|
||||
{
|
||||
do
|
||||
data = refStr->u.data;
|
||||
while ( InterlockedCompareExchange((volatile unsigned int*)&refStr->u.data, data | (user << 16), data) != data);
|
||||
|
||||
InterlockedExchangeAdd((volatile unsigned int*)&refStr->u.data, 1u);
|
||||
}
|
||||
}
|
||||
|
||||
// Restored
|
||||
void SL_AddUser(unsigned int stringValue, unsigned int user, game::scriptInstance_t inst)
|
||||
{
|
||||
game::RefString *refStr;
|
||||
|
||||
refStr = game::GetRefString(inst, stringValue);
|
||||
game::SL_AddUserInternal(user, refStr);
|
||||
}
|
||||
|
||||
// Decomp Status: Untested unknown how to test, completed
|
||||
void Mark_ScriptStringCustom(unsigned int var)
|
||||
{
|
||||
game::SL_AddUser(var, 4u, game::SCRIPTINSTANCE_SERVER);
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int SL_GetStringOfSize(game::scriptInstance_t inst, const char* str, unsigned int user, unsigned int len)
|
||||
{
|
||||
unsigned int stringValue;
|
||||
game::HashEntry* entry;
|
||||
unsigned int newNext;
|
||||
unsigned int newNexta;
|
||||
int hash;
|
||||
unsigned int newIndex;
|
||||
unsigned int newIndexa;
|
||||
unsigned int newIndexb;
|
||||
game::RefString *refStr;
|
||||
game::RefString *refStra;
|
||||
game::RefString *refStrb;
|
||||
unsigned int nexta;
|
||||
unsigned int next;
|
||||
unsigned int prev;
|
||||
unsigned int prevb;
|
||||
unsigned int preva;
|
||||
game::HashEntry *newEntry;
|
||||
game::HashEntry *newEntrya;
|
||||
game::HashEntry *newEntryb;
|
||||
|
||||
assert(str);
|
||||
|
||||
hash = game::GetHashCode(len, str);
|
||||
game::Sys_EnterCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
entry = &game::gScrStringGlob[inst].hashTable[hash];
|
||||
|
||||
if ( (entry->status_next & HASH_STAT_MASK) == HASH_STAT_HEAD )
|
||||
{
|
||||
refStr = game::GetRefString(inst, entry->u.prev);
|
||||
|
||||
if ( (unsigned char)refStr->u.s.byteLen == (unsigned char)len && !memcmp(refStr->str, str, len) )
|
||||
{
|
||||
game::SL_AddUserInternal(user, refStr);
|
||||
|
||||
assert((entry->status_next & HASH_STAT_MASK) != HASH_STAT_FREE);
|
||||
|
||||
stringValue = entry->u.prev;
|
||||
|
||||
assert(refStr->str == game::SL_ConvertToString(stringValue, inst));
|
||||
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
return stringValue;
|
||||
}
|
||||
|
||||
prev = hash;
|
||||
newIndex = (unsigned short)entry->status_next;
|
||||
for ( newEntry = &game::gScrStringGlob[inst].hashTable[newIndex];
|
||||
newEntry != entry;
|
||||
newEntry = &game::gScrStringGlob[inst].hashTable[newIndex] )
|
||||
{
|
||||
assert((newEntry->status_next & HASH_STAT_MASK) == HASH_STAT_MOVABLE);
|
||||
|
||||
refStra = game::GetRefString(inst, newEntry->u.prev);
|
||||
|
||||
if ( (unsigned char)refStra->u.s.byteLen == (unsigned char)len && !memcmp(refStra->str, str, len) )
|
||||
{
|
||||
game::gScrStringGlob[inst].hashTable[prev].status_next = (unsigned short)newEntry->status_next | game::gScrStringGlob[inst].hashTable[prev].status_next & HASH_STAT_MASK;
|
||||
newEntry->status_next = (unsigned short)entry->status_next | newEntry->status_next & HASH_STAT_MASK;
|
||||
entry->status_next = newIndex | entry->status_next & HASH_STAT_MASK;
|
||||
stringValue = newEntry->u.prev;
|
||||
newEntry->u.prev = entry->u.prev;
|
||||
entry->u.prev = stringValue;
|
||||
game::SL_AddUserInternal(user, refStra);
|
||||
|
||||
assert((newEntry->status_next & HASH_STAT_MASK) != HASH_STAT_FREE);
|
||||
|
||||
assert((entry->status_next & HASH_STAT_MASK) != HASH_STAT_FREE);
|
||||
|
||||
assert(refStra->str == game::SL_ConvertToString(stringValue, inst));
|
||||
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
return stringValue;
|
||||
}
|
||||
|
||||
prev = newIndex;
|
||||
newIndex = (unsigned short)newEntry->status_next;
|
||||
}
|
||||
|
||||
newIndexa = game::gScrStringGlob[inst].hashTable->status_next;
|
||||
if ( !newIndexa )
|
||||
{
|
||||
game::Scr_DumpScriptThreads(inst);
|
||||
game::Com_Error(game::ERR_DROP, "\x15" "exceeded maximum number of script strings\n");
|
||||
}
|
||||
|
||||
stringValue = game::MT_AllocIndex(inst, len + 4);
|
||||
newEntrya = &game::gScrStringGlob[inst].hashTable[newIndexa];
|
||||
|
||||
assert((newEntrya->status_next & HASH_STAT_MASK) == HASH_STAT_FREE);
|
||||
|
||||
newNext = (unsigned short)newEntrya->status_next;
|
||||
game::gScrStringGlob[inst].hashTable->status_next = newNext;
|
||||
game::gScrStringGlob[inst].hashTable[newNext].u.prev = 0;
|
||||
newEntrya->status_next = (unsigned short)entry->status_next | HASH_STAT_MOVABLE;
|
||||
entry->status_next = (unsigned short)newIndexa | entry->status_next & HASH_STAT_MASK;
|
||||
newEntrya->u.prev = entry->u.prev;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( (entry->status_next & HASH_STAT_MASK) != HASH_STAT_FREE )
|
||||
{
|
||||
assert((entry->status_next & HASH_STAT_MASK) == HASH_STAT_MOVABLE);
|
||||
|
||||
next = (unsigned short)entry->status_next;
|
||||
for ( preva = next;
|
||||
(unsigned short)game::gScrStringGlob[inst].hashTable[preva].status_next != hash;
|
||||
preva = (unsigned short)game::gScrStringGlob[inst].hashTable[preva].status_next )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
assert(preva);
|
||||
|
||||
newIndexb = game::gScrStringGlob[inst].hashTable->status_next;
|
||||
if ( !newIndexb )
|
||||
{
|
||||
game::Scr_DumpScriptThreads(inst);
|
||||
game::Com_Error(game::ERR_DROP, "\x15" "exceeded maximum number of script strings\n");
|
||||
}
|
||||
|
||||
stringValue = game::MT_AllocIndex(inst, len + 4);
|
||||
newEntryb = &game::gScrStringGlob[inst].hashTable[newIndexb];
|
||||
|
||||
assert((newEntryb->status_next & HASH_STAT_MASK) == HASH_STAT_FREE);
|
||||
|
||||
newNexta = (unsigned short)newEntryb->status_next;
|
||||
game::gScrStringGlob[inst].hashTable->status_next = newNexta;
|
||||
game::gScrStringGlob[inst].hashTable[newNexta].u.prev = 0;
|
||||
game::gScrStringGlob[inst].hashTable[preva].status_next = newIndexb | game::gScrStringGlob[inst].hashTable[preva].status_next & HASH_STAT_MASK;
|
||||
newEntryb->status_next = next | HASH_STAT_MOVABLE;
|
||||
newEntryb->u.prev = entry->u.prev;
|
||||
}
|
||||
else
|
||||
{
|
||||
stringValue = game::MT_AllocIndex(inst, len + 4);
|
||||
prevb = entry->u.prev;
|
||||
nexta = (unsigned short)entry->status_next;
|
||||
game::gScrStringGlob[inst].hashTable[prevb].status_next = nexta | game::gScrStringGlob[inst].hashTable[prevb].status_next & HASH_STAT_MASK;
|
||||
game::gScrStringGlob[inst].hashTable[nexta].u.prev = prevb;
|
||||
}
|
||||
|
||||
assert((hash & HASH_STAT_MASK) == 0);
|
||||
|
||||
entry->status_next = hash | HASH_STAT_HEAD;
|
||||
}
|
||||
|
||||
assert(stringValue);
|
||||
|
||||
entry->u.prev = stringValue;
|
||||
|
||||
refStrb = game::GetRefString(inst, stringValue);
|
||||
memcpy(refStrb->str, str, len);
|
||||
|
||||
refStrb->u.s.user = user;
|
||||
assert(refStrb->u.s.user == user);
|
||||
refStrb->u.s.refCount = 1;
|
||||
refStrb->u.s.byteLen = len;
|
||||
|
||||
assert((entry->status_next & HASH_STAT_MASK) != HASH_STAT_FREE);
|
||||
assert(refStrb->str == game::SL_ConvertToString(stringValue, inst));
|
||||
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
return stringValue;
|
||||
}
|
||||
|
||||
// Decomp Status: Untested unknown how to test, Completed
|
||||
unsigned int SL_GetString_(const char* str, game::scriptInstance_t inst, unsigned int user)
|
||||
{
|
||||
return game::SL_GetStringOfSize(inst, str, user, strlen(str) + 1);
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int SL_GetString__0(const char* str, unsigned int user, game::scriptInstance_t inst)
|
||||
{
|
||||
return game::SL_GetStringOfSize(inst, str, user, strlen(str) + 1);
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int SL_GetLowercaseStringOfLen(game::scriptInstance_t inst, const char* str, unsigned int user, unsigned int len)
|
||||
{
|
||||
char stra[SL_MAX_STRING_LEN];
|
||||
unsigned int i;
|
||||
|
||||
if (len > SL_MAX_STRING_LEN)
|
||||
{
|
||||
game::Com_Error(game::ERR_DROP, "max string length exceeded: \"%s\"", str);
|
||||
}
|
||||
|
||||
for ( i = 0;
|
||||
i < len;
|
||||
++i )
|
||||
{
|
||||
stra[i] = (char)tolower(str[i]);
|
||||
}
|
||||
|
||||
return game::SL_GetStringOfSize(inst, stra, user, len);
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int SL_GetLowercaseString(const char* str)
|
||||
{
|
||||
return game::SL_GetLowercaseStringOfLen(game::SCRIPTINSTANCE_SERVER, str, 0, strlen(str) + 1);
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
unsigned int SL_ConvertToLowercase(game::scriptInstance_t inst, unsigned int stringVal, unsigned int user)
|
||||
{
|
||||
char *strCopy;
|
||||
char str[SL_MAX_STRING_LEN];
|
||||
unsigned int answer;
|
||||
unsigned int len;
|
||||
unsigned int i;
|
||||
|
||||
len = game::SL_GetStringLen(stringVal, inst) + 1;
|
||||
if ( len > SL_MAX_STRING_LEN)
|
||||
{
|
||||
return stringVal;
|
||||
}
|
||||
|
||||
strCopy = game::SL_ConvertToString(stringVal, inst);
|
||||
|
||||
for ( i = 0;
|
||||
i < len;
|
||||
++i )
|
||||
{
|
||||
str[i] = (char)tolower(strCopy[i]);
|
||||
}
|
||||
|
||||
answer = game::SL_GetStringOfSize(inst, str, user, len);
|
||||
game::SL_RemoveRefToString(stringVal, inst);
|
||||
return answer;
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void SL_TransferRefToUser(unsigned int stringValue, unsigned int user, game::scriptInstance_t inst)
|
||||
{
|
||||
unsigned int data;
|
||||
game::RefString *refStr;
|
||||
|
||||
refStr = game::GetRefString(inst, stringValue);
|
||||
if ( ((unsigned char)user & (unsigned char)refStr->u.s.user) != 0 )
|
||||
{
|
||||
InterlockedExchangeAdd((volatile unsigned int*)&refStr->u.data, 0xFFFFFFFF);
|
||||
}
|
||||
else
|
||||
{
|
||||
do
|
||||
data = refStr->u.data;
|
||||
while ( InterlockedCompareExchange((volatile unsigned int*)&refStr->u.data, data | (user << 16), data) != data );
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Completed
|
||||
void SL_FreeString(game::scriptInstance_t inst, unsigned int stringValue, game::RefString* refStr, unsigned int len)
|
||||
{
|
||||
game::HashEntry *entry;
|
||||
unsigned int newIndex;
|
||||
unsigned int newNext;
|
||||
int index;
|
||||
unsigned int prev;
|
||||
game::HashEntry *newEntry;
|
||||
|
||||
index = game::GetHashCode(len, refStr->str);
|
||||
game::Sys_EnterCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
|
||||
if ( !(unsigned short)refStr->u.s.refCount )
|
||||
{
|
||||
entry = &game::gScrStringGlob[inst].hashTable[index];
|
||||
game::MT_FreeIndex(len + 4, inst, stringValue);
|
||||
|
||||
assert(((entry->status_next & HASH_STAT_MASK) == HASH_STAT_HEAD));
|
||||
|
||||
newIndex = (unsigned short)entry->status_next;
|
||||
newEntry = &game::gScrStringGlob[inst].hashTable[newIndex];
|
||||
if ( entry->u.prev == stringValue )
|
||||
{
|
||||
if ( newEntry == entry )
|
||||
{
|
||||
newEntry = entry;
|
||||
newIndex = index;
|
||||
}
|
||||
else
|
||||
{
|
||||
entry->status_next = (unsigned short)newEntry->status_next | HASH_STAT_HEAD;
|
||||
entry->u.prev = newEntry->u.prev;
|
||||
game::gScrStringGlob[inst].nextFreeEntry = entry;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
prev = index;
|
||||
while ( 1 )
|
||||
{
|
||||
assert(newEntry != entry);
|
||||
|
||||
assert((newEntry->status_next & HASH_STAT_MASK) == HASH_STAT_MOVABLE);
|
||||
|
||||
if ( newEntry->u.prev == stringValue )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
prev = newIndex;
|
||||
newIndex = (unsigned short)newEntry->status_next;
|
||||
newEntry = &game::gScrStringGlob[inst].hashTable[newIndex];
|
||||
}
|
||||
|
||||
game::gScrStringGlob[inst].hashTable[prev].status_next = (unsigned short)newEntry->status_next | game::gScrStringGlob[inst].hashTable[prev].status_next & HASH_STAT_MASK;
|
||||
}
|
||||
|
||||
assert((newEntry->status_next & HASH_STAT_MASK) != HASH_STAT_FREE);
|
||||
|
||||
newNext = game::gScrStringGlob[inst].hashTable->status_next;
|
||||
|
||||
assert((newNext & HASH_STAT_MASK) == HASH_STAT_FREE);
|
||||
|
||||
newEntry->status_next = newNext;
|
||||
newEntry->u.prev = 0;
|
||||
game::gScrStringGlob[inst].hashTable[newNext].u.prev = newIndex;
|
||||
game::gScrStringGlob[inst].hashTable->status_next = newIndex;
|
||||
}
|
||||
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
}
|
||||
|
||||
// Restored
|
||||
void SL_RemoveRefToStringOfSize(game::scriptInstance_t inst, unsigned int stringValue, unsigned int len)
|
||||
{
|
||||
game::RefString *refStr;
|
||||
|
||||
refStr = game::GetRefString(inst, stringValue);
|
||||
if ( !(unsigned __int16)InterlockedDecrement((volatile unsigned int*)&refStr->u.data))
|
||||
{
|
||||
game::SL_FreeString(inst, stringValue, refStr, len);
|
||||
}
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void SL_RemoveRefToString(unsigned int stringVal, game::scriptInstance_t inst)
|
||||
{
|
||||
game::RefString *refStr;
|
||||
int len;
|
||||
|
||||
refStr = game::GetRefString(inst, stringVal);
|
||||
len = game::SL_GetRefStringLen(refStr) + 1;
|
||||
game::SL_RemoveRefToStringOfSize(inst, stringVal, len);
|
||||
}
|
||||
|
||||
// Restored
|
||||
void SL_AddRefToString(game::scriptInstance_t inst, unsigned int stringValue)
|
||||
{
|
||||
game::RefString* refStr = game::GetRefString(inst, stringValue);
|
||||
InterlockedExchangeAdd((volatile unsigned int*)&refStr->u.data, 1u);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void Scr_SetString(game::scriptInstance_t inst, unsigned int from, unsigned __int16* to)
|
||||
{
|
||||
if (from)
|
||||
{
|
||||
game::SL_AddRefToString(inst, from);
|
||||
}
|
||||
|
||||
if (*to)
|
||||
{
|
||||
game::SL_RemoveRefToString(*to, inst);
|
||||
}
|
||||
|
||||
*to = (unsigned short)from;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void Scr_SetStringFromCharString(const char* from, unsigned __int16* to)
|
||||
{
|
||||
if (*to)
|
||||
{
|
||||
game::SL_RemoveRefToString(*to, game::SCRIPTINSTANCE_SERVER);
|
||||
}
|
||||
|
||||
*to = (unsigned short)game::SL_GetString_(from, game::SCRIPTINSTANCE_SERVER, 0);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
unsigned int GScr_AllocString(const char* str, game::scriptInstance_t inst)
|
||||
{
|
||||
return game::SL_GetString_(str, inst, 1);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
unsigned int SL_GetStringForFloat(float floatVal, game::scriptInstance_t inst)
|
||||
{
|
||||
char Buffer[128];
|
||||
|
||||
sprintf_s(Buffer, "%g", floatVal);
|
||||
return game::SL_GetString_(Buffer, inst, 0);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
unsigned int SL_GetStringForInt(int intVal, game::scriptInstance_t inst)
|
||||
{
|
||||
char Buffer[128];
|
||||
|
||||
sprintf_s(Buffer, "%i", intVal);
|
||||
return game::SL_GetString_(Buffer, inst, 0);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
unsigned int SL_GetStringForVector(float* vector, game::scriptInstance_t inst)
|
||||
{
|
||||
char Buffer[128];
|
||||
|
||||
sprintf_s(Buffer, "(%g, %g, %g)", vector[0], vector[1], vector[2]);
|
||||
return game::SL_GetString_(Buffer, inst, 0);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void SL_ShutdownSystem(game::scriptInstance_t inst, unsigned int user)
|
||||
{
|
||||
unsigned int hash;
|
||||
game::HashEntry *entry;
|
||||
game::RefString *refStr;
|
||||
|
||||
assert(user);
|
||||
|
||||
game::Sys_EnterCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
|
||||
for ( hash = 1;
|
||||
hash < HASH_MAX_HASHES;
|
||||
++hash )
|
||||
{
|
||||
do
|
||||
{
|
||||
entry = &game::gScrStringGlob[inst].hashTable[hash];
|
||||
if ( (entry->status_next & HASH_STAT_MASK) == HASH_STAT_FREE )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
refStr = game::GetRefString(inst, entry->u.prev);
|
||||
if ( ((unsigned char)user & (unsigned char)refStr->u.s.user) == 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
refStr->u.s.user &= ~user;
|
||||
game::gScrStringGlob[inst].nextFreeEntry = 0;
|
||||
game::SL_RemoveRefToString(entry->u.prev, inst);
|
||||
}
|
||||
while ( game::gScrStringGlob[inst].nextFreeEntry );
|
||||
}
|
||||
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed, Optimized args
|
||||
void SL_TransferSystem()
|
||||
{
|
||||
unsigned int hash;
|
||||
game::HashEntry *entry;
|
||||
game::RefString* refStr;
|
||||
|
||||
// args
|
||||
int from = 4;
|
||||
int to = 8;
|
||||
game::scriptInstance_t inst = game::SCRIPTINSTANCE_SERVER;
|
||||
|
||||
assert(from);
|
||||
assert(to);
|
||||
|
||||
game::Sys_EnterCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
|
||||
for (hash = 1; hash < HASH_MAX_HASHES; hash++)
|
||||
{
|
||||
entry = &game::gScrStringGlob[inst].hashTable[hash];
|
||||
|
||||
if ((entry->status_next & HASH_STAT_MASK) != HASH_STAT_FREE)
|
||||
{
|
||||
refStr = game::GetRefString(inst, entry->u.prev);
|
||||
|
||||
if ( ((unsigned __int8)from & (unsigned __int8)refStr->u.s.user) != 0 )
|
||||
{
|
||||
refStr->u.s.user &= ~from;
|
||||
refStr->u.s.user |= to;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
game::Sys_LeaveCriticalSection(game::CRITSECT_SCRIPT_STRING);
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
void SL_CreateCanonicalFilename(const char* filename, char* newFilename)
|
||||
{
|
||||
int count;
|
||||
unsigned int c;
|
||||
|
||||
count = 1024;
|
||||
do
|
||||
{
|
||||
do
|
||||
{
|
||||
do
|
||||
{
|
||||
c = *filename++;
|
||||
} while (c == '\\');
|
||||
} while (c == '/');
|
||||
if (c >= ' ')
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
*newFilename++ = (char)tolower(c);
|
||||
if (!--count)
|
||||
{
|
||||
game::Com_Error(game::ERR_DROP, "\x15" "Filename '%s' exceeds maximum length of %d", filename, 0);
|
||||
}
|
||||
if (c == '/')
|
||||
{
|
||||
break;
|
||||
}
|
||||
c = *filename++;
|
||||
if (c == '\\')
|
||||
{
|
||||
c = '/';
|
||||
}
|
||||
else if (c < ' ')
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while (c);
|
||||
*newFilename = 0;
|
||||
}
|
||||
|
||||
// Decomp Status: Tested, Completed
|
||||
unsigned int Scr_CreateCanonicalFilename(game::scriptInstance_t inst, const char* filename)
|
||||
{
|
||||
char newFileName[1024];
|
||||
|
||||
game::SL_CreateCanonicalFilename(filename, newFileName);
|
||||
return game::SL_GetString_(newFileName, inst, 0);
|
||||
}
|
||||
}
|
@@ -1,42 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
char* SL_ConvertToString(unsigned int id, game::scriptInstance_t inst);
|
||||
int SL_GetStringLen(unsigned int a1, game::scriptInstance_t a2);
|
||||
unsigned int GetHashCode(unsigned int a1, const char* a2);
|
||||
void SL_Init(game::scriptInstance_t a1);
|
||||
unsigned int SL_FindStringOfSize(game::scriptInstance_t inst, const char* str, unsigned int len);
|
||||
unsigned int SL_FindString(const char* a1, game::scriptInstance_t a2);
|
||||
unsigned int SL_FindLowercaseString(const char* str, game::scriptInstance_t inst);
|
||||
void SL_AddUserInternal(unsigned int user, game::RefString* refStr);
|
||||
void Mark_ScriptStringCustom(unsigned int a1);
|
||||
unsigned int SL_GetStringOfSize(game::scriptInstance_t inst, const char* string, unsigned int user, unsigned int len);
|
||||
unsigned int SL_GetString_(const char* a1, game::scriptInstance_t a2, unsigned int user);
|
||||
unsigned int SL_GetString__0(const char* a1, unsigned int user, game::scriptInstance_t a3);
|
||||
unsigned int SL_GetLowercaseStringOfLen(game::scriptInstance_t a1, const char* ArgList, unsigned int user, unsigned int len);
|
||||
unsigned int SL_GetLowercaseString(const char* a2);
|
||||
unsigned int SL_ConvertToLowercase(game::scriptInstance_t inst, unsigned int stringVal, unsigned int user);
|
||||
void SL_TransferRefToUser(unsigned int stringValue, unsigned int user, game::scriptInstance_t inst);
|
||||
void SL_FreeString(game::scriptInstance_t inst, unsigned int stringValue, game::RefString* refStr, unsigned int len);
|
||||
void SL_RemoveRefToString(unsigned int stringVal, game::scriptInstance_t inst);
|
||||
void SL_AddRefToString(game::scriptInstance_t inst, unsigned int stringValue);
|
||||
void Scr_SetString(game::scriptInstance_t inst, unsigned int from, unsigned __int16* to);
|
||||
void Scr_SetStringFromCharString(const char* from, unsigned __int16* to);
|
||||
unsigned int GScr_AllocString(const char* a1, game::scriptInstance_t inst);
|
||||
unsigned int SL_GetStringForFloat(float floatVal, game::scriptInstance_t inst);
|
||||
unsigned int SL_GetStringForInt(int intVal, game::scriptInstance_t inst);
|
||||
unsigned int SL_GetStringForVector(float* vector, game::scriptInstance_t inst);
|
||||
void SL_ShutdownSystem(game::scriptInstance_t inst, unsigned int user);
|
||||
void SL_TransferSystem();
|
||||
void SL_CreateCanonicalFilename(const char* filename, char* newFilename);
|
||||
unsigned int Scr_CreateCanonicalFilename(game::scriptInstance_t inst, const char* filename);
|
||||
game::RefString* GetRefString(game::scriptInstance_t inst, unsigned int id);
|
||||
void SL_RemoveRefToStringOfSize(game::scriptInstance_t inst, unsigned int stringValue, unsigned int len);
|
||||
int SL_GetRefStringLen(game::RefString* refString);
|
||||
void SL_AddUser(unsigned int stringValue, unsigned int user, game::scriptInstance_t inst);
|
||||
int SL_ConvertFromString(game::scriptInstance_t inst, const char* str);
|
||||
int SL_ConvertFromRefString(game::scriptInstance_t inst, game::RefString* refString);
|
||||
game::RefString* GetRefString_0(game::scriptInstance_t inst, const char* str);
|
||||
const char* SL_ConvertToStringSafe(unsigned int id, game::scriptInstance_t inst);
|
||||
}
|
@@ -1,23 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "clientscript_public.hpp"
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
// Restored
|
||||
char* TempMalloc(int len)
|
||||
{
|
||||
return (char *)game::Hunk_UserAlloc(*game::g_user, len, 1);
|
||||
}
|
||||
|
||||
// Restored
|
||||
void TempMemoryReset(game::HunkUser* user)
|
||||
{
|
||||
*game::g_user = user;
|
||||
}
|
||||
|
||||
// Restored
|
||||
void TempMemorySetPos(char* pos)
|
||||
{
|
||||
(*game::g_user)->pos = (int)pos;
|
||||
}
|
||||
}
|
@@ -1,8 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
char* TempMalloc(int len);
|
||||
void TempMemoryReset(game::HunkUser* user);
|
||||
void TempMemorySetPos(char* pos);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@@ -1,141 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
int ThreadInfoCompare(const void* a1, const void* a2);
|
||||
void Scr_DumpScriptThreads(game::scriptInstance_t scriptInstance);
|
||||
void Scr_InitVariableRange(unsigned int a1, unsigned int a2, game::scriptInstance_t inst);
|
||||
void Scr_InitClassMap(game::scriptInstance_t inst);
|
||||
unsigned int GetNewVariableIndexInternal3(game::scriptInstance_t inst, unsigned int parentId, unsigned int name, unsigned int index);
|
||||
unsigned int GetNewVariableIndexInternal2(unsigned int name, game::scriptInstance_t inst, unsigned int parentId, unsigned int index);
|
||||
unsigned int GetNewVariableIndexReverseInternal2(unsigned int name, game::scriptInstance_t inst, unsigned int parentId, unsigned int index);
|
||||
void MakeVariableExternal(game::VariableValueInternal* parentValue, game::scriptInstance_t inst, unsigned int index);
|
||||
void FreeChildValue(unsigned int id, game::scriptInstance_t inst, unsigned int parentId);
|
||||
void ClearObjectInternal(game::scriptInstance_t inst, unsigned int parentId);
|
||||
void ClearObject(unsigned int a1, game::scriptInstance_t inst);
|
||||
void Scr_StopThread(game::scriptInstance_t inst, unsigned int a2);
|
||||
unsigned int GetSafeParentLocalId(game::scriptInstance_t inst, unsigned int a2);
|
||||
unsigned int GetStartLocalId(unsigned int result, game::scriptInstance_t inst);
|
||||
void Scr_KillThread(game::scriptInstance_t inst, unsigned int parentId_1);
|
||||
unsigned __int16 AllocVariable(game::scriptInstance_t inst);
|
||||
void FreeVariable(unsigned int a1, game::scriptInstance_t inst);
|
||||
unsigned int AllocValue(game::scriptInstance_t inst);
|
||||
unsigned int AllocEntity(game::classNum_e classnum, game::scriptInstance_t inst, int entnum, int clientnum);
|
||||
unsigned int Scr_AllocArray(game::scriptInstance_t a1);
|
||||
unsigned int AllocChildThread(game::scriptInstance_t inst, unsigned int a2, unsigned int a3);
|
||||
void FreeValue(unsigned int id, game::scriptInstance_t inst);
|
||||
void RemoveRefToObject(unsigned int id, game::scriptInstance_t inst);
|
||||
float* Scr_AllocVector(game::scriptInstance_t a1);
|
||||
void RemoveRefToVector(const float* vectorValue, game::scriptInstance_t inst);
|
||||
void AddRefToValue(game::scriptInstance_t inst, game::VariableType type, game::VariableUnion u);
|
||||
void RemoveRefToValueInternal(game::scriptInstance_t inst, game::VariableType type, game::VariableUnion a3);
|
||||
unsigned int FindArrayVariable(unsigned int id, unsigned int intvalue, game::scriptInstance_t inst);
|
||||
unsigned int FindVariable(unsigned int name, unsigned int a2, game::scriptInstance_t inst);
|
||||
unsigned int GetArrayVariableIndex(unsigned int unsignedValue, game::scriptInstance_t inst, unsigned int parentId);
|
||||
unsigned int Scr_GetVariableFieldIndex(game::scriptInstance_t inst, unsigned int name, unsigned int parentId);
|
||||
game::VariableValue Scr_FindVariableField(game::scriptInstance_t inst, unsigned int parentId, unsigned int name);
|
||||
void ClearVariableField(game::scriptInstance_t inst, unsigned int id, unsigned int name, game::VariableValue* value);
|
||||
unsigned int GetVariable(game::scriptInstance_t inst, unsigned int parentId, unsigned int name);
|
||||
unsigned int GetNewVariable(game::scriptInstance_t inst, unsigned int a2, unsigned int a3);
|
||||
unsigned int GetObjectVariable(unsigned int a1, game::scriptInstance_t inst, unsigned int parentId);
|
||||
unsigned int GetNewObjectVariable(game::scriptInstance_t inst, unsigned int name, unsigned int parentId);
|
||||
void RemoveVariable(unsigned int name, unsigned int parentId, game::scriptInstance_t inst);
|
||||
void RemoveNextVariable(game::scriptInstance_t inst, unsigned int parentId);
|
||||
void SafeRemoveVariable(unsigned int unsignedValue, unsigned int parentId, game::scriptInstance_t inst);
|
||||
void CopyArray(game::scriptInstance_t inst, unsigned int parentId, unsigned int newParentId);
|
||||
void SetVariableValue(game::scriptInstance_t inst, game::VariableValue* a2, unsigned int a3);
|
||||
void SetVariableEntityFieldValue(game::scriptInstance_t inst, unsigned int parentId, unsigned int name, game::VariableValue* a4);
|
||||
game::VariableValue Scr_EvalVariable(game::scriptInstance_t inst, unsigned int a2);
|
||||
unsigned int Scr_EvalVariableObject(game::scriptInstance_t inst, unsigned int a2);
|
||||
game::VariableValue Scr_EvalVariableEntityField(unsigned int entId, game::scriptInstance_t inst, unsigned int name);
|
||||
game::VariableValue Scr_EvalVariableField(game::scriptInstance_t inst, unsigned int id);
|
||||
void Scr_EvalSizeValue(game::scriptInstance_t inst, game::VariableValue* value);
|
||||
unsigned int GetObject(game::scriptInstance_t inst, unsigned int a2);
|
||||
unsigned int GetArray(game::scriptInstance_t inst, unsigned int a2);
|
||||
void Scr_EvalBoolComplement(game::scriptInstance_t inst, game::VariableValue* a2);
|
||||
void Scr_CastBool(game::scriptInstance_t inst, game::VariableValue* a2);
|
||||
char Scr_CastString(game::scriptInstance_t inst, game::VariableValue* a2);
|
||||
void Scr_CastDebugString(game::scriptInstance_t inst, game::VariableValue* a2);
|
||||
void Scr_ClearVector(game::scriptInstance_t inst, game::VariableValue* a2);
|
||||
void Scr_CastVector(game::scriptInstance_t inst, game::VariableValue* a2);
|
||||
game::VariableUnion Scr_EvalFieldObject(game::VariableValue* a1, game::scriptInstance_t inst, unsigned int a3);
|
||||
void Scr_UnmatchingTypesError(game::scriptInstance_t inst, game::VariableValue* a2, game::VariableValue* value);
|
||||
void Scr_CastWeakerPair(game::VariableValue* a1, game::VariableValue* a2, game::scriptInstance_t inst);
|
||||
void Scr_CastWeakerStringPair(game::VariableValue* a1, game::VariableValue* a2, game::scriptInstance_t inst);
|
||||
void Scr_EvalOr(game::VariableValue* result, game::VariableValue* a2, game::scriptInstance_t inst);
|
||||
void Scr_EvalExOr(game::VariableValue* result, game::VariableValue* a2, game::scriptInstance_t inst);
|
||||
void Scr_EvalAnd(game::VariableValue* result, game::VariableValue* a2, game::scriptInstance_t inst);
|
||||
void Scr_EvalEquality(game::VariableValue* a1, game::scriptInstance_t inst, game::VariableValue* a4);
|
||||
void Scr_EvalLess(game::VariableValue* a1, game::VariableValue* a2, game::scriptInstance_t inst);
|
||||
void Scr_EvalGreaterEqual(game::scriptInstance_t inst, game::VariableValue* a2, game::VariableValue* a3);
|
||||
void Scr_EvalGreater(game::VariableValue* a1, game::VariableValue* a2, game::scriptInstance_t inst);
|
||||
void Scr_EvalLessEqual(game::scriptInstance_t inst, game::VariableValue* a2, game::VariableValue* a3);
|
||||
void Scr_EvalShiftLeft(game::VariableValue* result, game::VariableValue* a2, game::scriptInstance_t inst);
|
||||
void Scr_EvalShiftRight(game::VariableValue* result, game::VariableValue* a2, game::scriptInstance_t inst);
|
||||
void Scr_EvalPlus(game::scriptInstance_t inst, game::VariableValue* a1, game::VariableValue* a2);
|
||||
void Scr_EvalMinus(game::VariableValue* a1, game::scriptInstance_t inst, game::VariableValue* a3);
|
||||
void Scr_EvalMultiply(game::VariableValue* a1, game::scriptInstance_t inst, game::VariableValue* a3);
|
||||
void Scr_EvalDivide(game::VariableValue* a1, game::scriptInstance_t inst, game::VariableValue* a3);
|
||||
void Scr_EvalMod(game::scriptInstance_t inst, game::VariableValue* a2, game::VariableValue* a3);
|
||||
void Scr_EvalBinaryOperator(game::scriptInstance_t inst, game::VariableValue* a2, game::OpcodeVM a4, game::VariableValue* a5);
|
||||
void Scr_FreeEntityNum(game::scriptInstance_t inst, game::classNum_e classnum, unsigned int entnum);
|
||||
void Scr_FreeEntityList(game::scriptInstance_t inst);
|
||||
void Scr_FreeObjects(game::scriptInstance_t inst);
|
||||
void Scr_SetClassMap(game::scriptInstance_t inst, game::classNum_e classnum);
|
||||
void Scr_RemoveClassMap(game::classNum_e classnum, game::scriptInstance_t inst);
|
||||
void Scr_AddClassField(game::scriptInstance_t inst, game::classNum_e classnum, const char* name, unsigned int offset);
|
||||
game::VariableUnion Scr_GetOffset(const char* name, game::scriptInstance_t inst, game::classNum_e classNum);
|
||||
unsigned int FindEntityId(unsigned int entClass, int entNum, game::scriptInstance_t inst);
|
||||
unsigned int Scr_GetEntityId(int entNum, game::scriptInstance_t inst, game::classNum_e classnum, int clientnum);
|
||||
unsigned int Scr_FindArrayIndex(game::scriptInstance_t inst, game::VariableValue* a2, unsigned int a3);
|
||||
void Scr_EvalArray(game::scriptInstance_t inst, game::VariableValue* eax0, game::VariableValue* a3);
|
||||
unsigned int Scr_EvalArrayRef(game::scriptInstance_t inst, unsigned int eax0);
|
||||
void ClearArray(unsigned int parentId, game::scriptInstance_t inst, game::VariableValue* value);
|
||||
void SetEmptyArray(game::scriptInstance_t inst, unsigned int parentId);
|
||||
void Scr_AddArrayKeys(unsigned int array, game::scriptInstance_t inst);
|
||||
game::scr_entref_t* Scr_GetEntityIdRef(game::scr_entref_t* result, game::scriptInstance_t inst, unsigned int a3);
|
||||
void CopyEntity(unsigned int parentId, unsigned int newParentId);
|
||||
float Scr_GetEndonUsage(unsigned int a1, game::scriptInstance_t inst);
|
||||
float Scr_GetEntryUsageInternal(game::scriptInstance_t inst, unsigned int type, game::VariableUnion u);
|
||||
float Scr_GetEntryUsage(game::scriptInstance_t inst, game::VariableValueInternal* entryValue);
|
||||
float Scr_GetObjectUsage(game::scriptInstance_t inst, unsigned int parentId);
|
||||
float Scr_GetThreadUsage(game::VariableStackBuffer* inst, game::scriptInstance_t a2, float* endonUsage);
|
||||
unsigned int Scr_FindField(game::scriptInstance_t inst, const char* name, int* type);
|
||||
char* Scr_GetSourceFile_LoadObj(const char* a1);
|
||||
char* Scr_GetSourceFile_FastFile(const char* a3);
|
||||
void Scr_AddFieldsForFile(game::scriptInstance_t inst, const char* filename);
|
||||
void Scr_AddFields_LoadObj(game::scriptInstance_t inst, const char* path, const char* extension);
|
||||
void Scr_AddFields_FastFile(game::scriptInstance_t inst, const char* path, const char* extension);
|
||||
int Scr_MakeValuePrimitive(game::scriptInstance_t inst, unsigned int parentId);
|
||||
void Scr_FreeGameVariable(game::scriptInstance_t inst, int bComplete);
|
||||
bool Scr_SLHasLowercaseString(unsigned int a1, const char* a2);
|
||||
|
||||
unsigned int FindObject(game::scriptInstance_t inst, unsigned int id);
|
||||
unsigned int FindFirstSibling(game::scriptInstance_t inst, unsigned int id);
|
||||
unsigned int FindNextSibling(game::scriptInstance_t inst, unsigned int id);
|
||||
game::VariableValue Scr_GetArrayIndexValue(game::scriptInstance_t inst, unsigned int name);
|
||||
void AddRefToObject(game::scriptInstance_t inst, unsigned int id);
|
||||
void RemoveRefToEmptyObject(game::scriptInstance_t inst, unsigned int id);
|
||||
void Scr_ClearThread(game::scriptInstance_t inst, unsigned int parentId);
|
||||
unsigned int FindObjectVariable(game::scriptInstance_t inst, unsigned int parentId, unsigned int id);
|
||||
void RemoveObjectVariable(game::scriptInstance_t inst, unsigned int parentId, unsigned int id);
|
||||
game::VariableValueInternal_u* GetVariableValueAddress(game::scriptInstance_t inst, unsigned int id);
|
||||
void Scr_KillEndonThread(game::scriptInstance_t inst, unsigned int threadId);
|
||||
BOOL IsValidArrayIndex(game::scriptInstance_t inst, unsigned int unsignedValue);
|
||||
void RemoveArrayVariable(game::scriptInstance_t inst, unsigned int parentId, unsigned int unsignedValue);
|
||||
void SafeRemoveArrayVariable(game::scriptInstance_t inst, unsigned int parentId, unsigned int unsignedValue);
|
||||
void AddRefToVector(game::scriptInstance_t inst, const float* vecVal);
|
||||
unsigned int FindArrayVariableIndex(game::scriptInstance_t inst, unsigned int parentId, unsigned int unsignedValue);
|
||||
unsigned int GetVariableIndexInternal(game::scriptInstance_t inst, unsigned int parentId, unsigned int name);
|
||||
unsigned int GetNewVariableIndexInternal(game::scriptInstance_t inst, unsigned int parentId, unsigned int name);
|
||||
unsigned int AllocObject(game::scriptInstance_t inst);
|
||||
game::VariableType GetValueType(game::scriptInstance_t inst, unsigned int id);
|
||||
game::VariableType GetObjectType(game::scriptInstance_t inst, unsigned int id);
|
||||
float* Scr_AllocVector_(game::scriptInstance_t inst, const float* v);
|
||||
void Scr_EvalInequality(game::scriptInstance_t inst, game::VariableValue* value1, game::VariableValue* value2);
|
||||
unsigned int Scr_EvalArrayRefInternal(game::scriptInstance_t inst, game::VariableValue* varValue, game::VariableValueInternal* parentValue);
|
||||
unsigned int GetNewArrayVariableIndex(game::scriptInstance_t inst, unsigned int parentId, unsigned int unsignedValue);
|
||||
unsigned int GetNewArrayVariable(game::scriptInstance_t inst, unsigned int parentId, unsigned int unsignedValue);
|
||||
unsigned int GetArrayVariable(game::scriptInstance_t inst, unsigned int parentId, unsigned int unsignedValue);
|
||||
unsigned int AllocThread(game::scriptInstance_t inst, unsigned int self);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@@ -1,120 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
void Scr_VM_Init(game::scriptInstance_t inst);
|
||||
void Scr_Init(game::scriptInstance_t inst);
|
||||
void Scr_Shutdown(game::scriptInstance_t inst);
|
||||
void Scr_ErrorInternal(game::scriptInstance_t inst);
|
||||
void Scr_ClearOutParams(game::scriptInstance_t inst);
|
||||
unsigned int GetDummyObject(game::scriptInstance_t inst);
|
||||
unsigned int GetDummyFieldValue(game::scriptInstance_t inst);
|
||||
unsigned int VM_ExecuteInternal(game::scriptInstance_t inst);
|
||||
void VM_CancelNotifyInternal(game::scriptInstance_t inst, unsigned int notifyListOwnerId, unsigned int startLocalId, unsigned int notifyListId, unsigned int notifyNameListId, unsigned int stringValue);
|
||||
void VM_CancelNotify(game::scriptInstance_t inst, unsigned int a2, unsigned int a3);
|
||||
game::VariableStackBuffer* VM_ArchiveStack(game::scriptInstance_t inst);
|
||||
int Scr_AddLocalVars(game::scriptInstance_t inst, unsigned int a2);
|
||||
void VM_UnarchiveStack(game::scriptInstance_t inst, unsigned int startLocalId, game::VariableStackBuffer* stackValue);
|
||||
void VM_TerminateStack(game::scriptInstance_t inst, unsigned int a2, unsigned int a3, game::VariableStackBuffer* name);
|
||||
void VM_TrimStack(game::scriptInstance_t inst, unsigned int parentId, game::VariableStackBuffer* a3, int fromEndon);
|
||||
void Scr_TerminateRunningThread(game::scriptInstance_t inst, unsigned int a2);
|
||||
void Scr_TerminateWaitThread(game::scriptInstance_t inst, unsigned int a2, unsigned int a3);
|
||||
void Scr_CancelWaittill(game::scriptInstance_t inst, unsigned int startLocalId);
|
||||
void Scr_TerminateWaittillThread(game::scriptInstance_t inst, unsigned int a2, unsigned int a3);
|
||||
void Scr_TerminateThread(unsigned int a2, game::scriptInstance_t inst);
|
||||
void VM_Notify(game::scriptInstance_t inst, int notifyListOwnerId, unsigned int stringValue, game::VariableValue* top);
|
||||
void Scr_NotifyNum_Internal(game::scriptInstance_t inst, int entNum, unsigned int entClass, unsigned int notifStr, unsigned int numParams);
|
||||
void Scr_CancelNotifyList(unsigned int notifyListOwnerId, game::scriptInstance_t inst);
|
||||
void VM_TerminateTime(game::scriptInstance_t inst, unsigned int parentId);
|
||||
void VM_Resume(game::scriptInstance_t inst, unsigned int timeId);
|
||||
unsigned int VM_Execute(game::scriptInstance_t inst, unsigned int localId, const char* pos, unsigned int paramcount);
|
||||
unsigned short Scr_ExecThread(game::scriptInstance_t inst, unsigned int handle, unsigned int paramCount);
|
||||
unsigned short Scr_ExecEntThreadNum(game::scriptInstance_t inst, int entNum, unsigned int handle, int numParams, unsigned int entClass);
|
||||
void Scr_AddExecThread(game::scriptInstance_t inst, unsigned int handle);
|
||||
void VM_SetTime(game::scriptInstance_t inst);
|
||||
void Scr_InitSystem(game::scriptInstance_t inst);
|
||||
void Scr_ShutdownSystem(game::scriptInstance_t inst, int bComplete);
|
||||
bool Scr_IsSystemActive();
|
||||
int Scr_GetInt(game::scriptInstance_t inst, unsigned int index);
|
||||
game::scr_anim_s Scr_GetAnim(unsigned int index, game::XAnimTree_s* anims);
|
||||
game::scr_animtree_t Scr_GetAnimTree();
|
||||
float Scr_GetFloat(game::scriptInstance_t inst, unsigned int index);
|
||||
unsigned int Scr_GetConstString(game::scriptInstance_t inst, unsigned int index);
|
||||
unsigned int Scr_GetConstLowercaseString(game::scriptInstance_t inst, unsigned int index);
|
||||
const char* Scr_GetString(unsigned int index, game::scriptInstance_t inst);
|
||||
unsigned int Scr_GetConstStringIncludeNull(game::scriptInstance_t inst);
|
||||
char* Scr_GetDebugString(game::scriptInstance_t inst, unsigned int index);
|
||||
unsigned int Scr_GetConstIString(unsigned int index);
|
||||
void Scr_GetVector(game::scriptInstance_t inst, float* vectorValue, unsigned int index);
|
||||
unsigned int Scr_GetFunc();
|
||||
game::scr_entref_t* Scr_GetEntityRef(game::scriptInstance_t inst, game::scr_entref_t* retstr, unsigned int index);
|
||||
game::VariableUnion Scr_GetObject(game::scriptInstance_t inst);
|
||||
game::VariableType Scr_GetType(game::scriptInstance_t inst, unsigned int index);
|
||||
const char* Scr_GetTypeName(game::scriptInstance_t inst);
|
||||
game::VariableType Scr_GetPointerType(game::scriptInstance_t inst, unsigned int index);
|
||||
void Scr_AddInt(game::scriptInstance_t inst, int value);
|
||||
void Scr_AddFloat(game::scriptInstance_t inst, float value);
|
||||
void Scr_AddAnim(game::scr_anim_s value);
|
||||
void Scr_AddUndefined(game::scriptInstance_t inst);
|
||||
void Scr_AddObject(game::scriptInstance_t inst, unsigned int entid);
|
||||
void Scr_AddString(game::scriptInstance_t inst, const char* string);
|
||||
void Scr_AddIString(const char* string);
|
||||
void Scr_AddConstString(game::scriptInstance_t inst, unsigned int id);
|
||||
void Scr_AddVector(game::scriptInstance_t inst, float* value);
|
||||
void Scr_MakeArray(game::scriptInstance_t inst);
|
||||
void Scr_AddArray(game::scriptInstance_t inst);
|
||||
void Scr_AddArrayStringIndexed(unsigned int id, game::scriptInstance_t inst);
|
||||
void Scr_Error(const char* error, game::scriptInstance_t inst, int is_terminal);
|
||||
void Scr_TerminalError(game::scriptInstance_t inst, const char* error);
|
||||
void Scr_ParamError(unsigned int index, game::scriptInstance_t inst, const char* error);
|
||||
void Scr_ObjectError(game::scriptInstance_t inst, const char* error);
|
||||
bool SetEntityFieldValue(game::scriptInstance_t inst, int offset, int entnum, game::classNum_e classnum, int clientNum, game::VariableValue* value);
|
||||
game::VariableValue GetEntityFieldValue(int offset, int entnum, game::scriptInstance_t inst, game::classNum_e classnum, int clientNum);
|
||||
void Scr_SetStructField(unsigned int structId, unsigned int index, game::scriptInstance_t inst);
|
||||
void Scr_IncTime(game::scriptInstance_t inst);
|
||||
void Scr_RunCurrentThreads(game::scriptInstance_t inst);
|
||||
void Scr_ResetTimeout(game::scriptInstance_t inst);
|
||||
|
||||
void SetVariableFieldValue(game::scriptInstance_t inst, unsigned int id, game::VariableValue* value);
|
||||
void SetNewVariableValue(game::scriptInstance_t inst, unsigned int id, game::VariableValue* value);
|
||||
void Scr_ClearErrorMessage(game::scriptInstance_t inst);
|
||||
void VM_Shutdown(game::scriptInstance_t inst);
|
||||
void Scr_ShutdownVariables(game::scriptInstance_t inst);
|
||||
void ClearVariableValue(game::scriptInstance_t inst, unsigned int id);
|
||||
unsigned int Scr_GetThreadNotifyName(game::scriptInstance_t inst, unsigned int startLocalId);
|
||||
void Scr_RemoveThreadNotifyName(game::scriptInstance_t inst, unsigned int startLocalId);
|
||||
unsigned int GetArraySize(game::scriptInstance_t inst, unsigned int id);
|
||||
void IncInParam(game::scriptInstance_t inst);
|
||||
unsigned int GetParentLocalId(game::scriptInstance_t inst, unsigned int threadId);
|
||||
void Scr_ClearWaitTime(game::scriptInstance_t inst, unsigned int startLocalId);
|
||||
void Scr_SetThreadWaitTime(game::scriptInstance_t inst, unsigned int startLocalId, unsigned int waitTime);
|
||||
void Scr_SetThreadNotifyName(game::scriptInstance_t inst, unsigned int startLocalId, unsigned int stringValue);
|
||||
void Scr_DebugTerminateThread(game::scriptInstance_t inst, int topThread);
|
||||
unsigned int Scr_GetThreadWaitTime(game::scriptInstance_t inst, unsigned int startLocalId);
|
||||
const char* Scr_GetStackThreadPos(game::scriptInstance_t inst, unsigned int endLocalId, game::VariableStackBuffer* stackValue, bool killThread);
|
||||
unsigned int Scr_GetSelf(game::scriptInstance_t inst, unsigned int threadId);
|
||||
unsigned int GetVariableKeyObject(game::scriptInstance_t inst, unsigned int id);
|
||||
int MT_Realloc(game::scriptInstance_t inst, int oldNumBytes, int newNumbytes);
|
||||
void CScr_GetObjectField(game::classNum_e classnum, int entnum, int clientNum, int offset);
|
||||
int CScr_SetObjectField(game::classNum_e classnum, int entnum, int clientNum, int offset);
|
||||
void Scr_SetErrorMessage(game::scriptInstance_t inst, const char* error);
|
||||
bool Scr_IsStackClear(game::scriptInstance_t inst);
|
||||
void SL_CheckExists(game::scriptInstance_t inst, unsigned int stringValue);
|
||||
const char* Scr_ReadCodePos(game::scriptInstance_t inst, const char** pos);
|
||||
unsigned int Scr_ReadUnsignedInt(game::scriptInstance_t inst, const char** pos);
|
||||
unsigned short Scr_ReadUnsignedShort(game::scriptInstance_t inst, const char** pos);
|
||||
unsigned char Scr_ReadUnsignedByte(game::scriptInstance_t inst, const char** pos);
|
||||
float Scr_ReadFloat(game::scriptInstance_t inst, const char** pos);
|
||||
const float* Scr_ReadVector(game::scriptInstance_t inst, const char** pos);
|
||||
BOOL IsFieldObject(game::scriptInstance_t inst, unsigned int id);
|
||||
void RemoveVariableValue(game::scriptInstance_t inst, unsigned int parentId, unsigned int index);
|
||||
game::VariableStackBuffer* GetRefVariableStackBuffer(game::scriptInstance_t inst, int id);
|
||||
unsigned int GetNewObjectVariableReverse(game::scriptInstance_t inst, unsigned int parentId, unsigned int id);
|
||||
unsigned int GetNewVariableIndexReverseInternal(game::scriptInstance_t inst, unsigned int parentId, unsigned int name);
|
||||
unsigned int Scr_GetLocalVar(game::scriptInstance_t inst, int pos);
|
||||
void Scr_EvalBoolNot(game::scriptInstance_t inst, game::VariableValue* value);
|
||||
unsigned int GetInternalVariableIndex(game::scriptInstance_t inst, unsigned int unsignedValue);
|
||||
const char* Scr_ReadData(game::scriptInstance_t inst, const char** pos, unsigned int count);
|
||||
void Scr_NotifyNum(int entnum, game::classNum_e classnum, unsigned int stringValue, unsigned int paramcount);
|
||||
unsigned int Scr_GetNumParam(game::scriptInstance_t inst);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@@ -1,21 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace codsrc
|
||||
{
|
||||
unsigned int LowerCase(unsigned int strVal);
|
||||
int yyparse();
|
||||
int StringValue(int len, const char* str);
|
||||
int yylex();
|
||||
int yy_get_next_buffer();
|
||||
int yy_get_previous_state();
|
||||
int yy_try_NUL_trans(int yy_current_state);
|
||||
void yyrestart();
|
||||
game::yy_buffer_state* yy_create_buffer();
|
||||
void yy_flush_buffer(game::yy_buffer_state* result);
|
||||
void ScriptParse(game::scriptInstance_t a1, game::sval_u* parseData);
|
||||
|
||||
FILE* yy_load_buffer_state();
|
||||
void yy_fatal_error(const char* err);
|
||||
void* yy_flex_realloc(void* ptr, unsigned int size);
|
||||
void yy_init_buffer(game::yy_buffer_state* b, FILE* file);
|
||||
}
|
@@ -1,405 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
#include "utils/hook.hpp"
|
||||
//#include "codsrc/clientscript/cscr_animtree.hpp"
|
||||
|
||||
#ifndef DISABLE_RE_CSCR_ANIMTREE
|
||||
namespace re_cscr_animtree
|
||||
{
|
||||
utils::hook::detour AnimTreeCompileError_hook;
|
||||
utils::hook::detour GetAnimTreeParseProperties_hook;
|
||||
utils::hook::detour Scr_EmitAnimationInternal_hook;
|
||||
utils::hook::detour AnimTreeParseInternal_hook;
|
||||
utils::hook::detour Scr_AnimTreeParse_hook;
|
||||
utils::hook::detour Scr_GetAnimTreeSize_hook;
|
||||
utils::hook::detour ConnectScriptToAnim_hook;
|
||||
utils::hook::detour Scr_GetAnimsIndex_hook;
|
||||
utils::hook::detour Scr_CreateAnimationTree_hook;
|
||||
utils::hook::detour Scr_CheckAnimsDefined_hook;
|
||||
utils::hook::detour Scr_PrecacheAnimationTree_hook;
|
||||
utils::hook::detour Scr_UsingTreeInternal_hook;
|
||||
utils::hook::detour Scr_UsingTree_hook;
|
||||
utils::hook::detour Scr_SetAnimTreeConfigstring_hook;
|
||||
utils::hook::detour Scr_LoadAnimTreeInternal_hook;
|
||||
utils::hook::detour Scr_LoadAnimTreeAtIndex_hook;
|
||||
utils::hook::detour Scr_FindAnimTree_hook;
|
||||
utils::hook::detour Scr_FindAnim_hook;
|
||||
|
||||
void* AnimTreeCompileError_original;
|
||||
void* GetAnimTreeParseProperties_original;
|
||||
void* Scr_EmitAnimationInternal_original;
|
||||
void* AnimTreeParseInternal_original;
|
||||
void* Scr_AnimTreeParse_original;
|
||||
void* Scr_GetAnimTreeSize_original;
|
||||
void* ConnectScriptToAnim_original;
|
||||
void* Scr_GetAnimsIndex_original;
|
||||
void* Scr_CreateAnimationTree_original;
|
||||
void* Scr_CheckAnimsDefined_original;
|
||||
void* Scr_PrecacheAnimationTree_original;
|
||||
void* Scr_UsingTreeInternal_original;
|
||||
void* Scr_UsingTree_original;
|
||||
void* Scr_SetAnimTreeConfigstring_original;
|
||||
void* Scr_LoadAnimTreeInternal_original;
|
||||
void* Scr_LoadAnimTreeAtIndex_original;
|
||||
void* Scr_FindAnimTree_original;
|
||||
void* Scr_FindAnim_original;
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
void AnimTreeCompileError_stub(game::scriptInstance_t inst, const char * errorMsg)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
return AnimTreeCompileError_hook.invoke<void>(inst, errorMsg);
|
||||
#else
|
||||
return cscr_animtree::AnimTreeCompileError(inst, errorMsg);
|
||||
#endif
|
||||
}
|
||||
|
||||
int GetAnimTreeParseProperties_stub(game::scriptInstance_t inst)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
return GetAnimTreeParseProperties_hook.invoke<int>(inst);
|
||||
#else
|
||||
return cscr_animtree::GetAnimTreeParseProperties(inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Scr_EmitAnimationInternal_call(game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr, const char * pos, unsigned int animName, unsigned int names)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
game::Scr_EmitAnimationInternal(inst, pos, animName, names, Scr_EmitAnimationInternal_original);
|
||||
#else
|
||||
cscr_animtree::Scr_EmitAnimationInternal(inst, pos, animName, names);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_EmitAnimationInternal(game::scriptInstance_t inst@<edi>, const char *pos, unsigned int animName, unsigned int names)
|
||||
NAKED void Scr_EmitAnimationInternal_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
call Scr_EmitAnimationInternal_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
char AnimTreeParseInternal_stub(game::scriptInstance_t inst, int parentId, int names, int bIncludeParent, int bLoop, int bComplete)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
return AnimTreeParseInternal_hook.invoke<char>(inst, parentId, names, bIncludeParent, bLoop, bComplete);
|
||||
#else
|
||||
return cscr_animtree::AnimTreeParseInternal(inst, parentId, names, bIncludeParent, bLoop, bComplete);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Scr_AnimTreeParse_call(game::scriptInstance_t inst, const char * pos, [[maybe_unused]] void* caller_addr, unsigned int parentNode, unsigned int names)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
game::Scr_AnimTreeParse(inst, pos, parentNode, names, Scr_AnimTreeParse_original);
|
||||
#else
|
||||
cscr_animtree::Scr_AnimTreeParse(inst, pos, parentNode, names);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_AnimTreeParse(game::scriptInstance_t inst@<eax>, const char *pos@<edi>, unsigned int parentNode, unsigned int names)
|
||||
NAKED void Scr_AnimTreeParse_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
push eax;
|
||||
call Scr_AnimTreeParse_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
int Scr_GetAnimTreeSize_stub(game::scriptInstance_t inst, unsigned int parentNode)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
return Scr_GetAnimTreeSize_hook.invoke<int>(inst, parentNode);
|
||||
#else
|
||||
return cscr_animtree::Scr_GetAnimTreeSize(inst, parentNode);
|
||||
#endif
|
||||
}
|
||||
|
||||
void ConnectScriptToAnim_call(unsigned int name, unsigned int names, [[maybe_unused]] void* caller_addr, game::scriptInstance_t inst, int index, unsigned int filename, int treeIndex)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
game::ConnectScriptToAnim(name, names, inst, index, filename, treeIndex, ConnectScriptToAnim_original);
|
||||
#else
|
||||
cscr_animtree::ConnectScriptToAnim(name, names, inst, index, filename, treeIndex);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall ConnectScriptToAnim(unsigned int name@<eax>, unsigned int names@<edi>, game::scriptInstance_t inst, int index, unsigned int filename, int treeIndex)
|
||||
NAKED void ConnectScriptToAnim_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
push eax;
|
||||
call ConnectScriptToAnim_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
int Scr_GetAnimsIndex_call(game::XAnim_s * anim, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
return game::Scr_GetAnimsIndex(anim, Scr_GetAnimsIndex_original);
|
||||
#else
|
||||
return cscr_animtree::Scr_GetAnimsIndex(anim);
|
||||
#endif
|
||||
}
|
||||
|
||||
// int __usercall Scr_GetAnimsIndex@<eax>(game::XAnim_s *anim@<ecx>)
|
||||
NAKED int Scr_GetAnimsIndex_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
call Scr_GetAnimsIndex_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
int Scr_CreateAnimationTree_stub(game::scriptInstance_t inst, unsigned int parentNode, unsigned int rootData, game::XAnim_s* animtree, unsigned int childIndex, const char* name, unsigned int parentIndex, unsigned int filename, int treeIndex, int flags)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
return Scr_CreateAnimationTree_hook.invoke<int>(inst, parentNode, rootData, animtree, childIndex, name, parentIndex, filename, treeIndex, flags);
|
||||
#else
|
||||
return cscr_animtree::Scr_CreateAnimationTree(inst, parentNode, rootData, animtree, childIndex, name, parentIndex, filename, treeIndex, flags);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Scr_CheckAnimsDefined_call(unsigned int names, game::scriptInstance_t a2, [[maybe_unused]] void* caller_addr, unsigned int filename)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
game::Scr_CheckAnimsDefined(names, a2, filename, Scr_CheckAnimsDefined_original);
|
||||
#else
|
||||
cscr_animtree::Scr_CheckAnimsDefined(names, a2, filename);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_CheckAnimsDefined(unsigned int names@<eax>, game::scriptInstance_t a2@<ecx>, unsigned int filename)
|
||||
NAKED void Scr_CheckAnimsDefined_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
push eax;
|
||||
call Scr_CheckAnimsDefined_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_PrecacheAnimationTree_stub(game::scriptInstance_t inst, unsigned int parentNode)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
Scr_PrecacheAnimationTree_hook.invoke<void>(inst, parentNode);
|
||||
#else
|
||||
cscr_animtree::Scr_PrecacheAnimationTree(inst, parentNode);
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned int Scr_UsingTreeInternal_call(const char * filename, int user, [[maybe_unused]] void* caller_addr, game::scriptInstance_t inst, unsigned int * index)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
return game::Scr_UsingTreeInternal(filename, user, inst, index, Scr_UsingTreeInternal_original);
|
||||
#else
|
||||
return cscr_animtree::Scr_UsingTreeInternal(filename, user, inst, index);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall Scr_UsingTreeInternal@<eax>(const char *filename@<eax>, int user@<ecx>, game::scriptInstance_t inst, unsigned int *index)
|
||||
NAKED unsigned int Scr_UsingTreeInternal_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
push eax;
|
||||
call Scr_UsingTreeInternal_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_UsingTree_call(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr, const char * filename, unsigned int sourcePos)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
game::Scr_UsingTree(a1, filename, sourcePos, Scr_UsingTree_original);
|
||||
#else
|
||||
cscr_animtree::Scr_UsingTree(a1, filename, sourcePos);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_UsingTree(game::scriptInstance_t a1@<edi>, const char *filename, unsigned int sourcePos)
|
||||
NAKED void Scr_UsingTree_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
call Scr_UsingTree_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_SetAnimTreeConfigstring_stub(const char * animtreeName)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
Scr_SetAnimTreeConfigstring_hook.invoke<void>(animtreeName);
|
||||
#else
|
||||
cscr_animtree::Scr_SetAnimTreeConfigstring(animtreeName);
|
||||
#endif
|
||||
}
|
||||
|
||||
bool Scr_LoadAnimTreeInternal_call(const char * animtreeName, game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr, unsigned int parentNode, unsigned int names)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
return game::Scr_LoadAnimTreeInternal(animtreeName, inst, parentNode, names, Scr_LoadAnimTreeInternal_original);
|
||||
#else
|
||||
return cscr_animtree::Scr_LoadAnimTreeInternal(animtreeName, inst, parentNode, names);
|
||||
#endif
|
||||
}
|
||||
|
||||
// bool __usercall Scr_LoadAnimTreeInternal@<al>(const char *animtreeName@<eax>, game::scriptInstance_t inst@<ecx>, unsigned int parentNode, unsigned int names)
|
||||
NAKED bool Scr_LoadAnimTreeInternal_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
push eax;
|
||||
call Scr_LoadAnimTreeInternal_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_LoadAnimTreeAtIndex_call(game::scriptInstance_t inst, int user, [[maybe_unused]] void* caller_addr, unsigned int index, void *(__cdecl * Alloc)(int), int modCheckSum)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
return game::Scr_LoadAnimTreeAtIndex(inst, user, index, Alloc, modCheckSum, Scr_LoadAnimTreeAtIndex_original);
|
||||
#else
|
||||
return cscr_animtree::Scr_LoadAnimTreeAtIndex(inst, user, index, Alloc, modCheckSum);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_LoadAnimTreeAtIndex(game::scriptInstance_t inst@<ecx>, int user@<eax>, unsigned int index, void *(__cdecl *Alloc)(int), int modCheckSum)
|
||||
NAKED void Scr_LoadAnimTreeAtIndex_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
push ecx;
|
||||
call Scr_LoadAnimTreeAtIndex_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
game::scr_animtree_t Scr_FindAnimTree_call(const char * filename, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
return game::Scr_FindAnimTree(filename, Scr_FindAnimTree_original);
|
||||
#else
|
||||
return cscr_animtree::Scr_FindAnimTree(filename);
|
||||
#endif
|
||||
}
|
||||
|
||||
// game::XAnim_s *__usercall Scr_FindAnimTree@<eax>(const char *filename@<eax>)
|
||||
NAKED game::XAnim_s * Scr_FindAnimTree_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call Scr_FindAnimTree_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_FindAnim_call(const char * animName, [[maybe_unused]] void* caller_addr, game::scr_anim_s a2, int user)
|
||||
{
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
game::Scr_FindAnim(animName, a2, user, Scr_FindAnim_original);
|
||||
#else
|
||||
cscr_animtree::Scr_FindAnim(animName, a2, user);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_FindAnim(const char *animName@<edx>, game::scr_anim_s a2, int user)
|
||||
NAKED void Scr_FindAnim_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edx;
|
||||
call Scr_FindAnim_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class component final : public component_interface
|
||||
{
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
bool quick = true;
|
||||
#ifdef RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
quick = false;
|
||||
#endif
|
||||
|
||||
AnimTreeCompileError_hook.create(game::AnimTreeCompileError.get(), AnimTreeCompileError_stub, quick);
|
||||
GetAnimTreeParseProperties_hook.create(game::GetAnimTreeParseProperties.get(), GetAnimTreeParseProperties_stub, quick);
|
||||
Scr_EmitAnimationInternal_hook.create(game::Scr_EmitAnimationInternal_ADDR(), Scr_EmitAnimationInternal_stub, quick);
|
||||
AnimTreeParseInternal_hook.create(game::AnimTreeParseInternal.get(), AnimTreeParseInternal_stub, quick);
|
||||
Scr_AnimTreeParse_hook.create(game::Scr_AnimTreeParse_ADDR(), Scr_AnimTreeParse_stub, quick);
|
||||
Scr_GetAnimTreeSize_hook.create(game::Scr_GetAnimTreeSize.get(), Scr_GetAnimTreeSize_stub, quick);
|
||||
ConnectScriptToAnim_hook.create(game::ConnectScriptToAnim_ADDR(), ConnectScriptToAnim_stub, quick);
|
||||
Scr_GetAnimsIndex_hook.create(game::Scr_GetAnimsIndex_ADDR(), Scr_GetAnimsIndex_stub, quick);
|
||||
Scr_CreateAnimationTree_hook.create(game::Scr_CreateAnimationTree.get(), Scr_CreateAnimationTree_stub, quick);
|
||||
Scr_CheckAnimsDefined_hook.create(game::Scr_CheckAnimsDefined_ADDR(), Scr_CheckAnimsDefined_stub, quick);
|
||||
Scr_PrecacheAnimationTree_hook.create(game::Scr_PrecacheAnimationTree.get(), Scr_PrecacheAnimationTree_stub, quick);
|
||||
Scr_UsingTreeInternal_hook.create(game::Scr_UsingTreeInternal_ADDR(), Scr_UsingTreeInternal_stub, quick);
|
||||
Scr_UsingTree_hook.create(game::Scr_UsingTree_ADDR(), Scr_UsingTree_stub, quick);
|
||||
Scr_SetAnimTreeConfigstring_hook.create(game::Scr_SetAnimTreeConfigstring.get(), Scr_SetAnimTreeConfigstring_stub, quick);
|
||||
Scr_LoadAnimTreeInternal_hook.create(game::Scr_LoadAnimTreeInternal_ADDR(), Scr_LoadAnimTreeInternal_stub, quick);
|
||||
Scr_LoadAnimTreeAtIndex_hook.create(game::Scr_LoadAnimTreeAtIndex_ADDR(), Scr_LoadAnimTreeAtIndex_stub, quick);
|
||||
Scr_FindAnimTree_hook.create(game::Scr_FindAnimTree_ADDR(), Scr_FindAnimTree_stub, quick);
|
||||
Scr_FindAnim_hook.create(game::Scr_FindAnim_ADDR(), Scr_FindAnim_stub, quick);
|
||||
|
||||
//Original hook function addresses
|
||||
AnimTreeCompileError_original = AnimTreeCompileError_hook.get_original();
|
||||
GetAnimTreeParseProperties_original = GetAnimTreeParseProperties_hook.get_original();
|
||||
Scr_EmitAnimationInternal_original = Scr_EmitAnimationInternal_hook.get_original();
|
||||
AnimTreeParseInternal_original = AnimTreeParseInternal_hook.get_original();
|
||||
Scr_AnimTreeParse_original = Scr_AnimTreeParse_hook.get_original();
|
||||
Scr_GetAnimTreeSize_original = Scr_GetAnimTreeSize_hook.get_original();
|
||||
ConnectScriptToAnim_original = ConnectScriptToAnim_hook.get_original();
|
||||
Scr_GetAnimsIndex_original = Scr_GetAnimsIndex_hook.get_original();
|
||||
Scr_CreateAnimationTree_original = Scr_CreateAnimationTree_hook.get_original();
|
||||
Scr_CheckAnimsDefined_original = Scr_CheckAnimsDefined_hook.get_original();
|
||||
Scr_PrecacheAnimationTree_original = Scr_PrecacheAnimationTree_hook.get_original();
|
||||
Scr_UsingTreeInternal_original = Scr_UsingTreeInternal_hook.get_original();
|
||||
Scr_UsingTree_original = Scr_UsingTree_hook.get_original();
|
||||
Scr_SetAnimTreeConfigstring_original = Scr_SetAnimTreeConfigstring_hook.get_original();
|
||||
Scr_LoadAnimTreeInternal_original = Scr_LoadAnimTreeInternal_hook.get_original();
|
||||
Scr_LoadAnimTreeAtIndex_original = Scr_LoadAnimTreeAtIndex_hook.get_original();
|
||||
Scr_FindAnimTree_original = Scr_FindAnimTree_hook.get_original();
|
||||
Scr_FindAnim_original = Scr_FindAnim_hook.get_original();
|
||||
}
|
||||
|
||||
private:
|
||||
};
|
||||
}
|
||||
REGISTER_COMPONENT(re_cscr_animtree::component)
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@@ -1,314 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
#include "utils/hook.hpp"
|
||||
#include "codsrc/clientscript/cscr_main.hpp"
|
||||
|
||||
#ifndef DISABLE_RE_CSCR_MAIN
|
||||
namespace re_cscr_main
|
||||
{
|
||||
utils::hook::detour Scr_IsIdentifier_hook;
|
||||
utils::hook::detour Scr_GetFunctionHandle_hook;
|
||||
utils::hook::detour SL_TransferToCanonicalString_hook;
|
||||
utils::hook::detour SL_GetCanonicalString_hook;
|
||||
utils::hook::detour Scr_BeginLoadScripts_hook;
|
||||
utils::hook::detour Scr_BeginLoadAnimTrees_hook;
|
||||
utils::hook::detour Scr_ScanFile_hook;
|
||||
utils::hook::detour Scr_LoadScriptInternal_hook;
|
||||
utils::hook::detour Scr_LoadScript_hook;
|
||||
utils::hook::detour Scr_EndLoadScripts_hook;
|
||||
utils::hook::detour Scr_PrecacheAnimTrees_hook;
|
||||
utils::hook::detour Scr_EndLoadAnimTrees_hook;
|
||||
utils::hook::detour Scr_FreeScripts_hook;
|
||||
|
||||
void* Scr_IsIdentifier_original;
|
||||
void* Scr_GetFunctionHandle_original;
|
||||
void* SL_TransferToCanonicalString_original;
|
||||
void* SL_GetCanonicalString_original;
|
||||
void* Scr_BeginLoadScripts_original;
|
||||
void* Scr_BeginLoadAnimTrees_original;
|
||||
void* Scr_ScanFile_original;
|
||||
void* Scr_LoadScriptInternal_original;
|
||||
void* Scr_LoadScript_original;
|
||||
void* Scr_EndLoadScripts_original;
|
||||
void* Scr_PrecacheAnimTrees_original;
|
||||
void* Scr_EndLoadAnimTrees_original;
|
||||
void* Scr_FreeScripts_original;
|
||||
|
||||
namespace
|
||||
{
|
||||
bool Scr_IsIdentifier_call(char * token, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
return game::Scr_IsIdentifier(token, Scr_IsIdentifier_original);
|
||||
#else
|
||||
return codsrc::Scr_IsIdentifier(token);
|
||||
#endif
|
||||
}
|
||||
|
||||
// bool __usercall Scr_IsIdentifier@<al>(char *token@<ecx>)
|
||||
NAKED bool Scr_IsIdentifier_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
call Scr_IsIdentifier_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int Scr_GetFunctionHandle_call(const char * file, game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr, const char * handle)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
return game::Scr_GetFunctionHandle(file, inst, handle, Scr_GetFunctionHandle_original);
|
||||
#else
|
||||
return codsrc::Scr_GetFunctionHandle(file, inst, handle);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall Scr_GetFunctionHandle@<eax>(const char *file@<eax>, scriptInstance_t inst@<ecx>, const char *handle)
|
||||
NAKED unsigned int Scr_GetFunctionHandle_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
push eax;
|
||||
call Scr_GetFunctionHandle_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SL_TransferToCanonicalString_call(game::scriptInstance_t inst, unsigned int stringValue, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
return game::SL_TransferToCanonicalString(inst, stringValue, SL_TransferToCanonicalString_original);
|
||||
#else
|
||||
return codsrc::SL_TransferToCanonicalString(inst, stringValue);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall SL_TransferToCanonicalString@<eax>(scriptInstance_t inst@<eax>, unsigned int stringValue@<edi>)
|
||||
NAKED unsigned int SL_TransferToCanonicalString_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
push eax;
|
||||
call SL_TransferToCanonicalString_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SL_GetCanonicalString_call(char * token, game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
return game::SL_GetCanonicalString(token, inst, SL_GetCanonicalString_original);
|
||||
#else
|
||||
return codsrc::SL_GetCanonicalString(token, inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall SL_GetCanonicalString@<eax>(char *token@<eax>, scriptInstance_t inst@<esi>)
|
||||
NAKED unsigned int SL_GetCanonicalString_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push esi;
|
||||
push eax;
|
||||
call SL_GetCanonicalString_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_BeginLoadScripts_call(game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr, int user)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
game::Scr_BeginLoadScripts(inst, user, Scr_BeginLoadScripts_original);
|
||||
#else
|
||||
codsrc::Scr_BeginLoadScripts(inst, user);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_BeginLoadScripts(scriptInstance_t inst@<edi>, int user)
|
||||
NAKED void Scr_BeginLoadScripts_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
call Scr_BeginLoadScripts_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_BeginLoadAnimTrees_call(game::scriptInstance_t inst, int user, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
game::Scr_BeginLoadAnimTrees(inst, user, Scr_BeginLoadAnimTrees_original);
|
||||
#else
|
||||
codsrc::Scr_BeginLoadAnimTrees(inst, user);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_BeginLoadAnimTrees(scriptInstance_t inst@<ecx>, int user@<eax>)
|
||||
NAKED void Scr_BeginLoadAnimTrees_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
push ecx;
|
||||
call Scr_BeginLoadAnimTrees_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
int Scr_ScanFile_call(int max_size, [[maybe_unused]] void* caller_addr, char * buf)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
return game::Scr_ScanFile(max_size, buf, Scr_ScanFile_original);
|
||||
#else
|
||||
return codsrc::Scr_ScanFile(max_size, buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
// int __usercall Scr_ScanFile@<eax>(int max_size@<edi>, char *buf)
|
||||
NAKED int Scr_ScanFile_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
call Scr_ScanFile_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int Scr_LoadScriptInternal_stub(game::scriptInstance_t inst, const char * file, game::PrecacheEntry * entries, int entriesCount)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
return Scr_LoadScriptInternal_hook.invoke<unsigned int>(inst, file, entries, entriesCount);
|
||||
#else
|
||||
return codsrc::Scr_LoadScriptInternal(inst, file, entries, entriesCount);
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned int Scr_LoadScript_call(const char * file, game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
return game::Scr_LoadScript(file, inst, Scr_LoadScript_original);
|
||||
#else
|
||||
return codsrc::Scr_LoadScript(file, inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall Scr_LoadScript@<eax>(const char *file@<ecx>, scriptInstance_t inst@<edx>)
|
||||
NAKED unsigned int Scr_LoadScript_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edx;
|
||||
push ecx;
|
||||
call Scr_LoadScript_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_EndLoadScripts_stub(game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
Scr_EndLoadScripts_hook.invoke<void>(inst);
|
||||
#else
|
||||
codsrc::Scr_EndLoadScripts(inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Scr_PrecacheAnimTrees_stub(game::scriptInstance_t inst, void *(__cdecl *Alloc)(int), int user, int modChecksum, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
return Scr_PrecacheAnimTrees_hook.invoke<void>(inst, Alloc, user, modChecksum);
|
||||
#else
|
||||
return codsrc::Scr_PrecacheAnimTrees(inst, Alloc, user, modChecksum);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Scr_EndLoadAnimTrees_stub(game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
Scr_EndLoadAnimTrees_hook.invoke<void>(inst);
|
||||
#else
|
||||
codsrc::Scr_EndLoadAnimTrees(inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
void Scr_FreeScripts_call(game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
game::Scr_FreeScripts(inst, Scr_FreeScripts_original);
|
||||
#else
|
||||
codsrc::Scr_FreeScripts(inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_FreeScripts(scriptInstance_t a1@<eax>)
|
||||
NAKED void Scr_FreeScripts_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call Scr_FreeScripts_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class component final : public component_interface
|
||||
{
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
bool quick = true;
|
||||
#ifdef RE_CSCR_MAIN_USE_WRAPPERS
|
||||
quick = false;
|
||||
#endif
|
||||
|
||||
Scr_IsIdentifier_hook.create(game::Scr_IsIdentifier_ADDR(), Scr_IsIdentifier_stub, quick);
|
||||
Scr_GetFunctionHandle_hook.create(game::Scr_GetFunctionHandle_ADDR(), Scr_GetFunctionHandle_stub, quick);
|
||||
SL_TransferToCanonicalString_hook.create(game::SL_TransferToCanonicalString_ADDR(), SL_TransferToCanonicalString_stub, quick);
|
||||
SL_GetCanonicalString_hook.create(game::SL_GetCanonicalString_ADDR(), SL_GetCanonicalString_stub, quick);
|
||||
Scr_BeginLoadScripts_hook.create(game::Scr_BeginLoadScripts_ADDR(), Scr_BeginLoadScripts_stub, quick);
|
||||
Scr_BeginLoadAnimTrees_hook.create(game::Scr_BeginLoadAnimTrees_ADDR(), Scr_BeginLoadAnimTrees_stub, quick);
|
||||
Scr_ScanFile_hook.create(game::Scr_ScanFile_ADDR(), Scr_ScanFile_stub, quick);
|
||||
Scr_LoadScriptInternal_hook.create(game::Scr_LoadScriptInternal.get(), Scr_LoadScriptInternal_stub, quick);
|
||||
Scr_LoadScript_hook.create(game::Scr_LoadScript_ADDR(), Scr_LoadScript_stub, quick);
|
||||
Scr_EndLoadScripts_hook.create(game::Scr_EndLoadScripts.get(), Scr_EndLoadScripts_stub, quick);
|
||||
Scr_PrecacheAnimTrees_hook.create(game::Scr_PrecacheAnimTrees.get(), Scr_PrecacheAnimTrees_stub, quick);
|
||||
Scr_EndLoadAnimTrees_hook.create(game::Scr_EndLoadAnimTrees.get(), Scr_EndLoadAnimTrees_stub, quick);
|
||||
Scr_FreeScripts_hook.create(game::Scr_FreeScripts_ADDR(), Scr_FreeScripts_stub, quick);
|
||||
|
||||
//Original hook function addresses
|
||||
Scr_IsIdentifier_original = Scr_IsIdentifier_hook.get_original();
|
||||
Scr_GetFunctionHandle_original = Scr_GetFunctionHandle_hook.get_original();
|
||||
SL_TransferToCanonicalString_original = SL_TransferToCanonicalString_hook.get_original();
|
||||
SL_GetCanonicalString_original = SL_GetCanonicalString_hook.get_original();
|
||||
Scr_BeginLoadScripts_original = Scr_BeginLoadScripts_hook.get_original();
|
||||
Scr_BeginLoadAnimTrees_original = Scr_BeginLoadAnimTrees_hook.get_original();
|
||||
Scr_ScanFile_original = Scr_ScanFile_hook.get_original();
|
||||
Scr_LoadScriptInternal_original = Scr_LoadScriptInternal_hook.get_original();
|
||||
Scr_LoadScript_original = Scr_LoadScript_hook.get_original();
|
||||
Scr_EndLoadScripts_original = Scr_EndLoadScripts_hook.get_original();
|
||||
Scr_PrecacheAnimTrees_original = Scr_PrecacheAnimTrees_hook.get_original();
|
||||
Scr_EndLoadAnimTrees_original = Scr_EndLoadAnimTrees_hook.get_original();
|
||||
Scr_FreeScripts_original = Scr_FreeScripts_hook.get_original();
|
||||
}
|
||||
|
||||
private:
|
||||
};
|
||||
}
|
||||
REGISTER_COMPONENT(re_cscr_main::component)
|
||||
#endif
|
@@ -1,313 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
#include "utils/hook.hpp"
|
||||
#include "codsrc/clientscript/cscr_memorytree.hpp"
|
||||
|
||||
#ifndef DISABLE_RE_CSCR_MEMORYTREE
|
||||
namespace re_cscr_memorytree
|
||||
{
|
||||
utils::hook::detour MT_GetSubTreeSize_hook;
|
||||
utils::hook::detour MT_DumpTree_hook;
|
||||
utils::hook::detour MT_InitBits_hook;
|
||||
utils::hook::detour MT_GetScore_hook;
|
||||
utils::hook::detour MT_AddMemoryNode_hook;
|
||||
utils::hook::detour MT_RemoveMemoryNode_hook;
|
||||
utils::hook::detour MT_RemoveHeadMemoryNode_hook;
|
||||
utils::hook::detour MT_Init_hook;
|
||||
utils::hook::detour MT_Error_hook;
|
||||
utils::hook::detour MT_GetSize_hook;
|
||||
utils::hook::detour MT_AllocIndex_hook;
|
||||
utils::hook::detour MT_FreeIndex_hook;
|
||||
utils::hook::detour MT_Alloc_hook;
|
||||
utils::hook::detour MT_Free_hook;
|
||||
|
||||
void* MT_GetSubTreeSize_original;
|
||||
void* MT_DumpTree_original;
|
||||
void* MT_InitBits_original;
|
||||
void* MT_GetScore_original;
|
||||
void* MT_AddMemoryNode_original;
|
||||
void* MT_RemoveMemoryNode_original;
|
||||
void* MT_RemoveHeadMemoryNode_original;
|
||||
void* MT_Init_original;
|
||||
void* MT_Error_original;
|
||||
void* MT_GetSize_original;
|
||||
void* MT_AllocIndex_original;
|
||||
void* MT_FreeIndex_original;
|
||||
void* MT_Alloc_original;
|
||||
void* MT_Free_original;
|
||||
|
||||
namespace
|
||||
{
|
||||
int MT_GetSubTreeSize_stub(game::scriptInstance_t inst, int nodeNum, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
return MT_GetSubTreeSize_hook.invoke<int>(inst, nodeNum);
|
||||
#else
|
||||
return codsrc::MT_GetSubTreeSize(inst, nodeNum);
|
||||
#endif
|
||||
}
|
||||
|
||||
void MT_DumpTree_stub(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
MT_DumpTree_hook.invoke<void>(a1);
|
||||
#else
|
||||
codsrc::MT_DumpTree(a1);
|
||||
#endif
|
||||
}
|
||||
|
||||
void MT_InitBits_call(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
game::MT_InitBits(a1, MT_InitBits_original);
|
||||
#else
|
||||
codsrc::MT_InitBits(a1);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall MT_InitBits(scriptInstance_t a1@<ecx>)
|
||||
NAKED void MT_InitBits_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
call MT_InitBits_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
int MT_GetScore_call(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr, int num)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
return game::MT_GetScore(a1, num, MT_GetScore_original);
|
||||
#else
|
||||
return codsrc::MT_GetScore(a1, num);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
// int __usercall MT_GetScore@<eax>(scriptInstance_t a1@<edx>, int num)
|
||||
NAKED int MT_GetScore_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edx;
|
||||
call MT_GetScore_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void MT_AddMemoryNode_stub(game::scriptInstance_t inst, int newNode, int size, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
MT_AddMemoryNode_hook.invoke<void>(inst, newNode, size);
|
||||
#else
|
||||
codsrc::MT_AddMemoryNode(inst, newNode, size);
|
||||
#endif
|
||||
}
|
||||
|
||||
char MT_RemoveMemoryNode_stub(game::scriptInstance_t inst, int oldNode, int size, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
return MT_RemoveMemoryNode_hook.invoke<char>(inst, oldNode, size);
|
||||
#else
|
||||
return codsrc::MT_RemoveMemoryNode(inst, oldNode, size);
|
||||
#endif
|
||||
}
|
||||
|
||||
void MT_RemoveHeadMemoryNode_stub(game::scriptInstance_t inst, int size, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
MT_RemoveHeadMemoryNode_hook.invoke<void>(inst, size);
|
||||
#else
|
||||
codsrc::MT_RemoveHeadMemoryNode(inst, size);
|
||||
#endif
|
||||
}
|
||||
|
||||
void MT_Init_call(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
game::MT_Init(a1, MT_Init_original);
|
||||
#else
|
||||
codsrc::MT_Init(a1);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall MT_Init(scriptInstance_t a1@<edi>)
|
||||
NAKED void MT_Init_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
call MT_Init_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void MT_Error_call(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr, const char* funcName, int numBytes)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
game::MT_Error(a1, funcName, numBytes, MT_Error_original);
|
||||
#else
|
||||
codsrc::MT_Error(a1, funcName, numBytes);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall MT_Error(scriptInstance_t a1@<eax>, const char *funcName, int numBytes)
|
||||
NAKED void MT_Error_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call MT_Error_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
int MT_GetSize_call(int numBytes, game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
return game::MT_GetSize(numBytes, inst, MT_GetSize_original);
|
||||
#else
|
||||
return codsrc::MT_GetSize(numBytes, inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
// int __usercall MT_GetSize@<eax>(int numBytes@<eax>, scriptInstance_t inst@<ecx>)
|
||||
NAKED int MT_GetSize_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
push eax;
|
||||
call MT_GetSize_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned __int16 MT_AllocIndex_call(game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr, int size_)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
return game::MT_AllocIndex(inst, size_, MT_AllocIndex_original);
|
||||
#else
|
||||
return codsrc::MT_AllocIndex(inst, size_);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned __int16 __usercall MT_AllocIndex@<ax>(scriptInstance_t inst@<edi>, int size)
|
||||
NAKED unsigned __int16 MT_AllocIndex_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
call MT_AllocIndex_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void MT_FreeIndex_call(int numBytes, [[maybe_unused]] void* caller_addr, game::scriptInstance_t a1, int nodeNum)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
game::MT_FreeIndex(numBytes, a1, nodeNum, MT_FreeIndex_original);
|
||||
#else
|
||||
codsrc::MT_FreeIndex(numBytes, a1, nodeNum);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall MT_FreeIndex(int numBytes@<eax>, scriptInstance_t a1, int nodeNum)
|
||||
NAKED void MT_FreeIndex_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call MT_FreeIndex_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
char* MT_Alloc_call(int numBytes, game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
return game::MT_Alloc(numBytes, inst, MT_Alloc_original);
|
||||
#else
|
||||
return codsrc::MT_Alloc(numBytes, inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
// char *__usercall MT_Alloc@<eax>(int numBytes@<eax>, scriptInstance_t a2@<ecx>)
|
||||
NAKED char * MT_Alloc_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
push eax;
|
||||
call MT_Alloc_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void MT_Free_stub(void* p, int numBytes, game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
MT_Free_hook.invoke<void>(p, numBytes, inst);
|
||||
#else
|
||||
codsrc::MT_Free(p, numBytes, inst);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
class component final : public component_interface
|
||||
{
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
bool quick = true;
|
||||
#ifdef RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
quick = false;
|
||||
#endif
|
||||
|
||||
MT_GetSubTreeSize_hook.create(game::MT_GetSubTreeSize.get(), MT_GetSubTreeSize_stub, quick);
|
||||
MT_DumpTree_hook.create(game::MT_DumpTree.get(), MT_DumpTree_stub, quick);
|
||||
MT_InitBits_hook.create(game::MT_InitBits_ADDR(), MT_InitBits_stub, quick);
|
||||
MT_GetScore_hook.create(game::MT_GetScore_ADDR(), MT_GetScore_stub, quick);
|
||||
MT_AddMemoryNode_hook.create(game::MT_AddMemoryNode.get(), MT_AddMemoryNode_stub, quick);
|
||||
MT_RemoveMemoryNode_hook.create(game::MT_RemoveMemoryNode.get(), MT_RemoveMemoryNode_stub, quick);
|
||||
MT_RemoveHeadMemoryNode_hook.create(game::MT_RemoveHeadMemoryNode.get(), MT_RemoveHeadMemoryNode_stub, quick);
|
||||
MT_Init_hook.create(game::MT_Init_ADDR(), MT_Init_stub, quick);
|
||||
MT_Error_hook.create(game::MT_Error_ADDR(), MT_Error_stub, quick);
|
||||
MT_GetSize_hook.create(game::MT_GetSize_ADDR(), MT_GetSize_stub, quick);
|
||||
MT_AllocIndex_hook.create(game::MT_AllocIndex_ADDR(), MT_AllocIndex_stub, quick);
|
||||
MT_FreeIndex_hook.create(game::MT_FreeIndex_ADDR(), MT_FreeIndex_stub, quick);
|
||||
MT_Alloc_hook.create(game::MT_Alloc_ADDR(), MT_Alloc_stub, quick);
|
||||
MT_Free_hook.create(game::MT_Free.get(), MT_Free_stub, quick);
|
||||
|
||||
//Original hook function addresses
|
||||
MT_GetSubTreeSize_original = MT_GetSubTreeSize_hook.get_original();
|
||||
MT_DumpTree_original = MT_DumpTree_hook.get_original();
|
||||
MT_InitBits_original = MT_InitBits_hook.get_original();
|
||||
MT_GetScore_original = MT_GetScore_hook.get_original();
|
||||
MT_AddMemoryNode_original = MT_AddMemoryNode_hook.get_original();
|
||||
MT_RemoveMemoryNode_original = MT_RemoveMemoryNode_hook.get_original();
|
||||
MT_RemoveHeadMemoryNode_original = MT_RemoveHeadMemoryNode_hook.get_original();
|
||||
MT_Init_original = MT_Init_hook.get_original();
|
||||
MT_Error_original = MT_Error_hook.get_original();
|
||||
MT_GetSize_original = MT_GetSize_hook.get_original();
|
||||
MT_AllocIndex_original = MT_AllocIndex_hook.get_original();
|
||||
MT_FreeIndex_original = MT_FreeIndex_hook.get_original();
|
||||
MT_Alloc_original = MT_Alloc_hook.get_original();
|
||||
MT_Free_original = MT_Free_hook.get_original();
|
||||
}
|
||||
|
||||
private:
|
||||
};
|
||||
}
|
||||
REGISTER_COMPONENT(re_cscr_memorytree::component)
|
||||
#endif
|
@@ -1,595 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
#include "utils/hook.hpp"
|
||||
#include "codsrc/clientscript/cscr_parser.hpp"
|
||||
|
||||
#ifndef DISABLE_RE_CSCR_PARSER
|
||||
namespace re_cscr_parser
|
||||
{
|
||||
utils::hook::detour Scr_InitOpcodeLookup_hook;
|
||||
utils::hook::detour Scr_ShutdownOpcodeLookup_hook;
|
||||
utils::hook::detour AddOpcodePos_hook;
|
||||
utils::hook::detour RemoveOpcodePos_hook;
|
||||
utils::hook::detour AddThreadStartOpcodePos_hook;
|
||||
utils::hook::detour Scr_GetSourceBuffer_hook;
|
||||
utils::hook::detour Scr_GetLineNumInternal_hook;
|
||||
utils::hook::detour Scr_GetNewSourceBuffer_hook;
|
||||
utils::hook::detour Scr_AddSourceBufferInternal_hook;
|
||||
utils::hook::detour Scr_ReadFile_FastFile_hook;
|
||||
utils::hook::detour Scr_ReadFile_LoadObj_hook;
|
||||
utils::hook::detour Scr_ReadFile_hook;
|
||||
utils::hook::detour Scr_AddSourceBuffer_hook;
|
||||
utils::hook::detour Scr_CopyFormattedLine_hook;
|
||||
utils::hook::detour Scr_GetLineInfo_hook;
|
||||
utils::hook::detour Scr_PrintSourcePos_hook;
|
||||
utils::hook::detour Scr_GetPrevSourcePosOpcodeLookup_hook;
|
||||
utils::hook::detour Scr_GetTextSourcePos_hook;
|
||||
utils::hook::detour Scr_PrintPrevCodePos_hook;
|
||||
utils::hook::detour CompileError_hook;
|
||||
utils::hook::detour CompileError2_hook;
|
||||
utils::hook::detour RuntimeErrorInternal_hook;
|
||||
utils::hook::detour RuntimeError_hook;
|
||||
|
||||
void* Scr_InitOpcodeLookup_original;
|
||||
void* Scr_ShutdownOpcodeLookup_original;
|
||||
void* AddOpcodePos_original;
|
||||
void* RemoveOpcodePos_original;
|
||||
void* AddThreadStartOpcodePos_original;
|
||||
void* Scr_GetSourceBuffer_original;
|
||||
void* Scr_GetLineNumInternal_original;
|
||||
void* Scr_GetNewSourceBuffer_original;
|
||||
void* Scr_AddSourceBufferInternal_original;
|
||||
void* Scr_ReadFile_FastFile_original;
|
||||
void* Scr_ReadFile_LoadObj_original;
|
||||
void* Scr_ReadFile_original;
|
||||
void* Scr_AddSourceBuffer_original;
|
||||
void* Scr_CopyFormattedLine_original;
|
||||
void* Scr_GetLineInfo_original;
|
||||
void* Scr_PrintSourcePos_original;
|
||||
void* Scr_GetPrevSourcePosOpcodeLookup_original;
|
||||
void* Scr_GetTextSourcePos_original;
|
||||
void* Scr_PrintPrevCodePos_original;
|
||||
void* CompileError_original;
|
||||
void* CompileError2_original;
|
||||
void* RuntimeErrorInternal_original;
|
||||
void* RuntimeError_original;
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
void Scr_InitOpcodeLookup_call(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::Scr_InitOpcodeLookup(a1, Scr_InitOpcodeLookup_original);
|
||||
#else
|
||||
codsrc::Scr_InitOpcodeLookup(a1);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_InitOpcodeLookup(game::scriptInstance_t a1@<eax>)
|
||||
NAKED void Scr_InitOpcodeLookup_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call Scr_InitOpcodeLookup_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_ShutdownOpcodeLookup_call(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::Scr_ShutdownOpcodeLookup(a1, Scr_ShutdownOpcodeLookup_original);
|
||||
#else
|
||||
codsrc::Scr_ShutdownOpcodeLookup(a1);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_ShutdownOpcodeLookup(game::scriptInstance_t a1@<ecx>)
|
||||
NAKED void Scr_ShutdownOpcodeLookup_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
call Scr_ShutdownOpcodeLookup_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void AddOpcodePos_call(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr, unsigned int sourcePos, int type_)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::AddOpcodePos(a1, sourcePos, type_, AddOpcodePos_original);
|
||||
#else
|
||||
codsrc::AddOpcodePos(a1, sourcePos, type_);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall AddOpcodePos(game::scriptInstance_t a1@<eax>, unsigned int sourcePos, int type)
|
||||
NAKED void AddOpcodePos_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call AddOpcodePos_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void RemoveOpcodePos_call(game::scriptInstance_t result, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::RemoveOpcodePos(result, RemoveOpcodePos_original);
|
||||
#else
|
||||
codsrc::RemoveOpcodePos(result);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall RemoveOpcodePos(game::scriptInstance_t result@<eax>)
|
||||
NAKED void RemoveOpcodePos_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call RemoveOpcodePos_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void AddThreadStartOpcodePos_call(game::scriptInstance_t result, [[maybe_unused]] void* caller_addr, unsigned int sourcePos)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::AddThreadStartOpcodePos(result, sourcePos, AddThreadStartOpcodePos_original);
|
||||
#else
|
||||
codsrc::AddThreadStartOpcodePos(result, sourcePos);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall AddThreadStartOpcodePos(game::scriptInstance_t result@<eax>, unsigned int sourcePos)
|
||||
NAKED void AddThreadStartOpcodePos_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call AddThreadStartOpcodePos_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int Scr_GetSourceBuffer_call(game::scriptInstance_t a1, const char * codePos, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
return game::Scr_GetSourceBuffer(a1, codePos, Scr_GetSourceBuffer_original);
|
||||
#else
|
||||
return codsrc::Scr_GetSourceBuffer(a1, codePos);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall Scr_GetSourceBuffer@<eax>(game::scriptInstance_t inst@<eax>, const char *codePos@<esi>)
|
||||
NAKED unsigned int Scr_GetSourceBuffer_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push esi;
|
||||
push eax;
|
||||
call Scr_GetSourceBuffer_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int Scr_GetLineNumInternal_call(const char ** startLine, const char * buf, [[maybe_unused]] void* caller_addr, const char * sourcePos, int * col)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
return game::Scr_GetLineNumInternal(startLine, buf, sourcePos, col, Scr_GetLineNumInternal_original);
|
||||
#else
|
||||
return codsrc::Scr_GetLineNumInternal(startLine, buf, sourcePos, col);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall Scr_GetLineNumInternal@<eax>(const char **startLine@<edx>, const char *buf@<ecx>, const char *sourcePos, int *col)
|
||||
NAKED unsigned int Scr_GetLineNumInternal_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
push edx;
|
||||
call Scr_GetLineNumInternal_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
game::SourceBufferInfo * Scr_GetNewSourceBuffer_call(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
return game::Scr_GetNewSourceBuffer(a1, Scr_GetNewSourceBuffer_original);
|
||||
#else
|
||||
return codsrc::Scr_GetNewSourceBuffer(a1);
|
||||
#endif
|
||||
}
|
||||
|
||||
// SourceBufferInfo *__usercall Scr_GetNewSourceBuffer@<eax>(game::scriptInstance_t a1@<eax>)
|
||||
NAKED game::SourceBufferInfo * Scr_GetNewSourceBuffer_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call Scr_GetNewSourceBuffer_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_AddSourceBufferInternal_call(const char * filename, [[maybe_unused]] void* caller_addr, game::scriptInstance_t inst, const char * codepos, char * buffer, int len, int archive)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::Scr_AddSourceBufferInternal(filename, inst, codepos, buffer, len, archive, Scr_AddSourceBufferInternal_original);
|
||||
#else
|
||||
codsrc::Scr_AddSourceBufferInternal(filename, inst, codepos, buffer, len, archive);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_AddSourceBufferInternal(const char *filename@<eax>, game::scriptInstance_t inst, const char *codepos, char *buffer, int len, int archive)
|
||||
NAKED void Scr_AddSourceBufferInternal_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call Scr_AddSourceBufferInternal_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
char * Scr_ReadFile_FastFile_stub(game::scriptInstance_t inst, int unused, char * filename, const char * codepos, int archive)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
return Scr_ReadFile_FastFile_hook.invoke<char *>(inst, unused, filename, codepos, archive);
|
||||
#else
|
||||
return codsrc::Scr_ReadFile_FastFile(inst, unused, filename, codepos, archive);
|
||||
#endif
|
||||
}
|
||||
|
||||
char * Scr_ReadFile_LoadObj_stub(game::scriptInstance_t inst, int unused_arg1, const char * filename, const char * codepos, int archive)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
return Scr_ReadFile_LoadObj_hook.invoke<char *>(inst, unused_arg1, filename, codepos, archive);
|
||||
#else
|
||||
return codsrc::Scr_ReadFile_LoadObj(inst, unused_arg1, filename, codepos, archive);
|
||||
#endif
|
||||
}
|
||||
|
||||
char * Scr_ReadFile_call(const char * codepos, char * filename, [[maybe_unused]] void* caller_addr, game::scriptInstance_t inst, int unused)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
return game::Scr_ReadFile(codepos, filename, inst, unused, Scr_ReadFile_original);
|
||||
#else
|
||||
return codsrc::Scr_ReadFile(codepos, filename, inst, unused);
|
||||
#endif
|
||||
}
|
||||
|
||||
// char *__usercall Scr_ReadFile@<eax>(const char *codepos@<edi>, char *filename@<esi>, game::scriptInstance_t inst, int unused)
|
||||
NAKED char * Scr_ReadFile_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push esi;
|
||||
push edi;
|
||||
call Scr_ReadFile_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
char * Scr_AddSourceBuffer_call(game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr, int unused_arg1, char * filename, const char * codepos)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
return game::Scr_AddSourceBuffer(inst, unused_arg1, filename, codepos, Scr_AddSourceBuffer_original);
|
||||
#else
|
||||
return codsrc::Scr_AddSourceBuffer(inst, unused_arg1, filename, codepos);
|
||||
#endif
|
||||
}
|
||||
|
||||
// char *__usercall Scr_AddSourceBuffer@<eax>(game::scriptInstance_t inst@<eax>, int unused_arg1, char *filename, const char *codepos)
|
||||
NAKED char * Scr_AddSourceBuffer_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call Scr_AddSourceBuffer_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_CopyFormattedLine_call(const char * rawLine, [[maybe_unused]] void* caller_addr, char * line)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::Scr_CopyFormattedLine(rawLine, line, Scr_CopyFormattedLine_original);
|
||||
#else
|
||||
codsrc::Scr_CopyFormattedLine(rawLine, line);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_CopyFormattedLine(const char *rawLine@<eax>, char *line)
|
||||
NAKED void Scr_CopyFormattedLine_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call Scr_CopyFormattedLine_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int Scr_GetLineInfo_call(int * col, const char * buf, [[maybe_unused]] void* caller_addr, unsigned int sourcePos, char * line)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
return game::Scr_GetLineInfo(col, buf, sourcePos, line, Scr_GetLineInfo_original);
|
||||
#else
|
||||
return codsrc::Scr_GetLineInfo(col, buf, sourcePos, line);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall Scr_GetLineInfo@<eax>(int *col@<edx>, _BYTE *buf@<ecx>, unsigned int sourcePos, char *line)
|
||||
NAKED unsigned int Scr_GetLineInfo_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
push edx;
|
||||
call Scr_GetLineInfo_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_PrintSourcePos_call(unsigned int sourcePos, const char * buf, game::con_channel_e channel, [[maybe_unused]] void* caller_addr, game::scriptInstance_t a4, const char * file)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::Scr_PrintSourcePos(sourcePos, buf, channel, a4, file, Scr_PrintSourcePos_original);
|
||||
#else
|
||||
codsrc::Scr_PrintSourcePos(sourcePos, buf, channel, a4, file);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_PrintSourcePos(unsigned int sourcePos@<edx>, const char *buf@<ecx>, con_channel_e channel@<esi>, game::scriptInstance_t a4, const char *file)
|
||||
NAKED void Scr_PrintSourcePos_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push esi;
|
||||
push ecx;
|
||||
push edx;
|
||||
call Scr_PrintSourcePos_call;
|
||||
add esp, 0xC;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
game::OpcodeLookup * Scr_GetPrevSourcePosOpcodeLookup_call(game::scriptInstance_t a1, const char * codePos, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
return game::Scr_GetPrevSourcePosOpcodeLookup(a1, codePos, Scr_GetPrevSourcePosOpcodeLookup_original);
|
||||
#else
|
||||
return codsrc::Scr_GetPrevSourcePosOpcodeLookup(a1, codePos);
|
||||
#endif
|
||||
}
|
||||
|
||||
// OpcodeLookup *__usercall Scr_GetPrevSourcePosOpcodeLookup@<eax>(game::scriptInstance_t a1@<eax>, const char *codePos@<edi>)
|
||||
NAKED game::OpcodeLookup * Scr_GetPrevSourcePosOpcodeLookup_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
push eax;
|
||||
call Scr_GetPrevSourcePosOpcodeLookup_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_GetTextSourcePos_call(char * line, const char * codePos, [[maybe_unused]] void* caller_addr, game::scriptInstance_t a3)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::Scr_GetTextSourcePos(line, codePos, a3, Scr_GetTextSourcePos_original);
|
||||
#else
|
||||
codsrc::Scr_GetTextSourcePos(line, codePos, a3);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_GetTextSourcePos(char *line@<edx>, const char *codePos@<ecx>, game::scriptInstance_t a3)
|
||||
NAKED void Scr_GetTextSourcePos_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
push edx;
|
||||
call Scr_GetTextSourcePos_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_PrintPrevCodePos_call(const char * codepos, [[maybe_unused]] void* caller_addr, game::scriptInstance_t scriptInstance, game::con_channel_e channel, unsigned int index)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::Scr_PrintPrevCodePos(codepos, scriptInstance, channel, index, Scr_PrintPrevCodePos_original);
|
||||
#else
|
||||
codsrc::Scr_PrintPrevCodePos(codepos, scriptInstance, channel, index);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_PrintPrevCodePos(const char *codepos@<eax>, game::scriptInstance_t scriptInstance, con_channel_e channel, unsigned int index)
|
||||
NAKED void Scr_PrintPrevCodePos_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call Scr_PrintPrevCodePos_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void CompileError_stub(game::scriptInstance_t a1, unsigned int codePos, const char * msg, ...)
|
||||
{
|
||||
char Buffer[1024];
|
||||
va_list ArgList;
|
||||
va_start(ArgList, msg);
|
||||
|
||||
_vsnprintf(Buffer, 0x400u, msg, ArgList);
|
||||
va_end(ArgList);
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
CompileError_hook.invoke<void>(a1, codePos, "%s", Buffer);
|
||||
#else
|
||||
codsrc::CompileError(a1, codePos, "%s", Buffer);
|
||||
#endif
|
||||
}
|
||||
|
||||
void CompileError2_call(const char * codePos, game::scriptInstance_t a2, [[maybe_unused]] void* caller_addr, const char * msg, ...)
|
||||
{
|
||||
char Buffer[1024];
|
||||
va_list ArgList;
|
||||
va_start(ArgList, msg);
|
||||
|
||||
_vsnprintf(Buffer, 0x400u, msg, ArgList);
|
||||
va_end(ArgList);
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::CompileError2(codePos, a2, CompileError2_original, "%s", Buffer);
|
||||
#else
|
||||
codsrc::CompileError2(codePos, a2, "%s", Buffer);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
// void __usercall CompileError2(const char *codePos@<edi>, game::scriptInstance_t a2@<esi>, char *msg, ...)
|
||||
NAKED void CompileError2_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push esi;
|
||||
push edi;
|
||||
call CompileError2_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void RuntimeErrorInternal_call(const char * msg, game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr, game::con_channel_e channel, const char * codepos, int index)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::RuntimeErrorInternal(msg, inst, channel, codepos, index, RuntimeErrorInternal_original);
|
||||
#else
|
||||
codsrc::RuntimeErrorInternal(msg, inst, channel, codepos, index);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall RuntimeErrorInternal(const char *msg@<eax>, game::scriptInstance_t inst@<edi>, con_channel_e channel, const char *codepos, int index)
|
||||
NAKED void RuntimeErrorInternal_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
push eax;
|
||||
call RuntimeErrorInternal_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void RuntimeError_call(game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr, const char * pos, int error_index, const char * err, const char * err2)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
game::RuntimeError(inst, pos, error_index, err, err2, RuntimeError_original);
|
||||
#else
|
||||
codsrc::RuntimeError(inst, pos, error_index, err, err2);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall RuntimeError(game::scriptInstance_t inst@<eax>, const char *pos, int error_index, const char *err, const char *err2)
|
||||
NAKED void RuntimeError_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call RuntimeError_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class component final : public component_interface
|
||||
{
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
bool quick = true;
|
||||
#ifdef RE_CSCR_PARSER_USE_WRAPPERS
|
||||
quick = false;
|
||||
#endif
|
||||
|
||||
Scr_InitOpcodeLookup_hook.create(game::Scr_InitOpcodeLookup_ADDR(), Scr_InitOpcodeLookup_stub, quick);
|
||||
Scr_ShutdownOpcodeLookup_hook.create(game::Scr_ShutdownOpcodeLookup_ADDR(), Scr_ShutdownOpcodeLookup_stub, quick);
|
||||
AddOpcodePos_hook.create(game::AddOpcodePos_ADDR(), AddOpcodePos_stub, quick);
|
||||
RemoveOpcodePos_hook.create(game::RemoveOpcodePos_ADDR(), RemoveOpcodePos_stub, quick);
|
||||
AddThreadStartOpcodePos_hook.create(game::AddThreadStartOpcodePos_ADDR(), AddThreadStartOpcodePos_stub, quick);
|
||||
Scr_GetSourceBuffer_hook.create(game::Scr_GetSourceBuffer_ADDR(), Scr_GetSourceBuffer_stub, quick);
|
||||
Scr_GetLineNumInternal_hook.create(game::Scr_GetLineNumInternal_ADDR(), Scr_GetLineNumInternal_stub, quick);
|
||||
Scr_GetNewSourceBuffer_hook.create(game::Scr_GetNewSourceBuffer_ADDR(), Scr_GetNewSourceBuffer_stub, quick);
|
||||
Scr_AddSourceBufferInternal_hook.create(game::Scr_AddSourceBufferInternal_ADDR(), Scr_AddSourceBufferInternal_stub, quick);
|
||||
Scr_ReadFile_FastFile_hook.create(game::Scr_ReadFile_FastFile.get(), Scr_ReadFile_FastFile_stub, quick);
|
||||
Scr_ReadFile_LoadObj_hook.create(game::Scr_ReadFile_LoadObj.get(), Scr_ReadFile_LoadObj_stub, quick);
|
||||
Scr_ReadFile_hook.create(game::Scr_ReadFile_ADDR(), Scr_ReadFile_stub, quick);
|
||||
Scr_AddSourceBuffer_hook.create(game::Scr_AddSourceBuffer_ADDR(), Scr_AddSourceBuffer_stub, quick);
|
||||
Scr_CopyFormattedLine_hook.create(game::Scr_CopyFormattedLine_ADDR(), Scr_CopyFormattedLine_stub, quick);
|
||||
Scr_GetLineInfo_hook.create(game::Scr_GetLineInfo_ADDR(), Scr_GetLineInfo_stub, quick);
|
||||
Scr_PrintSourcePos_hook.create(game::Scr_PrintSourcePos_ADDR(), Scr_PrintSourcePos_stub, quick);
|
||||
Scr_GetPrevSourcePosOpcodeLookup_hook.create(game::Scr_GetPrevSourcePosOpcodeLookup_ADDR(), Scr_GetPrevSourcePosOpcodeLookup_stub, quick);
|
||||
Scr_GetTextSourcePos_hook.create(game::Scr_GetTextSourcePos_ADDR(), Scr_GetTextSourcePos_stub, quick);
|
||||
Scr_PrintPrevCodePos_hook.create(game::Scr_PrintPrevCodePos_ADDR(), Scr_PrintPrevCodePos_stub, quick);
|
||||
CompileError_hook.create(game::CompileError.get(), CompileError_stub, quick);
|
||||
CompileError2_hook.create(game::CompileError2_ADDR(), CompileError2_stub, quick);
|
||||
RuntimeErrorInternal_hook.create(game::RuntimeErrorInternal_ADDR(), RuntimeErrorInternal_stub, quick);
|
||||
RuntimeError_hook.create(game::RuntimeError_ADDR(), RuntimeError_stub, quick);
|
||||
|
||||
//Original hook function addresses
|
||||
Scr_InitOpcodeLookup_original = Scr_InitOpcodeLookup_hook.get_original();
|
||||
Scr_ShutdownOpcodeLookup_original = Scr_ShutdownOpcodeLookup_hook.get_original();
|
||||
AddOpcodePos_original = AddOpcodePos_hook.get_original();
|
||||
RemoveOpcodePos_original = RemoveOpcodePos_hook.get_original();
|
||||
AddThreadStartOpcodePos_original = AddThreadStartOpcodePos_hook.get_original();
|
||||
Scr_GetSourceBuffer_original = Scr_GetSourceBuffer_hook.get_original();
|
||||
Scr_GetLineNumInternal_original = Scr_GetLineNumInternal_hook.get_original();
|
||||
Scr_GetNewSourceBuffer_original = Scr_GetNewSourceBuffer_hook.get_original();
|
||||
Scr_AddSourceBufferInternal_original = Scr_AddSourceBufferInternal_hook.get_original();
|
||||
Scr_ReadFile_FastFile_original = Scr_ReadFile_FastFile_hook.get_original();
|
||||
Scr_ReadFile_LoadObj_original = Scr_ReadFile_LoadObj_hook.get_original();
|
||||
Scr_ReadFile_original = Scr_ReadFile_hook.get_original();
|
||||
Scr_AddSourceBuffer_original = Scr_AddSourceBuffer_hook.get_original();
|
||||
Scr_CopyFormattedLine_original = Scr_CopyFormattedLine_hook.get_original();
|
||||
Scr_GetLineInfo_original = Scr_GetLineInfo_hook.get_original();
|
||||
Scr_PrintSourcePos_original = Scr_PrintSourcePos_hook.get_original();
|
||||
Scr_GetPrevSourcePosOpcodeLookup_original = Scr_GetPrevSourcePosOpcodeLookup_hook.get_original();
|
||||
Scr_GetTextSourcePos_original = Scr_GetTextSourcePos_hook.get_original();
|
||||
Scr_PrintPrevCodePos_original = Scr_PrintPrevCodePos_hook.get_original();
|
||||
CompileError_original = CompileError_hook.get_original();
|
||||
CompileError2_original = CompileError2_hook.get_original();
|
||||
RuntimeErrorInternal_original = RuntimeErrorInternal_hook.get_original();
|
||||
RuntimeError_original = RuntimeError_hook.get_original();
|
||||
}
|
||||
|
||||
private:
|
||||
};
|
||||
}
|
||||
REGISTER_COMPONENT(re_cscr_parser::component)
|
||||
#endif
|
@@ -1,202 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
#include "utils/hook.hpp"
|
||||
#include "codsrc/clientscript/cscr_parsetree.hpp"
|
||||
|
||||
#ifndef DISABLE_RE_CSCR_PARSETREE
|
||||
namespace re_cscr_parsetree
|
||||
{
|
||||
utils::hook::detour Scr_InitAllocNode_hook;
|
||||
utils::hook::detour node0_hook;
|
||||
utils::hook::detour node1_hook;
|
||||
utils::hook::detour node2_hook;
|
||||
utils::hook::detour node3_hook;
|
||||
utils::hook::detour node4_hook;
|
||||
utils::hook::detour node5_hook;
|
||||
utils::hook::detour node6_hook;
|
||||
utils::hook::detour node7_hook;
|
||||
utils::hook::detour node8_hook;
|
||||
utils::hook::detour linked_list_end_hook;
|
||||
utils::hook::detour prepend_node_hook;
|
||||
utils::hook::detour append_node_hook;
|
||||
|
||||
void* Scr_InitAllocNode_original;
|
||||
void* node0_original;
|
||||
void* node1_original;
|
||||
void* node2_original;
|
||||
void* node3_original;
|
||||
void* node4_original;
|
||||
void* node5_original;
|
||||
void* node6_original;
|
||||
void* node7_original;
|
||||
void* node8_original;
|
||||
void* linked_list_end_original;
|
||||
void* prepend_node_original;
|
||||
void* append_node_original;
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
void Scr_InitAllocNode_stub(game::scriptInstance_t inst)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
Scr_InitAllocNode_hook.invoke<void>(inst);
|
||||
#else
|
||||
codsrc::Scr_InitAllocNode(inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
game::sval_u node0_stub()
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
return node0_hook.invoke<game::sval_u>();
|
||||
#else
|
||||
return codsrc::node0();
|
||||
#endif
|
||||
}
|
||||
|
||||
game::sval_u node1_stub(game::scr_enum_t type, game::sval_u val1)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
return node1_hook.invoke<game::sval_u>(type, val1);
|
||||
#else
|
||||
return codsrc::node1(type, val1);
|
||||
#endif
|
||||
}
|
||||
|
||||
game::sval_u node2_stub(game::scr_enum_t type, game::sval_u val1, game::sval_u val2)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
return node2_hook.invoke<game::sval_u>(type, val1, val2);
|
||||
#else
|
||||
return codsrc::node2(type, val1, val2);
|
||||
#endif
|
||||
}
|
||||
|
||||
game::sval_u node3_stub(game::scr_enum_t type, game::sval_u val1, game::sval_u val2, game::sval_u val3)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
return node3_hook.invoke<game::sval_u>(type, val1, val2, val3);
|
||||
#else
|
||||
return codsrc::node3(type, val1, val2, val3);
|
||||
#endif
|
||||
}
|
||||
|
||||
game::sval_u node4_stub(game::scr_enum_t type, game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
return node4_hook.invoke<game::sval_u>(type, val1, val2, val3, val4);
|
||||
#else
|
||||
return codsrc::node4(type, val1, val2, val3, val4);
|
||||
#endif
|
||||
}
|
||||
|
||||
game::sval_u node5_stub(game::scr_enum_t type, game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4, game::sval_u val5)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
return node5_hook.invoke<game::sval_u>(type, val1, val2, val3, val4, val5);
|
||||
#else
|
||||
return codsrc::node5(type, val1, val2, val3, val4, val5);
|
||||
#endif
|
||||
}
|
||||
|
||||
game::sval_u node6_stub(game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4, game::sval_u val5, game::sval_u val6)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
return node6_hook.invoke<game::sval_u>(val1, val2, val3, val4, val5, val6);
|
||||
#else
|
||||
return codsrc::node6(val1, val2, val3, val4, val5, val6);
|
||||
#endif
|
||||
}
|
||||
|
||||
game::sval_u node7_stub(game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4, game::sval_u val5, game::sval_u val6, game::sval_u val7)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
return node7_hook.invoke<game::sval_u>(val1, val2, val3, val4, val5, val6, val7);
|
||||
#else
|
||||
return codsrc::node7(val1, val2, val3, val4, val5, val6, val7);
|
||||
#endif
|
||||
}
|
||||
|
||||
game::sval_u node8_stub(game::sval_u val1, game::sval_u val2, game::sval_u val3, game::sval_u val4, game::sval_u val5, game::sval_u val6, game::sval_u val7, game::sval_u val8)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
return node8_hook.invoke<game::sval_u>(val1, val2, val3, val4, val5, val6, val7, val8);
|
||||
#else
|
||||
return codsrc::node8(val1, val2, val3, val4, val5, val6, val7, val8);
|
||||
#endif
|
||||
}
|
||||
|
||||
game::sval_u linked_list_end_stub(game::sval_u val1)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
return linked_list_end_hook.invoke<game::sval_u>(val1);
|
||||
#else
|
||||
return codsrc::linked_list_end(val1);
|
||||
#endif
|
||||
}
|
||||
|
||||
game::sval_u prepend_node_stub(game::sval_u val1, game::sval_u val2)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
return prepend_node_hook.invoke<game::sval_u>(val1, val2);
|
||||
#else
|
||||
return codsrc::prepend_node(val1, val2);
|
||||
#endif
|
||||
}
|
||||
|
||||
game::sval_u append_node_stub(game::sval_u val1, game::sval_u val2)
|
||||
{
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
return append_node_hook.invoke<game::sval_u>(val1, val2);
|
||||
#else
|
||||
return codsrc::append_node(val1, val2);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
class component final : public component_interface
|
||||
{
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
bool quick = true;
|
||||
#ifdef RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
quick = false;
|
||||
#endif
|
||||
|
||||
Scr_InitAllocNode_hook.create(game::Scr_InitAllocNode.get(), Scr_InitAllocNode_stub, quick);
|
||||
node0_hook.create(game::node0.get(), node0_stub, quick);
|
||||
node1_hook.create(game::node1.get(), node1_stub, quick);
|
||||
node2_hook.create(game::node2.get(), node2_stub, quick);
|
||||
node3_hook.create(game::node3.get(), node3_stub, quick);
|
||||
node4_hook.create(game::node4.get(), node4_stub, quick);
|
||||
node5_hook.create(game::node5.get(), node5_stub, quick);
|
||||
node6_hook.create(game::node6.get(), node6_stub, quick);
|
||||
node7_hook.create(game::node7.get(), node7_stub, quick);
|
||||
node8_hook.create(game::node8.get(), node8_stub, quick);
|
||||
linked_list_end_hook.create(game::linked_list_end.get(), linked_list_end_stub, quick);
|
||||
prepend_node_hook.create(game::prepend_node.get(), prepend_node_stub, quick);
|
||||
append_node_hook.create(game::append_node.get(), append_node_stub, quick);
|
||||
|
||||
//Original hook function addresses
|
||||
Scr_InitAllocNode_original = Scr_InitAllocNode_hook.get_original();
|
||||
node0_original = node0_hook.get_original();
|
||||
node1_original = node1_hook.get_original();
|
||||
node2_original = node2_hook.get_original();
|
||||
node3_original = node3_hook.get_original();
|
||||
node4_original = node4_hook.get_original();
|
||||
node5_original = node5_hook.get_original();
|
||||
node6_original = node6_hook.get_original();
|
||||
node7_original = node7_hook.get_original();
|
||||
node8_original = node8_hook.get_original();
|
||||
linked_list_end_original = linked_list_end_hook.get_original();
|
||||
prepend_node_original = prepend_node_hook.get_original();
|
||||
append_node_original = append_node_hook.get_original();
|
||||
}
|
||||
|
||||
private:
|
||||
};
|
||||
}
|
||||
REGISTER_COMPONENT(re_cscr_parsetree::component)
|
||||
#endif
|
@@ -1,84 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
#include "utils/hook.hpp"
|
||||
#include "codsrc/clientscript/cscr_readwrite.hpp"
|
||||
|
||||
#ifndef DISABLE_RE_CSCR_READWRITE
|
||||
namespace re_cscr_readwrite
|
||||
{
|
||||
utils::hook::detour FindVariableIndexInternal2_hook;
|
||||
utils::hook::detour FindLastSibling_hook;
|
||||
|
||||
void* FindVariableIndexInternal2_original;
|
||||
void* FindLastSibling_original;
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
unsigned int FindVariableIndexInternal2_call(game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr, unsigned int name, unsigned int index)
|
||||
{
|
||||
#ifdef RE_CSCR_READWRITE_USE_WRAPPERS
|
||||
return game::FindVariableIndexInternal2(inst, name, index, FindVariableIndexInternal2_original);
|
||||
#else
|
||||
return codsrc::FindVariableIndexInternal2(inst, name, index);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall FindVariableIndexInternal2@<eax>(scriptInstance_t inst@<eax>, unsigned int name, unsigned int index)
|
||||
NAKED unsigned int FindVariableIndexInternal2_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call FindVariableIndexInternal2_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int FindLastSibling_call(unsigned int parentId, game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_READWRITE_USE_WRAPPERS
|
||||
return game::FindLastSibling(parentId, inst, FindLastSibling_original);
|
||||
#else
|
||||
return codsrc::FindLastSibling(parentId, inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall FindLastSibling@<eax>(unsigned int parentId@<edx>, scriptInstance_t inst@<esi>)
|
||||
NAKED unsigned int FindLastSibling_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push esi;
|
||||
push edx;
|
||||
call FindLastSibling_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class component final : public component_interface
|
||||
{
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
bool quick = true;
|
||||
#ifdef RE_CSCR_READWRITE_USE_WRAPPERS
|
||||
quick = false;
|
||||
#endif
|
||||
|
||||
FindVariableIndexInternal2_hook.create(game::FindVariableIndexInternal2_ADDR(), FindVariableIndexInternal2_stub, quick);
|
||||
FindLastSibling_hook.create(game::FindLastSibling_ADDR(), FindLastSibling_stub, quick);
|
||||
|
||||
//Original hook function addresses
|
||||
FindVariableIndexInternal2_original = FindVariableIndexInternal2_hook.get_original();
|
||||
FindLastSibling_original = FindLastSibling_hook.get_original();
|
||||
}
|
||||
|
||||
private:
|
||||
};
|
||||
}
|
||||
REGISTER_COMPONENT(re_cscr_readwrite::component)
|
||||
#endif
|
@@ -1,657 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
#include "utils/hook.hpp"
|
||||
#include "codsrc/clientscript/cscr_stringlist.hpp"
|
||||
|
||||
#ifndef DISABLE_RE_CSCR_STRINGLIST
|
||||
namespace re_cscr_stringlist
|
||||
{
|
||||
utils::hook::detour SL_ConvertToString_hook;
|
||||
utils::hook::detour SL_GetStringLen_hook;
|
||||
utils::hook::detour GetHashCode_hook;
|
||||
utils::hook::detour SL_Init_hook;
|
||||
utils::hook::detour SL_FindStringOfSize_hook;
|
||||
utils::hook::detour SL_FindString_hook;
|
||||
utils::hook::detour SL_FindLowercaseString_hook;
|
||||
utils::hook::detour SL_AddUserInternal_hook;
|
||||
utils::hook::detour Mark_ScriptStringCustom_hook;
|
||||
utils::hook::detour SL_GetStringOfSize_hook;
|
||||
utils::hook::detour SL_GetString__hook;
|
||||
utils::hook::detour SL_GetString__0_hook;
|
||||
utils::hook::detour SL_GetLowercaseStringOfLen_hook;
|
||||
utils::hook::detour SL_GetLowercaseString_hook;
|
||||
utils::hook::detour SL_ConvertToLowercase_hook;
|
||||
utils::hook::detour SL_TransferRefToUser_hook;
|
||||
utils::hook::detour SL_FreeString_hook;
|
||||
utils::hook::detour SL_RemoveRefToString_hook;
|
||||
utils::hook::detour Scr_SetString_hook;
|
||||
utils::hook::detour Scr_SetStringFromCharString_hook;
|
||||
utils::hook::detour GScr_AllocString_hook;
|
||||
utils::hook::detour SL_GetStringForFloat_hook;
|
||||
utils::hook::detour SL_GetStringForInt_hook;
|
||||
utils::hook::detour SL_GetStringForVector_hook;
|
||||
utils::hook::detour SL_ShutdownSystem_hook;
|
||||
utils::hook::detour SL_TransferSystem_hook;
|
||||
utils::hook::detour SL_CreateCanonicalFilename_hook;
|
||||
utils::hook::detour Scr_CreateCanonicalFilename_hook;
|
||||
|
||||
void* SL_ConvertToString_original;
|
||||
void* SL_GetStringLen_original;
|
||||
void* GetHashCode_original;
|
||||
void* SL_Init_original;
|
||||
void* SL_FindStringOfSize_original;
|
||||
void* SL_FindString_original;
|
||||
void* SL_FindLowercaseString_original;
|
||||
void* SL_AddUserInternal_original;
|
||||
void* Mark_ScriptStringCustom_original;
|
||||
void* SL_GetStringOfSize_original;
|
||||
void* SL_GetString__original;
|
||||
void* SL_GetString__0_original;
|
||||
void* SL_GetLowercaseStringOfLen_original;
|
||||
void* SL_GetLowercaseString_original;
|
||||
void* SL_ConvertToLowercase_original;
|
||||
void* SL_TransferRefToUser_original;
|
||||
void* SL_FreeString_original;
|
||||
void* SL_RemoveRefToString_original;
|
||||
void* Scr_SetString_original;
|
||||
void* Scr_SetStringFromCharString_original;
|
||||
void* GScr_AllocString_original;
|
||||
void* SL_GetStringForFloat_original;
|
||||
void* SL_GetStringForInt_original;
|
||||
void* SL_GetStringForVector_original;
|
||||
void* SL_ShutdownSystem_original;
|
||||
void* SL_TransferSystem_original;
|
||||
void* SL_CreateCanonicalFilename_original;
|
||||
void* Scr_CreateCanonicalFilename_original;
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
char* SL_ConvertToString_call(unsigned int id, game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return game::SL_ConvertToString(id, inst, SL_ConvertToString_original);
|
||||
#else
|
||||
return codsrc::SL_ConvertToString(id, inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
// char *__usercall SL_ConvertToString@<eax>(unsigned int id@<eax>, game::scriptInstance_t inst@<ecx>)
|
||||
NAKED char* SL_ConvertToString_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
push eax;
|
||||
call SL_ConvertToString_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
int SL_GetStringLen_call(unsigned int a1, game::scriptInstance_t a2, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return game::SL_GetStringLen(a1, a2, SL_GetStringLen_original);
|
||||
#else
|
||||
return codsrc::SL_GetStringLen(a1, a2);
|
||||
#endif
|
||||
}
|
||||
|
||||
// int __usercall SL_GetStringLen@<eax>(unsigned int a1@<eax>, game::scriptInstance_t a2@<ecx>)
|
||||
NAKED int SL_GetStringLen_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
push eax;
|
||||
call SL_GetStringLen_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int GetHashCode_call(unsigned int a1, const char* a2, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return game::GetHashCode(a1, a2, GetHashCode_original);
|
||||
#else
|
||||
return codsrc::GetHashCode(a1, a2);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall GetHashCode@<eax>(unsigned int a1@<eax>, const char *a2@<edx>)
|
||||
NAKED unsigned int GetHashCode_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edx;
|
||||
push eax;
|
||||
call GetHashCode_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void SL_Init_call(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
game::SL_Init(a1, SL_Init_original);
|
||||
#else
|
||||
codsrc::SL_Init(a1);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall SL_Init(game::scriptInstance_t a1@<eax>)
|
||||
NAKED void SL_Init_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call SL_Init_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SL_FindStringOfSize_call(game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr, const char* str_, unsigned int len)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return game::SL_FindStringOfSize(inst, str_, len, SL_FindStringOfSize_original);
|
||||
#else
|
||||
return codsrc::SL_FindStringOfSize(inst, str_, len);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall SL_FindStringOfSize@<eax>(game::scriptInstance_t inst@<eax>, const char *str, unsigned int len)
|
||||
NAKED unsigned int SL_FindStringOfSize_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call SL_FindStringOfSize_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SL_FindString_call(const char* a1, [[maybe_unused]] void* caller_addr, game::scriptInstance_t a2)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return game::SL_FindString(a1, a2, SL_FindString_original);
|
||||
#else
|
||||
return codsrc::SL_FindString(a1, a2);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall SL_FindString@<eax>(const char *a1@<edx>, game::scriptInstance_t a2)
|
||||
NAKED unsigned int SL_FindString_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edx;
|
||||
call SL_FindString_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SL_FindLowercaseString_stub(const char* str, game::scriptInstance_t inst)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return SL_FindLowercaseString_hook.invoke<unsigned int>(str, inst);
|
||||
#else
|
||||
return codsrc::SL_FindLowercaseString(str, inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
void SL_AddUserInternal_call(unsigned int user, game::RefString* refStr, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
game::SL_AddUserInternal(user, refStr, SL_AddUserInternal_original);
|
||||
#else
|
||||
codsrc::SL_AddUserInternal(user, refStr);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall SL_AddUserInternal(unsigned int user@<eax>, RefString *refStr@<edx>)
|
||||
NAKED void SL_AddUserInternal_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edx;
|
||||
push eax;
|
||||
call SL_AddUserInternal_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Mark_ScriptStringCustom_call(unsigned int a1, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
game::Mark_ScriptStringCustom(a1, Mark_ScriptStringCustom_original);
|
||||
#else
|
||||
codsrc::Mark_ScriptStringCustom(a1);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Mark_ScriptStringCustom(unsigned __int16 *a1@<eax>)
|
||||
NAKED void Mark_ScriptStringCustom_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call Mark_ScriptStringCustom_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SL_GetStringOfSize_stub(game::scriptInstance_t inst, const char* string, unsigned int user, unsigned int len)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return SL_GetStringOfSize_hook.invoke<unsigned int>(inst, string, user, len);
|
||||
#else
|
||||
return codsrc::SL_GetStringOfSize(inst, string, user, len);
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned int SL_GetString__call(const char* a1, [[maybe_unused]] void* caller_addr, game::scriptInstance_t a2, unsigned int user)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return game::SL_GetString_(a1, a2, user, SL_GetString__original);
|
||||
#else
|
||||
return codsrc::SL_GetString_(a1, a2, user);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall SL_GetString_@<eax>(const char *a1@<edx>, game::scriptInstance_t a2, unsigned int user)
|
||||
NAKED unsigned int SL_GetString__stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edx;
|
||||
call SL_GetString__call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SL_GetString__0_call(const char* a1, [[maybe_unused]] void* caller_addr, unsigned int user, game::scriptInstance_t a3)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return game::SL_GetString__0(a1, user, a3, SL_GetString__0_original);
|
||||
#else
|
||||
return codsrc::SL_GetString__0(a1, user, a3);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall SL_GetString__0@<eax>(const char *a1@<edx>, unsigned int user, game::scriptInstance_t a3)
|
||||
NAKED unsigned int SL_GetString__0_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edx;
|
||||
call SL_GetString__0_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SL_GetLowercaseStringOfLen_stub(game::scriptInstance_t a1, const char* ArgList, unsigned int user, unsigned int len)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return SL_GetLowercaseStringOfLen_hook.invoke<unsigned int>(a1, ArgList, user, len);
|
||||
#else
|
||||
return codsrc::SL_GetLowercaseStringOfLen(a1, ArgList, user, len);
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned int SL_GetLowercaseString_call(const char* a2, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return game::SL_GetLowercaseString(a2, SL_GetLowercaseString_original);
|
||||
#else
|
||||
return codsrc::SL_GetLowercaseString(a2);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall SL_GetLowercaseString@<eax>(const char *a2@<edx>)
|
||||
NAKED unsigned int SL_GetLowercaseString_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edx;
|
||||
call SL_GetLowercaseString_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SL_ConvertToLowercase_stub(game::scriptInstance_t inst, unsigned int stringVal, unsigned int user)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return SL_ConvertToLowercase_hook.invoke<unsigned int>(inst, stringVal, user);
|
||||
#else
|
||||
return codsrc::SL_ConvertToLowercase(inst, stringVal, user);
|
||||
#endif
|
||||
}
|
||||
|
||||
void SL_TransferRefToUser_call(unsigned int stringValue, unsigned int user, [[maybe_unused]] void* caller_addr, game::scriptInstance_t inst)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
game::SL_TransferRefToUser(stringValue, user, inst, SL_TransferRefToUser_original);
|
||||
#else
|
||||
codsrc::SL_TransferRefToUser(stringValue, user, inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall SL_TransferRefToUser(unsigned int stringValue@<eax>, unsigned int user@<ecx>, game::scriptInstance_t inst)
|
||||
NAKED void SL_TransferRefToUser_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
push eax;
|
||||
call SL_TransferRefToUser_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void SL_FreeString_stub(game::scriptInstance_t a1, unsigned int a2, game::RefString* a3, unsigned int a4)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
SL_FreeString_hook.invoke<void>(a1, a2, a3, a4);
|
||||
#else
|
||||
codsrc::SL_FreeString(a1, a2, a3, a4);
|
||||
#endif
|
||||
}
|
||||
|
||||
void SL_RemoveRefToString_call(unsigned int stringVal, game::scriptInstance_t inst, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
game::SL_RemoveRefToString(stringVal, inst, SL_RemoveRefToString_original);
|
||||
#else
|
||||
codsrc::SL_RemoveRefToString(stringVal, inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall SL_RemoveRefToString(unsigned int stringVal@<edx>, game::scriptInstance_t inst@<esi>)
|
||||
NAKED void SL_RemoveRefToString_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push esi;
|
||||
push edx;
|
||||
call SL_RemoveRefToString_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_SetString_call(game::scriptInstance_t inst, unsigned int from, [[maybe_unused]] void* caller_addr, unsigned __int16* to)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
game::Scr_SetString(inst, from, to, Scr_SetString_original);
|
||||
#else
|
||||
codsrc::Scr_SetString(inst, from, to);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall Scr_SetString(game::scriptInstance_t inst@<eax>, unsigned int from@<edi>, unsigned __int16 *to)
|
||||
NAKED void Scr_SetString_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
push eax;
|
||||
call Scr_SetString_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_SetStringFromCharString_call(const char* a1, [[maybe_unused]] void* caller_addr, unsigned __int16* a2)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
game::Scr_SetStringFromCharString(a1, a2, Scr_SetStringFromCharString_original);
|
||||
#else
|
||||
codsrc::Scr_SetStringFromCharString(a1, a2);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall Scr_SetStringFromCharString@<eax>(const char *a1@<edi>, unsigned __int16 *a2)
|
||||
NAKED void Scr_SetStringFromCharString_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
call Scr_SetStringFromCharString_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int GScr_AllocString_call(const char* a1, [[maybe_unused]] void* caller_addr, game::scriptInstance_t inst)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return game::GScr_AllocString(a1, inst, GScr_AllocString_original);
|
||||
#else
|
||||
return codsrc::GScr_AllocString(a1, inst);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall GScr_AllocString@<eax>(const char *a1@<edx>, game::scriptInstance_t inst)
|
||||
NAKED unsigned int GScr_AllocString_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edx;
|
||||
call GScr_AllocString_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SL_GetStringForFloat_call(float a1, [[maybe_unused]] void* caller_addr, game::scriptInstance_t a2)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return game::SL_GetStringForFloat(a1, a2, SL_GetStringForFloat_original);
|
||||
#else
|
||||
return codsrc::SL_GetStringForFloat(a1, a2);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall SL_GetStringForFloat@<eax>(float a1@<xmm0>, game::scriptInstance_t a2)
|
||||
NAKED unsigned int SL_GetStringForFloat_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
movd eax, xmm0;
|
||||
push eax;
|
||||
call SL_GetStringForFloat_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SL_GetStringForInt_call(int a1, [[maybe_unused]] void* caller_addr, game::scriptInstance_t a2)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return game::SL_GetStringForInt(a1, a2, SL_GetStringForInt_original);
|
||||
#else
|
||||
return codsrc::SL_GetStringForInt(a1, a2);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall SL_GetStringForInt@<eax>(int a1@<eax>, game::scriptInstance_t a2)
|
||||
NAKED unsigned int SL_GetStringForInt_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call SL_GetStringForInt_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SL_GetStringForVector_call(float* a1, [[maybe_unused]] void* caller_addr, game::scriptInstance_t a2)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return game::SL_GetStringForVector(a1, a2, SL_GetStringForVector_original);
|
||||
#else
|
||||
return codsrc::SL_GetStringForVector(a1, a2);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall SL_GetStringForVector@<eax>(float *a1@<eax>, game::scriptInstance_t a2)
|
||||
NAKED unsigned int SL_GetStringForVector_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call SL_GetStringForVector_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void SL_ShutdownSystem_call(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr, unsigned int a2)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
game::SL_ShutdownSystem(a1, a2, SL_ShutdownSystem_original);
|
||||
#else
|
||||
codsrc::SL_ShutdownSystem(a1, a2);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall SL_ShutdownSystem(game::scriptInstance_t a1@<edi>, unsigned int a2)
|
||||
NAKED void SL_ShutdownSystem_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edi;
|
||||
call SL_ShutdownSystem_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void SL_TransferSystem_stub()
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
SL_TransferSystem_hook.invoke<void>();
|
||||
#else
|
||||
codsrc::SL_TransferSystem();
|
||||
#endif
|
||||
}
|
||||
|
||||
void SL_CreateCanonicalFilename_call(const char* filename, [[maybe_unused]] void* caller_addr, char* newFilename)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
game::SL_CreateCanonicalFilename(filename, newFilename, SL_CreateCanonicalFilename_original);
|
||||
#else
|
||||
codsrc::SL_CreateCanonicalFilename(filename, newFilename);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall SL_CreateCanonicalFilename(const char *filename@<eax>, char *newFilename)
|
||||
NAKED void SL_CreateCanonicalFilename_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call SL_CreateCanonicalFilename_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int Scr_CreateCanonicalFilename_stub(game::scriptInstance_t a1, const char* a2)
|
||||
{
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
return Scr_CreateCanonicalFilename_hook.invoke<unsigned int>(a1, a2);
|
||||
#else
|
||||
return codsrc::Scr_CreateCanonicalFilename(a1, a2);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
class component final : public component_interface
|
||||
{
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
bool quick = true;
|
||||
#ifdef RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
quick = false;
|
||||
#endif
|
||||
|
||||
SL_ConvertToString_hook.create(game::SL_ConvertToString_ADDR(), SL_ConvertToString_stub, quick);
|
||||
SL_GetStringLen_hook.create(game::SL_GetStringLen_ADDR(), SL_GetStringLen_stub, quick);
|
||||
GetHashCode_hook.create(game::GetHashCode_ADDR(), GetHashCode_stub, quick);
|
||||
SL_Init_hook.create(game::SL_Init_ADDR(), SL_Init_stub, quick);
|
||||
SL_FindStringOfSize_hook.create(game::SL_FindStringOfSize_ADDR(), SL_FindStringOfSize_stub, quick);
|
||||
SL_FindString_hook.create(game::SL_FindString_ADDR(), SL_FindString_stub, quick);
|
||||
SL_FindLowercaseString_hook.create(game::SL_FindLowercaseString.get(), SL_FindLowercaseString_stub, quick);
|
||||
SL_AddUserInternal_hook.create(game::SL_AddUserInternal_ADDR(), SL_AddUserInternal_stub, quick);
|
||||
Mark_ScriptStringCustom_hook.create(game::Mark_ScriptStringCustom_ADDR(), Mark_ScriptStringCustom_stub, quick);
|
||||
SL_GetStringOfSize_hook.create(game::SL_GetStringOfSize.get(), SL_GetStringOfSize_stub, quick);
|
||||
SL_GetString__hook.create(game::SL_GetString__ADDR(), SL_GetString__stub, quick);
|
||||
SL_GetString__0_hook.create(game::SL_GetString__0_ADDR(), SL_GetString__0_stub, quick);
|
||||
SL_GetLowercaseStringOfLen_hook.create(game::SL_GetLowercaseStringOfLen.get(), SL_GetLowercaseStringOfLen_stub, quick);
|
||||
SL_GetLowercaseString_hook.create(game::SL_GetLowercaseString_ADDR(), SL_GetLowercaseString_stub, quick);
|
||||
SL_ConvertToLowercase_hook.create(game::SL_ConvertToLowercase.get(), SL_ConvertToLowercase_stub, quick);
|
||||
SL_TransferRefToUser_hook.create(game::SL_TransferRefToUser_ADDR(), SL_TransferRefToUser_stub, quick);
|
||||
SL_FreeString_hook.create(game::SL_FreeString.get(), SL_FreeString_stub, quick);
|
||||
SL_RemoveRefToString_hook.create(game::SL_RemoveRefToString_ADDR(), SL_RemoveRefToString_stub, quick);
|
||||
Scr_SetString_hook.create(game::Scr_SetString_ADDR(), Scr_SetString_stub, quick);
|
||||
Scr_SetStringFromCharString_hook.create(game::Scr_SetStringFromCharString_ADDR(), Scr_SetStringFromCharString_stub, quick);
|
||||
GScr_AllocString_hook.create(game::GScr_AllocString_ADDR(), GScr_AllocString_stub, quick);
|
||||
SL_GetStringForFloat_hook.create(game::SL_GetStringForFloat_ADDR(), SL_GetStringForFloat_stub, quick);
|
||||
SL_GetStringForInt_hook.create(game::SL_GetStringForInt_ADDR(), SL_GetStringForInt_stub, quick);
|
||||
SL_GetStringForVector_hook.create(game::SL_GetStringForVector_ADDR(), SL_GetStringForVector_stub, quick);
|
||||
SL_ShutdownSystem_hook.create(game::SL_ShutdownSystem_ADDR(), SL_ShutdownSystem_stub, quick);
|
||||
SL_TransferSystem_hook.create(game::SL_TransferSystem.get(), SL_TransferSystem_stub, quick);
|
||||
SL_CreateCanonicalFilename_hook.create(game::SL_CreateCanonicalFilename_ADDR(), SL_CreateCanonicalFilename_stub, quick);
|
||||
Scr_CreateCanonicalFilename_hook.create(game::Scr_CreateCanonicalFilename.get(), Scr_CreateCanonicalFilename_stub, quick);
|
||||
|
||||
//Original hook function addresses
|
||||
SL_ConvertToString_original = SL_ConvertToString_hook.get_original();
|
||||
SL_GetStringLen_original = SL_GetStringLen_hook.get_original();
|
||||
GetHashCode_original = GetHashCode_hook.get_original();
|
||||
SL_Init_original = SL_Init_hook.get_original();
|
||||
SL_FindStringOfSize_original = SL_FindStringOfSize_hook.get_original();
|
||||
SL_FindString_original = SL_FindString_hook.get_original();
|
||||
SL_FindLowercaseString_original = SL_FindLowercaseString_hook.get_original();
|
||||
SL_AddUserInternal_original = SL_AddUserInternal_hook.get_original();
|
||||
Mark_ScriptStringCustom_original = Mark_ScriptStringCustom_hook.get_original();
|
||||
SL_GetStringOfSize_original = SL_GetStringOfSize_hook.get_original();
|
||||
SL_GetString__original = SL_GetString__hook.get_original();
|
||||
SL_GetString__0_original = SL_GetString__0_hook.get_original();
|
||||
SL_GetLowercaseStringOfLen_original = SL_GetLowercaseStringOfLen_hook.get_original();
|
||||
SL_GetLowercaseString_original = SL_GetLowercaseString_hook.get_original();
|
||||
SL_ConvertToLowercase_original = SL_ConvertToLowercase_hook.get_original();
|
||||
SL_TransferRefToUser_original = SL_TransferRefToUser_hook.get_original();
|
||||
SL_FreeString_original = SL_FreeString_hook.get_original();
|
||||
SL_RemoveRefToString_original = SL_RemoveRefToString_hook.get_original();
|
||||
Scr_SetString_original = Scr_SetString_hook.get_original();
|
||||
Scr_SetStringFromCharString_original = Scr_SetStringFromCharString_hook.get_original();
|
||||
GScr_AllocString_original = GScr_AllocString_hook.get_original();
|
||||
SL_GetStringForFloat_original = SL_GetStringForFloat_hook.get_original();
|
||||
SL_GetStringForInt_original = SL_GetStringForInt_hook.get_original();
|
||||
SL_GetStringForVector_original = SL_GetStringForVector_hook.get_original();
|
||||
SL_ShutdownSystem_original = SL_ShutdownSystem_hook.get_original();
|
||||
SL_TransferSystem_original = SL_TransferSystem_hook.get_original();
|
||||
SL_CreateCanonicalFilename_original = SL_CreateCanonicalFilename_hook.get_original();
|
||||
Scr_CreateCanonicalFilename_original = Scr_CreateCanonicalFilename_hook.get_original();
|
||||
}
|
||||
|
||||
private:
|
||||
};
|
||||
}
|
||||
REGISTER_COMPONENT(re_cscr_stringlist::component)
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,237 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
#include "utils/hook.hpp"
|
||||
#include "codsrc/clientscript/cscr_yacc.hpp"
|
||||
|
||||
#ifndef DISABLE_RE_CSCR_YACC
|
||||
namespace re_cscr_yacc
|
||||
{
|
||||
utils::hook::detour LowerCase_hook;
|
||||
utils::hook::detour yyparse_hook;
|
||||
utils::hook::detour StringValue_hook;
|
||||
utils::hook::detour yylex_hook;
|
||||
utils::hook::detour yy_get_next_buffer_hook;
|
||||
utils::hook::detour yy_get_previous_state_hook;
|
||||
utils::hook::detour yy_try_NUL_trans_hook;
|
||||
utils::hook::detour yyrestart_hook;
|
||||
utils::hook::detour yy_create_buffer_hook;
|
||||
utils::hook::detour yy_flush_buffer_hook;
|
||||
utils::hook::detour ScriptParse_hook;
|
||||
|
||||
void* LowerCase_original;
|
||||
void* yyparse_original;
|
||||
void* StringValue_original;
|
||||
void* yylex_original;
|
||||
void* yy_get_next_buffer_original;
|
||||
void* yy_get_previous_state_original;
|
||||
void* yy_try_NUL_trans_original;
|
||||
void* yyrestart_original;
|
||||
void* yy_create_buffer_original;
|
||||
void* yy_flush_buffer_original;
|
||||
void* ScriptParse_original;
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
unsigned int LowerCase_call(unsigned int strVal, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_YACC_USE_WRAPPERS
|
||||
return game::LowerCase(strVal, LowerCase_original);
|
||||
#else
|
||||
return codsrc::LowerCase(strVal);
|
||||
#endif
|
||||
}
|
||||
|
||||
// unsigned int __usercall LowerCase@<eax>(unsigned int strVal@<ecx>)
|
||||
NAKED unsigned int LowerCase_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push ecx;
|
||||
call LowerCase_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
int yyparse_stub()
|
||||
{
|
||||
#ifdef RE_CSCR_YACC_USE_WRAPPERS
|
||||
return yyparse_hook.invoke<int>();
|
||||
#else
|
||||
return codsrc::yyparse();
|
||||
#endif
|
||||
}
|
||||
|
||||
int StringValue_call(int len, const char * str_, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_YACC_USE_WRAPPERS
|
||||
return game::StringValue(len, str_, StringValue_original);
|
||||
#else
|
||||
return codsrc::StringValue(len, str_);
|
||||
#endif
|
||||
}
|
||||
|
||||
// int __usercall StringValue@<eax>(int len@<ecx>, const char *str@<edx>)
|
||||
NAKED int StringValue_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push edx;
|
||||
push ecx;
|
||||
call StringValue_call;
|
||||
add esp, 0x8;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
int yylex_stub()
|
||||
{
|
||||
#ifdef RE_CSCR_YACC_USE_WRAPPERS
|
||||
return yylex_hook.invoke<int>();
|
||||
#else
|
||||
return codsrc::yylex();
|
||||
#endif
|
||||
}
|
||||
|
||||
int yy_get_next_buffer_stub()
|
||||
{
|
||||
#ifdef RE_CSCR_YACC_USE_WRAPPERS
|
||||
return yy_get_next_buffer_hook.invoke<int>();
|
||||
#else
|
||||
return codsrc::yy_get_next_buffer();
|
||||
#endif
|
||||
}
|
||||
|
||||
int yy_get_previous_state_stub()
|
||||
{
|
||||
#ifdef RE_CSCR_YACC_USE_WRAPPERS
|
||||
return yy_get_previous_state_hook.invoke<int>();
|
||||
#else
|
||||
return codsrc::yy_get_previous_state();
|
||||
#endif
|
||||
}
|
||||
|
||||
int yy_try_NUL_trans_call(int yy_current_state, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_YACC_USE_WRAPPERS
|
||||
return game::yy_try_NUL_trans(yy_current_state, yy_try_NUL_trans_original);
|
||||
#else
|
||||
return codsrc::yy_try_NUL_trans(yy_current_state);
|
||||
#endif
|
||||
}
|
||||
|
||||
// int __usercall yy_try_NUL_trans@<eax>(int yy_current_state@<eax>)
|
||||
NAKED int yy_try_NUL_trans_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call yy_try_NUL_trans_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void yyrestart_stub()
|
||||
{
|
||||
#ifdef RE_CSCR_YACC_USE_WRAPPERS
|
||||
yyrestart_hook.invoke<void>();
|
||||
#else
|
||||
codsrc::yyrestart();
|
||||
#endif
|
||||
}
|
||||
|
||||
game::yy_buffer_state * yy_create_buffer_stub()
|
||||
{
|
||||
#ifdef RE_CSCR_YACC_USE_WRAPPERS
|
||||
return yy_create_buffer_hook.invoke<game::yy_buffer_state *>();
|
||||
#else
|
||||
return codsrc::yy_create_buffer();
|
||||
#endif
|
||||
}
|
||||
|
||||
void yy_flush_buffer_call(game::yy_buffer_state * result, [[maybe_unused]] void* caller_addr)
|
||||
{
|
||||
#ifdef RE_CSCR_YACC_USE_WRAPPERS
|
||||
game::yy_flush_buffer(result, yy_flush_buffer_original);
|
||||
#else
|
||||
codsrc::yy_flush_buffer(result);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall yy_flush_buffer(game::yy_buffer_state *result@<eax>)
|
||||
NAKED void yy_flush_buffer_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call yy_flush_buffer_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
|
||||
void ScriptParse_call(game::scriptInstance_t a1, [[maybe_unused]] void* caller_addr, game::sval_u * parseData)
|
||||
{
|
||||
#ifdef RE_CSCR_YACC_USE_WRAPPERS
|
||||
game::ScriptParse(a1, parseData, ScriptParse_original);
|
||||
#else
|
||||
codsrc::ScriptParse(a1, parseData);
|
||||
#endif
|
||||
}
|
||||
|
||||
// void __usercall ScriptParse(game::scriptInstance_t a1@<eax>, game::sval_u *parseData)
|
||||
NAKED void ScriptParse_stub()
|
||||
{
|
||||
_asm
|
||||
{
|
||||
push eax;
|
||||
call ScriptParse_call;
|
||||
add esp, 0x4;
|
||||
ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class component final : public component_interface
|
||||
{
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
bool quick = true;
|
||||
#ifdef RE_CSCR_YACC_USE_WRAPPERS
|
||||
quick = false;
|
||||
#endif
|
||||
|
||||
LowerCase_hook.create(game::LowerCase_ADDR(), LowerCase_stub, quick);
|
||||
yyparse_hook.create(game::yyparse.get(), yyparse_stub, quick);
|
||||
StringValue_hook.create(game::StringValue_ADDR(), StringValue_stub, quick);
|
||||
yylex_hook.create(game::yylex.get(), yylex_stub, quick);
|
||||
yy_get_next_buffer_hook.create(game::yy_get_next_buffer.get(), yy_get_next_buffer_stub, quick);
|
||||
yy_get_previous_state_hook.create(game::yy_get_previous_state.get(), yy_get_previous_state_stub, quick);
|
||||
yy_try_NUL_trans_hook.create(game::yy_try_NUL_trans_ADDR(), yy_try_NUL_trans_stub, quick);
|
||||
yyrestart_hook.create(game::yyrestart.get(), yyrestart_stub, quick);
|
||||
yy_create_buffer_hook.create(game::yy_create_buffer.get(), yy_create_buffer_stub, quick);
|
||||
yy_flush_buffer_hook.create(game::yy_flush_buffer_ADDR(), yy_flush_buffer_stub, quick);
|
||||
ScriptParse_hook.create(game::ScriptParse_ADDR(), ScriptParse_stub, quick);
|
||||
|
||||
//Original hook function addresses
|
||||
LowerCase_original = LowerCase_hook.get_original();
|
||||
yyparse_original = yyparse_hook.get_original();
|
||||
StringValue_original = StringValue_hook.get_original();
|
||||
yylex_original = yylex_hook.get_original();
|
||||
yy_get_next_buffer_original = yy_get_next_buffer_hook.get_original();
|
||||
yy_get_previous_state_original = yy_get_previous_state_hook.get_original();
|
||||
yy_try_NUL_trans_original = yy_try_NUL_trans_hook.get_original();
|
||||
yyrestart_original = yyrestart_hook.get_original();
|
||||
yy_create_buffer_original = yy_create_buffer_hook.get_original();
|
||||
yy_flush_buffer_original = yy_flush_buffer_hook.get_original();
|
||||
ScriptParse_original = ScriptParse_hook.get_original();
|
||||
}
|
||||
|
||||
private:
|
||||
};
|
||||
}
|
||||
REGISTER_COMPONENT(re_cscr_yacc::component)
|
||||
#endif
|
@@ -1,141 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
#include <utils/io.hpp>
|
||||
#include <utils/string.hpp>
|
||||
#include <utils/thread.hpp>
|
||||
#include <utils/compression.hpp>
|
||||
|
||||
#include <exception/minidump.hpp>
|
||||
|
||||
namespace exception
|
||||
{
|
||||
namespace
|
||||
{
|
||||
thread_local struct
|
||||
{
|
||||
DWORD code = 0;
|
||||
PVOID address = nullptr;
|
||||
} exception_data;
|
||||
|
||||
void show_mouse_cursor()
|
||||
{
|
||||
while (ShowCursor(TRUE) < 0);
|
||||
}
|
||||
|
||||
void display_error_dialog()
|
||||
{
|
||||
std::string error_str = utils::string::va("Fatal error (0x%08X) at 0x%p.\n"
|
||||
"A minidump has been written.\n\n",
|
||||
exception_data.code, exception_data.address);
|
||||
|
||||
error_str += "Make sure to update your graphics card drivers and install operating system updates!";
|
||||
|
||||
utils::thread::suspend_other_threads();
|
||||
show_mouse_cursor();
|
||||
MessageBoxA(nullptr, error_str.data(), "Plutonium T4 ERROR", MB_ICONERROR);
|
||||
TerminateProcess(GetCurrentProcess(), exception_data.code);
|
||||
}
|
||||
|
||||
void reset_state()
|
||||
{
|
||||
display_error_dialog();
|
||||
}
|
||||
|
||||
size_t get_reset_state_stub()
|
||||
{
|
||||
static auto* stub = utils::hook::assemble([](utils::hook::assembler& a)
|
||||
{
|
||||
a.sub(esp, 0x10);
|
||||
a.or_(esp, 0x8);
|
||||
a.jmp(reset_state);
|
||||
});
|
||||
|
||||
return reinterpret_cast<size_t>(stub);
|
||||
}
|
||||
|
||||
std::string generate_crash_info(const LPEXCEPTION_POINTERS exceptioninfo)
|
||||
{
|
||||
std::string info{};
|
||||
const auto line = [&info](const std::string& text)
|
||||
{
|
||||
info.append(text);
|
||||
info.append("\r\n");
|
||||
};
|
||||
|
||||
line("Plutonium T4 Crash Dump");
|
||||
line("");
|
||||
line("Timestamp: "s + utils::string::get_timestamp());
|
||||
line(utils::string::va("Exception: 0x%08X", exceptioninfo->ExceptionRecord->ExceptionCode));
|
||||
line(utils::string::va("Address: 0x%lX", exceptioninfo->ExceptionRecord->ExceptionAddress));
|
||||
|
||||
line("");
|
||||
line(build_gsc_dump(game::SCRIPTINSTANCE_SERVER));
|
||||
line("");
|
||||
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4996)
|
||||
OSVERSIONINFOEXA version_info;
|
||||
ZeroMemory(&version_info, sizeof(version_info));
|
||||
version_info.dwOSVersionInfoSize = sizeof(version_info);
|
||||
GetVersionExA(reinterpret_cast<LPOSVERSIONINFOA>(&version_info));
|
||||
#pragma warning(pop)
|
||||
|
||||
line(utils::string::va("OS Version: %u.%u", version_info.dwMajorVersion, version_info.dwMinorVersion));
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
void write_minidump(const LPEXCEPTION_POINTERS exceptioninfo)
|
||||
{
|
||||
const std::string crash_name = utils::string::va("t4sp-server-plugin/minidumps/plutonium-t4-crash-%s.zip",
|
||||
utils::string::get_timestamp().data());
|
||||
|
||||
utils::compression::zip::archive zip_file{};
|
||||
zip_file.add("crash.dmp", create_minidump(exceptioninfo));
|
||||
zip_file.add("info.txt", generate_crash_info(exceptioninfo));
|
||||
zip_file.write(crash_name, "Plutonium T4 Crash Dump");
|
||||
}
|
||||
|
||||
bool is_harmless_error(const LPEXCEPTION_POINTERS exceptioninfo)
|
||||
{
|
||||
const auto code = exceptioninfo->ExceptionRecord->ExceptionCode;
|
||||
return code == STATUS_INTEGER_OVERFLOW || code == STATUS_FLOAT_OVERFLOW || code == STATUS_SINGLE_STEP;
|
||||
}
|
||||
|
||||
LONG WINAPI exception_filter(const LPEXCEPTION_POINTERS exceptioninfo)
|
||||
{
|
||||
if (is_harmless_error(exceptioninfo))
|
||||
{
|
||||
return EXCEPTION_CONTINUE_EXECUTION;
|
||||
}
|
||||
|
||||
write_minidump(exceptioninfo);
|
||||
|
||||
exception_data.code = exceptioninfo->ExceptionRecord->ExceptionCode;
|
||||
exception_data.address = exceptioninfo->ExceptionRecord->ExceptionAddress;
|
||||
exceptioninfo->ContextRecord->Eip = get_reset_state_stub();
|
||||
|
||||
return EXCEPTION_CONTINUE_EXECUTION;
|
||||
}
|
||||
|
||||
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI set_unhandled_exception_filter_stub(LPTOP_LEVEL_EXCEPTION_FILTER)
|
||||
{
|
||||
// Don't register anything here...
|
||||
return &exception_filter;
|
||||
}
|
||||
}
|
||||
|
||||
class component final : public component_interface
|
||||
{
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
SetUnhandledExceptionFilter(exception_filter);
|
||||
utils::hook::jump(reinterpret_cast<uintptr_t>(&SetUnhandledExceptionFilter), set_unhandled_exception_filter_stub);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
REGISTER_COMPONENT(exception::component)
|
@@ -1,467 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
#include "gsc.hpp"
|
||||
#include "scheduler.hpp"
|
||||
#include <utils/memory.hpp>
|
||||
#include <utils/string.hpp>
|
||||
|
||||
namespace fileio
|
||||
{
|
||||
namespace
|
||||
{
|
||||
static constexpr size_t max_fhs = 10;
|
||||
static constexpr size_t max_gsc_string = 0x10000 - 1;
|
||||
|
||||
enum class scr_fh_type_e
|
||||
{
|
||||
UNUSED,
|
||||
READ,
|
||||
WRITE,
|
||||
APPEND
|
||||
};
|
||||
|
||||
struct scr_fh_t
|
||||
{
|
||||
scr_fh_type_e type;
|
||||
std::unique_ptr<char[]> file_buff;
|
||||
int file_length;
|
||||
int seek;
|
||||
std::filesystem::path full_path;
|
||||
std::string base_path;
|
||||
};
|
||||
|
||||
std::array<scr_fh_t, max_fhs> scr_fhs = {};
|
||||
|
||||
bool validate_scr_path(const std::string& fpath)
|
||||
{
|
||||
auto toks = utils::string::split(fpath, '/');
|
||||
|
||||
for (const auto& tok : toks)
|
||||
{
|
||||
if (tok == "." || tok == "..")
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (tok.find(":") != std::string::npos)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string build_base_path(const std::string& path_)
|
||||
{
|
||||
auto path = path_;
|
||||
std::replace(path.begin(), path.end(), '\\', '/');
|
||||
|
||||
if (!validate_scr_path(path))
|
||||
{
|
||||
game::Scr_ParamError(0, game::SCRIPTINSTANCE_SERVER, utils::string::va("Invalid path: %s", path_.c_str()));
|
||||
}
|
||||
|
||||
// its sandboxed, but what about symlinks?
|
||||
return path.starts_with("scriptdata/") ? path : "scriptdata/" + path;
|
||||
}
|
||||
|
||||
std::filesystem::path build_full_path(const std::string& path, bool use_global)
|
||||
{
|
||||
static game::dvar_s* fs_localAppData = nullptr;
|
||||
static game::dvar_s* fs_gamedir = nullptr;
|
||||
|
||||
if (!fs_localAppData)
|
||||
{
|
||||
fs_localAppData = game::Dvar_FindVar("fs_localAppData");
|
||||
}
|
||||
|
||||
if (!fs_gamedir)
|
||||
{
|
||||
fs_gamedir = game::Dvar_FindVar("fs_game");
|
||||
}
|
||||
|
||||
return std::filesystem::path(fs_localAppData->current.string) / (!use_global && *fs_gamedir->current.string ? fs_gamedir->current.string : "raw") / path;
|
||||
}
|
||||
|
||||
void free_scr_fh(scr_fh_t& scr_fh)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
plugin::get()->get_interface()->logging()->info(utils::string::va("free_scr_fh: closing %s\n", scr_fh.base_path.c_str()));
|
||||
#endif
|
||||
|
||||
scr_fh = {};
|
||||
scr_fh.type = scr_fh_type_e::UNUSED;
|
||||
}
|
||||
|
||||
void close_all_scr_fh()
|
||||
{
|
||||
for (auto& fh : scr_fhs)
|
||||
{
|
||||
if (fh.type == scr_fh_type_e::UNUSED)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
free_scr_fh(fh);
|
||||
}
|
||||
}
|
||||
|
||||
int scr_get_fh()
|
||||
{
|
||||
auto fh = game::Scr_GetInt(game::SCRIPTINSTANCE_SERVER, 0) - 1;
|
||||
|
||||
if (fh < 0 || fh >= max_fhs)
|
||||
{
|
||||
game::Scr_ParamError(0, game::SCRIPTINSTANCE_SERVER, "fs_fwrite: invalid filehandle");
|
||||
}
|
||||
|
||||
return fh;
|
||||
}
|
||||
|
||||
void fwrite_to_file(bool append_newline)
|
||||
{
|
||||
auto fh = scr_get_fh();
|
||||
|
||||
if (scr_fhs[fh].type != scr_fh_type_e::WRITE && scr_fhs[fh].type != scr_fh_type_e::APPEND)
|
||||
{
|
||||
game::Scr_ParamError(0, game::SCRIPTINSTANCE_SERVER, "File not opened for writing");
|
||||
}
|
||||
|
||||
std::string to_write = game::Scr_GetString(1, game::SCRIPTINSTANCE_SERVER);
|
||||
if (append_newline)
|
||||
{
|
||||
to_write += '\n';
|
||||
}
|
||||
|
||||
if (!utils::io::write_file(scr_fhs[fh].full_path.string(), to_write, true))
|
||||
{
|
||||
game::Com_PrintWarning(game::CON_CHANNEL_SCRIPT, "Failed to write file: %s\n", scr_fhs[fh].base_path.c_str());
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, 1);
|
||||
}
|
||||
|
||||
void add_file_io()
|
||||
{
|
||||
scheduler::on_scr_execute([]()
|
||||
{
|
||||
close_all_scr_fh();
|
||||
});
|
||||
|
||||
gsc::function::add("fs_testfile", []()
|
||||
{
|
||||
auto fpath = build_base_path(game::Scr_GetString(0, game::SCRIPTINSTANCE_SERVER));
|
||||
|
||||
auto fd = 0;
|
||||
auto file_length = game::FS_FOpenFileRead(fpath.c_str(), &fd);
|
||||
|
||||
if (!fd || file_length < 0)
|
||||
{
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
game::FS_FCloseFile(fd);
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, 1);
|
||||
});
|
||||
|
||||
gsc::function::add("fs_fopen", []()
|
||||
{
|
||||
auto fpath = build_base_path(game::Scr_GetString(0, game::SCRIPTINSTANCE_SERVER));
|
||||
|
||||
// check for dupes
|
||||
for (const auto& scr_fd : scr_fhs)
|
||||
{
|
||||
if (scr_fd.type != scr_fh_type_e::UNUSED && scr_fd.base_path == fpath)
|
||||
{
|
||||
game::Scr_ParamError(0, game::SCRIPTINSTANCE_SERVER, "File already opened");
|
||||
}
|
||||
}
|
||||
|
||||
// check for avail slot
|
||||
auto i = 0;
|
||||
for (; i < max_fhs; i++)
|
||||
{
|
||||
if (scr_fhs[i].type == scr_fh_type_e::UNUSED)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i >= max_fhs)
|
||||
{
|
||||
game::Scr_ParamError(0, game::SCRIPTINSTANCE_SERVER, "Too many files opened");
|
||||
}
|
||||
|
||||
// check mode
|
||||
auto mode = game::Scr_GetString(1, game::SCRIPTINSTANCE_SERVER);
|
||||
if (mode == "read"s)
|
||||
{
|
||||
auto fd = 0;
|
||||
auto file_length = game::FS_FOpenFileRead(fpath.c_str(), &fd);
|
||||
|
||||
if (!fd || file_length < 0)
|
||||
{
|
||||
game::Com_PrintWarning(game::CON_CHANNEL_SCRIPT, "Failed to open file for reading: %s\n", fpath.c_str());
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
scr_fhs[i].file_buff = std::make_unique<char[]>(file_length + 1);
|
||||
auto bytes_read = game::FS_Read(scr_fhs[i].file_buff.get(), file_length, fd);
|
||||
scr_fhs[i].file_buff[file_length] = '\0';
|
||||
game::FS_FCloseFile(fd);
|
||||
|
||||
assert(bytes_read == file_length);
|
||||
|
||||
if (bytes_read < 0)
|
||||
{
|
||||
scr_fhs[i].file_buff = {};
|
||||
game::Com_PrintWarning(game::CON_CHANNEL_SCRIPT, "Failed to read file: %s\n", fpath.c_str());
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
scr_fhs[i].type = scr_fh_type_e::READ;
|
||||
scr_fhs[i].file_length = bytes_read;
|
||||
scr_fhs[i].seek = 0;
|
||||
scr_fhs[i].base_path = fpath;
|
||||
}
|
||||
else if (mode == "write"s || mode == "append"s)
|
||||
{
|
||||
auto full_path = build_full_path(fpath, game::Scr_GetNumParam(game::SCRIPTINSTANCE_SERVER) >= 3 && game::Scr_GetType(game::SCRIPTINSTANCE_SERVER, 2) == game::VAR_INTEGER && game::Scr_GetInt(game::SCRIPTINSTANCE_SERVER, 2));
|
||||
|
||||
if (!utils::io::write_file(full_path.string(), "", (mode == "append"s)))
|
||||
{
|
||||
game::Com_PrintWarning(game::CON_CHANNEL_SCRIPT, "Failed to open file for writing: %s\n", fpath.c_str());
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
scr_fhs[i].type = scr_fh_type_e::WRITE;
|
||||
scr_fhs[i].base_path = fpath;
|
||||
scr_fhs[i].full_path = full_path;
|
||||
}
|
||||
else
|
||||
{
|
||||
game::Scr_ParamError(1, game::SCRIPTINSTANCE_SERVER, utils::string::va("Invalid mode: %s", mode));
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
plugin::get()->get_interface()->logging()->info(utils::string::va("gscr_fs_fopen: opening %s, mode %s\n", fpath.c_str(), mode));
|
||||
#endif
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, i + 1);
|
||||
});
|
||||
|
||||
gsc::function::add("fs_write", []()
|
||||
{
|
||||
fwrite_to_file(false);
|
||||
});
|
||||
|
||||
gsc::function::add("fs_writeline", []()
|
||||
{
|
||||
fwrite_to_file(true);
|
||||
});
|
||||
|
||||
gsc::function::add("fs_readline", []()
|
||||
{
|
||||
auto fh = scr_get_fh();
|
||||
|
||||
if (scr_fhs[fh].type != scr_fh_type_e::READ)
|
||||
{
|
||||
game::Scr_ParamError(0, game::SCRIPTINSTANCE_SERVER, "File not opened for reading");
|
||||
}
|
||||
|
||||
// file is completed being read
|
||||
if (scr_fhs[fh].seek >= scr_fhs[fh].file_length)
|
||||
{
|
||||
game::Scr_AddUndefined(game::SCRIPTINSTANCE_SERVER);
|
||||
return;
|
||||
}
|
||||
|
||||
// count how many bytes until the newline
|
||||
auto bytes_to_read = 0;
|
||||
auto found_nl = false;
|
||||
|
||||
for (auto i = scr_fhs[fh].seek; i < scr_fhs[fh].file_length; bytes_to_read++, i++)
|
||||
{
|
||||
if (scr_fhs[fh].file_buff[i] == '\n')
|
||||
{
|
||||
bytes_to_read++;
|
||||
found_nl = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (bytes_to_read > max_gsc_string)
|
||||
{
|
||||
found_nl = false;
|
||||
bytes_to_read = max_gsc_string;
|
||||
|
||||
game::Com_PrintWarning(game::CON_CHANNEL_SCRIPT, "Line was too long in file %s, truncating\n", scr_fhs[fh].base_path.c_str());
|
||||
}
|
||||
|
||||
auto scr_str = std::string(&scr_fhs[fh].file_buff[scr_fhs[fh].seek], bytes_to_read);
|
||||
scr_fhs[fh].seek += bytes_to_read;
|
||||
|
||||
// remove all '\r'
|
||||
scr_str.erase(std::remove(scr_str.begin(), scr_str.end(), '\r'), scr_str.end());
|
||||
|
||||
// chop the newline char off
|
||||
if (found_nl)
|
||||
{
|
||||
scr_str.pop_back();
|
||||
}
|
||||
|
||||
game::Scr_AddString(game::SCRIPTINSTANCE_SERVER, scr_str.c_str());
|
||||
});
|
||||
|
||||
gsc::function::add("fs_read", []()
|
||||
{
|
||||
auto fh = scr_get_fh();
|
||||
|
||||
if (scr_fhs[fh].type != scr_fh_type_e::READ)
|
||||
{
|
||||
game::Scr_ParamError(0, game::SCRIPTINSTANCE_SERVER, "File not opened for reading");
|
||||
}
|
||||
|
||||
// file is completed being read
|
||||
if (scr_fhs[fh].seek >= scr_fhs[fh].file_length)
|
||||
{
|
||||
game::Scr_AddUndefined(game::SCRIPTINSTANCE_SERVER);
|
||||
return;
|
||||
}
|
||||
|
||||
auto bytes_to_read = scr_fhs[fh].file_length - scr_fhs[fh].seek;
|
||||
if (game::Scr_GetNumParam(game::SCRIPTINSTANCE_SERVER) >= 2)
|
||||
{
|
||||
bytes_to_read = std::clamp(game::Scr_GetInt(game::SCRIPTINSTANCE_SERVER, 1), 0, bytes_to_read);
|
||||
|
||||
if (bytes_to_read <= 0)
|
||||
{
|
||||
game::Scr_ParamError(1, game::SCRIPTINSTANCE_SERVER, "Trying to read <1 bytes");
|
||||
}
|
||||
}
|
||||
|
||||
if (bytes_to_read > max_gsc_string)
|
||||
{
|
||||
bytes_to_read = max_gsc_string;
|
||||
|
||||
game::Com_PrintWarning(game::CON_CHANNEL_SCRIPT, "Line was too long in file %s, truncating\n", scr_fhs[fh].base_path.c_str());
|
||||
}
|
||||
|
||||
auto scr_str = std::string(&scr_fhs[fh].file_buff[scr_fhs[fh].seek], bytes_to_read);
|
||||
scr_fhs[fh].seek += bytes_to_read;
|
||||
|
||||
game::Scr_AddString(game::SCRIPTINSTANCE_SERVER, scr_str.c_str());
|
||||
});
|
||||
|
||||
gsc::function::add("fs_fcloseall", []()
|
||||
{
|
||||
close_all_scr_fh();
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, 1);
|
||||
});
|
||||
|
||||
gsc::function::add("fs_fclose", []()
|
||||
{
|
||||
auto fh = scr_get_fh();
|
||||
|
||||
if (scr_fhs[fh].type == scr_fh_type_e::UNUSED)
|
||||
{
|
||||
game::Scr_ParamError(0, game::SCRIPTINSTANCE_SERVER, "File not opened");
|
||||
}
|
||||
|
||||
free_scr_fh(scr_fhs[fh]);
|
||||
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, 1);
|
||||
});
|
||||
|
||||
gsc::function::add("fs_length", []()
|
||||
{
|
||||
auto fh = scr_get_fh();
|
||||
|
||||
if (scr_fhs[fh].type == scr_fh_type_e::UNUSED)
|
||||
{
|
||||
game::Scr_ParamError(0, game::SCRIPTINSTANCE_SERVER, "File not opened");
|
||||
}
|
||||
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, scr_fhs[fh].file_length);
|
||||
});
|
||||
|
||||
gsc::function::add("fs_getseek", []()
|
||||
{
|
||||
auto fh = scr_get_fh();
|
||||
|
||||
// write seek would require completely redoing how we write files...
|
||||
if (scr_fhs[fh].type != scr_fh_type_e::READ)
|
||||
{
|
||||
game::Scr_ParamError(0, game::SCRIPTINSTANCE_SERVER, "File not opened for reading");
|
||||
}
|
||||
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, scr_fhs[fh].seek);
|
||||
});
|
||||
|
||||
gsc::function::add("fs_seek", []()
|
||||
{
|
||||
auto fh = scr_get_fh();
|
||||
|
||||
if (scr_fhs[fh].type != scr_fh_type_e::READ)
|
||||
{
|
||||
game::Scr_ParamError(0, game::SCRIPTINSTANCE_SERVER, "File not opened for reading");
|
||||
}
|
||||
|
||||
scr_fhs[fh].seek = std::clamp(game::Scr_GetInt(game::SCRIPTINSTANCE_SERVER, 1), 0, scr_fhs[fh].file_length);
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, 1);
|
||||
});
|
||||
|
||||
gsc::function::add("fs_remove", []()
|
||||
{
|
||||
auto fpath = build_base_path(game::Scr_GetString(0, game::SCRIPTINSTANCE_SERVER));
|
||||
auto full_path = build_full_path(fpath, game::Scr_GetNumParam(game::SCRIPTINSTANCE_SERVER) >= 2 && game::Scr_GetType(game::SCRIPTINSTANCE_SERVER, 1) == game::VAR_INTEGER && game::Scr_GetInt(game::SCRIPTINSTANCE_SERVER, 1));
|
||||
|
||||
if (!utils::io::remove_file(full_path.string()))
|
||||
{
|
||||
game::Com_PrintWarning(game::CON_CHANNEL_SCRIPT, "Failed to delete file: %s\n", fpath.c_str());
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
game::Scr_AddInt(game::SCRIPTINSTANCE_SERVER, 1);
|
||||
});
|
||||
|
||||
gsc::function::add("fs_listfiles", []()
|
||||
{
|
||||
auto fpath = build_base_path(game::Scr_GetString(0, game::SCRIPTINSTANCE_SERVER));
|
||||
|
||||
int numfiles;
|
||||
auto* files = game::FS_ListFiles(fpath.c_str(), "", game::FS_LIST_ALL, &numfiles);
|
||||
|
||||
game::Scr_MakeArray(game::SCRIPTINSTANCE_SERVER);
|
||||
for (int i = 0; i < numfiles; i++)
|
||||
{
|
||||
game::Scr_AddString(game::SCRIPTINSTANCE_SERVER, files[i]);
|
||||
game::Scr_AddArray(game::SCRIPTINSTANCE_SERVER);
|
||||
}
|
||||
|
||||
game::FS_FreeFileList(files);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
class component final : public component_interface
|
||||
{
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
add_file_io();
|
||||
}
|
||||
|
||||
private:
|
||||
};
|
||||
}
|
||||
|
||||
REGISTER_COMPONENT(fileio::component)
|
||||
|
@@ -1,82 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "signatures.hpp"
|
||||
#include <utils/hook.hpp>
|
||||
#include <utils/io.hpp>
|
||||
#include <utils/string.hpp>
|
||||
#include <utils/cryptography.hpp>
|
||||
#include <utils/compression.hpp>
|
||||
#include <json.hpp>
|
||||
|
||||
namespace signatures
|
||||
{
|
||||
bool addr_is_in_image_space_of_pluto(size_t wheree)
|
||||
{
|
||||
MODULEINFO info{};
|
||||
GetModuleInformation(GetCurrentProcess(),
|
||||
GetModuleHandle("plutonium-bootstrapper-win32.exe"), &info, sizeof(MODULEINFO));
|
||||
|
||||
static const auto image_base = reinterpret_cast<size_t>(GetModuleHandle("plutonium-bootstrapper-win32.exe"));
|
||||
|
||||
return wheree >= image_base && wheree < image_base + info.SizeOfImage;
|
||||
}
|
||||
|
||||
std::string err_reason;
|
||||
const std::string& get_err_reason()
|
||||
{
|
||||
return err_reason;
|
||||
}
|
||||
|
||||
#define SAFE_SET_PLUTO_SYMBOL_DOUBLE(name, addr, off) \
|
||||
addr2 = reinterpret_cast<size_t>(utils::hook::get_displacement_addr(addr)); \
|
||||
if (!addr_is_in_image_space_of_pluto(addr2)) \
|
||||
{ \
|
||||
err_reason = #name " 1"; \
|
||||
return false; \
|
||||
} \
|
||||
addr1 = reinterpret_cast<size_t>(utils::hook::get_displacement_addr(addr2 + off)); \
|
||||
if (!addr_is_in_image_space_of_pluto(addr1)) \
|
||||
{ \
|
||||
err_reason = #name " 2"; \
|
||||
return false; \
|
||||
} \
|
||||
game::plutonium::name.set(addr1)
|
||||
|
||||
|
||||
#define SAFE_SET_PLUTO_SYMBOL(name, addr) \
|
||||
addr1 = reinterpret_cast<size_t>(utils::hook::get_displacement_addr(addr)); \
|
||||
if (!addr_is_in_image_space_of_pluto(addr1)) \
|
||||
{ \
|
||||
err_reason = #name; \
|
||||
return false; \
|
||||
} \
|
||||
game::plutonium::name.set(addr1)
|
||||
|
||||
|
||||
bool handle_funcs()
|
||||
{
|
||||
size_t addr1;
|
||||
size_t addr2;
|
||||
|
||||
SAFE_SET_PLUTO_SYMBOL_DOUBLE(load_custom_script_func, 0x689C80, 0x6);
|
||||
SAFE_SET_PLUTO_SYMBOL_DOUBLE(script_preprocess, 0x689BCF, 0x2);
|
||||
|
||||
SAFE_SET_PLUTO_SYMBOL_DOUBLE(vm_execute_update_codepos, 0x69608C, 0x2);
|
||||
SAFE_SET_PLUTO_SYMBOL_DOUBLE(scr_execthread_update_codepos_func, 0x699560, 0x11);
|
||||
SAFE_SET_PLUTO_SYMBOL_DOUBLE(scr_execentthread_update_codepos_func, 0x699640, 0x7);
|
||||
SAFE_SET_PLUTO_SYMBOL_DOUBLE(scr_addexecthread_update_codepos_func, 0x699730, 0x7);
|
||||
SAFE_SET_PLUTO_SYMBOL_DOUBLE(at_codepose_va, 0x68B3A5, 0xA);
|
||||
SAFE_SET_PLUTO_SYMBOL_DOUBLE(store_func_codepos, 0x688909, 0x3);
|
||||
|
||||
SAFE_SET_PLUTO_SYMBOL(cscr_get_function_hook, 0x682DC0);
|
||||
SAFE_SET_PLUTO_SYMBOL(cscr_get_method_hook, 0x68305C);
|
||||
SAFE_SET_PLUTO_SYMBOL_DOUBLE(scr_get_method_hook, 0x683043, 0x4);
|
||||
SAFE_SET_PLUTO_SYMBOL_DOUBLE(scr_get_function_hook, 0x682D99, 0x8);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool process()
|
||||
{
|
||||
return handle_funcs();
|
||||
}
|
||||
}
|
@@ -1,7 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace signatures
|
||||
{
|
||||
const std::string& get_err_reason();
|
||||
bool process();
|
||||
}
|
@@ -2,6 +2,7 @@
|
||||
#include "loader/component_loader.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
#include "gsc.hpp"
|
||||
|
||||
namespace test
|
||||
{
|
||||
@@ -14,15 +15,15 @@ namespace test
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
//Disable AI print spam
|
||||
utils::hook::nop(0x4BAB7D, 5);
|
||||
utils::hook::nop(0x4BAAFA, 5);
|
||||
gsc::function::add("testfunc", []()
|
||||
{
|
||||
game::Com_Printf(game::CON_CHANNEL_DONT_FILTER, "this is a test builtin\n");
|
||||
});
|
||||
|
||||
//Disable asset loading print spam
|
||||
utils::hook::nop(0x48D9D9, 5);
|
||||
|
||||
//Disable unknown dvar spam
|
||||
utils::hook::nop(0x5F04AF, 5);
|
||||
gsc::method::add("testmeth", [](game::scr_entref_t ref)
|
||||
{
|
||||
game::Com_Printf(game::CON_CHANNEL_DONT_FILTER, "this is a test builtin on ent %d\n", ref.entnum);
|
||||
});
|
||||
}
|
||||
|
||||
private:
|
||||
|
@@ -1,94 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "minidump.hpp"
|
||||
|
||||
#include <DbgHelp.h>
|
||||
#pragma comment(lib, "dbghelp.lib")
|
||||
|
||||
#include <gsl/gsl>
|
||||
|
||||
namespace exception
|
||||
{
|
||||
namespace
|
||||
{
|
||||
constexpr MINIDUMP_TYPE get_minidump_type()
|
||||
{
|
||||
const auto type = MiniDumpIgnoreInaccessibleMemory //
|
||||
| MiniDumpWithHandleData //
|
||||
| MiniDumpScanMemory //
|
||||
| MiniDumpWithProcessThreadData //
|
||||
| MiniDumpWithFullMemoryInfo //
|
||||
| MiniDumpWithThreadInfo //
|
||||
| MiniDumpWithUnloadedModules;
|
||||
|
||||
return static_cast<MINIDUMP_TYPE>(type);
|
||||
}
|
||||
|
||||
std::string get_temp_filename()
|
||||
{
|
||||
char filename[MAX_PATH] = {0};
|
||||
char pathname[MAX_PATH] = {0};
|
||||
|
||||
GetTempPathA(sizeof(pathname), pathname);
|
||||
GetTempFileNameA(pathname, "Plutonium T4 -", 0, filename);
|
||||
return filename;
|
||||
}
|
||||
|
||||
HANDLE write_dump_to_temp_file(const LPEXCEPTION_POINTERS exceptioninfo)
|
||||
{
|
||||
MINIDUMP_EXCEPTION_INFORMATION minidump_exception_info = {GetCurrentThreadId(), exceptioninfo, FALSE};
|
||||
|
||||
auto* const file_handle = CreateFileA(get_temp_filename().data(), GENERIC_WRITE | GENERIC_READ,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_ALWAYS,
|
||||
FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,
|
||||
nullptr);
|
||||
|
||||
if (!MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file_handle, get_minidump_type(),
|
||||
&minidump_exception_info,
|
||||
nullptr,
|
||||
nullptr))
|
||||
{
|
||||
MessageBoxA(nullptr, "There was an error creating the minidump! Hit OK to close the program.",
|
||||
"Minidump Error", MB_OK | MB_ICONERROR);
|
||||
TerminateProcess(GetCurrentProcess(), 123);
|
||||
}
|
||||
|
||||
return file_handle;
|
||||
}
|
||||
|
||||
std::string read_file(HANDLE file_handle)
|
||||
{
|
||||
FlushFileBuffers(file_handle);
|
||||
SetFilePointer(file_handle, 0, nullptr, FILE_BEGIN);
|
||||
|
||||
std::string buffer{};
|
||||
|
||||
DWORD bytes_read = 0;
|
||||
char temp_bytes[0x2000];
|
||||
|
||||
do
|
||||
{
|
||||
if (!ReadFile(file_handle, temp_bytes, sizeof(temp_bytes), &bytes_read, nullptr))
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
buffer.append(temp_bytes, bytes_read);
|
||||
}
|
||||
while (bytes_read == sizeof(temp_bytes));
|
||||
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
|
||||
std::string create_minidump(const LPEXCEPTION_POINTERS exceptioninfo)
|
||||
{
|
||||
auto* const file_handle = write_dump_to_temp_file(exceptioninfo);
|
||||
|
||||
const auto _ = gsl::finally([file_handle]()
|
||||
{
|
||||
CloseHandle(file_handle);
|
||||
});
|
||||
|
||||
return read_file(file_handle);
|
||||
}
|
||||
}
|
@@ -1,6 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
namespace exception
|
||||
{
|
||||
std::string create_minidump(LPEXCEPTION_POINTERS exceptioninfo);
|
||||
}
|
@@ -1,5 +1,4 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "codsrc/clientscript/cscr_compiler.hpp"
|
||||
|
||||
namespace game
|
||||
{
|
||||
@@ -1482,231 +1481,461 @@ namespace game
|
||||
|
||||
void EmitFloat(scriptInstance_t inst, float value)
|
||||
{
|
||||
codsrc::EmitFloat(inst, value);
|
||||
game::gScrCompileGlob[inst].codePos = game::TempMalloc(4);
|
||||
*(float*)game::gScrCompileGlob[inst].codePos = value;
|
||||
}
|
||||
|
||||
void EmitCanonicalStringConst(scriptInstance_t inst, unsigned int stringValue)
|
||||
{
|
||||
codsrc::EmitCanonicalStringConst(inst, stringValue);
|
||||
bool bConstRefCount;
|
||||
|
||||
bConstRefCount = game::gScrCompileGlob[inst].bConstRefCount;
|
||||
game::gScrCompileGlob[inst].bConstRefCount = 1;
|
||||
game::EmitCanonicalString(inst, stringValue);
|
||||
game::gScrCompileGlob[inst].bConstRefCount = bConstRefCount;
|
||||
}
|
||||
|
||||
int Scr_FindLocalVar(scr_block_s* block, int startIndex, unsigned int name)
|
||||
{
|
||||
return codsrc::Scr_FindLocalVar(block, startIndex, name);
|
||||
while (startIndex < block->localVarsCount)
|
||||
{
|
||||
if (block->localVars[startIndex].name == name)
|
||||
{
|
||||
return startIndex;
|
||||
}
|
||||
|
||||
++startIndex;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
void Scr_CheckLocalVarsCount(int localVarsCount)
|
||||
{
|
||||
codsrc::Scr_CheckLocalVarsCount(localVarsCount);
|
||||
if (localVarsCount >= 64)
|
||||
{
|
||||
game::Com_Error(game::ERR_DROP, "LOCAL_game::VAR_STACK_SIZE exceeded");
|
||||
}
|
||||
}
|
||||
|
||||
void EmitGetUndefined(scriptInstance_t inst, sval_u sourcePos)
|
||||
{
|
||||
codsrc::EmitGetUndefined(inst, sourcePos);
|
||||
game::EmitOpcode(inst, game::OP_GetUndefined, 1, 0);
|
||||
game::AddOpcodePos(inst, sourcePos.stringValue, 1);
|
||||
}
|
||||
|
||||
void EmitPrimitiveExpression(scriptInstance_t inst, sval_u expr, scr_block_s* block)
|
||||
{
|
||||
codsrc::EmitPrimitiveExpression(inst, expr, block);
|
||||
game::VariableCompileValue constValue;
|
||||
|
||||
if (game::EmitOrEvalPrimitiveExpression(inst, expr, &constValue, block))
|
||||
{
|
||||
game::EmitValue(inst, &constValue);
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_EmitAnimation(scriptInstance_t inst, char* pos, unsigned int animName, unsigned int sourcePos)
|
||||
{
|
||||
codsrc::Scr_EmitAnimation(inst, pos, animName, sourcePos);
|
||||
if (game::gScrAnimPub[inst].animTreeNames)
|
||||
{
|
||||
game::Scr_EmitAnimationInternal(inst, pos, animName, game::gScrAnimPub[inst].animTreeNames);
|
||||
}
|
||||
else
|
||||
{
|
||||
game::CompileError(inst, sourcePos, "#using_animtree was not specified");
|
||||
}
|
||||
}
|
||||
|
||||
void EmitEvalArray(scriptInstance_t inst, sval_u sourcePos, sval_u indexSourcePos)
|
||||
{
|
||||
codsrc::EmitEvalArray(inst, sourcePos, indexSourcePos);
|
||||
game::EmitOpcode(inst, game::OP_EvalArray, -1, 0);
|
||||
game::AddOpcodePos(inst, indexSourcePos.stringValue, 0);
|
||||
game::AddOpcodePos(inst, sourcePos.stringValue, 1);
|
||||
}
|
||||
|
||||
void EmitEvalArrayRef(scriptInstance_t inst, sval_u sourcePos, sval_u indexSourcePos)
|
||||
{
|
||||
codsrc::EmitEvalArrayRef(inst, sourcePos, indexSourcePos);
|
||||
game::EmitOpcode(inst, game::OP_EvalArrayRef, -1, 0);
|
||||
game::AddOpcodePos(inst, indexSourcePos.stringValue, 0);
|
||||
game::AddOpcodePos(inst, sourcePos.stringValue, 1);
|
||||
}
|
||||
|
||||
unsigned int Scr_GetBuiltin(scriptInstance_t inst, sval_u func_name)
|
||||
{
|
||||
return codsrc::Scr_GetBuiltin(inst, func_name);
|
||||
game::sval_u func_namea;
|
||||
game::sval_u func_nameb;
|
||||
|
||||
if (func_name.node[0].type != game::ENUM_script_call)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
func_namea = func_name.node[1];
|
||||
if (func_namea.node[0].type != game::ENUM_function)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
func_nameb = func_namea.node[1];
|
||||
if (func_nameb.node[0].type != game::ENUM_local_function)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ( /*game::gScrCompilePub[inst].developer_statement == 3 ||*/ !game::FindVariable(func_nameb.node[1].stringValue, game::gScrCompileGlob[inst].filePosId, inst))
|
||||
{
|
||||
return func_nameb.node[1].stringValue;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Scr_GetUncacheType(int type)
|
||||
{
|
||||
return codsrc::Scr_GetUncacheType(type);
|
||||
if (type == game::VAR_CODEPOS)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
assert(type == game::VAR_DEVELOPER_CODEPOS);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int Scr_GetCacheType(int type)
|
||||
{
|
||||
return codsrc::Scr_GetCacheType(type);
|
||||
if (!type)
|
||||
{
|
||||
return game::VAR_CODEPOS;
|
||||
}
|
||||
|
||||
assert(type == 1); // BUILTIN_DEVELOPER_ONLY
|
||||
|
||||
return game::VAR_DEVELOPER_CODEPOS;
|
||||
}
|
||||
|
||||
BuiltinFunction Scr_GetFunction(const char** pName, int* type)
|
||||
{
|
||||
return codsrc::Scr_GetFunction(pName, type);
|
||||
game::BuiltinFunction answer;
|
||||
|
||||
answer = game::Sentient_GetFunction(pName);
|
||||
|
||||
if (answer)
|
||||
{
|
||||
return answer;
|
||||
}
|
||||
|
||||
return game::BuiltIn_GetFunction(pName, type);
|
||||
}
|
||||
|
||||
BuiltinFunction GetFunction(scriptInstance_t inst, const char** pName, int* type)
|
||||
{
|
||||
return codsrc::GetFunction(inst, pName, type);
|
||||
if (inst)
|
||||
{
|
||||
return game::CScr_GetFunction(pName, type);
|
||||
}
|
||||
|
||||
return game::Scr_GetFunction(pName, type);
|
||||
}
|
||||
|
||||
BuiltinMethod GetMethod(scriptInstance_t inst, const char** pName, int* type)
|
||||
{
|
||||
return codsrc::GetMethod(inst, pName, type);
|
||||
if (inst)
|
||||
{
|
||||
return game::CScr_GetMethod(pName, type);
|
||||
}
|
||||
|
||||
return game::Scr_GetMethod(type, pName);
|
||||
}
|
||||
|
||||
unsigned int GetVariableName(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
return codsrc::GetVariableName(inst, id);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].childVariables[id];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
assert(!IsObject(entryValue));
|
||||
|
||||
return entryValue->w.status >> 8;
|
||||
}
|
||||
|
||||
int GetExpressionCount(sval_u exprlist)
|
||||
{
|
||||
return codsrc::GetExpressionCount(exprlist);
|
||||
game::sval_u* node;
|
||||
int expr_count;
|
||||
|
||||
expr_count = 0;
|
||||
for (node = exprlist.node->node;
|
||||
node;
|
||||
node = node[1].node)
|
||||
{
|
||||
++expr_count;
|
||||
}
|
||||
|
||||
return expr_count;
|
||||
}
|
||||
|
||||
sval_u* GetSingleParameter(sval_u exprlist)
|
||||
{
|
||||
return codsrc::GetSingleParameter(exprlist);
|
||||
if (!exprlist.node->node)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (exprlist.node->node[1].node)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return exprlist.node->node;
|
||||
}
|
||||
|
||||
void EmitExpressionFieldObject(scriptInstance_t inst, sval_u expr, sval_u sourcePos, scr_block_s* block)
|
||||
{
|
||||
codsrc::EmitExpressionFieldObject(inst, expr, sourcePos, block);
|
||||
if (expr.node[0].type == game::ENUM_primitive_expression)
|
||||
{
|
||||
game::EmitPrimitiveExpressionFieldObject(inst, expr.node[1], expr.node[2], block);
|
||||
}
|
||||
else
|
||||
{
|
||||
game::CompileError(inst, sourcePos.stringValue, "not an object");
|
||||
}
|
||||
}
|
||||
|
||||
void EvalInteger(int value, sval_u sourcePos, VariableCompileValue* constValue)
|
||||
{
|
||||
codsrc::EvalInteger(value, sourcePos, constValue);
|
||||
assert(constValue);
|
||||
|
||||
constValue->value.type = game::VAR_INTEGER;
|
||||
constValue->value.u.intValue = value;
|
||||
constValue->sourcePos = sourcePos;
|
||||
}
|
||||
|
||||
void EvalFloat(float value, sval_u sourcePos, VariableCompileValue* constValue)
|
||||
{
|
||||
codsrc::EvalFloat(value, sourcePos, constValue);
|
||||
assert(constValue);
|
||||
|
||||
constValue->value.type = game::VAR_FLOAT;
|
||||
constValue->value.u.floatValue = value;
|
||||
constValue->sourcePos = sourcePos;
|
||||
}
|
||||
|
||||
void EvalString(unsigned int value, sval_u sourcePos, VariableCompileValue* constValue)
|
||||
{
|
||||
codsrc::EvalString(value, sourcePos, constValue);
|
||||
assert(constValue);
|
||||
|
||||
constValue->value.type = game::VAR_STRING;
|
||||
constValue->value.u.stringValue = value;
|
||||
constValue->sourcePos = sourcePos;
|
||||
}
|
||||
|
||||
void EvalIString(unsigned int value, sval_u sourcePos, VariableCompileValue* constValue)
|
||||
{
|
||||
codsrc::EvalIString(value, sourcePos, constValue);
|
||||
assert(constValue);
|
||||
|
||||
constValue->value.type = game::VAR_ISTRING;
|
||||
constValue->value.u.stringValue = value;
|
||||
constValue->sourcePos = sourcePos;
|
||||
}
|
||||
|
||||
void EvalUndefined(sval_u sourcePos, VariableCompileValue* constValue)
|
||||
{
|
||||
codsrc::EvalUndefined(sourcePos, constValue);
|
||||
assert(constValue);
|
||||
|
||||
constValue->value.type = game::VAR_UNDEFINED;
|
||||
constValue->sourcePos = sourcePos;
|
||||
}
|
||||
|
||||
void Scr_PopValue(scriptInstance_t inst)
|
||||
{
|
||||
codsrc::Scr_PopValue(inst);
|
||||
assert(game::gScrCompilePub[inst].value_count);
|
||||
--game::gScrCompilePub[inst].value_count;
|
||||
}
|
||||
|
||||
void EmitSetVariableField(scriptInstance_t inst, sval_u sourcePos)
|
||||
{
|
||||
codsrc::EmitSetVariableField(inst, sourcePos);
|
||||
game::EmitOpcode(inst, game::OP_SetVariableField, -1, 0);
|
||||
game::AddOpcodePos(inst, sourcePos.stringValue, 0);
|
||||
// game::EmitAssignmentPos(inst);
|
||||
}
|
||||
|
||||
void EmitFieldVariableRef(scriptInstance_t inst, sval_u expr, sval_u field, sval_u sourcePos, scr_block_s* block)
|
||||
{
|
||||
codsrc::EmitFieldVariableRef(inst, expr, field, sourcePos, block);
|
||||
game::EmitPrimitiveExpressionFieldObject(inst, expr, sourcePos, block);
|
||||
game::EmitOpcode(inst, game::OP_EvalFieldVariableRef, 0, 0);
|
||||
game::EmitCanonicalString(inst, field.stringValue);
|
||||
}
|
||||
|
||||
void Scr_CalcLocalVarsArrayPrimitiveExpressionRef(sval_u expr, scr_block_s* block)
|
||||
{
|
||||
codsrc::Scr_CalcLocalVarsArrayPrimitiveExpressionRef(expr, block);
|
||||
if (expr.node[0].type == game::ENUM_variable)
|
||||
{
|
||||
game::Scr_CalcLocalVarsVariableExpressionRef(block, expr.node[1]);
|
||||
}
|
||||
}
|
||||
|
||||
BOOL IsUndefinedPrimitiveExpression(sval_u expr)
|
||||
{
|
||||
return codsrc::IsUndefinedPrimitiveExpression(expr);
|
||||
return expr.node[0].type == game::ENUM_undefined;
|
||||
}
|
||||
|
||||
bool IsUndefinedExpression(sval_u expr)
|
||||
{
|
||||
return codsrc::IsUndefinedExpression(expr);
|
||||
if (expr.node[0].type == game::ENUM_primitive_expression)
|
||||
{
|
||||
return game::IsUndefinedPrimitiveExpression(expr.node[1]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Scr_CopyBlock(scr_block_s* from, scr_block_s** to)
|
||||
{
|
||||
codsrc::Scr_CopyBlock(from, to);
|
||||
if (!*to)
|
||||
{
|
||||
*to = (game::scr_block_s*)game::Hunk_AllocateTempMemoryHigh(sizeof(game::scr_block_s));
|
||||
}
|
||||
|
||||
memcpy(*to, from, sizeof(game::scr_block_s));
|
||||
(*to)->localVarsPublicCount = 0;
|
||||
}
|
||||
|
||||
void Scr_CheckMaxSwitchCases(int count)
|
||||
{
|
||||
codsrc::Scr_CheckMaxSwitchCases(count);
|
||||
if (count >= 512)
|
||||
{
|
||||
game::Com_Error(game::ERR_DROP, "MAX_SWITCH_CASES exceeded");
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_CalcLocalVarsSafeSetVariableField(sval_u expr, sval_u sourcePos, scr_block_s* block)
|
||||
{
|
||||
codsrc::Scr_CalcLocalVarsSafeSetVariableField(expr, sourcePos, block);
|
||||
game::Scr_RegisterLocalVar(expr.stringValue, sourcePos, block);
|
||||
}
|
||||
|
||||
void EmitFormalWaittillParameterListRefInternal(scriptInstance_t inst, sval_u* node, scr_block_s* block)
|
||||
{
|
||||
codsrc::EmitFormalWaittillParameterListRefInternal(inst, node, block);
|
||||
while (1)
|
||||
{
|
||||
node = node[1].node;
|
||||
if (!node)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
game::EmitSafeSetWaittillVariableField(block, inst, *node->node, node->node[1]);
|
||||
}
|
||||
}
|
||||
|
||||
void EmitDefaultStatement(scriptInstance_t inst, sval_u sourcePos)
|
||||
{
|
||||
codsrc::EmitDefaultStatement(inst, sourcePos);
|
||||
game::EmitCaseStatementInfo(inst, 0, sourcePos);
|
||||
}
|
||||
|
||||
char Scr_IsLastStatement(scriptInstance_t inst, sval_u* node)
|
||||
{
|
||||
return codsrc::Scr_IsLastStatement(inst, node);
|
||||
if (!node)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (game::gScrVarPub[inst].developer_script)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (node)
|
||||
{
|
||||
if (node->node[0].type != game::ENUM_developer_statement_list)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
node = node[1].node;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void EmitEndStatement(scriptInstance_t inst, sval_u sourcePos, scr_block_s* block)
|
||||
{
|
||||
codsrc::EmitEndStatement(inst, sourcePos, block);
|
||||
if (!block->abortLevel)
|
||||
{
|
||||
block->abortLevel = 3;
|
||||
}
|
||||
|
||||
game::EmitEnd(inst);
|
||||
game::AddOpcodePos(inst, sourcePos.stringValue, 1);
|
||||
}
|
||||
|
||||
void EmitProfBeginStatement(scriptInstance_t inst, sval_u profileName, sval_u sourcePos)
|
||||
{
|
||||
codsrc::EmitProfBeginStatement(inst, profileName, sourcePos);
|
||||
game::EmitProfStatement(inst, profileName, sourcePos, game::OP_prof_begin);
|
||||
}
|
||||
|
||||
void EmitProfEndStatement(scriptInstance_t inst, sval_u profileName, sval_u sourcePos)
|
||||
{
|
||||
codsrc::EmitProfEndStatement(inst, profileName, sourcePos);
|
||||
game::EmitProfStatement(inst, profileName, sourcePos, game::OP_prof_end);
|
||||
}
|
||||
|
||||
void Scr_CalcLocalVarsIncStatement(sval_u expr, scr_block_s* block)
|
||||
{
|
||||
codsrc::Scr_CalcLocalVarsIncStatement(expr, block);
|
||||
game::Scr_CalcLocalVarsVariableExpressionRef(block, expr);
|
||||
}
|
||||
|
||||
void Scr_CalcLocalVarsWaittillStatement(sval_u exprlist, scr_block_s* block)
|
||||
{
|
||||
codsrc::Scr_CalcLocalVarsWaittillStatement(exprlist, block);
|
||||
game::sval_u* node;
|
||||
|
||||
node = exprlist.node->node[1].node;
|
||||
assert(node);
|
||||
game::Scr_CalcLocalVarsFormalParameterListInternal(node, block);
|
||||
}
|
||||
|
||||
void EmitFormalParameterListInternal(scriptInstance_t inst, sval_u* node, scr_block_s* block)
|
||||
{
|
||||
codsrc::EmitFormalParameterListInternal(inst, node, block);
|
||||
while (1)
|
||||
{
|
||||
node = node[1].node;
|
||||
if (!node)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
game::EmitSafeSetVariableField(block, inst, *node->node, node->node[1]);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int SpecifyThreadPosition(scriptInstance_t inst, unsigned int posId, unsigned int name, unsigned int sourcePos, int type)
|
||||
{
|
||||
return codsrc::SpecifyThreadPosition(inst, posId, name, sourcePos, type);
|
||||
game::VariableValue pos;
|
||||
|
||||
game::CheckThreadPosition(inst, posId, name, sourcePos);
|
||||
pos.type = (game::VariableType)type;
|
||||
pos.u.intValue = 0;
|
||||
game::SetNewVariableValue(inst, posId, &pos);
|
||||
return posId;
|
||||
}
|
||||
|
||||
void Scr_CalcLocalVarsFormalParameterList(sval_u exprlist, scr_block_s* block)
|
||||
{
|
||||
codsrc::Scr_CalcLocalVarsFormalParameterList(exprlist, block);
|
||||
game::Scr_CalcLocalVarsFormalParameterListInternal(exprlist.node->node, block);
|
||||
}
|
||||
|
||||
void SetThreadPosition(scriptInstance_t inst, unsigned int posId)
|
||||
{
|
||||
codsrc::SetThreadPosition(inst, posId);
|
||||
game::GetVariableValueAddress(inst, posId)->u.intValue = (unsigned int)game::TempMalloc(0);
|
||||
}
|
||||
|
||||
void EmitIncludeList(scriptInstance_t inst, sval_u val)
|
||||
{
|
||||
codsrc::EmitIncludeList(inst, val);
|
||||
game::sval_u* node;
|
||||
|
||||
for (node = val.node->node[1].node;
|
||||
node;
|
||||
node = node[1].node)
|
||||
{
|
||||
game::EmitInclude(inst, *node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "codsrc/clientscript/cscr_main.hpp"
|
||||
|
||||
namespace game
|
||||
{
|
||||
@@ -136,16 +135,20 @@ namespace game
|
||||
|
||||
int Scr_IsInOpcodeMemory(scriptInstance_t inst, const char* pos)
|
||||
{
|
||||
return codsrc::Scr_IsInOpcodeMemory(inst, pos);
|
||||
assert(game::gScrVarPub[inst].programBuffer);
|
||||
assert(pos);
|
||||
|
||||
return (unsigned int)(pos - game::gScrVarPub[inst].programBuffer) < game::gScrCompilePub[inst].programLen;
|
||||
}
|
||||
|
||||
void SL_BeginLoadScripts(scriptInstance_t inst)
|
||||
{
|
||||
codsrc::SL_BeginLoadScripts(inst);
|
||||
memset(game::gScrCompilePub[inst].canonicalStrings, 0, sizeof(game::gScrCompilePub[inst].canonicalStrings));
|
||||
game::gScrVarPub[inst].canonicalStrCount = 0;
|
||||
}
|
||||
|
||||
void Scr_SetLoadedImpureScript(bool loadedImpureScript)
|
||||
{
|
||||
codsrc::Scr_SetLoadedImpureScript(loadedImpureScript);
|
||||
*game::loadedImpureScript = loadedImpureScript;
|
||||
}
|
||||
}
|
@@ -1,5 +1,4 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "codsrc/clientscript/cscr_memorytree.hpp"
|
||||
|
||||
namespace game
|
||||
{
|
||||
@@ -117,6 +116,10 @@ namespace game
|
||||
|
||||
RefVector* GetRefVector(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
return codsrc::GetRefVector(inst, id);
|
||||
assert(id);
|
||||
|
||||
assert((id * MT_NODE_SIZE) < MT_SIZE);
|
||||
|
||||
return (game::RefVector*)&game::gScrMemTreePub[inst].mt_buffer->nodes[id];
|
||||
}
|
||||
}
|
@@ -1,5 +1,4 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "codsrc/clientscript/cscr_parser.hpp"
|
||||
|
||||
namespace game
|
||||
{
|
||||
@@ -306,11 +305,15 @@ namespace game
|
||||
|
||||
unsigned int Scr_GetPrevSourcePos(scriptInstance_t inst, const char* codePos, unsigned int index)
|
||||
{
|
||||
return codsrc::Scr_GetPrevSourcePos(inst, codePos, index);
|
||||
return game::gScrParserGlob[inst].sourcePosLookup[index + game::Scr_GetPrevSourcePosOpcodeLookup(inst, codePos)->sourcePosIndex].sourcePos;
|
||||
}
|
||||
|
||||
void Scr_ShutdownAllocNode(scriptInstance_t inst)
|
||||
{
|
||||
codsrc::Scr_ShutdownAllocNode(inst);
|
||||
if (game::g_allocNodeUser[inst])
|
||||
{
|
||||
game::Hunk_UserDestroy(game::g_allocNodeUser[inst]);
|
||||
game::g_allocNodeUser[inst] = 0;
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,10 +1,11 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "codsrc/clientscript/cscr_parsetree.hpp"
|
||||
|
||||
namespace game
|
||||
{
|
||||
sval_u* Scr_AllocNode(scriptInstance_t inst, int size)
|
||||
{
|
||||
return codsrc::Scr_AllocNode(inst, size);
|
||||
assert(game::g_allocNodeUser[inst]);
|
||||
|
||||
return (game::sval_u*)game::Hunk_UserAlloc(game::g_allocNodeUser[inst], 4 * size, 4);
|
||||
}
|
||||
}
|
@@ -1,5 +1,4 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "codsrc/clientscript/cscr_readwrite.hpp"
|
||||
|
||||
namespace game
|
||||
{
|
||||
@@ -39,6 +38,18 @@ namespace game
|
||||
|
||||
unsigned int FindVariableIndexInternal(scriptInstance_t inst, unsigned int parentId, unsigned int name)
|
||||
{
|
||||
return codsrc::FindVariableIndexInternal(inst, parentId, name);
|
||||
game::VariableValueInternal* parentValue;
|
||||
|
||||
assert(parentId);
|
||||
|
||||
parentValue = &game::gScrVarGlob[inst].parentVariables[parentId + 1];
|
||||
|
||||
assert((parentValue->w.status & VAR_STAT_MASK) == VAR_STAT_EXTERNAL);
|
||||
|
||||
assert((parentValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(IsObject(parentValue));
|
||||
|
||||
return game::FindVariableIndexInternal2(inst, name, (parentId + name) % 0xFFFD + 1);
|
||||
}
|
||||
}
|
@@ -1,5 +1,4 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "codsrc/clientscript/cscr_stringlist.hpp"
|
||||
|
||||
namespace game
|
||||
{
|
||||
@@ -325,46 +324,88 @@ namespace game
|
||||
|
||||
RefString* GetRefString(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
return codsrc::GetRefString(inst, id);
|
||||
assert(id);
|
||||
|
||||
assert((id * MT_NODE_SIZE) < MT_SIZE);
|
||||
|
||||
return (game::RefString*)&game::gScrMemTreePub[inst].mt_buffer->nodes[id];
|
||||
}
|
||||
|
||||
void SL_AddRefToString(scriptInstance_t inst, unsigned int stringValue)
|
||||
{
|
||||
codsrc::SL_AddRefToString(inst, stringValue);
|
||||
game::RefString* refStr = game::GetRefString(inst, stringValue);
|
||||
InterlockedExchangeAdd((volatile unsigned int*)&refStr->u.data, 1u);
|
||||
}
|
||||
|
||||
void SL_RemoveRefToStringOfSize(scriptInstance_t inst, unsigned int stringValue, unsigned int len)
|
||||
{
|
||||
codsrc::SL_RemoveRefToStringOfSize(inst, stringValue, len);
|
||||
game::RefString* refStr;
|
||||
|
||||
refStr = game::GetRefString(inst, stringValue);
|
||||
if (!(unsigned __int16)InterlockedDecrement((volatile unsigned int*)&refStr->u.data))
|
||||
{
|
||||
game::SL_FreeString(inst, stringValue, refStr, len);
|
||||
}
|
||||
}
|
||||
|
||||
int SL_GetRefStringLen(RefString* refString)
|
||||
{
|
||||
return codsrc::SL_GetRefStringLen(refString);
|
||||
int len;
|
||||
|
||||
if (!refString->u.s.byteLen)
|
||||
{
|
||||
len = 256 - 1; //Bugfix for 256 % 256 = 0 or 512 % 256 = 0 or... Just promote it to 256
|
||||
}
|
||||
else
|
||||
{
|
||||
len = refString->u.s.byteLen - 1;
|
||||
}
|
||||
|
||||
while (refString->str[len])
|
||||
{
|
||||
len += 256;
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
void SL_AddUser(unsigned int stringValue, unsigned int user, scriptInstance_t inst)
|
||||
{
|
||||
codsrc::SL_AddUser(stringValue, user, inst);
|
||||
game::RefString* refStr;
|
||||
|
||||
refStr = game::GetRefString(inst, stringValue);
|
||||
game::SL_AddUserInternal(user, refStr);
|
||||
}
|
||||
|
||||
int SL_ConvertFromString(scriptInstance_t inst, const char* str)
|
||||
{
|
||||
return codsrc::SL_ConvertFromString(inst, str);
|
||||
game::RefString* v2;
|
||||
|
||||
assert(str);
|
||||
|
||||
v2 = game::GetRefString_0(inst, str);
|
||||
return game::SL_ConvertFromRefString(inst, v2);
|
||||
}
|
||||
|
||||
int SL_ConvertFromRefString(scriptInstance_t inst, RefString* refString)
|
||||
{
|
||||
return codsrc::SL_ConvertFromRefString(inst, refString);
|
||||
return ((char*)refString - (char*)game::gScrMemTreePub[inst].mt_buffer) / MT_NODE_SIZE;
|
||||
}
|
||||
|
||||
RefString* GetRefString_0(scriptInstance_t inst, const char* str)
|
||||
RefString* GetRefString_0([[maybe_unused]]scriptInstance_t inst, const char* str)
|
||||
{
|
||||
return codsrc::GetRefString_0(inst, str);
|
||||
assert(str >= (char*)game::gScrMemTreePub[inst].mt_buffer && str < (char*)(game::gScrMemTreePub[inst].mt_buffer + MT_SIZE));
|
||||
|
||||
return (game::RefString*)(str - 4);
|
||||
}
|
||||
|
||||
const char* SL_ConvertToStringSafe(unsigned int id, game::scriptInstance_t inst)
|
||||
{
|
||||
return codsrc::SL_ConvertToStringSafe(id, inst);
|
||||
if (!id)
|
||||
{
|
||||
return "(NULL)";
|
||||
}
|
||||
|
||||
return game::GetRefString(inst, id)->str;
|
||||
}
|
||||
}
|
@@ -1,20 +1,19 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "codsrc/clientscript/cscr_tempmemory.hpp"
|
||||
|
||||
namespace game
|
||||
{
|
||||
void TempMemorySetPos(char* pos)
|
||||
{
|
||||
codsrc::TempMemorySetPos(pos);
|
||||
(*game::g_user)->pos = (int)pos;
|
||||
}
|
||||
|
||||
void TempMemoryReset(HunkUser* user)
|
||||
{
|
||||
codsrc::TempMemoryReset(user);
|
||||
*game::g_user = user;
|
||||
}
|
||||
|
||||
char* TempMalloc(int len)
|
||||
{
|
||||
return codsrc::TempMalloc(len);
|
||||
return (char*)game::Hunk_UserAlloc(*game::g_user, len, 1);
|
||||
}
|
||||
}
|
@@ -1,5 +1,4 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "codsrc/clientscript/cscr_variable.hpp"
|
||||
|
||||
namespace game
|
||||
{
|
||||
@@ -1287,151 +1286,452 @@ namespace game
|
||||
|
||||
unsigned int FindObject(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
return codsrc::FindObject(inst, id);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
assert(id);
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].childVariables[id];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert((entryValue->w.type & VAR_MASK) == game::VAR_POINTER);
|
||||
|
||||
return entryValue->u.u.pointerValue;
|
||||
}
|
||||
|
||||
float Scr_GetEntryUsageInternal(scriptInstance_t inst, unsigned int type, VariableUnion u)
|
||||
{
|
||||
return codsrc::Scr_GetEntryUsageInternal(inst, type, u);
|
||||
float result;
|
||||
game::VariableValueInternal* parentValue;
|
||||
|
||||
if (type != game::VAR_POINTER)
|
||||
{
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
parentValue = &game::gScrVarGlob[inst].parentVariables[u.intValue + 1];
|
||||
|
||||
assert((parentValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(IsObject(parentValue));
|
||||
|
||||
if ((parentValue->w.status & VAR_MASK) == game::VAR_ARRAY)
|
||||
{
|
||||
result = game::Scr_GetObjectUsage(inst, u.stringValue) / ((float)parentValue->u.o.refCount + 1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
result = 0.0f;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
float Scr_GetEntryUsage(scriptInstance_t inst, VariableValueInternal* entryValue)
|
||||
{
|
||||
return codsrc::Scr_GetEntryUsage(inst, entryValue);
|
||||
return game::Scr_GetEntryUsageInternal(inst, entryValue->w.status & 0x1F, entryValue->u.u) + 1.0f;
|
||||
}
|
||||
|
||||
unsigned int FindFirstSibling(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
return codsrc::FindFirstSibling(inst, id);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].parentVariables[id + 1];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(IsObject(entryValue));
|
||||
|
||||
return entryValue->nextSibling;
|
||||
}
|
||||
|
||||
unsigned int FindNextSibling(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
return codsrc::FindNextSibling(inst, id);
|
||||
unsigned int nextSibling;
|
||||
game::VariableValueInternal* list;
|
||||
unsigned int childId;
|
||||
game::VariableValueInternal* entryValue;
|
||||
game::VariableValueInternal* childValue;
|
||||
|
||||
list = game::gScrVarGlob[inst].childVariables;
|
||||
entryValue = &list[id];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(!IsObject(entryValue));
|
||||
|
||||
nextSibling = entryValue->nextSibling;
|
||||
|
||||
if (!nextSibling)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
childId = list[nextSibling].hash.id;
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
childValue = &list[childId];
|
||||
|
||||
assert(!IsObject(childValue));
|
||||
|
||||
return childId;
|
||||
}
|
||||
|
||||
VariableValue Scr_GetArrayIndexValue(scriptInstance_t inst, unsigned int name)
|
||||
VariableValue Scr_GetArrayIndexValue(scriptInstance_t, unsigned int name)
|
||||
{
|
||||
return codsrc::Scr_GetArrayIndexValue(inst, name);
|
||||
game::VariableValue value;
|
||||
|
||||
assert(name);
|
||||
|
||||
if (name >= SL_MAX_STRING_INDEX)
|
||||
{
|
||||
if (name >= OBJECT_STACK)
|
||||
{
|
||||
value.type = game::VAR_INTEGER;
|
||||
value.u.intValue = name - 0x800000;
|
||||
}
|
||||
else
|
||||
{
|
||||
value.type = game::VAR_POINTER;
|
||||
value.u.intValue = name - SL_MAX_STRING_INDEX;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
value.type = game::VAR_STRING;
|
||||
value.u.intValue = (unsigned short)name;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
void AddRefToObject(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
codsrc::AddRefToObject(inst, id);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
assert(id >= 1 && id < VARIABLELIST_CHILD_BEGIN);
|
||||
|
||||
assert((game::gScrVarGlob[inst].parentVariables[id + 1].w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].parentVariables[id + 1];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(IsObject(entryValue));
|
||||
|
||||
++entryValue->u.o.refCount;
|
||||
|
||||
assert(entryValue->u.o.refCount);
|
||||
}
|
||||
|
||||
void RemoveRefToEmptyObject(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
codsrc::RemoveRefToEmptyObject(inst, id);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].parentVariables[id + 1];
|
||||
|
||||
assert(((entryValue->w.status & VAR_STAT_MASK) == VAR_STAT_EXTERNAL));
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(IsObject(entryValue));
|
||||
|
||||
assert(!entryValue->nextSibling);
|
||||
|
||||
if (entryValue->u.o.refCount)
|
||||
{
|
||||
assert(id >= 1 && id < VARIABLELIST_CHILD_BEGIN);
|
||||
|
||||
--entryValue->u.o.refCount;
|
||||
}
|
||||
else
|
||||
{
|
||||
game::FreeVariable(id, inst);
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_ClearThread(scriptInstance_t inst, unsigned int parentId)
|
||||
{
|
||||
codsrc::Scr_ClearThread(inst, parentId);
|
||||
game::VariableValueInternal* parentValue;
|
||||
|
||||
assert(parentId);
|
||||
|
||||
parentValue = &game::gScrVarGlob[inst].parentVariables[parentId + 1];
|
||||
|
||||
assert((parentValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(((parentValue->w.type & VAR_MASK) >= game::VAR_THREAD) && ((parentValue->w.type & VAR_MASK) <= game::VAR_CHILD_THREAD));
|
||||
|
||||
assert(!game::FindVariable(OBJECT_STACK, parentId, inst));
|
||||
|
||||
if (parentValue->nextSibling)
|
||||
{
|
||||
game::ClearObjectInternal(inst, parentId);
|
||||
}
|
||||
|
||||
game::RemoveRefToObject(parentValue->u.o.u.nextEntId, inst);
|
||||
}
|
||||
|
||||
unsigned int FindObjectVariable(scriptInstance_t inst, unsigned int parentId, unsigned int id)
|
||||
{
|
||||
return codsrc::FindObjectVariable(inst, parentId, id);
|
||||
return game::gScrVarGlob[inst].childVariables[game::FindVariableIndexInternal(inst, parentId, id + SL_MAX_STRING_INDEX)].hash.id;
|
||||
}
|
||||
|
||||
void RemoveObjectVariable(scriptInstance_t inst, unsigned int parentId, unsigned int id)
|
||||
{
|
||||
codsrc::RemoveObjectVariable(inst, parentId, id);
|
||||
assert((game::gScrVarGlob[inst].parentVariables[parentId + 1].w.type & VAR_MASK) == game::VAR_ARRAY);
|
||||
|
||||
game::RemoveVariable(id + SL_MAX_STRING_INDEX, parentId, inst);
|
||||
}
|
||||
|
||||
VariableValueInternal_u* GetVariableValueAddress(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
return codsrc::GetVariableValueAddress(inst, id);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
assert(id);
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].childVariables[id];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert((entryValue->w.type & VAR_MASK) != game::VAR_UNDEFINED);
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(!IsObject(entryValue));
|
||||
|
||||
return &entryValue->u;
|
||||
}
|
||||
|
||||
void Scr_KillEndonThread(scriptInstance_t inst, unsigned int threadId)
|
||||
{
|
||||
codsrc::Scr_KillEndonThread(inst, threadId);
|
||||
game::VariableValueInternal* parentValue;
|
||||
|
||||
parentValue = &game::gScrVarGlob[inst].parentVariables[threadId + 1];
|
||||
|
||||
assert((parentValue->w.status & VAR_STAT_MASK) == VAR_STAT_EXTERNAL);
|
||||
|
||||
assert((parentValue->w.type & VAR_MASK) == game::VAR_THREAD);
|
||||
|
||||
assert(!parentValue->nextSibling);
|
||||
|
||||
game::RemoveRefToObject(parentValue->u.o.u.nextEntId, inst);
|
||||
|
||||
assert(!game::FindObjectVariable(inst, game::gScrVarPub[inst].pauseArrayId, threadId));
|
||||
|
||||
parentValue->w.status &= ~0xAu;
|
||||
parentValue->w.status |= game::VAR_DEAD_THREAD;
|
||||
}
|
||||
|
||||
BOOL IsValidArrayIndex(scriptInstance_t inst, unsigned int unsignedValue)
|
||||
BOOL IsValidArrayIndex(scriptInstance_t, unsigned int unsignedValue)
|
||||
{
|
||||
return codsrc::IsValidArrayIndex(inst, unsignedValue);
|
||||
return (unsignedValue + 0x7EA002) <= 0xFEA001;
|
||||
}
|
||||
|
||||
void RemoveArrayVariable(scriptInstance_t inst, unsigned int parentId, unsigned int unsignedValue)
|
||||
{
|
||||
codsrc::RemoveArrayVariable(inst, parentId, unsignedValue);
|
||||
assert(game::IsValidArrayIndex(inst, unsignedValue));
|
||||
|
||||
game::RemoveVariable((unsignedValue + 0x800000) & 0xFFFFFF, parentId, inst);
|
||||
}
|
||||
|
||||
void SafeRemoveArrayVariable(scriptInstance_t inst, unsigned int parentId, unsigned int unsignedValue)
|
||||
{
|
||||
codsrc::SafeRemoveArrayVariable(inst, parentId, unsignedValue);
|
||||
assert(game::IsValidArrayIndex(inst, unsignedValue));
|
||||
|
||||
game::SafeRemoveVariable((unsignedValue + 0x800000) & 0xFFFFFF, parentId, inst);
|
||||
}
|
||||
|
||||
void AddRefToVector(scriptInstance_t inst, const float* floatVal)
|
||||
void AddRefToVector(scriptInstance_t, const float* floatVal)
|
||||
{
|
||||
codsrc::AddRefToVector(inst, floatVal);
|
||||
game::RefVector* rf = (game::RefVector*)(floatVal - 1);
|
||||
|
||||
if (!rf->u.s.length)
|
||||
{
|
||||
++rf->u.s.refCount;
|
||||
|
||||
assert(rf->u.s.refCount);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int FindArrayVariableIndex(scriptInstance_t inst, unsigned int parentId, unsigned int unsignedValue)
|
||||
{
|
||||
return codsrc::FindArrayVariableIndex(inst, parentId, unsignedValue);
|
||||
assert(game::IsValidArrayIndex(inst, unsignedValue));
|
||||
|
||||
return game::FindVariableIndexInternal(inst, parentId, (unsignedValue + 0x800000) & 0xFFFFFF); // - ??
|
||||
}
|
||||
|
||||
unsigned int GetVariableIndexInternal(scriptInstance_t inst, unsigned int parentId, unsigned int name)
|
||||
{
|
||||
return codsrc::GetVariableIndexInternal(inst, parentId, name);
|
||||
unsigned int newIndex;
|
||||
game::VariableValueInternal* parentValue;
|
||||
|
||||
assert(parentId);
|
||||
|
||||
parentValue = &game::gScrVarGlob[inst].parentVariables[parentId + 1];
|
||||
|
||||
assert((parentValue->w.status & VAR_STAT_MASK) == VAR_STAT_EXTERNAL);
|
||||
|
||||
assert((parentValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(IsObject(parentValue));
|
||||
|
||||
newIndex = game::FindVariableIndexInternal2(inst, name, (parentId + name) % 0xFFFD + 1);
|
||||
if (newIndex)
|
||||
{
|
||||
return newIndex;
|
||||
}
|
||||
|
||||
return game::GetNewVariableIndexInternal2(name, inst, parentId, (parentId + name) % 0xFFFD + 1);
|
||||
}
|
||||
|
||||
unsigned int GetNewVariableIndexInternal(scriptInstance_t inst, unsigned int parentId, unsigned int name)
|
||||
{
|
||||
return codsrc::GetNewVariableIndexInternal(inst, parentId, name);
|
||||
assert(!game::FindVariableIndexInternal(inst, parentId, name));
|
||||
|
||||
return game::GetNewVariableIndexInternal2(name, inst, parentId, (parentId + name) % 0xFFFD + 1);
|
||||
}
|
||||
|
||||
unsigned int AllocObject(scriptInstance_t inst)
|
||||
{
|
||||
return codsrc::AllocObject(inst);
|
||||
game::VariableValueInternal* entryValue;
|
||||
unsigned int id;
|
||||
|
||||
id = game::AllocVariable(inst);
|
||||
entryValue = &game::gScrVarGlob[inst].parentVariables[id + 1];
|
||||
entryValue->w.status = VAR_STAT_EXTERNAL;
|
||||
|
||||
assert((entryValue->w.type & VAR_MASK) == game::VAR_UNDEFINED);
|
||||
|
||||
entryValue->w.status |= game::VAR_OBJECT;
|
||||
entryValue->u.o.refCount = 0;
|
||||
return id;
|
||||
}
|
||||
|
||||
VariableType GetValueType(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
return codsrc::GetValueType(inst, id);
|
||||
assert((game::gScrVarGlob[inst].childVariables[id].w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
return (game::VariableType)(game::gScrVarGlob[inst].childVariables[id].w.status & VAR_MASK);
|
||||
}
|
||||
|
||||
VariableType GetObjectType(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
return codsrc::GetObjectType(inst, id);
|
||||
assert((game::gScrVarGlob[inst].parentVariables[id + 1].w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
return (game::VariableType)(game::gScrVarGlob[inst].parentVariables[id + 1].w.status & VAR_MASK);
|
||||
}
|
||||
|
||||
float* Scr_AllocVector_(scriptInstance_t inst, const float* v)
|
||||
{
|
||||
return codsrc::Scr_AllocVector_(inst, v);
|
||||
float* vectorValue;
|
||||
|
||||
vectorValue = game::Scr_AllocVector(inst);
|
||||
vectorValue[0] = v[0];
|
||||
vectorValue[1] = v[1];
|
||||
vectorValue[2] = v[2];
|
||||
return vectorValue;
|
||||
}
|
||||
|
||||
void Scr_EvalInequality(scriptInstance_t inst, VariableValue* value1, VariableValue* value2)
|
||||
{
|
||||
codsrc::Scr_EvalInequality(inst, value1, value2);
|
||||
game::Scr_EvalEquality(value1, inst, value2);
|
||||
|
||||
assert((value1->type == game::VAR_INTEGER) || (value1->type == game::VAR_UNDEFINED));
|
||||
|
||||
value1->u.intValue = value1->u.intValue == 0;
|
||||
}
|
||||
|
||||
unsigned int Scr_EvalArrayRefInternal(scriptInstance_t inst, VariableValue* varValue, VariableValueInternal* parentValue)
|
||||
{
|
||||
return codsrc::Scr_EvalArrayRefInternal(inst, varValue, parentValue);
|
||||
game::VariableValueInternal* entryValue;
|
||||
unsigned int result;
|
||||
unsigned int id;
|
||||
|
||||
if (varValue->type == game::VAR_POINTER)
|
||||
{
|
||||
entryValue = &game::gScrVarGlob[inst].parentVariables[varValue->u.intValue + 1];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(IsObject(entryValue));
|
||||
|
||||
if ((entryValue->w.status & VAR_MASK) == game::VAR_ARRAY)
|
||||
{
|
||||
if (entryValue->u.o.refCount)
|
||||
{
|
||||
id = varValue->u.intValue;
|
||||
game::RemoveRefToObject(varValue->u.stringValue, inst);
|
||||
varValue->u.intValue = game::Scr_AllocArray(inst);
|
||||
game::CopyArray(inst, id, varValue->u.stringValue);
|
||||
parentValue->u.u.intValue = varValue->u.intValue;
|
||||
}
|
||||
result = varValue->u.intValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
game::gScrVarPub[inst].error_index = 1;
|
||||
game::Scr_Error(game::va("%s is not an array", game::var_typename[entryValue->w.status & VAR_MASK]), inst, 0);
|
||||
result = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
assert(varValue->type != game::VAR_STACK);
|
||||
|
||||
game::gScrVarPub[inst].error_index = 1;
|
||||
if (varValue->type == game::VAR_STRING)
|
||||
{
|
||||
game::Scr_Error("string characters cannot be individually changed", inst, 0);
|
||||
result = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (varValue->type == game::VAR_VECTOR)
|
||||
{
|
||||
game::Scr_Error("vector components cannot be individually changed", inst, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
game::Scr_Error(game::va("%s is not an array", game::var_typename[varValue->type]), inst, 0);
|
||||
}
|
||||
result = 0;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
unsigned int GetNewArrayVariableIndex(scriptInstance_t inst, unsigned int parentId, unsigned int unsignedValue)
|
||||
{
|
||||
return codsrc::GetNewArrayVariableIndex(inst, parentId, unsignedValue);
|
||||
assert(game::IsValidArrayIndex(inst, unsignedValue));
|
||||
|
||||
return game::GetNewVariableIndexInternal(inst, parentId, (unsignedValue + 0x800000) & 0xFFFFFF);
|
||||
}
|
||||
|
||||
unsigned int GetNewArrayVariable(scriptInstance_t inst, unsigned int parentId, unsigned int unsignedValue)
|
||||
{
|
||||
return codsrc::GetNewArrayVariable(inst, parentId, unsignedValue);
|
||||
return game::gScrVarGlob[inst].childVariables[game::GetNewArrayVariableIndex(inst, parentId, unsignedValue)].hash.id;
|
||||
}
|
||||
|
||||
unsigned int GetArrayVariable(scriptInstance_t inst, unsigned int parentId, unsigned int unsignedValue)
|
||||
{
|
||||
return codsrc::GetArrayVariable(inst, parentId, unsignedValue);
|
||||
return game::gScrVarGlob[inst].childVariables[game::GetArrayVariableIndex(unsignedValue, inst, parentId)].hash.id;
|
||||
}
|
||||
|
||||
unsigned int AllocThread(scriptInstance_t inst, unsigned int self)
|
||||
{
|
||||
return codsrc::AllocThread(inst, self);
|
||||
game::VariableValueInternal* entryValue;
|
||||
unsigned int id;
|
||||
|
||||
id = game::AllocVariable(inst);
|
||||
entryValue = &game::gScrVarGlob[inst].parentVariables[id + 1];
|
||||
entryValue->w.status = VAR_STAT_EXTERNAL;
|
||||
|
||||
assert((entryValue->w.type & VAR_MASK) == game::VAR_UNDEFINED);
|
||||
|
||||
entryValue->w.status |= game::VAR_THREAD;
|
||||
entryValue->u.o.refCount = 0;
|
||||
entryValue->u.o.u.self = (unsigned short)self;
|
||||
return id;
|
||||
}
|
||||
}
|
||||
|
@@ -1,5 +1,4 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "codsrc/clientscript/cscr_vm.hpp"
|
||||
|
||||
namespace game
|
||||
{
|
||||
@@ -784,206 +783,438 @@ namespace game
|
||||
|
||||
void SetVariableFieldValue(scriptInstance_t inst, unsigned int id, VariableValue* value)
|
||||
{
|
||||
codsrc::SetVariableFieldValue(inst, id, value);
|
||||
if (id)
|
||||
{
|
||||
game::SetVariableValue(inst, value, id);
|
||||
}
|
||||
else
|
||||
{
|
||||
game::SetVariableEntityFieldValue(inst, game::gScrVarPub[inst].entId, game::gScrVarPub[inst].entFieldName, value);
|
||||
}
|
||||
}
|
||||
|
||||
void SetNewVariableValue(scriptInstance_t inst, unsigned int id, VariableValue* value)
|
||||
{
|
||||
codsrc::SetNewVariableValue(inst, id, value);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
assert(value->type < game::VAR_THREAD);
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].childVariables[id];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(!IsObject(entryValue));
|
||||
|
||||
assert(value->type >= game::VAR_UNDEFINED && value->type < game::VAR_COUNT);
|
||||
|
||||
assert((entryValue->w.type & VAR_MASK) == game::VAR_UNDEFINED);
|
||||
|
||||
assert((value->type != game::VAR_POINTER) || ((entryValue->w.type & VAR_MASK) < game::FIRST_DEAD_OBJECT));
|
||||
|
||||
entryValue->w.status |= value->type;
|
||||
entryValue->u.u.intValue = value->u.intValue;
|
||||
}
|
||||
|
||||
void Scr_ClearErrorMessage(scriptInstance_t inst)
|
||||
{
|
||||
codsrc::Scr_ClearErrorMessage(inst);
|
||||
game::gScrVarPub[inst].error_message = 0;
|
||||
game::gScrVmGlob[inst].dialog_error_message = 0;
|
||||
game::gScrVarPub[inst].error_index = 0;
|
||||
}
|
||||
|
||||
void VM_Shutdown(scriptInstance_t inst)
|
||||
{
|
||||
codsrc::VM_Shutdown(inst);
|
||||
if (game::gScrVarPub[inst].tempVariable)
|
||||
{
|
||||
game::FreeValue(game::gScrVarPub[inst].tempVariable, inst);
|
||||
game::gScrVarPub[inst].tempVariable = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_ShutdownVariables(scriptInstance_t inst)
|
||||
{
|
||||
codsrc::Scr_ShutdownVariables(inst);
|
||||
if (game::gScrVarPub[inst].gameId)
|
||||
{
|
||||
game::FreeValue(game::gScrVarPub[inst].gameId, inst);
|
||||
game::gScrVarPub[inst].gameId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void ClearVariableValue(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
codsrc::ClearVariableValue(inst, id);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
assert(id);
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].childVariables[id];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(!IsObject(entryValue));
|
||||
|
||||
assert((entryValue->w.type & VAR_MASK) != game::VAR_STACK);
|
||||
|
||||
game::RemoveRefToValueInternal(inst, (game::VariableType)(entryValue->w.status & VAR_MASK), entryValue->u.u);
|
||||
entryValue->w.status &= ~VAR_MASK;
|
||||
|
||||
assert((entryValue->w.type & VAR_MASK) == game::VAR_UNDEFINED);
|
||||
}
|
||||
|
||||
unsigned int Scr_GetThreadNotifyName(scriptInstance_t inst, unsigned int startLocalId)
|
||||
{
|
||||
return codsrc::Scr_GetThreadNotifyName(inst, startLocalId);
|
||||
assert((game::gScrVarGlob[inst].parentVariables[startLocalId + 1].w.type & VAR_STAT_MASK) == VAR_STAT_EXTERNAL);
|
||||
|
||||
assert((game::gScrVarGlob[inst].parentVariables[startLocalId + 1].w.type & VAR_MASK) == game::VAR_NOTIFY_THREAD);
|
||||
|
||||
assert((game::gScrVarGlob[inst].parentVariables[startLocalId + 1].w.notifyName >> VAR_NAME_BIT_SHIFT) < VARIABLELIST_CHILD_SIZE);
|
||||
|
||||
return game::gScrVarGlob[inst].parentVariables[startLocalId + 1].w.status >> VAR_NAME_BIT_SHIFT;
|
||||
}
|
||||
|
||||
void Scr_RemoveThreadNotifyName(scriptInstance_t inst, unsigned int startLocalId)
|
||||
{
|
||||
codsrc::Scr_RemoveThreadNotifyName(inst, startLocalId);
|
||||
unsigned __int16 stringValue;
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].parentVariables[startLocalId + 1];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert((entryValue->w.type & VAR_MASK) == game::VAR_NOTIFY_THREAD);
|
||||
|
||||
stringValue = (unsigned short)game::Scr_GetThreadNotifyName(inst, startLocalId);
|
||||
|
||||
assert(stringValue);
|
||||
|
||||
game::SL_RemoveRefToString(stringValue, inst);
|
||||
entryValue->w.status &= ~VAR_MASK;
|
||||
entryValue->w.status |= game::VAR_THREAD;
|
||||
}
|
||||
|
||||
unsigned int GetArraySize(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
return codsrc::GetArraySize(inst, id);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
assert(id);
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].parentVariables[id + 1];
|
||||
|
||||
assert((entryValue->w.type & VAR_MASK) == game::VAR_ARRAY);
|
||||
|
||||
return entryValue->u.o.u.entnum;
|
||||
}
|
||||
|
||||
void IncInParam(scriptInstance_t inst)
|
||||
{
|
||||
codsrc::IncInParam(inst);
|
||||
assert(((game::gScrVmPub[inst].top >= game::gScrVmGlob[inst].eval_stack - 1) && (game::gScrVmPub[inst].top <= game::gScrVmGlob[inst].eval_stack)) ||
|
||||
((game::gScrVmPub[inst].top >= game::gScrVmPub[inst].stack) && (game::gScrVmPub[inst].top <= game::gScrVmPub[inst].maxstack)));
|
||||
|
||||
game::Scr_ClearOutParams(inst);
|
||||
|
||||
if (game::gScrVmPub[inst].top == game::gScrVmPub[inst].maxstack)
|
||||
{
|
||||
game::Sys_Error("Internal script stack overflow");
|
||||
}
|
||||
|
||||
++game::gScrVmPub[inst].top;
|
||||
++game::gScrVmPub[inst].inparamcount;
|
||||
|
||||
assert(((game::gScrVmPub[inst].top >= game::gScrVmGlob[inst].eval_stack) && (game::gScrVmPub[inst].top <= game::gScrVmGlob[inst].eval_stack + 1)) ||
|
||||
((game::gScrVmPub[inst].top >= game::gScrVmPub[inst].stack) && (game::gScrVmPub[inst].top <= game::gScrVmPub[inst].maxstack)));
|
||||
}
|
||||
|
||||
unsigned int GetParentLocalId(scriptInstance_t inst, unsigned int threadId)
|
||||
{
|
||||
return codsrc::GetParentLocalId(inst, threadId);
|
||||
assert((game::gScrVarGlob[inst].parentVariables[threadId + 1].w.status & VAR_STAT_MASK) == VAR_STAT_EXTERNAL);
|
||||
|
||||
assert((game::gScrVarGlob[inst].parentVariables[threadId + 1].w.type & VAR_MASK) == game::VAR_CHILD_THREAD);
|
||||
|
||||
return game::gScrVarGlob[inst].parentVariables[threadId + 1].w.status >> VAR_NAME_BIT_SHIFT;
|
||||
}
|
||||
|
||||
void Scr_ClearWaitTime(scriptInstance_t inst, unsigned int startLocalId)
|
||||
{
|
||||
codsrc::Scr_ClearWaitTime(inst, startLocalId);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].parentVariables[startLocalId + 1];
|
||||
|
||||
assert(((entryValue->w.status & VAR_STAT_MASK) == VAR_STAT_EXTERNAL));
|
||||
|
||||
assert((entryValue->w.type & VAR_MASK) == game::VAR_TIME_THREAD);
|
||||
|
||||
entryValue->w.status &= ~VAR_MASK;
|
||||
entryValue->w.status |= game::VAR_THREAD;
|
||||
}
|
||||
|
||||
void Scr_SetThreadWaitTime(scriptInstance_t inst, unsigned int startLocalId, unsigned int waitTime)
|
||||
{
|
||||
codsrc::Scr_SetThreadWaitTime(inst, startLocalId, waitTime);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].parentVariables[startLocalId + 1];
|
||||
|
||||
assert(((entryValue->w.status & VAR_STAT_MASK) == VAR_STAT_EXTERNAL));
|
||||
|
||||
assert(((entryValue->w.type & VAR_MASK) == game::VAR_THREAD) || !game::Scr_GetThreadNotifyName(inst, startLocalId));
|
||||
|
||||
entryValue->w.status &= ~VAR_MASK;
|
||||
entryValue->w.status = (unsigned __int8)entryValue->w.status;
|
||||
entryValue->w.status |= game::VAR_TIME_THREAD;
|
||||
game::gScrVarGlob[inst].parentVariables[startLocalId + 1].w.status |= waitTime << 8;
|
||||
}
|
||||
|
||||
void Scr_SetThreadNotifyName(scriptInstance_t inst, unsigned int startLocalId, unsigned int stringValue)
|
||||
{
|
||||
codsrc::Scr_SetThreadNotifyName(inst, startLocalId, stringValue);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].parentVariables[startLocalId + 1];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(((entryValue->w.type & VAR_MASK) == game::VAR_THREAD));
|
||||
|
||||
entryValue->w.status &= ~VAR_MASK;
|
||||
entryValue->w.status = (unsigned __int8)entryValue->w.status;
|
||||
entryValue->w.status |= game::VAR_NOTIFY_THREAD;
|
||||
entryValue->w.status |= stringValue << 8;
|
||||
}
|
||||
|
||||
void Scr_DebugTerminateThread(scriptInstance_t inst, int topThread)
|
||||
{
|
||||
codsrc::Scr_DebugTerminateThread(inst, topThread);
|
||||
// if ( topThread != game::gScrVmPub[inst].function_count )
|
||||
{
|
||||
game::gScrVmPub[inst].function_frame_start[topThread].fs.pos = game::g_EndPos.get();
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int Scr_GetThreadWaitTime(scriptInstance_t inst, unsigned int startLocalId)
|
||||
{
|
||||
return codsrc::Scr_GetThreadWaitTime(inst, startLocalId);
|
||||
assert((game::gScrVarGlob[inst].parentVariables[startLocalId + 1].w.status & VAR_STAT_MASK) == VAR_STAT_EXTERNAL);
|
||||
|
||||
assert((game::gScrVarGlob[inst].parentVariables[startLocalId + 1].w.type & VAR_MASK) == game::VAR_TIME_THREAD);
|
||||
|
||||
return game::gScrVarGlob[inst].parentVariables[startLocalId + 1].w.status >> 8;
|
||||
}
|
||||
|
||||
const char* Scr_GetStackThreadPos(scriptInstance_t inst, unsigned int endLocalId, VariableStackBuffer* stackValue, bool killThread)
|
||||
const char* Scr_GetStackThreadPos([[maybe_unused]]scriptInstance_t inst, unsigned int, VariableStackBuffer*, bool)
|
||||
{
|
||||
return codsrc::Scr_GetStackThreadPos(inst, endLocalId, stackValue, killThread);
|
||||
assert(game::gScrVarPub[inst].developer);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int Scr_GetSelf(scriptInstance_t inst, unsigned int threadId)
|
||||
{
|
||||
return codsrc::Scr_GetSelf(inst, threadId);
|
||||
assert((game::gScrVarGlob[inst].parentVariables[threadId + 1].w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(((game::gScrVarGlob[inst].parentVariables[threadId + 1].w.type & VAR_MASK) >= game::VAR_THREAD) &&
|
||||
((game::gScrVarGlob[inst].parentVariables[threadId + 1].w.type & VAR_MASK) <= game::VAR_CHILD_THREAD));
|
||||
|
||||
return game::gScrVarGlob[inst].parentVariables[threadId + 1].u.o.u.self;
|
||||
}
|
||||
|
||||
unsigned int GetVariableKeyObject(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
return codsrc::GetVariableKeyObject(inst, id);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].childVariables[id];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
|
||||
assert(!IsObject(entryValue));
|
||||
|
||||
return (game::gScrVarGlob[inst].childVariables[id].w.status >> 8) - 0x10000;
|
||||
}
|
||||
|
||||
int MT_Realloc(scriptInstance_t inst, int oldNumBytes, int newNumbytes)
|
||||
{
|
||||
return codsrc::MT_Realloc(inst, oldNumBytes, newNumbytes);
|
||||
int size;
|
||||
|
||||
size = game::MT_GetSize(oldNumBytes, inst);
|
||||
return size >= game::MT_GetSize(newNumbytes, inst);
|
||||
}
|
||||
|
||||
void CScr_GetObjectField(classNum_e classnum, int entnum, int clientNum, int offset)
|
||||
{
|
||||
codsrc::CScr_GetObjectField(classnum, entnum, clientNum, offset);
|
||||
if (classnum > game::CLASS_NUM_ENTITY)
|
||||
{
|
||||
//assertMsg("bad classnum");
|
||||
assert(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
game::CScr_GetEntityField(offset, entnum, clientNum);
|
||||
}
|
||||
}
|
||||
|
||||
int CScr_SetObjectField(classNum_e classnum, int entnum, int clientNum, int offset)
|
||||
{
|
||||
return codsrc::CScr_SetObjectField(classnum, entnum, clientNum, offset);
|
||||
if (classnum > game::CLASS_NUM_ENTITY)
|
||||
{
|
||||
//assertMsg("bad classnum");
|
||||
assert(false);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
return game::CScr_SetEntityField(offset, entnum, clientNum);
|
||||
}
|
||||
}
|
||||
|
||||
void Scr_SetErrorMessage(scriptInstance_t inst, const char* error)
|
||||
{
|
||||
codsrc::Scr_SetErrorMessage(inst, error);
|
||||
if (!game::gScrVarPub[inst].error_message)
|
||||
{
|
||||
game::I_strncpyz(game::error_message_buff.get(), error, 1023u);
|
||||
game::error_message_buff[1023] = '\0';
|
||||
game::gScrVarPub[inst].error_message = game::error_message_buff.get();
|
||||
}
|
||||
}
|
||||
|
||||
bool Scr_IsStackClear(scriptInstance_t inst)
|
||||
{
|
||||
return codsrc::Scr_IsStackClear(inst);
|
||||
return game::gScrVmPub[inst].top == game::gScrVmPub[inst].stack;
|
||||
}
|
||||
|
||||
void SL_CheckExists(scriptInstance_t inst, unsigned int stringValue)
|
||||
void SL_CheckExists(scriptInstance_t, unsigned int)
|
||||
{
|
||||
codsrc::SL_CheckExists(inst, stringValue);
|
||||
}
|
||||
|
||||
const char* Scr_ReadCodePos(scriptInstance_t inst, const char** pos)
|
||||
const char* Scr_ReadCodePos(scriptInstance_t, const char** pos)
|
||||
{
|
||||
return codsrc::Scr_ReadCodePos(inst, pos);
|
||||
int ans;
|
||||
|
||||
ans = *(int*)*pos;
|
||||
*pos += 4;
|
||||
return (const char*)ans;
|
||||
}
|
||||
|
||||
unsigned int Scr_ReadUnsignedInt(scriptInstance_t inst, const char** pos)
|
||||
unsigned int Scr_ReadUnsignedInt(scriptInstance_t, const char** pos)
|
||||
{
|
||||
return codsrc::Scr_ReadUnsignedInt(inst, pos);
|
||||
unsigned int ans;
|
||||
|
||||
ans = *(unsigned int*)*pos;
|
||||
*pos += 4;
|
||||
return ans;
|
||||
}
|
||||
|
||||
unsigned short Scr_ReadUnsignedShort(scriptInstance_t inst, const char** pos)
|
||||
unsigned short Scr_ReadUnsignedShort(scriptInstance_t, const char** pos)
|
||||
{
|
||||
return codsrc::Scr_ReadUnsignedShort(inst, pos);
|
||||
unsigned short ans;
|
||||
|
||||
ans = *(unsigned short*)*pos;
|
||||
*pos += 2;
|
||||
return ans;
|
||||
}
|
||||
|
||||
unsigned char Scr_ReadUnsignedByte(scriptInstance_t inst, const char** pos)
|
||||
unsigned char Scr_ReadUnsignedByte(scriptInstance_t, const char** pos)
|
||||
{
|
||||
return codsrc::Scr_ReadUnsignedByte(inst, pos);
|
||||
unsigned char ans;
|
||||
|
||||
ans = *(unsigned char*)*pos;
|
||||
*pos += 1;
|
||||
return ans;
|
||||
}
|
||||
|
||||
float Scr_ReadFloat(scriptInstance_t inst, const char** pos)
|
||||
float Scr_ReadFloat(scriptInstance_t, const char** pos)
|
||||
{
|
||||
return codsrc::Scr_ReadFloat(inst, pos);
|
||||
float ans;
|
||||
|
||||
ans = *(float*)*pos;
|
||||
*pos += 4;
|
||||
return ans;
|
||||
}
|
||||
|
||||
const float* Scr_ReadVector(scriptInstance_t inst, const char** pos)
|
||||
const float* Scr_ReadVector(scriptInstance_t, const char** pos)
|
||||
{
|
||||
return codsrc::Scr_ReadVector(inst, pos);
|
||||
float* ans;
|
||||
|
||||
ans = (float*)*pos;
|
||||
*pos += 12;
|
||||
return ans;
|
||||
}
|
||||
|
||||
BOOL IsFieldObject(scriptInstance_t inst, unsigned int id)
|
||||
{
|
||||
return codsrc::IsFieldObject(inst, id);
|
||||
game::VariableValueInternal* entryValue;
|
||||
|
||||
assert(id);
|
||||
|
||||
entryValue = &game::gScrVarGlob[inst].parentVariables[id + 1];
|
||||
|
||||
assert((entryValue->w.status & VAR_STAT_MASK) != VAR_STAT_FREE);
|
||||
assert(IsObject(entryValue));
|
||||
|
||||
return (game::VariableType)(entryValue->w.status & VAR_MASK) < game::VAR_ARRAY;
|
||||
}
|
||||
|
||||
void RemoveVariableValue(scriptInstance_t inst, unsigned int parentId, unsigned int index)
|
||||
{
|
||||
codsrc::RemoveVariableValue(inst, parentId, index);
|
||||
unsigned int id;
|
||||
|
||||
assert(index);
|
||||
id = game::gScrVarGlob[inst].childVariables[index].hash.id;
|
||||
|
||||
assert(id);
|
||||
|
||||
game::MakeVariableExternal(&game::gScrVarGlob[inst].parentVariables[parentId + 1], inst, index);
|
||||
game::FreeChildValue(id, inst, parentId);
|
||||
}
|
||||
|
||||
VariableStackBuffer* GetRefVariableStackBuffer(scriptInstance_t inst, int id)
|
||||
{
|
||||
return codsrc::GetRefVariableStackBuffer(inst, id);
|
||||
assert(id);
|
||||
|
||||
assert((id * MT_NODE_SIZE) < MT_SIZE);
|
||||
|
||||
return (game::VariableStackBuffer*)&game::gScrMemTreePub[inst].mt_buffer->nodes[id];
|
||||
}
|
||||
|
||||
unsigned int GetNewVariableIndexReverseInternal(scriptInstance_t inst, unsigned int parentId, unsigned int name)
|
||||
{
|
||||
return codsrc::GetNewVariableIndexReverseInternal(inst, parentId, name);
|
||||
assert(!game::FindVariableIndexInternal(inst, parentId, name));
|
||||
|
||||
return game::GetNewVariableIndexReverseInternal2(name, inst, parentId, (parentId + name) % 0xFFFD + 1);
|
||||
}
|
||||
|
||||
unsigned int GetNewObjectVariableReverse(scriptInstance_t inst, unsigned int parentId, unsigned int id)
|
||||
{
|
||||
return codsrc::GetNewObjectVariableReverse(inst, parentId, id);
|
||||
assert((game::gScrVarGlob[inst].parentVariables[parentId + 1].w.status & VAR_MASK) == game::VAR_ARRAY);
|
||||
|
||||
return game::gScrVarGlob[inst].childVariables[game::GetNewVariableIndexReverseInternal(inst, parentId, id + 0x10000)].hash.id;
|
||||
}
|
||||
|
||||
unsigned int Scr_GetLocalVar(scriptInstance_t inst, int pos)
|
||||
{
|
||||
return codsrc::Scr_GetLocalVar(inst, pos);
|
||||
return game::gScrVmPub[inst].localVars[-pos];
|
||||
}
|
||||
|
||||
void Scr_EvalBoolNot(scriptInstance_t inst, VariableValue* value)
|
||||
{
|
||||
codsrc::Scr_EvalBoolNot(inst, value);
|
||||
game::Scr_CastBool(inst, value);
|
||||
|
||||
if (value->type == game::VAR_INTEGER)
|
||||
{
|
||||
value->u.intValue = value->u.intValue == 0;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int GetInternalVariableIndex(scriptInstance_t inst, unsigned int unsignedValue)
|
||||
unsigned int GetInternalVariableIndex([[maybe_unused]]scriptInstance_t inst, unsigned int unsignedValue)
|
||||
{
|
||||
return codsrc::GetInternalVariableIndex(inst, unsignedValue);
|
||||
assert(game::IsValidArrayIndex(inst, unsignedValue));
|
||||
return (unsignedValue + 0x800000) & 0xFFFFFF;
|
||||
}
|
||||
|
||||
const char* Scr_ReadData(scriptInstance_t inst, const char** pos, unsigned int count)
|
||||
const char* Scr_ReadData(scriptInstance_t, const char** pos, unsigned int count)
|
||||
{
|
||||
return codsrc::Scr_ReadData(inst, pos, count);
|
||||
const char* result;
|
||||
|
||||
result = *pos;
|
||||
*pos += count;
|
||||
return result;
|
||||
}
|
||||
|
||||
unsigned int Scr_GetNumParam(game::scriptInstance_t inst)
|
||||
{
|
||||
return codsrc::Scr_GetNumParam(inst);
|
||||
return game::gScrVmPub[inst].outparamcount;
|
||||
}
|
||||
}
|
@@ -1,5 +1,4 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "codsrc/clientscript/cscr_yacc.hpp"
|
||||
|
||||
namespace game
|
||||
{
|
||||
@@ -73,21 +72,33 @@ namespace game
|
||||
|
||||
FILE* yy_load_buffer_state()
|
||||
{
|
||||
return codsrc::yy_load_buffer_state();
|
||||
FILE* result;
|
||||
|
||||
*game::yy_n_chars = (*game::yy_current_buffer)->yy_n_chars;
|
||||
*game::yy_c_buf_p = (*game::yy_current_buffer)->yy_buf_pos;
|
||||
*game::yytext = *game::yy_c_buf_p;
|
||||
result = (*game::yy_current_buffer)->yy_input_file;
|
||||
*game::yyin = (*game::yy_current_buffer)->yy_input_file;
|
||||
*game::yy_hold_char = *(*game::yy_c_buf_p);
|
||||
return result;
|
||||
}
|
||||
|
||||
void yy_fatal_error(const char* err)
|
||||
{
|
||||
codsrc::yy_fatal_error(err);
|
||||
game::_fprintf(game::__iob_func() + 2, "%s\n", err);
|
||||
game::_exit(2);
|
||||
}
|
||||
|
||||
void* yy_flex_realloc(void* ptr, unsigned int size)
|
||||
{
|
||||
return codsrc::yy_flex_realloc(ptr, size);
|
||||
return game::_realloc(ptr, size);
|
||||
}
|
||||
|
||||
void yy_init_buffer(yy_buffer_state* b, FILE* file)
|
||||
{
|
||||
codsrc::yy_init_buffer(b, file);
|
||||
game::yy_flush_buffer(b);
|
||||
b->yy_input_file = file;
|
||||
b->yy_fill_buffer = 1;
|
||||
b->yy_is_interactive = 0;
|
||||
}
|
||||
}
|
@@ -10,41 +10,6 @@
|
||||
#define ARRAY_COUNT(arrayn) \
|
||||
((sizeof(arrayn)) / (sizeof(arrayn[0])))
|
||||
|
||||
#ifndef NDEBUG
|
||||
#undef assert
|
||||
#define assert(expr) \
|
||||
if (!!!(expr)) \
|
||||
{ \
|
||||
utils::io::write_file("t4sp-server-plugin/gsc_state_assert.json", build_gsc_dump(game::SCRIPTINSTANCE_SERVER)); \
|
||||
_wassert(_CRT_WIDE(#expr), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)); \
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#define RE_CSCR_ANIMTREE_USE_WRAPPERS
|
||||
//#define RE_CSCR_COMPILER_USE_WRAPPERS
|
||||
//#define RE_CSCR_MAIN_USE_WRAPPERS
|
||||
//#define RE_CSCR_MEMORYTREE_USE_WRAPPERS
|
||||
//#define RE_CSCR_PARSER_USE_WRAPPERS
|
||||
//#define RE_CSCR_PARSETREE_USE_WRAPPERS
|
||||
//#define RE_CSCR_READWRITE_USE_WRAPPERS
|
||||
//#define RE_CSCR_STRINGLIST_USE_WRAPPERS
|
||||
//#define RE_CSCR_VARIABLE_USE_WRAPPERS
|
||||
//#define RE_CSCR_VM_USE_WRAPPERS
|
||||
//#define RE_CSCR_YACC_USE_WRAPPERS
|
||||
|
||||
//#define DISABLE_RE_CSCR_ANIMTREE
|
||||
//#define DISABLE_RE_CSCR_COMPILER
|
||||
//#define DISABLE_RE_CSCR_MAIN
|
||||
//#define DISABLE_RE_CSCR_MEMORYTREE
|
||||
//#define DISABLE_RE_CSCR_PARSER
|
||||
//#define DISABLE_RE_CSCR_PARSETREE
|
||||
//#define DISABLE_RE_CSCR_READWRITE
|
||||
//#define DISABLE_RE_CSCR_STRINGLIST
|
||||
//#define DISABLE_RE_CSCR_VARIABLE
|
||||
//#define DISABLE_RE_CSCR_VM
|
||||
//#define DISABLE_RE_CSCR_YACC
|
||||
|
||||
|
||||
namespace game
|
||||
{
|
||||
|
@@ -1,5 +1,4 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "component/signatures.hpp"
|
||||
|
||||
#include <utils/hook.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
@@ -32,17 +31,6 @@ namespace plugin
|
||||
return;
|
||||
}
|
||||
|
||||
if (!signatures::process())
|
||||
{
|
||||
MessageBoxA(NULL,
|
||||
std::format("This version of t4sp-server-plugin is outdated.\n" \
|
||||
"Download the latest dll from here: https://github.com/JezuzLizard/T4SP-Server-Plugin/releases\n" \
|
||||
"'{}' failed", signatures::get_err_reason()).c_str(),
|
||||
"ERROR", MB_ICONERROR);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
component_loader::post_unpack();
|
||||
}
|
||||
|
||||
|
@@ -1,986 +0,0 @@
|
||||
#include <stdinc.hpp>
|
||||
#include "codsrc/clientscript/clientscript_public.hpp"
|
||||
#include <dbghelp.h>
|
||||
|
||||
#define QUICK_TO_JSON_FIELD(j, v, membername) j[#membername] = v.membername
|
||||
|
||||
#define QUICK_TO_JSON_FIELD_SAFE_CSTR(j, v, membername) \
|
||||
if (v.membername) \
|
||||
j[#membername] = v.membername; \
|
||||
else \
|
||||
j[#membername] = "(NULL)"
|
||||
|
||||
#define QUICK_TO_JSON_FIELD_PTR_ADDR(j, v, membername) j[#membername] = reinterpret_cast<size_t>(&v.membername)
|
||||
|
||||
#define QUICK_TO_JSON_FIELD_ARRAY(j, v, membername) \
|
||||
for (auto i = 0; i < ARRAY_COUNT(v.membername); i++) \
|
||||
{ \
|
||||
j[#membername][i] = v.membername[i]; \
|
||||
}
|
||||
|
||||
#define QUICK_TO_JSON_FIELD_SL_STRING(j, v, membername) j[#membername "Str"] = SL_ConvertToStringSafe(v.membername, *gInst)
|
||||
|
||||
namespace game
|
||||
{
|
||||
void to_json(nlohmann::json& j, const scrVarPub_t& v)
|
||||
{
|
||||
QUICK_TO_JSON_FIELD_SAFE_CSTR(j, v, fieldBuffer);
|
||||
QUICK_TO_JSON_FIELD(j, v, canonicalStrCount);
|
||||
QUICK_TO_JSON_FIELD(j, v, developer);
|
||||
QUICK_TO_JSON_FIELD(j, v, developer_script);
|
||||
QUICK_TO_JSON_FIELD(j, v, evaluate);
|
||||
QUICK_TO_JSON_FIELD_SAFE_CSTR(j, v, error_message);
|
||||
QUICK_TO_JSON_FIELD(j, v, error_index);
|
||||
QUICK_TO_JSON_FIELD(j, v, time);
|
||||
QUICK_TO_JSON_FIELD(j, v, timeArrayId);
|
||||
QUICK_TO_JSON_FIELD(j, v, pauseArrayId);
|
||||
QUICK_TO_JSON_FIELD(j, v, levelId);
|
||||
QUICK_TO_JSON_FIELD(j, v, gameId);
|
||||
QUICK_TO_JSON_FIELD(j, v, animId);
|
||||
QUICK_TO_JSON_FIELD(j, v, freeEntList);
|
||||
QUICK_TO_JSON_FIELD(j, v, tempVariable);
|
||||
QUICK_TO_JSON_FIELD(j, v, bInited);
|
||||
QUICK_TO_JSON_FIELD(j, v, savecount);
|
||||
QUICK_TO_JSON_FIELD(j, v, checksum);
|
||||
QUICK_TO_JSON_FIELD(j, v, entId);
|
||||
QUICK_TO_JSON_FIELD(j, v, entFieldName);
|
||||
QUICK_TO_JSON_FIELD_SL_STRING(j, v, entFieldName);
|
||||
QUICK_TO_JSON_FIELD_PTR_ADDR(j, v, programHunkUser);
|
||||
QUICK_TO_JSON_FIELD_PTR_ADDR(j, v, programBuffer);
|
||||
QUICK_TO_JSON_FIELD_PTR_ADDR(j, v, endScriptBuffer);
|
||||
QUICK_TO_JSON_FIELD_ARRAY(j, v, saveIdMap);
|
||||
QUICK_TO_JSON_FIELD_ARRAY(j, v, saveIdMapRev);
|
||||
}
|
||||
}
|
||||
|
||||
int op_idx[game::SCRIPT_INSTANCE_MAX] = { 0, 0 };
|
||||
bool op_idx_rolled_over[game::SCRIPT_INSTANCE_MAX] = { false, false };
|
||||
game::OpcodeVM op_history[game::SCRIPT_INSTANCE_MAX][128] = {};
|
||||
|
||||
int builtin_idx[game::SCRIPT_INSTANCE_MAX] = { 0, 0 };
|
||||
bool builtin_idx_rolled_over[game::SCRIPT_INSTANCE_MAX] = { false, false };
|
||||
int builtin_history[game::SCRIPT_INSTANCE_MAX][128] = {};
|
||||
|
||||
int codepos_idx[game::SCRIPT_INSTANCE_MAX] = { 0, 0 };
|
||||
bool codepos_idx_rolled_over[game::SCRIPT_INSTANCE_MAX] = { false, false };
|
||||
const char* codepos_history[game::SCRIPT_INSTANCE_MAX][128] = {};
|
||||
|
||||
const char* scr_enum_t_to_string[] =
|
||||
{
|
||||
"ENUM_NOP",
|
||||
"ENUM_program",
|
||||
"ENUM_assignment",
|
||||
"ENUM_unknown_variable",
|
||||
"ENUM_duplicate_variable",
|
||||
"ENUM_local_variable",
|
||||
"ENUM_local_variable_frozen",
|
||||
"ENUM_duplicate_expression",
|
||||
"ENUM_primitive_expression",
|
||||
"ENUM_integer",
|
||||
"ENUM_float",
|
||||
"ENUM_minus_integer",
|
||||
"ENUM_minus_float",
|
||||
"ENUM_string",
|
||||
"ENUM_istring",
|
||||
"ENUM_array_variable",
|
||||
"ENUM_unknown_field",
|
||||
"ENUM_field_variable",
|
||||
"ENUM_field_variable_frozen",
|
||||
"ENUM_variable",
|
||||
"ENUM_function",
|
||||
"ENUM_call_expression",
|
||||
"ENUM_local_function",
|
||||
"ENUM_far_function",
|
||||
"ENUM_function_pointer",
|
||||
"ENUM_call",
|
||||
"ENUM_method",
|
||||
"ENUM_call_expression_statement",
|
||||
"ENUM_script_call",
|
||||
"ENUM_return",
|
||||
"ENUM_return2",
|
||||
"ENUM_wait",
|
||||
"ENUM_script_thread_call",
|
||||
"ENUM_undefined",
|
||||
"ENUM_self",
|
||||
"ENUM_self_frozen",
|
||||
"ENUM_level",
|
||||
"ENUM_game",
|
||||
"ENUM_anim",
|
||||
"ENUM_if",
|
||||
"ENUM_if_else",
|
||||
"ENUM_while",
|
||||
"ENUM_for",
|
||||
"ENUM_inc",
|
||||
"ENUM_dec",
|
||||
"ENUM_binary_equals",
|
||||
"ENUM_statement_list",
|
||||
"ENUM_developer_statement_list",
|
||||
"ENUM_expression_list",
|
||||
"ENUM_bool_or",
|
||||
"ENUM_bool_and",
|
||||
"ENUM_binary",
|
||||
"ENUM_bool_not",
|
||||
"ENUM_bool_complement",
|
||||
"ENUM_size_field",
|
||||
"ENUM_self_field",
|
||||
"ENUM_precachetree",
|
||||
"ENUM_waittill",
|
||||
"ENUM_waittillmatch",
|
||||
"ENUM_waittillFrameEnd",
|
||||
"ENUM_notify",
|
||||
"ENUM_endon",
|
||||
"ENUM_switch",
|
||||
"ENUM_case",
|
||||
"ENUM_default",
|
||||
"ENUM_break",
|
||||
"ENUM_continue",
|
||||
"ENUM_expression",
|
||||
"ENUM_empty_array",
|
||||
"ENUM_animation",
|
||||
"ENUM_thread",
|
||||
"ENUM_begin_developer_thread",
|
||||
"ENUM_end_developer_thread",
|
||||
"ENUM_usingtree",
|
||||
"ENUM_false",
|
||||
"ENUM_true",
|
||||
"ENUM_animtree",
|
||||
"ENUM_breakon",
|
||||
"ENUM_breakpoint",
|
||||
"ENUM_prof_begin",
|
||||
"ENUM_prof_end",
|
||||
"ENUM_vector",
|
||||
"ENUM_object",
|
||||
"ENUM_thread_object",
|
||||
"ENUM_local",
|
||||
"ENUM_statement",
|
||||
"ENUM_bad_expression",
|
||||
"ENUM_bad_statement",
|
||||
"ENUM_include",
|
||||
"ENUM_argument"
|
||||
};
|
||||
|
||||
const char* OpcodeVMToString[] = {
|
||||
"OP_End",
|
||||
"OP_Return",
|
||||
"OP_GetUndefined",
|
||||
"OP_GetZero",
|
||||
"OP_GetByte",
|
||||
"OP_GetNegByte",
|
||||
"OP_GetUnsignedShort",
|
||||
"OP_GetNegUnsignedShort",
|
||||
"OP_GetInteger",
|
||||
"OP_GetFloat",
|
||||
"OP_GetString",
|
||||
"OP_GetIString",
|
||||
"OP_GetVector",
|
||||
"OP_GetLevelObject",
|
||||
"OP_GetAnimObject",
|
||||
"OP_GetSelf",
|
||||
"OP_GetLevel",
|
||||
"OP_GetGame",
|
||||
"OP_GetAnim",
|
||||
"OP_GetAnimation",
|
||||
"OP_GetGameRef",
|
||||
"OP_GetFunction",
|
||||
"OP_CreateLocalVariable",
|
||||
"OP_RemoveLocalVariables",
|
||||
"OP_EvalLocalVariableCached0",
|
||||
"OP_EvalLocalVariableCached1",
|
||||
"OP_EvalLocalVariableCached2",
|
||||
"OP_EvalLocalVariableCached3",
|
||||
"OP_EvalLocalVariableCached4",
|
||||
"OP_EvalLocalVariableCached5",
|
||||
"OP_EvalLocalVariableCached",
|
||||
"OP_EvalLocalArrayCached",
|
||||
"OP_EvalArray",
|
||||
"OP_EvalLocalArrayRefCached0",
|
||||
"OP_EvalLocalArrayRefCached",
|
||||
"OP_EvalArrayRef",
|
||||
"OP_ClearArray",
|
||||
"OP_EmptyArray",
|
||||
"OP_GetSelfObject",
|
||||
"OP_EvalLevelFieldVariable",
|
||||
"OP_EvalAnimFieldVariable",
|
||||
"OP_EvalSelfFieldVariable",
|
||||
"OP_EvalFieldVariable",
|
||||
"OP_EvalLevelFieldVariableRef",
|
||||
"OP_EvalAnimFieldVariableRef",
|
||||
"OP_EvalSelfFieldVariableRef",
|
||||
"OP_EvalFieldVariableRef",
|
||||
"OP_ClearFieldVariable",
|
||||
"OP_SafeCreateVariableFieldCached",
|
||||
"OP_SafeSetVariableFieldCached0",
|
||||
"OP_SafeSetVariableFieldCached",
|
||||
"OP_SafeSetWaittillVariableFieldCached",
|
||||
"OP_clearparams",
|
||||
"OP_checkclearparams",
|
||||
"OP_EvalLocalVariableRefCached0",
|
||||
"OP_EvalLocalVariableRefCached",
|
||||
"OP_SetLevelFieldVariableField",
|
||||
"OP_SetVariableField",
|
||||
"OP_SetAnimFieldVariableField",
|
||||
"OP_SetSelfFieldVariableField",
|
||||
"OP_SetLocalVariableFieldCached0",
|
||||
"OP_SetLocalVariableFieldCached",
|
||||
"OP_CallBuiltin0",
|
||||
"OP_CallBuiltin1",
|
||||
"OP_CallBuiltin2",
|
||||
"OP_CallBuiltin3",
|
||||
"OP_CallBuiltin4",
|
||||
"OP_CallBuiltin5",
|
||||
"OP_CallBuiltin",
|
||||
"OP_CallBuiltinMethod0",
|
||||
"OP_CallBuiltinMethod1",
|
||||
"OP_CallBuiltinMethod2",
|
||||
"OP_CallBuiltinMethod3",
|
||||
"OP_CallBuiltinMethod4",
|
||||
"OP_CallBuiltinMethod5",
|
||||
"OP_CallBuiltinMethod",
|
||||
"OP_wait",
|
||||
"OP_waittillFrameEnd",
|
||||
"OP_PreScriptCall",
|
||||
"OP_ScriptFunctionCall2",
|
||||
"OP_ScriptFunctionCall",
|
||||
"OP_ScriptFunctionCallPointer",
|
||||
"OP_ScriptMethodCall",
|
||||
"OP_ScriptMethodCallPointer",
|
||||
"OP_ScriptThreadCall",
|
||||
"OP_ScriptThreadCallPointer",
|
||||
"OP_ScriptMethodThreadCall",
|
||||
"OP_ScriptMethodThreadCallPointer",
|
||||
"OP_DecTop",
|
||||
"OP_CastFieldObject",
|
||||
"OP_EvalLocalVariableObjectCached",
|
||||
"OP_CastBool",
|
||||
"OP_BoolNot",
|
||||
"OP_BoolComplement",
|
||||
"OP_JumpOnFalse",
|
||||
"OP_JumpOnTrue",
|
||||
"OP_JumpOnFalseExpr",
|
||||
"OP_JumpOnTrueExpr",
|
||||
"OP_jump",
|
||||
"OP_jumpback",
|
||||
"OP_inc",
|
||||
"OP_dec",
|
||||
"OP_bit_or",
|
||||
"OP_bit_ex_or",
|
||||
"OP_bit_and",
|
||||
"OP_equality",
|
||||
"OP_inequality",
|
||||
"OP_less",
|
||||
"OP_greater",
|
||||
"OP_less_equal",
|
||||
"OP_greater_equal",
|
||||
"OP_shift_left",
|
||||
"OP_shift_right",
|
||||
"OP_plus",
|
||||
"OP_minus",
|
||||
"OP_multiply",
|
||||
"OP_divide",
|
||||
"OP_mod",
|
||||
"OP_size",
|
||||
"OP_waittillmatch",
|
||||
"OP_waittill",
|
||||
"OP_notify",
|
||||
"OP_endon",
|
||||
"OP_voidCodepos",
|
||||
"OP_switch",
|
||||
"OP_endswitch",
|
||||
"OP_vector",
|
||||
"OP_NOP",
|
||||
"OP_abort",
|
||||
"OP_object",
|
||||
"OP_thread_object",
|
||||
"OP_EvalLocalVariable",
|
||||
"OP_EvalLocalVariableRef",
|
||||
"OP_prof_begin",
|
||||
"OP_prof_end",
|
||||
"OP_breakpoint",
|
||||
"OP_assignmentBreakpoint",
|
||||
"OP_manualAndAssignmentBreakpoint",
|
||||
"OP_count"
|
||||
};
|
||||
|
||||
nlohmann::json print_statement_ast(game::scriptInstance_t inst, game::sval_u val)
|
||||
{
|
||||
nlohmann::json answer{};
|
||||
game::sval_u *node;
|
||||
game::sval_u *start_node;
|
||||
int i;
|
||||
|
||||
answer["type"] = scr_enum_t_to_string[val.node[0].type];
|
||||
|
||||
switch (val.node[0].type)
|
||||
{
|
||||
case game::ENUM_array_variable:
|
||||
answer["expr"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["index"] = print_statement_ast(inst, val.node[2]);
|
||||
answer["sourcePos"] = val.node[3].sourcePosValue;
|
||||
answer["indexSourcePos"] = val.node[4].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_field_variable:
|
||||
answer["expr"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["field"] = game::SL_ConvertToString(val.node[2].stringValue, inst);
|
||||
answer["sourcePos"] = val.node[3].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_assignment:
|
||||
answer["lhs"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["rhs"] = print_statement_ast(inst, val.node[2]);
|
||||
answer["sourcePos"] = val.node[3].sourcePosValue;
|
||||
answer["rhsSourcePos"] = val.node[4].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_far_function:
|
||||
answer["filename"] = game::SL_ConvertToString(val.node[1].stringValue, inst);
|
||||
answer["threadName"] = game::SL_ConvertToString(val.node[2].stringValue, inst);
|
||||
answer["sourcePos"] = val.node[3].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_local_function:
|
||||
answer["threadName"] = game::SL_ConvertToString(val.node[1].stringValue, inst);
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_function:
|
||||
case game::ENUM_function_pointer:
|
||||
answer["func"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_script_call:
|
||||
answer["func_name"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["nameSourcePos"] = val.node[2].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_script_thread_call:
|
||||
answer["func_name"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
answer["nameSourcePos"] = val.node[3].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_call:
|
||||
answer["func_name"] = print_statement_ast(inst, val.node[1]);
|
||||
|
||||
answer["params"] = nlohmann::json::array();
|
||||
for (i = 0, node = val.node[2].node[0].node;
|
||||
node;
|
||||
node = node[1].node, i++)
|
||||
{
|
||||
answer["params"][i] = print_statement_ast(inst, node->node[0]);
|
||||
}
|
||||
|
||||
answer["sourcePos"] = val.node[3].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_method:
|
||||
answer["expr"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["func_name"] = print_statement_ast(inst, val.node[2]);
|
||||
|
||||
answer["params"] = nlohmann::json::array();
|
||||
for (i = 0, node = val.node[3].node[0].node;
|
||||
node;
|
||||
node = node[1].node, i++)
|
||||
{
|
||||
answer["params"][i] = print_statement_ast(inst, node->node[0]);
|
||||
}
|
||||
|
||||
answer["sourcePos"] = val.node[4].sourcePosValue;
|
||||
answer["methodSourcePos"] = val.node[5].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_integer:
|
||||
case game::ENUM_minus_integer:
|
||||
answer["value"] = val.node[1].intValue;
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_float:
|
||||
case game::ENUM_minus_float:
|
||||
answer["value"] = val.node[1].floatValue;
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_string:
|
||||
case game::ENUM_istring:
|
||||
answer["value"] = game::SL_ConvertToString(val.node[1].stringValue, inst);
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_expression_list:
|
||||
answer["exprlist"] = nlohmann::json::array();
|
||||
for (i = 0, node = val.node[1].node->node;
|
||||
node;
|
||||
node = node[1].node, i++)
|
||||
{
|
||||
answer["exprlist"][i] = print_statement_ast(inst, *node->node);
|
||||
}
|
||||
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_thread:
|
||||
answer["threadName"] = game::SL_ConvertToString(val.node[1].stringValue, inst);
|
||||
|
||||
answer["formalParams"] = nlohmann::json::array();
|
||||
for (i = 0, node = val.node[2].node->node[1].node;
|
||||
node;
|
||||
node = node[1].node, i++)
|
||||
{
|
||||
answer["formalParams"][i]["expr_name"] = game::SL_ConvertToString(node->node[0].stringValue, inst);
|
||||
answer["formalParams"][i]["sourcePos"] = node->node[1].sourcePosValue;
|
||||
}
|
||||
|
||||
answer["statements"] = nlohmann::json::array();
|
||||
for (i = 0, node = val.node[3].node->node[1].node;
|
||||
node;
|
||||
node = node[1].node, i++)
|
||||
{
|
||||
answer["statements"][i] = print_statement_ast(inst, *node);
|
||||
}
|
||||
|
||||
answer["sourcePos"] = val.node[4].sourcePosValue;
|
||||
answer["endSourcePos"] = val.node[5].sourcePosValue;
|
||||
|
||||
{
|
||||
auto stmtblock = &val.node[6].block;
|
||||
stmtblock = stmtblock;
|
||||
}
|
||||
break;
|
||||
|
||||
case game::ENUM_usingtree:
|
||||
answer["string"] = game::SL_ConvertToString(val.node[1].stringValue, inst);
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
answer["sourcePos2"] = val.node[3].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_wait:
|
||||
answer["expr"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
answer["waitSourcePos"] = val.node[3].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_developer_statement_list:
|
||||
answer["list"] = nlohmann::json::array();
|
||||
for (i = 0, node = val.node[1].node->node[1].node;
|
||||
node;
|
||||
node = node[1].node, i++)
|
||||
{
|
||||
answer["list"][i] = print_statement_ast(inst, *node);
|
||||
}
|
||||
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
|
||||
{
|
||||
auto devStatBlock = val.node[3].block;
|
||||
devStatBlock = devStatBlock;
|
||||
}
|
||||
break;
|
||||
|
||||
case game::ENUM_statement_list:
|
||||
answer["list"] = nlohmann::json::array();
|
||||
for (i = 0, node = val.node[1].node->node[1].node;
|
||||
node;
|
||||
node = node[1].node, i++)
|
||||
{
|
||||
answer["list"][i] = print_statement_ast(inst, *node);
|
||||
}
|
||||
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
answer["sourcePos2"] = val.node[3].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_if:
|
||||
answer["expr"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["stmt"] = print_statement_ast(inst, val.node[2]);
|
||||
answer["sourcePos"] = val.node[3].sourcePosValue;
|
||||
|
||||
{
|
||||
auto ifStatBlock = val.node[4].block;
|
||||
ifStatBlock = ifStatBlock;
|
||||
}
|
||||
break;
|
||||
|
||||
case game::ENUM_if_else:
|
||||
answer["expr"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["stmt1"] = print_statement_ast(inst, val.node[2]);
|
||||
answer["stmt2"] = print_statement_ast(inst, val.node[3]);
|
||||
answer["sourcePos"] = val.node[4].sourcePosValue;
|
||||
answer["elseSourcePos"] = val.node[5].sourcePosValue;
|
||||
|
||||
{
|
||||
auto ifBlock = val.node[6].block;
|
||||
auto elseBlock = val.node[7].block;
|
||||
ifBlock = ifBlock;
|
||||
elseBlock = elseBlock;
|
||||
}
|
||||
break;
|
||||
|
||||
case game::ENUM_while:
|
||||
answer["expr"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["stmt"] = print_statement_ast(inst, val.node[2]);
|
||||
answer["sourcePos"] = val.node[3].sourcePosValue;
|
||||
answer["whileSourcePos"] = val.node[4].sourcePosValue;
|
||||
|
||||
{
|
||||
|
||||
auto whileStatBlock = val.node[5].block;
|
||||
whileStatBlock = whileStatBlock;
|
||||
}
|
||||
break;
|
||||
|
||||
case game::ENUM_for:
|
||||
answer["stmt1"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["expr"] = print_statement_ast(inst, val.node[2]);
|
||||
answer["stmt2"] = print_statement_ast(inst, val.node[3]);
|
||||
answer["stmt"] = print_statement_ast(inst, val.node[4]);
|
||||
answer["sourcePos"] = val.node[5].sourcePosValue;
|
||||
answer["forSourcePos"] = val.node[6].sourcePosValue;
|
||||
|
||||
{
|
||||
auto forStatBlock = val.node[7].block;
|
||||
auto forStatPostBlock = val.node[8].block;
|
||||
forStatBlock = forStatBlock;
|
||||
forStatPostBlock = forStatPostBlock;
|
||||
}
|
||||
break;
|
||||
|
||||
case game::ENUM_bool_or:
|
||||
case game::ENUM_bool_and:
|
||||
answer["expr1"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["expr2"] = print_statement_ast(inst, val.node[2]);
|
||||
answer["expr1SourcePos"] = val.node[3].sourcePosValue;
|
||||
answer["expr2SourcePos"] = val.node[4].sourcePosValue;
|
||||
answer["sourcePos"] = val.node[5].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_binary:
|
||||
{
|
||||
auto expr1 = val.node[1];
|
||||
auto expr2 = val.node[2];
|
||||
auto opcode = val.node[3].type;
|
||||
auto sourcePos = val.node[4].sourcePosValue;
|
||||
|
||||
answer["opcode"] = OpcodeVMToString[opcode];
|
||||
answer["sourcePos"] = sourcePos;
|
||||
answer["expr1"] = print_statement_ast(inst, expr1);
|
||||
answer["expr2"] = print_statement_ast(inst, expr2);
|
||||
break;
|
||||
}
|
||||
|
||||
case game::ENUM_binary_equals:
|
||||
answer["lhs"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["rhs"] = print_statement_ast(inst, val.node[2]);
|
||||
answer["opcode"] = OpcodeVMToString[val.node[3].type];
|
||||
answer["sourcePos"] = val.node[4].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_endon:
|
||||
answer["obj"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["expr"] = print_statement_ast(inst, val.node[2]);
|
||||
answer["sourcePos"] = val.node[3].sourcePosValue;
|
||||
answer["exprSourcePos"] = val.node[4].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_notify:
|
||||
answer["obj"] = print_statement_ast(inst, val.node[1]);
|
||||
|
||||
answer["exprlist"] = nlohmann::json::array();
|
||||
start_node = nullptr;
|
||||
for (i = 0, node = val.node[2].node->node;
|
||||
node;
|
||||
node = node[1].node, i++)
|
||||
{
|
||||
start_node = node;
|
||||
answer["exprlist"][i] = print_statement_ast(inst, *node->node);
|
||||
}
|
||||
|
||||
answer["startNodeSourcePos"] = start_node->node[1].sourcePosValue;
|
||||
answer["sourcePos"] = val.node[3].sourcePosValue;
|
||||
answer["notifySourcePos"] = val.node[4].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_waittill:
|
||||
answer["obj"] = print_statement_ast(inst, val.node[1]);
|
||||
|
||||
node = val.node[2].node->node[1].node;
|
||||
answer["expr"]["expr"] = print_statement_ast(inst, *node->node);
|
||||
answer["expr"]["sourcePos"] = node->node[1].sourcePosValue;
|
||||
|
||||
answer["exprlist"] = nlohmann::json::array();
|
||||
for (i = 0, node = node[1].node;
|
||||
node;
|
||||
node = node[1].node, i++)
|
||||
{
|
||||
answer["exprlist"][i]["expr"] = game::SL_ConvertToString(node[0].node->stringValue, inst);
|
||||
answer["exprlist"][i]["sourcePos"] = node->node[1].sourcePosValue;
|
||||
}
|
||||
|
||||
answer["sourcePos"] = val.node[3].sourcePosValue;
|
||||
answer["waitSourcePos"] = val.node[4].sourcePosValue;
|
||||
break;
|
||||
|
||||
|
||||
case game::ENUM_switch:
|
||||
answer["expr"] = print_statement_ast(inst, val.node[1]);
|
||||
|
||||
answer["stmtlist"] = nlohmann::json::array();
|
||||
for (i = 0, node = val.node[2].node->node[1].node;
|
||||
node;
|
||||
node = node[1].node, i++)
|
||||
{
|
||||
answer["stmtlist"][i] = print_statement_ast(inst, *node);
|
||||
}
|
||||
|
||||
answer["sourcePos"] = val.node[3].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_default:
|
||||
answer["sourcePos"] = val.node[1].sourcePosValue;
|
||||
|
||||
{
|
||||
auto breakBlock = val.node[2].block;
|
||||
breakBlock = breakBlock;
|
||||
}
|
||||
break;
|
||||
|
||||
case game::ENUM_case:
|
||||
answer["expr"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
|
||||
{
|
||||
auto caseBlock = val.node[3].block;
|
||||
caseBlock = caseBlock;
|
||||
}
|
||||
break;
|
||||
|
||||
case game::ENUM_waittillmatch:
|
||||
answer["obj"] = print_statement_ast(inst, val.node[1]);
|
||||
|
||||
answer["exprlist"] = nlohmann::json::array();
|
||||
for (i = 0, node = val.node[2].node->node[1].node;
|
||||
node;
|
||||
node = node[1].node, i++)
|
||||
{
|
||||
answer["exprlist"][i]["expr"] = print_statement_ast(inst, *node->node);
|
||||
answer["exprlist"][i]["sourcePos"] = node->node[1].sourcePosValue;
|
||||
}
|
||||
|
||||
answer["sourcePos"] = val.node[3].sourcePosValue;
|
||||
answer["waitSourcePos"] = val.node[4].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_local_variable:
|
||||
case game::ENUM_prof_begin:
|
||||
case game::ENUM_prof_end:
|
||||
case game::ENUM_animation:
|
||||
answer["name"] = game::SL_ConvertToString(val.node[1].stringValue, inst);
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_begin_developer_thread:
|
||||
case game::ENUM_end_developer_thread:
|
||||
case game::ENUM_undefined:
|
||||
case game::ENUM_false:
|
||||
case game::ENUM_true:
|
||||
case game::ENUM_return2:
|
||||
case game::ENUM_self:
|
||||
case game::ENUM_level:
|
||||
case game::ENUM_game:
|
||||
case game::ENUM_anim:
|
||||
case game::ENUM_empty_array:
|
||||
case game::ENUM_waittillFrameEnd:
|
||||
case game::ENUM_break:
|
||||
case game::ENUM_continue:
|
||||
case game::ENUM_animtree:
|
||||
case game::ENUM_breakpoint:
|
||||
answer["sourcePos"] = val.node[1].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_duplicate_variable:
|
||||
case game::ENUM_duplicate_expression:
|
||||
case game::ENUM_call_expression:
|
||||
case game::ENUM_call_expression_statement:
|
||||
case game::ENUM_expression:
|
||||
case game::ENUM_statement:
|
||||
answer["expr"] = print_statement_ast(inst, val.node[1]);
|
||||
break;
|
||||
|
||||
case game::ENUM_variable:
|
||||
case game::ENUM_primitive_expression:
|
||||
case game::ENUM_return:
|
||||
case game::ENUM_inc:
|
||||
case game::ENUM_dec:
|
||||
case game::ENUM_bool_not:
|
||||
case game::ENUM_bool_complement:
|
||||
case game::ENUM_size_field:
|
||||
answer["expr"] = print_statement_ast(inst, val.node[1]);
|
||||
answer["sourcePos"] = val.node[2].sourcePosValue;
|
||||
break;
|
||||
|
||||
case game::ENUM_NOP:
|
||||
case game::ENUM_program: // unk
|
||||
case game::ENUM_unknown_variable: // unk
|
||||
case game::ENUM_local_variable_frozen: // unk, debugger?
|
||||
case game::ENUM_unknown_field: // unk
|
||||
case game::ENUM_field_variable_frozen: // unk, debugger?
|
||||
case game::ENUM_self_frozen: // unk, debugger?
|
||||
case game::ENUM_include: // handled
|
||||
case game::ENUM_self_field: // debugger
|
||||
case game::ENUM_object: // debugger
|
||||
case game::ENUM_precachetree: // unk
|
||||
case game::ENUM_local: // unk
|
||||
case game::ENUM_bad_expression: // unk
|
||||
case game::ENUM_bad_statement: // unk
|
||||
case game::ENUM_argument: // unk
|
||||
case game::ENUM_thread_object: // unk
|
||||
case game::ENUM_vector: // unk
|
||||
case game::ENUM_breakon: // debugger unk 2 vals 1 pos
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return answer;
|
||||
}
|
||||
|
||||
void print_ast(game::scriptInstance_t inst, game::sval_u val)
|
||||
{
|
||||
nlohmann::json answer{};
|
||||
game::sval_u* node;
|
||||
int i;
|
||||
|
||||
answer["filename"] = game::gScrParserPub[inst].scriptfilename;
|
||||
|
||||
// this is the include list
|
||||
answer["includes"] = nlohmann::json::array();
|
||||
for ( i = 0, node = val.node[0].node->node[1].node;
|
||||
node;
|
||||
node = node[1].node, i++ )
|
||||
{
|
||||
answer["includes"][i]["type"] = scr_enum_t_to_string[node->node[0].type];
|
||||
answer["includes"][i]["filename"] = game::SL_ConvertToString(node->node[1].stringValue, inst);
|
||||
answer["includes"][i]["sourcePos"] = node->node[2].sourcePosValue;
|
||||
}
|
||||
|
||||
// this is the thread list
|
||||
answer["threads"] = nlohmann::json::array();
|
||||
for ( i = 0, node = val.node[1].node->node[1].node;
|
||||
node;
|
||||
node = node[1].node, i++ )
|
||||
{
|
||||
answer["threads"][i] = print_statement_ast(inst, *node);
|
||||
}
|
||||
|
||||
utils::io::write_file(std::format("t4sp-server-plugin/ast-{}.json", game::gScrParserPub[inst].scriptfilename), answer.dump(2));
|
||||
}
|
||||
|
||||
// https://stackoverflow.com/questions/5693192/win32-backtrace-from-c-code
|
||||
std::string build_code_stack()
|
||||
{
|
||||
unsigned int i;
|
||||
void * stack[ 100 ];
|
||||
unsigned short frames;
|
||||
SYMBOL_INFO * symbol;
|
||||
HANDLE process;
|
||||
std::string answer{};
|
||||
|
||||
process = GetCurrentProcess();
|
||||
|
||||
SymInitialize( process, NULL, TRUE );
|
||||
|
||||
frames = CaptureStackBackTrace( 0, 100, stack, NULL );
|
||||
symbol = ( SYMBOL_INFO * )calloc( sizeof( SYMBOL_INFO ) + 256 * sizeof( char ), 1 );
|
||||
symbol->MaxNameLen = 255;
|
||||
symbol->SizeOfStruct = sizeof( SYMBOL_INFO );
|
||||
|
||||
for( i = 0; i < frames; i++ )
|
||||
{
|
||||
SymFromAddr( process, ( DWORD64 )( stack[ i ] ), 0, symbol );
|
||||
|
||||
answer += std::format("{}: {} - 0x{:06x}\n", frames - i - 1, symbol->Name, symbol->Address);
|
||||
}
|
||||
|
||||
free( symbol );
|
||||
|
||||
return answer;
|
||||
}
|
||||
|
||||
std::string build_builtin_history(game::scriptInstance_t inst)
|
||||
{
|
||||
std::string answer{};
|
||||
|
||||
int count = builtin_idx_rolled_over[inst] ? ARRAY_COUNT(builtin_history[inst]) : builtin_idx[inst];
|
||||
|
||||
for (auto i = 0; i < count; i++)
|
||||
{
|
||||
auto idx = builtin_idx[inst] - 1 - i;
|
||||
if (idx < 0)
|
||||
{
|
||||
idx += ARRAY_COUNT(builtin_history[inst]);
|
||||
}
|
||||
|
||||
// todo, convert to builtin name
|
||||
answer += std::format("{}\n", builtin_history[inst][idx]);
|
||||
}
|
||||
|
||||
return answer;
|
||||
}
|
||||
|
||||
std::string build_codepos_history(game::scriptInstance_t inst)
|
||||
{
|
||||
std::string answer{};
|
||||
int bufferIndex;
|
||||
int prevSourcePos;
|
||||
int col;
|
||||
char line[1024];
|
||||
int lineNum;
|
||||
const char* fileName;
|
||||
|
||||
int count = codepos_idx_rolled_over[inst] ? ARRAY_COUNT(codepos_history[inst]) : codepos_idx[inst];
|
||||
|
||||
for (auto i = 0; i < count; i++)
|
||||
{
|
||||
auto idx = codepos_idx[inst] - 1 - i;
|
||||
if (idx < 0)
|
||||
{
|
||||
idx += ARRAY_COUNT(codepos_history[inst]);
|
||||
}
|
||||
|
||||
bufferIndex = game::Scr_GetSourceBuffer(inst, codepos_history[inst][idx]);
|
||||
prevSourcePos = game::Scr_GetPrevSourcePos(inst, codepos_history[inst][idx], 0);
|
||||
lineNum = game::Scr_GetLineInfo(&col, game::gScrParserPub[inst].sourceBufferLookup[bufferIndex].sourceBuf, prevSourcePos, line);
|
||||
fileName = game::gScrParserPub[inst].sourceBufferLookup[bufferIndex].buf;
|
||||
|
||||
answer += std::format("{}({}, {}): '{}'\n", fileName, lineNum, col, line);
|
||||
}
|
||||
|
||||
return answer;
|
||||
}
|
||||
|
||||
std::string build_op_history(game::scriptInstance_t inst)
|
||||
{
|
||||
std::string answer{};
|
||||
|
||||
int count = op_idx_rolled_over[inst] ? ARRAY_COUNT(op_history[inst]) : op_idx[inst];
|
||||
|
||||
for (auto i = 0; i < count; i++)
|
||||
{
|
||||
auto idx = op_idx[inst] - 1 - i;
|
||||
if (idx < 0)
|
||||
{
|
||||
idx += ARRAY_COUNT(op_history[inst]);
|
||||
}
|
||||
|
||||
if ((int)op_history[inst][idx] >= 0 && op_history[inst][idx] < game::OP_count)
|
||||
{
|
||||
answer += std::format("{}\n", OpcodeVMToString[op_history[inst][idx]]);
|
||||
}
|
||||
else
|
||||
{
|
||||
answer += std::format("0x{:02x}\n", (int)op_history[inst][idx]);
|
||||
}
|
||||
}
|
||||
|
||||
return answer;
|
||||
}
|
||||
|
||||
std::string build_gsc_stack(game::scriptInstance_t inst)
|
||||
{
|
||||
std::string answer{};
|
||||
|
||||
int bufferIndex;
|
||||
int prevSourcePos;
|
||||
int col;
|
||||
char line[1024];
|
||||
int lineNum;
|
||||
const char* fileName;
|
||||
|
||||
if (!game::gFs[inst].pos || !game::Scr_IsInOpcodeMemory(inst, game::gFs[inst].pos))
|
||||
{
|
||||
return answer;
|
||||
}
|
||||
|
||||
for (auto frame = game::gScrVmPub[inst].function_frame_start;; frame++)
|
||||
{
|
||||
if (!frame->fs.pos || !game::Scr_IsInOpcodeMemory(inst, frame->fs.pos))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
bufferIndex = game::Scr_GetSourceBuffer(inst, frame->fs.pos - 1);
|
||||
prevSourcePos = game::Scr_GetPrevSourcePos(inst, frame->fs.pos - 1, 0);
|
||||
lineNum = game::Scr_GetLineInfo(&col, game::gScrParserPub[inst].sourceBufferLookup[bufferIndex].sourceBuf, prevSourcePos, line);
|
||||
fileName = game::gScrParserPub[inst].sourceBufferLookup[bufferIndex].buf;
|
||||
|
||||
answer += std::format("{}({}, {}): '{}'\n", fileName, lineNum, col, line);
|
||||
|
||||
if (frame == game::gScrVmPub[inst].function_frame)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return answer;
|
||||
}
|
||||
|
||||
std::string build_gsc_dump(game::scriptInstance_t inst)
|
||||
{
|
||||
nlohmann::json answer{};
|
||||
auto t = *game::gInst;
|
||||
*game::gInst = inst;
|
||||
|
||||
answer["inst"] = inst;
|
||||
answer["gScrVarPub"] = game::gScrVarPub[inst];
|
||||
answer["codeCallStack"] = build_code_stack();
|
||||
answer["gscCallStack"] = build_gsc_stack(inst);
|
||||
answer["opHistory"] = build_op_history(inst);
|
||||
answer["builtinHistory"] = build_builtin_history(inst);
|
||||
answer["codeposHistory"] = build_codepos_history(inst);
|
||||
|
||||
*game::gInst = t;
|
||||
|
||||
return answer.dump(2);
|
||||
}
|
||||
|
||||
void push_opcode_history(game::scriptInstance_t inst, game::OpcodeVM op)
|
||||
{
|
||||
assert(inst == 0 || inst == 1);
|
||||
//assert((int)op >= 0 && op < game::OP_count);
|
||||
|
||||
op_history[inst][op_idx[inst]++] = op;
|
||||
|
||||
if (op_idx[inst] >= ARRAY_COUNT(op_history[inst]))
|
||||
{
|
||||
op_idx_rolled_over[inst] = true;
|
||||
op_idx[inst] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void push_builtin_history(game::scriptInstance_t inst, int idx)
|
||||
{
|
||||
assert(inst == 0 || inst == 1);
|
||||
assert(idx >= 0 && idx < 1024);
|
||||
|
||||
builtin_history[inst][builtin_idx[inst]++] = idx;
|
||||
|
||||
if (builtin_idx[inst] >= ARRAY_COUNT(builtin_history[inst]))
|
||||
{
|
||||
builtin_idx_rolled_over[inst] = true;
|
||||
builtin_idx[inst] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void push_codepos_history(game::scriptInstance_t inst, const char* pos)
|
||||
{
|
||||
assert(inst == 0 || inst == 1);
|
||||
assert(game::Scr_IsInOpcodeMemory(inst, pos));
|
||||
|
||||
codepos_history[inst][codepos_idx[inst]++] = pos;
|
||||
|
||||
if (codepos_idx[inst] >= ARRAY_COUNT(codepos_history[inst]))
|
||||
{
|
||||
codepos_idx_rolled_over[inst] = true;
|
||||
codepos_idx[inst] = 0;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user