4 Commits

Author SHA1 Message Date
ineed bots
25f827da0d add sample 2025-09-20 20:53:00 -06:00
ineed bots
afbbdd2d11 fix wanrings 2025-09-20 20:50:37 -06:00
ineed bots
d417f41992 new workflow 2025-09-20 20:41:58 -06:00
ineed bots
812a7424fe cleanup for no plutonium release 2025-09-20 20:36:55 -06:00
59 changed files with 1011 additions and 33597 deletions

View File

@@ -1,7 +0,0 @@
version: 2
updates:
- package-ecosystem: gitsubmodule
directory: "/"
schedule:
interval: daily
open-pull-requests-limit: 10

View File

@@ -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
View File

@@ -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)

View File

@@ -1,2 +0,0 @@
#include <stdinc.hpp>
#include "clientscript_public.hpp"

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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];
}
}

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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);
}

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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();
}
}

View File

@@ -1,7 +0,0 @@
#pragma once
namespace signatures
{
const std::string& get_err_reason();
bool process();
}

View File

@@ -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:

View File

@@ -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);
}
}

View File

@@ -1,6 +0,0 @@
#pragma once
namespace exception
{
std::string create_minidump(LPEXCEPTION_POINTERS exceptioninfo);
}

View File

@@ -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);
}
}
}

View File

@@ -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;
}
}

View File

@@ -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];
}
}

View File

@@ -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;
}
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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
{

View File

@@ -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();
}

View File

@@ -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;
}
}