// Copyright 2022 xensik. All rights reserved. // // Use of this source code is governed by a GNU GPLv3 license // that can be found in the LICENSE file. #include "stdafx.hpp" #include "s1.hpp" namespace xsk::gsc::s1 { auto opcode_size(std::uint8_t id) -> std::uint32_t { switch (opcode(id)) { case opcode::OP_Return: case opcode::OP_BoolNot: case opcode::OP_CastBool: case opcode::OP_inequality: case opcode::OP_GetThisthread: case opcode::OP_ClearLocalVariableFieldCached0: case opcode::OP_checkclearparams: case opcode::OP_CastFieldObject: case opcode::OP_End: case opcode::OP_size: case opcode::OP_EmptyArray: case opcode::OP_bit_and: case opcode::OP_less_equal: case opcode::OP_voidCodepos: case opcode::OP_ClearVariableField: case opcode::OP_divide: case opcode::OP_GetSelf: case opcode::OP_SetLocalVariableFieldCached0: case opcode::OP_plus: case opcode::OP_BoolComplement: case opcode::OP_ScriptMethodCallPointer: case opcode::OP_inc: case opcode::OP_clearparams: case opcode::OP_EvalLocalVariableRefCached0: case opcode::OP_ScriptFunctionCallPointer: case opcode::OP_endon: case opcode::OP_greater_equal: case opcode::OP_GetSelfObject: case opcode::OP_SetVariableField: case opcode::OP_EvalLocalArrayRefCached0: case opcode::OP_less: case opcode::OP_GetGameRef: case opcode::OP_waittillFrameEnd: case opcode::OP_waitFrame: case opcode::OP_SafeSetVariableFieldCached0: case opcode::OP_GetLevel: case opcode::OP_notify: case opcode::OP_DecTop: case opcode::OP_shift_left: case opcode::OP_greater: case opcode::OP_EvalLocalVariableCached0: case opcode::OP_EvalLocalVariableCached1: case opcode::OP_EvalLocalVariableCached2: case opcode::OP_EvalLocalVariableCached3: case opcode::OP_EvalLocalVariableCached4: case opcode::OP_EvalLocalVariableCached5: case opcode::OP_GetZero: case opcode::OP_wait: case opcode::OP_minus: case opcode::OP_EvalNewLocalVariableRefCached0: case opcode::OP_multiply: case opcode::OP_mod: case opcode::OP_GetGame: case opcode::OP_waittill: case opcode::OP_dec: case opcode::OP_PreScriptCall: case opcode::OP_GetAnim: case opcode::OP_GetUndefined: case opcode::OP_GetAnimObject: case opcode::OP_GetLevelObject: case opcode::OP_bit_ex_or: case opcode::OP_equality: case opcode::OP_ClearArray: case opcode::OP_EvalArrayRef: case opcode::OP_EvalArray: case opcode::OP_vector: case opcode::OP_bit_or: case opcode::OP_AddArray: case opcode::OP_waittillmatch2: case opcode::OP_shift_right: return 1; case opcode::OP_SetNewLocalVariableFieldCached0: case opcode::OP_EvalNewLocalArrayRefCached0: case opcode::OP_CallBuiltinPointer: case opcode::OP_SafeCreateVariableFieldCached: case opcode::OP_ClearLocalVariableFieldCached: case opcode::OP_ScriptMethodThreadCallPointer: case opcode::OP_SetLocalVariableFieldCached: case opcode::OP_RemoveLocalVariables: case opcode::OP_EvalLocalVariableRefCached: case opcode::OP_EvalLocalArrayRefCached: case opcode::OP_SafeSetVariableFieldCached: case opcode::OP_ScriptMethodChildThreadCallPointer: case opcode::OP_EvalLocalVariableCached: case opcode::OP_SafeSetWaittillVariableFieldCached: case opcode::OP_ScriptThreadCallPointer: case opcode::OP_CreateLocalVariable: case opcode::OP_EvalLocalVariableObjectCached: case opcode::OP_GetAnimTree: case opcode::OP_GetNegByte: case opcode::OP_CallBuiltinMethodPointer: case opcode::OP_EvalLocalArrayCached: case opcode::OP_GetByte: case opcode::OP_ScriptChildThreadCallPointer: case opcode::OP_waittillmatch: return 2; case opcode::OP_EvalSelfFieldVariable: case opcode::OP_SetLevelFieldVariableField: case opcode::OP_ClearFieldVariable: case opcode::OP_EvalFieldVariable: case opcode::OP_EvalFieldVariableRef: case opcode::OP_EvalLevelFieldVariable: case opcode::OP_SetAnimFieldVariableField: case opcode::OP_SetSelfFieldVariableField: case opcode::OP_EvalAnimFieldVariableRef: case opcode::OP_EvalLevelFieldVariableRef: case opcode::OP_EvalAnimFieldVariable: case opcode::OP_EvalSelfFieldVariableRef: case opcode::OP_CallBuiltin0: case opcode::OP_CallBuiltin1: case opcode::OP_CallBuiltin2: case opcode::OP_CallBuiltin3: case opcode::OP_CallBuiltin4: case opcode::OP_CallBuiltin5: case opcode::OP_JumpOnTrueExpr: case opcode::OP_GetUnsignedShort: case opcode::OP_JumpOnTrue: case opcode::OP_JumpOnFalseExpr: case opcode::OP_GetBuiltinFunction: case opcode::OP_jumpback: case opcode::OP_GetBuiltinMethod: case opcode::OP_GetNegUnsignedShort: case opcode::OP_CallBuiltinMethod0: case opcode::OP_CallBuiltinMethod1: case opcode::OP_CallBuiltinMethod2: case opcode::OP_CallBuiltinMethod3: case opcode::OP_CallBuiltinMethod4: case opcode::OP_CallBuiltinMethod5: case opcode::OP_JumpOnFalse: case opcode::OP_endswitch: return 3; case opcode::OP_CallBuiltin: case opcode::OP_ScriptLocalMethodCall: case opcode::OP_ScriptLocalFunctionCall2: case opcode::OP_ScriptLocalFunctionCall: case opcode::OP_GetLocalFunction: case opcode::OP_CallBuiltinMethod: case opcode::OP_ScriptFarFunctionCall2: case opcode::OP_ScriptFarFunctionCall: case opcode::OP_GetFarFunction: case opcode::OP_ScriptFarMethodCall: return 4; case opcode::OP_ScriptFarMethodThreadCall: case opcode::OP_ScriptFarChildThreadCall: case opcode::OP_ScriptFarMethodChildThreadCall: case opcode::OP_ScriptFarThreadCall: case opcode::OP_GetFloat: case opcode::OP_ScriptLocalThreadCall: case opcode::OP_switch: case opcode::OP_ScriptLocalMethodThreadCall: case opcode::OP_ScriptLocalMethodChildThreadCall: case opcode::OP_jump: case opcode::OP_ScriptLocalChildThreadCall: case opcode::OP_GetInteger: case opcode::OP_GetString: case opcode::OP_GetIString: return 5; case opcode::OP_GetAnimation: return 9; case opcode::OP_GetVector: return 13; default: throw error("couldn't resolve instruction size for " + std::to_string(id)); } } } // namespace xsk::gsc::s1