#include namespace game { //custom made don't replace VariableValue __usercall GetEntityFieldValue@(int offset@, int entnum@, scriptInstance_t inst, int classnum, int clientNum) VariableValue GetEntityFieldValue/*@*/(int offset_, int entnum, scriptInstance_t inst, int classnum, int clientNum, void* call_addr) { VariableValue answer; VariableUnion u; VariableType typ; __asm { push clientNum; push classnum; push inst; mov ecx, entnum; mov eax, offset_; call call_addr; mov u, eax; mov typ, edx; add esp, 0xC; } answer.u = u; answer.type = typ; return answer; } void Scr_Init(scriptInstance_t a1/*@*/, void* call_addr) { __asm { mov eax, a1; call call_addr; } } void Scr_Shutdown(scriptInstance_t a1/*@*/, void* call_addr) { __asm { mov edi, a1; call call_addr; } } void Scr_ErrorInternal(scriptInstance_t a1/*@*/, void* call_addr) { __asm { mov eax, a1; call call_addr; } } void Scr_ClearOutParams(scriptInstance_t a1/*@*/, void* call_addr) { __asm { mov edi, a1; call call_addr; } } unsigned int GetDummyObject/*@*/(scriptInstance_t a1/*@*/, void* call_addr) { unsigned int answer; __asm { mov edi, a1; call call_addr; mov answer, eax; } return answer; } unsigned int GetDummyFieldValue/*@*/(scriptInstance_t a1/*@*/, void* call_addr) { unsigned int answer; __asm { mov eax, a1; call call_addr; mov answer, eax; } return answer; } void VM_CancelNotifyInternal(scriptInstance_t inst/*@*/, unsigned int notifyListOwnerId/*@*/, unsigned int startLocalId, unsigned int notifyListId, unsigned int notifyNameListId, unsigned int stringValue, void* call_addr) { __asm { push stringValue; push notifyNameListId; push notifyListId; push startLocalId; mov ecx, inst; mov eax, notifyListOwnerId; call call_addr; add esp, 0x10; } } void VM_CancelNotify(scriptInstance_t a1/*@*/, unsigned int a2, unsigned int a3, void* call_addr) { __asm { push a3; push a2; mov edi, a1; call call_addr; add esp, 0x8; } } VariableStackBuffer * VM_ArchiveStack/*@*/(scriptInstance_t inst/*@*/, void* call_addr) { VariableStackBuffer * answer; __asm { mov eax, inst; call call_addr; mov answer, eax; } return answer; } int Scr_AddLocalVars/*@*/(scriptInstance_t a1/*@*/, unsigned int a2/*@*/, void* call_addr) { int answer; __asm { mov eax, a1; mov edx, a2; call call_addr; mov answer, eax; } return answer; } void VM_TerminateStack(scriptInstance_t inst/*@*/, unsigned int endLocalId, unsigned int startLocalId, VariableStackBuffer * name, void* call_addr) { __asm { push name; push startLocalId; push endLocalId; mov esi, inst; call call_addr; add esp, 0xC; } } void VM_TrimStack(scriptInstance_t a1/*@*/, unsigned int parentId, VariableStackBuffer * a3, int fromEndon, void* call_addr) { __asm { push fromEndon; push a3; push parentId; mov eax, a1; call call_addr; add esp, 0xC; } } void Scr_TerminateRunningThread(scriptInstance_t a1/*@*/, unsigned int a2, void* call_addr) { __asm { push a2; mov edx, a1; call call_addr; add esp, 0x4; } } void Scr_TerminateWaitThread(scriptInstance_t a1/*@*/, unsigned int a2, unsigned int a3, void* call_addr) { __asm { push a3; push a2; mov eax, a1; call call_addr; add esp, 0x8; } } void Scr_CancelWaittill(scriptInstance_t inst/*@*/, unsigned int startLocalId/*@*/, void* call_addr) { __asm { mov ecx, inst; mov eax, startLocalId; call call_addr; } } void Scr_TerminateWaittillThread(scriptInstance_t a1/*@*/, unsigned int a2, unsigned int a3, void* call_addr) { __asm { push a3; push a2; mov eax, a1; call call_addr; add esp, 0x8; } } void Scr_TerminateThread(unsigned int a2/*@*/, scriptInstance_t a3/*@*/, void* call_addr) { __asm { mov edi, a2; mov esi, a3; call call_addr; } } void VM_Notify(scriptInstance_t inst/*@*/, int notifyListOwnerId, unsigned int stringValue, VariableValue * top, void* call_addr) { __asm { push top; push stringValue; push notifyListOwnerId; mov eax, inst; call call_addr; add esp, 0xC; } } void Scr_NotifyNum_Internal(scriptInstance_t inst/*@*/, int entNum, int entClass, unsigned int notifStr, int numParams, void* call_addr) { __asm { push numParams; push notifStr; push entClass; push entNum; mov eax, inst; call call_addr; add esp, 0x10; } } void Scr_CancelNotifyList(unsigned int notifyListOwnerId/*@*/, scriptInstance_t inst, void* call_addr) { __asm { push inst; mov eax, notifyListOwnerId; call call_addr; add esp, 0x4; } } void VM_TerminateTime(scriptInstance_t a1/*@*/, unsigned int parentId, void* call_addr) { __asm { push parentId; mov eax, a1; call call_addr; add esp, 0x4; } } void VM_Resume(scriptInstance_t inst/*@*/, unsigned int timeId, void* call_addr) { __asm { push timeId; mov eax, inst; call call_addr; add esp, 0x4; } } unsigned short Scr_ExecThread/*@*/(scriptInstance_t inst/*@*/, unsigned int handle, unsigned int paramCount, void* call_addr) { unsigned __int16 answer; __asm { push paramCount; push handle; mov edi, inst; call call_addr; mov answer, ax; add esp, 0x8; } return answer; } unsigned short Scr_ExecEntThreadNum/*@*/(scriptInstance_t inst/*@*/, int entNum, unsigned int handle, int numParams, unsigned int clientNum, void* call_addr) { unsigned __int16 answer; __asm { push clientNum; push numParams; push handle; push entNum; mov edi, inst; call call_addr; mov answer, ax; add esp, 0x10; } return answer; } void Scr_AddExecThread(scriptInstance_t a1/*@*/, unsigned int handle, void* call_addr) { __asm { push handle; mov edi, a1; call call_addr; add esp, 0x4; } } void VM_SetTime(scriptInstance_t a1/*@*/, void* call_addr) { __asm { mov eax, a1; call call_addr; } } void Scr_InitSystem(scriptInstance_t a1/*@*/, void* call_addr) { __asm { mov edi, a1; call call_addr; } } int Scr_GetInt/*@*/(scriptInstance_t inst/*@*/, unsigned int index/*@*/, void* call_addr) { int answer; __asm { mov eax, inst; mov ecx, index; call call_addr; mov answer, eax; } return answer; } scr_anim_s Scr_GetAnim/*@*/(unsigned int index/*@*/, XAnimTree_s * a2/*@*/, void* call_addr) { scr_anim_s answer; __asm { mov eax, index; mov ecx, a2; call call_addr; mov answer, eax; } return answer; } float Scr_GetFloat/*@*/(scriptInstance_t inst/*@*/, unsigned int index/*@*/, void* call_addr) { float answer; __asm { mov eax, inst; mov ecx, index; call call_addr; movss answer, xmm0; } return answer; } unsigned int Scr_GetConstString/*@*/(scriptInstance_t inst/*@*/, unsigned int index, void* call_addr) { unsigned int answer; __asm { push index; mov eax, inst; call call_addr; mov answer, eax; add esp, 0x4; } return answer; } unsigned int Scr_GetConstLowercaseString/*@*/(scriptInstance_t inst/*@*/, unsigned int index, void* call_addr) { unsigned int answer; __asm { push index; mov ecx, inst; call call_addr; mov answer, eax; add esp, 0x4; } return answer; } const char * Scr_GetString/*@*/(unsigned int index/*@*/, scriptInstance_t inst/*@*/, void* call_addr) { const char * answer; __asm { mov eax, index; mov esi, inst; call call_addr; mov answer, eax; } return answer; } unsigned int Scr_GetConstStringIncludeNull/*@*/(scriptInstance_t a1/*@*/, void* call_addr) { unsigned int answer; __asm { mov eax, a1; call call_addr; mov answer, eax; } return answer; } char * Scr_GetDebugString/*@*/(scriptInstance_t a1/*@*/, unsigned int a2/*@*/, void* call_addr) { char * answer; __asm { mov eax, a1; mov ecx, a2; call call_addr; mov answer, eax; } return answer; } unsigned int Scr_GetConstIString/*@*/(unsigned int index/*@*/, void* call_addr) { unsigned int answer; __asm { mov eax, index; call call_addr; mov answer, eax; } return answer; } void Scr_GetVector(scriptInstance_t inst/*@*/, float * value/*@*/, unsigned int index, void* call_addr) { __asm { push index; mov eax, inst; mov ecx, value; call call_addr; add esp, 0x4; } } scr_entref_t * Scr_GetEntityRef/*@*/(scriptInstance_t inst/*@*/, scr_entref_t * retstr, unsigned int index, void* call_addr) { scr_entref_t * answer; __asm { push index; push retstr; mov eax, inst; call call_addr; mov answer, eax; add esp, 0x8; } return answer; } VariableUnion Scr_GetObject/*@*/(scriptInstance_t a1/*@*/, void* call_addr) { VariableUnion answer; __asm { mov eax, a1; call call_addr; mov answer, eax; } return answer; } VariableType Scr_GetType/*@*/(scriptInstance_t inst/*@*/, unsigned int index/*@*/, void* call_addr) { VariableType answer; __asm { mov eax, inst; mov ecx, index; call call_addr; mov answer, eax; } return answer; } const char * Scr_GetTypeName/*@*/(scriptInstance_t a1/*@*/, void* call_addr) { char * answer; __asm { mov eax, a1; call call_addr; mov answer, eax; } return answer; } VariableType Scr_GetPointerType/*@*/(scriptInstance_t a1/*@*/, unsigned int a2/*@*/, void* call_addr) { VariableType answer; __asm { mov eax, a1; mov ecx, a2; call call_addr; mov answer, eax; } return answer; } void Scr_AddInt(scriptInstance_t inst/*@*/, int value, void* call_addr) { __asm { push value; mov eax, inst; call call_addr; add esp, 0x4; } } void Scr_AddFloat(scriptInstance_t inst/*@*/, float value, void* call_addr) { __asm { push value; mov eax, inst; call call_addr; add esp, 0x4; } } void Scr_AddUndefined(scriptInstance_t inst/*@*/, void* call_addr) { __asm { mov eax, inst; call call_addr; } } void Scr_AddObject(scriptInstance_t inst/*@*/, unsigned int entid/*@*/, void* call_addr) { __asm { mov eax, inst; mov esi, entid; call call_addr; } } void Scr_AddString(scriptInstance_t inst/*@*/, const char * string, void* call_addr) { __asm { push string; mov eax, inst; call call_addr; add esp, 0x4; } } void Scr_AddIString(char * string/*@*/, void* call_addr) { __asm { mov esi, string; call call_addr; } } void Scr_AddConstString(scriptInstance_t inst/*@*/, unsigned int id/*@*/, void* call_addr) { __asm { mov eax, inst; mov esi, id; call call_addr; } } void Scr_AddVector(scriptInstance_t inst/*@*/, float * value, void* call_addr) { __asm { push value; mov eax, inst; call call_addr; add esp, 0x4; } } void Scr_MakeArray(scriptInstance_t a1/*@*/, void* call_addr) { __asm { mov eax, a1; call call_addr; } } void Scr_AddArrayStringIndexed(unsigned int id/*@*/, scriptInstance_t inst/*@*/, void* call_addr) { __asm { mov ecx, id; mov edi, inst; call call_addr; } } void Scr_Error(const char * err/*@*/, scriptInstance_t inst/*@*/, int is_terminal, void* call_addr) { __asm { push is_terminal; mov ecx, err; mov edi, inst; call call_addr; add esp, 0x4; } } void Scr_TerminalError(scriptInstance_t a1/*@*/, const char * Source, void* call_addr) { __asm { push Source; mov eax, a1; call call_addr; add esp, 0x4; } } void Scr_ParamError(int a1/*@*/, scriptInstance_t a2/*@*/, const char * Source, void* call_addr) { __asm { push Source; mov eax, a1; mov ecx, a2; call call_addr; add esp, 0x4; } } void Scr_ObjectError(scriptInstance_t a1/*@*/, const char * a2/*@*/, void* call_addr) { __asm { mov eax, a1; mov ecx, a2; call call_addr; } } bool SetEntityFieldValue/*@*/(scriptInstance_t inst/*@*/, int offset_/*@*/, int entnum/*@*/, classNum_e classnum, int clientNum, VariableValue * value, void* call_addr) { bool answer; __asm { push value; push clientNum; push classnum; mov edi, inst; mov eax, offset_; mov ecx, entnum; call call_addr; mov answer, al; add esp, 0xC; } return answer; } void Scr_SetStructField(unsigned int a1/*@*/, unsigned int a2/*@*/, scriptInstance_t a3, void* call_addr) { __asm { push a3; mov eax, a1; mov ecx, a2; call call_addr; add esp, 0x4; } } void Scr_IncTime(scriptInstance_t a1/*@*/, void* call_addr) { __asm { mov eax, a1; call call_addr; } } void Scr_RunCurrentThreads(scriptInstance_t a1/*@*/, void* call_addr) { __asm { mov esi, a1; call call_addr; } } void Scr_ResetTimeout(scriptInstance_t a1/*@*/, void* call_addr) { __asm { mov eax, a1; call call_addr; } } void SetVariableFieldValue(scriptInstance_t inst, unsigned int id, VariableValue* 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) { 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) { 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) { if (game::gScrVarPub[inst].tempVariable) { game::FreeValue(game::gScrVarPub[inst].tempVariable, inst); game::gScrVarPub[inst].tempVariable = 0; } } void Scr_ShutdownVariables(scriptInstance_t 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) { 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) { 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) { 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) { 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) { 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) { 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) { 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) { 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) { 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) { // 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) { 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([[maybe_unused]]scriptInstance_t inst, unsigned int, VariableStackBuffer*, bool) { assert(game::gScrVarPub[inst].developer); return 0; } unsigned int Scr_GetSelf(scriptInstance_t inst, unsigned int 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) { 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) { 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) { 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) { 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) { 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 game::gScrVmPub[inst].top == game::gScrVmPub[inst].stack; } void SL_CheckExists(scriptInstance_t, unsigned int) { } const char* Scr_ReadCodePos(scriptInstance_t, const char** pos) { int ans; ans = *(int*)*pos; *pos += 4; return (const char*)ans; } unsigned int Scr_ReadUnsignedInt(scriptInstance_t, const char** pos) { unsigned int ans; ans = *(unsigned int*)*pos; *pos += 4; return ans; } unsigned short Scr_ReadUnsignedShort(scriptInstance_t, const char** pos) { unsigned short ans; ans = *(unsigned short*)*pos; *pos += 2; return ans; } unsigned char Scr_ReadUnsignedByte(scriptInstance_t, const char** pos) { unsigned char ans; ans = *(unsigned char*)*pos; *pos += 1; return ans; } float Scr_ReadFloat(scriptInstance_t, const char** pos) { float ans; ans = *(float*)*pos; *pos += 4; return ans; } const float* Scr_ReadVector(scriptInstance_t, const char** pos) { float* ans; ans = (float*)*pos; *pos += 12; return ans; } BOOL IsFieldObject(scriptInstance_t inst, unsigned int 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) { 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) { 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) { 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) { 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 game::gScrVmPub[inst].localVars[-pos]; } void Scr_EvalBoolNot(scriptInstance_t inst, VariableValue* value) { game::Scr_CastBool(inst, value); if (value->type == game::VAR_INTEGER) { value->u.intValue = value->u.intValue == 0; } } unsigned int GetInternalVariableIndex([[maybe_unused]]scriptInstance_t inst, unsigned int unsignedValue) { assert(game::IsValidArrayIndex(inst, unsignedValue)); return (unsignedValue + 0x800000) & 0xFFFFFF; } const char* Scr_ReadData(scriptInstance_t, const char** pos, unsigned int count) { const char* result; result = *pos; *pos += count; return result; } unsigned int Scr_GetNumParam(game::scriptInstance_t inst) { return game::gScrVmPub[inst].outparamcount; } }