Path: blob/master/RSDKv5/RSDK/Scene/Legacy/v4/ScriptLegacyv4.cpp
1174 views
12RSDK::Legacy::v4::ObjectScript RSDK::Legacy::v4::objectScriptList[LEGACY_v4_OBJECT_COUNT];3RSDK::Legacy::v4::ScriptFunction RSDK::Legacy::v4::scriptFunctionList[LEGACY_v4_FUNCTION_COUNT];4#if LEGACY_RETRO_USE_COMPILER5int32 RSDK::Legacy::v4::scriptFunctionCount = 0;6#endif78int32 RSDK::Legacy::v4::scriptCode[LEGACY_v4_SCRIPTCODE_COUNT];9int32 RSDK::Legacy::v4::jumpTable[LEGACY_v4_JUMPTABLE_COUNT];10int32 RSDK::Legacy::v4::jumpTableStack[LEGACY_v4_JUMPSTACK_COUNT];11int32 RSDK::Legacy::v4::functionStack[LEGACY_v4_FUNCSTACK_COUNT];12int32 RSDK::Legacy::v4::foreachStack[LEGACY_v4_FORSTACK_COUNT];1314int32 RSDK::Legacy::v4::scriptCodePos = 0;15int32 RSDK::Legacy::v4::scriptCodeOffset = 0;16int32 RSDK::Legacy::v4::jumpTablePos = 0;17int32 RSDK::Legacy::v4::jumpTableOffset = 0;18int32 RSDK::Legacy::v4::jumpTableStackPos = 0;19int32 RSDK::Legacy::v4::functionStackPos = 0;20int32 RSDK::Legacy::v4::foreachStackPos = 0;2122RSDK::Legacy::v4::ScriptEngine RSDK::Legacy::v4::scriptEng = Legacy::v4::ScriptEngine();23char RSDK::Legacy::v4::scriptText[0x4000];2425#if LEGACY_RETRO_USE_COMPILER26#define LEGACY_v4_COMMON_SCRIPT_VAR_COUNT (34)2728#define LEGACY_v4_SCRIPT_VAR_COUNT (LEGACY_v4_COMMON_SCRIPT_VAR_COUNT + 0x1DF)29int32 RSDK::Legacy::v4::lineID = 0;3031namespace RSDK32{33namespace Legacy34{35namespace v436{37const char *scriptFile = "";3839enum ScriptVarType { VAR_ALIAS, VAR_STATICVALUE, VAR_TABLE };40enum ScriptVarAccessModifier { ACCESS_NONE, ACCESS_PUBLIC, ACCESS_PRIVATE };4142struct ScriptVariableInfo {43ScriptVariableInfo()44{45type = VAR_ALIAS;46access = ACCESS_NONE;47name[0] = 0;48value[0] = 0;49}5051ScriptVariableInfo(uint8 type, uint8 access, const char *name, const char *value)52{53this->type = type;54this->access = access;55strcpy(this->name, name);56strcpy(this->value, value);57}5859uint8 type;60uint8 access;61char name[0x20];62char value[0x20];63};6465} // namespace v466} // namespace Legacy67} // namespace RSDK6869#endif7071namespace RSDK72{73namespace Legacy74{75namespace v476{7778struct FunctionInfo {79FunctionInfo()80{81name[0] = 0;82opcodeSize = 0;83}84FunctionInfo(const char *functionName, int32 opSize)85{86strcpy(name, functionName);87opcodeSize = opSize;88}8990char name[0x30];91int32 opcodeSize;92};9394#if LEGACY_RETRO_USE_COMPILER95const char variableNames[][0x20] = {96// Internal Script Values97"temp0",98"temp1",99"temp2",100"temp3",101"temp4",102"temp5",103"temp6",104"temp7",105"checkResult",106"arrayPos0",107"arrayPos1",108"arrayPos2",109"arrayPos3",110"arrayPos4",111"arrayPos5",112"arrayPos6",113"arrayPos7",114"global",115"local",116117// Object Properties118"object.entityPos",119"object.groupID",120"object.type",121"object.propertyValue",122"object.xpos",123"object.ypos",124"object.ixpos",125"object.iypos",126"object.xvel",127"object.yvel",128"object.speed",129"object.state",130"object.rotation",131"object.scale",132"object.priority",133"object.drawOrder",134"object.direction",135"object.inkEffect",136"object.alpha",137"object.frame",138"object.animation",139"object.prevAnimation",140"object.animationSpeed",141"object.animationTimer",142"object.angle",143"object.lookPosX",144"object.lookPosY",145"object.collisionMode",146"object.collisionPlane",147"object.controlMode",148"object.controlLock",149"object.pushing",150"object.visible",151"object.tileCollisions",152"object.interaction",153"object.gravity",154"object.up",155"object.down",156"object.left",157"object.right",158"object.jumpPress",159"object.jumpHold",160"object.scrollTracking",161"object.floorSensorL",162"object.floorSensorC",163"object.floorSensorR",164"object.floorSensorLC",165"object.floorSensorRC",166"object.collisionLeft",167"object.collisionTop",168"object.collisionRight",169"object.collisionBottom",170"object.outOfBounds",171"object.spriteSheet",172173// Object Values174"object.value0",175"object.value1",176"object.value2",177"object.value3",178"object.value4",179"object.value5",180"object.value6",181"object.value7",182"object.value8",183"object.value9",184"object.value10",185"object.value11",186"object.value12",187"object.value13",188"object.value14",189"object.value15",190"object.value16",191"object.value17",192"object.value18",193"object.value19",194"object.value20",195"object.value21",196"object.value22",197"object.value23",198"object.value24",199"object.value25",200"object.value26",201"object.value27",202"object.value28",203"object.value29",204"object.value30",205"object.value31",206"object.value32",207"object.value33",208"object.value34",209"object.value35",210"object.value36",211"object.value37",212"object.value38",213"object.value39",214"object.value40",215"object.value41",216"object.value42",217"object.value43",218"object.value44",219"object.value45",220"object.value46",221"object.value47",222223// Stage Properties224"stage.state",225"stage.activeList",226"stage.listPos",227"stage.timeEnabled",228"stage.milliSeconds",229"stage.seconds",230"stage.minutes",231"stage.actNum",232"stage.pauseEnabled",233"stage.listSize",234"stage.newXBoundary1",235"stage.newXBoundary2",236"stage.newYBoundary1",237"stage.newYBoundary2",238"stage.curXBoundary1",239"stage.curXBoundary2",240"stage.curYBoundary1",241"stage.curYBoundary2",242"stage.deformationData0",243"stage.deformationData1",244"stage.deformationData2",245"stage.deformationData3",246"stage.waterLevel",247"stage.activeLayer",248"stage.midPoint",249"stage.playerListPos",250"stage.debugMode",251"stage.entityPos",252253// Screen Properties254"screen.cameraEnabled",255"screen.cameraTarget",256"screen.cameraStyle",257"screen.cameraX",258"screen.cameraY",259"screen.drawListSize",260"screen.xcenter",261"screen.ycenter",262"screen.xsize",263"screen.ysize",264"screen.xoffset",265"screen.yoffset",266"screen.shakeX",267"screen.shakeY",268"screen.adjustCameraY",269270"touchscreen.down",271"touchscreen.xpos",272"touchscreen.ypos",273274// Sound Properties275"music.volume",276"music.currentTrack",277"music.position",278279// Input Properties280"keyDown.up",281"keyDown.down",282"keyDown.left",283"keyDown.right",284"keyDown.buttonA",285"keyDown.buttonB",286"keyDown.buttonC",287"keyDown.buttonX",288"keyDown.buttonY",289"keyDown.buttonZ",290"keyDown.buttonL",291"keyDown.buttonR",292"keyDown.start",293"keyDown.select",294"keyPress.up",295"keyPress.down",296"keyPress.left",297"keyPress.right",298"keyPress.buttonA",299"keyPress.buttonB",300"keyPress.buttonC",301"keyPress.buttonX",302"keyPress.buttonY",303"keyPress.buttonZ",304"keyPress.buttonL",305"keyPress.buttonR",306"keyPress.start",307"keyPress.select",308309// Menu Properties310"menu1.selection",311"menu2.selection",312313// Tile Layer Properties314"tileLayer.xsize",315"tileLayer.ysize",316"tileLayer.type",317"tileLayer.angle",318"tileLayer.xpos",319"tileLayer.ypos",320"tileLayer.zpos",321"tileLayer.parallaxFactor",322"tileLayer.scrollSpeed",323"tileLayer.scrollPos",324"tileLayer.deformationOffset",325"tileLayer.deformationOffsetW",326"hParallax.parallaxFactor",327"hParallax.scrollSpeed",328"hParallax.scrollPos",329"vParallax.parallaxFactor",330"vParallax.scrollSpeed",331"vParallax.scrollPos",332333// 3D Scene Properties334"scene3D.vertexCount",335"scene3D.faceCount",336"scene3D.projectionX",337"scene3D.projectionY",338"scene3D.fogColor",339"scene3D.fogStrength",340341"vertexBuffer.x",342"vertexBuffer.y",343"vertexBuffer.z",344"vertexBuffer.u",345"vertexBuffer.v",346347"faceBuffer.a",348"faceBuffer.b",349"faceBuffer.c",350"faceBuffer.d",351"faceBuffer.flag",352"faceBuffer.color",353354"saveRAM",355"engine.state",356"engine.language",357"engine.onlineActive",358"engine.sfxVolume",359"engine.bgmVolume",360"engine.trialMode",361"engine.deviceType",362363// Extras364"screen.currentID",365"camera.enabled",366"camera.target",367"camera.style",368"camera.xpos",369"camera.ypos",370"camera.adjustY",371372// Haptics373#if LEGACY_RETRO_USE_HAPTICS374"engine.hapticsEnabled",375#endif376};377#endif378379const FunctionInfo functions[] = {380FunctionInfo("End", 0), // End of Script381FunctionInfo("Equal", 2), // Equal382FunctionInfo("Add", 2), // Add383FunctionInfo("Sub", 2), // Subtract384FunctionInfo("Inc", 1), // Increment385FunctionInfo("Dec", 1), // Decrement386FunctionInfo("Mul", 2), // Multiply387FunctionInfo("Div", 2), // Divide388FunctionInfo("ShR", 2), // Bit Shift Right389FunctionInfo("ShL", 2), // Bit Shift Left390FunctionInfo("And", 2), // Bitwise And391FunctionInfo("Or", 2), // Bitwise Or392FunctionInfo("Xor", 2), // Bitwise Xor393FunctionInfo("Mod", 2), // Mod394FunctionInfo("FlipSign", 1), // Flips the Sign of the value395396FunctionInfo("CheckEqual", 2), // compare a=b, return result in CheckResult Variable397FunctionInfo("CheckGreater", 2), // compare a>b, return result in CheckResult Variable398FunctionInfo("CheckLower", 2), // compare a<b, return result in CheckResult Variable399FunctionInfo("CheckNotEqual", 2), // compare a!=b, return result in CheckResult Variable400401FunctionInfo("IfEqual", 3), // compare a=b, jump if condition met402FunctionInfo("IfGreater", 3), // compare a>b, jump if condition met403FunctionInfo("IfGreaterOrEqual", 3), // compare a>=b, jump if condition met404FunctionInfo("IfLower", 3), // compare a<b, jump if condition met405FunctionInfo("IfLowerOrEqual", 3), // compare a<=b, jump if condition met406FunctionInfo("IfNotEqual", 3), // compare a!=b, jump if condition met407FunctionInfo("else", 0), // The else for an if statement408FunctionInfo("endif", 0), // The end if409410FunctionInfo("WEqual", 3), // compare a=b, loop if condition met411FunctionInfo("WGreater", 3), // compare a>b, loop if condition met412FunctionInfo("WGreaterOrEqual", 3), // compare a>=b, loop if condition met413FunctionInfo("WLower", 3), // compare a<b, loop if condition met414FunctionInfo("WLowerOrEqual", 3), // compare a<=b, loop if condition met415FunctionInfo("WNotEqual", 3), // compare a!=b, loop if condition met416FunctionInfo("loop", 0), // While Loop marker417418FunctionInfo("ForEachActive", 3), // foreach loop, iterates through object group lists only if they are active and interaction is true419FunctionInfo("ForEachAll", 3), // foreach loop, iterates through objects matching type420FunctionInfo("next", 0), // foreach loop, next marker421422FunctionInfo("switch", 2), // Switch Statement423FunctionInfo("break", 0), // break424FunctionInfo("endswitch", 0), // endswitch425426// Math Functions427FunctionInfo("Rand", 2),428FunctionInfo("Sin", 2),429FunctionInfo("Cos", 2),430FunctionInfo("Sin256", 2),431FunctionInfo("Cos256", 2),432FunctionInfo("ATan2", 3),433FunctionInfo("Interpolate", 4),434FunctionInfo("InterpolateXY", 7),435436// Graphics Functions437FunctionInfo("LoadSpriteSheet", 1),438FunctionInfo("RemoveSpriteSheet", 1),439FunctionInfo("DrawSprite", 1),440FunctionInfo("DrawSpriteXY", 3),441FunctionInfo("DrawSpriteScreenXY", 3),442FunctionInfo("DrawTintRect", 4),443FunctionInfo("DrawNumbers", 7),444FunctionInfo("DrawActName", 7),445FunctionInfo("DrawMenu", 3),446FunctionInfo("SpriteFrame", 6),447FunctionInfo("EditFrame", 7),448FunctionInfo("LoadPalette", 5),449FunctionInfo("RotatePalette", 4),450FunctionInfo("SetScreenFade", 4),451FunctionInfo("SetActivePalette", 3),452FunctionInfo("SetPaletteFade", 6),453FunctionInfo("SetPaletteEntry", 3),454FunctionInfo("GetPaletteEntry", 3),455FunctionInfo("CopyPalette", 5),456FunctionInfo("ClearScreen", 1),457FunctionInfo("DrawSpriteFX", 4),458FunctionInfo("DrawSpriteScreenFX", 4),459460// More Useful Stuff461FunctionInfo("LoadAnimation", 1),462FunctionInfo("SetupMenu", 4),463FunctionInfo("AddMenuEntry", 3),464FunctionInfo("EditMenuEntry", 4),465FunctionInfo("LoadStage", 0),466FunctionInfo("DrawRect", 8),467FunctionInfo("ResetObjectEntity", 5),468FunctionInfo("BoxCollisionTest", 11),469FunctionInfo("CreateTempObject", 4),470471// Player and Animation Functions472FunctionInfo("ProcessObjectMovement", 0),473FunctionInfo("ProcessObjectControl", 0),474FunctionInfo("ProcessAnimation", 0),475FunctionInfo("DrawObjectAnimation", 0),476477// Music478FunctionInfo("SetMusicTrack", 3),479FunctionInfo("PlayMusic", 1),480FunctionInfo("StopMusic", 0),481FunctionInfo("PauseMusic", 0),482FunctionInfo("ResumeMusic", 0),483FunctionInfo("SwapMusicTrack", 4),484485// Sound FX486FunctionInfo("PlaySfx", 2),487FunctionInfo("StopSfx", 1),488FunctionInfo("SetSfxAttributes", 3),489490// More Collision Stuff491FunctionInfo("ObjectTileCollision", 4),492FunctionInfo("ObjectTileGrip", 4),493494// Bitwise Not495FunctionInfo("Not", 1),496497// 3D Stuff498FunctionInfo("Draw3DScene", 0),499FunctionInfo("SetIdentityMatrix", 1),500FunctionInfo("MatrixMultiply", 2),501FunctionInfo("MatrixTranslateXYZ", 4),502FunctionInfo("MatrixScaleXYZ", 4),503FunctionInfo("MatrixRotateX", 2),504FunctionInfo("MatrixRotateY", 2),505FunctionInfo("MatrixRotateZ", 2),506FunctionInfo("MatrixRotateXYZ", 4),507FunctionInfo("MatrixInverse", 1),508FunctionInfo("TransformVertices", 3),509510FunctionInfo("CallFunction", 1),511FunctionInfo("return", 0),512513FunctionInfo("SetLayerDeformation", 6),514FunctionInfo("CheckTouchRect", 4),515FunctionInfo("GetTileLayerEntry", 4),516FunctionInfo("SetTileLayerEntry", 4),517518FunctionInfo("GetBit", 3),519FunctionInfo("SetBit", 3),520521FunctionInfo("ClearDrawList", 1),522FunctionInfo("AddDrawListEntityRef", 2),523FunctionInfo("GetDrawListEntityRef", 3),524FunctionInfo("SetDrawListEntityRef", 3),525526FunctionInfo("Get16x16TileInfo", 4),527FunctionInfo("Set16x16TileInfo", 4),528FunctionInfo("Copy16x16Tile", 2),529FunctionInfo("GetAnimationByName", 2),530FunctionInfo("ReadSaveRAM", 0),531FunctionInfo("WriteSaveRAM", 0),532533FunctionInfo("LoadTextFile", 2),534FunctionInfo("GetTextInfo", 5),535FunctionInfo("GetVersionNumber", 2),536537FunctionInfo("GetTableValue", 3),538FunctionInfo("SetTableValue", 3),539540FunctionInfo("CheckCurrentStageFolder", 1),541FunctionInfo("Abs", 1),542543FunctionInfo("CallNativeFunction", 1),544FunctionInfo("CallNativeFunction2", 3),545FunctionInfo("CallNativeFunction4", 5),546547FunctionInfo("SetObjectRange", 1),548FunctionInfo("GetObjectValue", 3),549FunctionInfo("SetObjectValue", 3),550FunctionInfo("CopyObject", 3),551FunctionInfo("Print", 3),552553// Extras554FunctionInfo("CheckCameraProximity", 4),555FunctionInfo("SetScreenCount", 1),556FunctionInfo("SetScreenVertices", 5),557FunctionInfo("GetInputDeviceID", 2),558FunctionInfo("GetFilteredInputDeviceID", 4),559FunctionInfo("GetInputDeviceType", 2),560FunctionInfo("IsInputDeviceAssigned", 1),561FunctionInfo("AssignInputSlotToDevice", 2),562FunctionInfo("IsInputSlotAssigned", 1),563FunctionInfo("ResetInputSlotAssignments", 0),564};565566#if LEGACY_RETRO_USE_COMPILER567568int32 scriptValueListCount = 0;569// clang-format off570ScriptVariableInfo scriptValueList[LEGACY_v4_SCRIPT_VAR_COUNT] = {571// ORIGINAL ALIASES572// These are in the official v4573ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "true", "1"),574ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "false", "0"),575ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "FX_SCALE", "0"),576ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "FX_ROTATE", "1"),577ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "FX_ROTOZOOM", "2"),578ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "FX_INK", "3"),579ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "PRESENTATION_STAGE", "0"),580ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "REGULAR_STAGE", "1"),581ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "SPECIAL_STAGE", "2"),582ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "BONUS_STAGE", "3"),583ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "MENU_1", "0"),584ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "MENU_2", "1"),585ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "C_TOUCH", "0"),586ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "C_SOLID", "1"),587ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "C_SOLID2", "2"),588ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "C_PLATFORM", "3"),589ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "C_BOX", "65536"),590ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "MAT_WORLD", "0"),591ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "MAT_VIEW", "1"),592ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "MAT_TEMP", "2"),593ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "FX_FLIP", "5"),594ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "FACING_LEFT", "1"),595ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "FACING_RIGHT", "0"),596ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "STAGE_2P_MODE", "4"),597ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "STAGE_FROZEN", "3"),598ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "STAGE_PAUSED", "2"),599ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "STAGE_RUNNING", "1"),600ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "RESET_GAME", "2"),601ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "STANDARD", "0"),602ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "MOBILE", "1"),603ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "DEVICE_XBOX", "2"),604ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "DEVICE_PSN", "3"),605ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "DEVICE_IOS", "4"),606ScriptVariableInfo(VAR_ALIAS, ACCESS_PUBLIC, "DEVICE_ANDROID", "5"),607};608// clang-format on609610const char scriptEvaluationTokens[][0x4] = { "=", "+=", "-=", "++", "--", "*=", "/=", ">>=", "<<=", "&=",611"|=", "^=", "%=", "==", ">", ">=", "<", "<=", "!=" };612613enum ScriptReadModes { READMODE_NORMAL = 0, READMODE_STRING = 1, READMODE_COMMENTLINE = 2, READMODE_ENDLINE = 3, READMODE_EOF = 4 };614enum ScriptParseModes {615PARSEMODE_SCOPELESS = 0,616PARSEMODE_PLATFORMSKIP = 1,617PARSEMODE_FUNCTION = 2,618PARSEMODE_SWITCHREAD = 3,619PARSEMODE_TABLEREAD = 4,620PARSEMODE_ERROR = 0xFF621};622#endif623624enum ScriptVarTypes { SCRIPTVAR_VAR = 1, SCRIPTVAR_INTCONST = 2, SCRIPTVAR_STRCONST = 3 };625enum ScriptVarArrTypes { VARARR_NONE = 0, VARARR_ARRAY = 1, VARARR_ENTNOPLUS1 = 2, VARARR_ENTNOMINUS1 = 3 };626627enum ScrVar {628VAR_TEMP0,629VAR_TEMP1,630VAR_TEMP2,631VAR_TEMP3,632VAR_TEMP4,633VAR_TEMP5,634VAR_TEMP6,635VAR_TEMP7,636VAR_CHECKRESULT,637VAR_ARRAYPOS0,638VAR_ARRAYPOS1,639VAR_ARRAYPOS2,640VAR_ARRAYPOS3,641VAR_ARRAYPOS4,642VAR_ARRAYPOS5,643VAR_ARRAYPOS6,644VAR_ARRAYPOS7,645VAR_GLOBAL,646VAR_LOCAL,647VAR_OBJECTENTITYPOS,648VAR_OBJECTGROUPID,649VAR_OBJECTTYPE,650VAR_OBJECTPROPERTYVALUE,651VAR_OBJECTXPOS,652VAR_OBJECTYPOS,653VAR_OBJECTIXPOS,654VAR_OBJECTIYPOS,655VAR_OBJECTXVEL,656VAR_OBJECTYVEL,657VAR_OBJECTSPEED,658VAR_OBJECTSTATE,659VAR_OBJECTROTATION,660VAR_OBJECTSCALE,661VAR_OBJECTPRIORITY,662VAR_OBJECTDRAWORDER,663VAR_OBJECTDIRECTION,664VAR_OBJECTINKEFFECT,665VAR_OBJECTALPHA,666VAR_OBJECTFRAME,667VAR_OBJECTANIMATION,668VAR_OBJECTPREVANIMATION,669VAR_OBJECTANIMATIONSPEED,670VAR_OBJECTANIMATIONTIMER,671VAR_OBJECTANGLE,672VAR_OBJECTLOOKPOSX,673VAR_OBJECTLOOKPOSY,674VAR_OBJECTCOLLISIONMODE,675VAR_OBJECTCOLLISIONPLANE,676VAR_OBJECTCONTROLMODE,677VAR_OBJECTCONTROLLOCK,678VAR_OBJECTPUSHING,679VAR_OBJECTVISIBLE,680VAR_OBJECTTILECOLLISIONS,681VAR_OBJECTINTERACTION,682VAR_OBJECTGRAVITY,683VAR_OBJECTUP,684VAR_OBJECTDOWN,685VAR_OBJECTLEFT,686VAR_OBJECTRIGHT,687VAR_OBJECTJUMPPRESS,688VAR_OBJECTJUMPHOLD,689VAR_OBJECTSCROLLTRACKING,690VAR_OBJECTFLOORSENSORL,691VAR_OBJECTFLOORSENSORC,692VAR_OBJECTFLOORSENSORR,693VAR_OBJECTFLOORSENSORLC,694VAR_OBJECTFLOORSENSORRC,695VAR_OBJECTCOLLISIONLEFT,696VAR_OBJECTCOLLISIONTOP,697VAR_OBJECTCOLLISIONRIGHT,698VAR_OBJECTCOLLISIONBOTTOM,699VAR_OBJECTOUTOFBOUNDS,700VAR_OBJECTSPRITESHEET,701VAR_OBJECTVALUE0,702VAR_OBJECTVALUE1,703VAR_OBJECTVALUE2,704VAR_OBJECTVALUE3,705VAR_OBJECTVALUE4,706VAR_OBJECTVALUE5,707VAR_OBJECTVALUE6,708VAR_OBJECTVALUE7,709VAR_OBJECTVALUE8,710VAR_OBJECTVALUE9,711VAR_OBJECTVALUE10,712VAR_OBJECTVALUE11,713VAR_OBJECTVALUE12,714VAR_OBJECTVALUE13,715VAR_OBJECTVALUE14,716VAR_OBJECTVALUE15,717VAR_OBJECTVALUE16,718VAR_OBJECTVALUE17,719VAR_OBJECTVALUE18,720VAR_OBJECTVALUE19,721VAR_OBJECTVALUE20,722VAR_OBJECTVALUE21,723VAR_OBJECTVALUE22,724VAR_OBJECTVALUE23,725VAR_OBJECTVALUE24,726VAR_OBJECTVALUE25,727VAR_OBJECTVALUE26,728VAR_OBJECTVALUE27,729VAR_OBJECTVALUE28,730VAR_OBJECTVALUE29,731VAR_OBJECTVALUE30,732VAR_OBJECTVALUE31,733VAR_OBJECTVALUE32,734VAR_OBJECTVALUE33,735VAR_OBJECTVALUE34,736VAR_OBJECTVALUE35,737VAR_OBJECTVALUE36,738VAR_OBJECTVALUE37,739VAR_OBJECTVALUE38,740VAR_OBJECTVALUE39,741VAR_OBJECTVALUE40,742VAR_OBJECTVALUE41,743VAR_OBJECTVALUE42,744VAR_OBJECTVALUE43,745VAR_OBJECTVALUE44,746VAR_OBJECTVALUE45,747VAR_OBJECTVALUE46,748VAR_OBJECTVALUE47,749VAR_STAGESTATE,750VAR_STAGEACTIVELIST,751VAR_STAGELISTPOS,752VAR_STAGETIMEENABLED,753VAR_STAGEMILLISECONDS,754VAR_STAGESECONDS,755VAR_STAGEMINUTES,756VAR_STAGEACTNUM,757VAR_STAGEPAUSEENABLED,758VAR_STAGELISTSIZE,759VAR_STAGENEWXBOUNDARY1,760VAR_STAGENEWXBOUNDARY2,761VAR_STAGENEWYBOUNDARY1,762VAR_STAGENEWYBOUNDARY2,763VAR_STAGECURXBOUNDARY1,764VAR_STAGECURXBOUNDARY2,765VAR_STAGECURYBOUNDARY1,766VAR_STAGECURYBOUNDARY2,767VAR_STAGEDEFORMATIONDATA0,768VAR_STAGEDEFORMATIONDATA1,769VAR_STAGEDEFORMATIONDATA2,770VAR_STAGEDEFORMATIONDATA3,771VAR_STAGEWATERLEVEL,772VAR_STAGEACTIVELAYER,773VAR_STAGEMIDPOINT,774VAR_STAGEPLAYERLISTPOS,775VAR_STAGEDEBUGMODE,776VAR_STAGEENTITYPOS,777VAR_SCREENCAMERAENABLED,778VAR_SCREENCAMERATARGET,779VAR_SCREENCAMERASTYLE,780VAR_SCREENCAMERAX,781VAR_SCREENCAMERAY,782VAR_SCREENDRAWLISTSIZE,783VAR_SCREENXCENTER,784VAR_SCREENYCENTER,785VAR_SCREENXSIZE,786VAR_SCREENYSIZE,787VAR_SCREENXOFFSET,788VAR_SCREENYOFFSET,789VAR_SCREENSHAKEX,790VAR_SCREENSHAKEY,791VAR_SCREENADJUSTCAMERAY,792VAR_TOUCHSCREENDOWN,793VAR_TOUCHSCREENXPOS,794VAR_TOUCHSCREENYPOS,795VAR_MUSICVOLUME,796VAR_MUSICCURRENTTRACK,797VAR_MUSICPOSITION,798VAR_KEYDOWNUP,799VAR_KEYDOWNDOWN,800VAR_KEYDOWNLEFT,801VAR_KEYDOWNRIGHT,802VAR_KEYDOWNBUTTONA,803VAR_KEYDOWNBUTTONB,804VAR_KEYDOWNBUTTONC,805VAR_KEYDOWNBUTTONX,806VAR_KEYDOWNBUTTONY,807VAR_KEYDOWNBUTTONZ,808VAR_KEYDOWNBUTTONL,809VAR_KEYDOWNBUTTONR,810VAR_KEYDOWNSTART,811VAR_KEYDOWNSELECT,812VAR_KEYPRESSUP,813VAR_KEYPRESSDOWN,814VAR_KEYPRESSLEFT,815VAR_KEYPRESSRIGHT,816VAR_KEYPRESSBUTTONA,817VAR_KEYPRESSBUTTONB,818VAR_KEYPRESSBUTTONC,819VAR_KEYPRESSBUTTONX,820VAR_KEYPRESSBUTTONY,821VAR_KEYPRESSBUTTONZ,822VAR_KEYPRESSBUTTONL,823VAR_KEYPRESSBUTTONR,824VAR_KEYPRESSSTART,825VAR_KEYPRESSSELECT,826VAR_MENU1SELECTION,827VAR_MENU2SELECTION,828VAR_TILELAYERXSIZE,829VAR_TILELAYERYSIZE,830VAR_TILELAYERTYPE,831VAR_TILELAYERANGLE,832VAR_TILELAYERXPOS,833VAR_TILELAYERYPOS,834VAR_TILELAYERZPOS,835VAR_TILELAYERPARALLAXFACTOR,836VAR_TILELAYERSCROLLSPEED,837VAR_TILELAYERSCROLLPOS,838VAR_TILELAYERDEFORMATIONOFFSET,839VAR_TILELAYERDEFORMATIONOFFSETW,840VAR_HPARALLAXPARALLAXFACTOR,841VAR_HPARALLAXSCROLLSPEED,842VAR_HPARALLAXSCROLLPOS,843VAR_VPARALLAXPARALLAXFACTOR,844VAR_VPARALLAXSCROLLSPEED,845VAR_VPARALLAXSCROLLPOS,846VAR_SCENE3DVERTEXCOUNT,847VAR_SCENE3DFACECOUNT,848VAR_SCENE3DPROJECTIONX,849VAR_SCENE3DPROJECTIONY,850VAR_SCENE3DFOGCOLOR,851VAR_SCENE3DFOGSTRENGTH,852VAR_VERTEXBUFFERX,853VAR_VERTEXBUFFERY,854VAR_VERTEXBUFFERZ,855VAR_VERTEXBUFFERU,856VAR_VERTEXBUFFERV,857VAR_FACEBUFFERA,858VAR_FACEBUFFERB,859VAR_FACEBUFFERC,860VAR_FACEBUFFERD,861VAR_FACEBUFFERFLAG,862VAR_FACEBUFFERCOLOR,863VAR_SAVERAM,864VAR_ENGINESTATE,865VAR_ENGINELANGUAGE,866VAR_ENGINEONLINEACTIVE,867VAR_ENGINESFXVOLUME,868VAR_ENGINEBGMVOLUME,869VAR_ENGINETRIALMODE,870VAR_ENGINEDEVICETYPE,871872// Extras873VAR_SCREENCURRENTID,874VAR_CAMERAENABLED,875VAR_CAMERATARGET,876VAR_CAMERASTYLE,877VAR_CAMERAXPOS,878VAR_CAMERAYPOS,879VAR_CAMERAADJUSTY,880881#if LEGACY_RETRO_USE_HAPTICS882VAR_HAPTICSENABLED,883#endif884VAR_MAX_CNT885};886887enum ScrFunc {888FUNC_END,889FUNC_EQUAL,890FUNC_ADD,891FUNC_SUB,892FUNC_INC,893FUNC_DEC,894FUNC_MUL,895FUNC_DIV,896FUNC_SHR,897FUNC_SHL,898FUNC_AND,899FUNC_OR,900FUNC_XOR,901FUNC_MOD,902FUNC_FLIPSIGN,903FUNC_CHECKEQUAL,904FUNC_CHECKGREATER,905FUNC_CHECKLOWER,906FUNC_CHECKNOTEQUAL,907FUNC_IFEQUAL,908FUNC_IFGREATER,909FUNC_IFGREATEROREQUAL,910FUNC_IFLOWER,911FUNC_IFLOWEROREQUAL,912FUNC_IFNOTEQUAL,913FUNC_ELSE,914FUNC_ENDIF,915FUNC_WEQUAL,916FUNC_WGREATER,917FUNC_WGREATEROREQUAL,918FUNC_WLOWER,919FUNC_WLOWEROREQUAL,920FUNC_WNOTEQUAL,921FUNC_LOOP,922FUNC_FOREACHACTIVE,923FUNC_FOREACHALL,924FUNC_NEXT,925FUNC_SWITCH,926FUNC_BREAK,927FUNC_ENDSWITCH,928FUNC_RAND,929FUNC_SIN,930FUNC_COS,931FUNC_SIN256,932FUNC_COS256,933FUNC_ATAN2,934FUNC_INTERPOLATE,935FUNC_INTERPOLATEXY,936FUNC_LOADSPRITESHEET,937FUNC_REMOVESPRITESHEET,938FUNC_DRAWSPRITE,939FUNC_DRAWSPRITEXY,940FUNC_DRAWSPRITESCREENXY,941FUNC_DRAWTINTRECT,942FUNC_DRAWNUMBERS,943FUNC_DRAWACTNAME,944FUNC_DRAWMENU,945FUNC_SPRITEFRAME,946FUNC_EDITFRAME,947FUNC_LOADPALETTE,948FUNC_ROTATEPALETTE,949FUNC_SETSCREENFADE,950FUNC_SETACTIVEPALETTE,951FUNC_SETPALETTEFADE,952FUNC_SETPALETTEENTRY,953FUNC_GETPALETTEENTRY,954FUNC_COPYPALETTE,955FUNC_CLEARSCREEN,956FUNC_DRAWSPRITEFX,957FUNC_DRAWSPRITESCREENFX,958FUNC_LOADANIMATION,959FUNC_SETUPMENU,960FUNC_ADDMENUENTRY,961FUNC_EDITMENUENTRY,962FUNC_LOADSTAGE,963FUNC_DRAWRECT,964FUNC_RESETOBJECTENTITY,965FUNC_BOXCOLLISIONTEST,966FUNC_CREATETEMPOBJECT,967FUNC_PROCESSOBJECTMOVEMENT,968FUNC_PROCESSOBJECTCONTROL,969FUNC_PROCESSANIMATION,970FUNC_DRAWOBJECTANIMATION,971FUNC_SETMUSICTRACK,972FUNC_PLAYMUSIC,973FUNC_STOPMUSIC,974FUNC_PAUSEMUSIC,975FUNC_RESUMEMUSIC,976FUNC_SWAPMUSICTRACK,977FUNC_PLAYSFX,978FUNC_STOPSFX,979FUNC_SETSFXATTRIBUTES,980FUNC_OBJECTTILECOLLISION,981FUNC_OBJECTTILEGRIP,982FUNC_NOT,983FUNC_DRAW3DSCENE,984FUNC_SETIDENTITYMATRIX,985FUNC_MATRIXMULTIPLY,986FUNC_MATRIXTRANSLATEXYZ,987FUNC_MATRIXSCALEXYZ,988FUNC_MATRIXROTATEX,989FUNC_MATRIXROTATEY,990FUNC_MATRIXROTATEZ,991FUNC_MATRIXROTATEXYZ,992FUNC_MATRIXINVERSE,993FUNC_TRANSFORMVERTICES,994FUNC_CALLFUNCTION,995FUNC_RETURN,996FUNC_SETLAYERDEFORMATION,997FUNC_CHECKTOUCHRECT,998FUNC_GETTILELAYERENTRY,999FUNC_SETTILELAYERENTRY,1000FUNC_GETBIT,1001FUNC_SETBIT,1002FUNC_CLEARDRAWLIST,1003FUNC_ADDDRAWLISTENTITYREF,1004FUNC_GETDRAWLISTENTITYREF,1005FUNC_SETDRAWLISTENTITYREF,1006FUNC_GET16X16TILEINFO,1007FUNC_SET16X16TILEINFO,1008FUNC_COPY16X16TILE,1009FUNC_GETANIMATIONBYNAME,1010FUNC_READSAVERAM,1011FUNC_WRITESAVERAM,1012FUNC_LOADTEXTFILE,1013FUNC_GETTEXTINFO,1014FUNC_GETVERSIONNUMBER,1015FUNC_GETTABLEVALUE,1016FUNC_SETTABLEVALUE,1017FUNC_CHECKCURRENTSTAGEFOLDER,1018FUNC_ABS,1019FUNC_CALLNATIVEFUNCTION,1020FUNC_CALLNATIVEFUNCTION2,1021FUNC_CALLNATIVEFUNCTION4,1022FUNC_SETOBJECTRANGE,1023FUNC_GETOBJECTVALUE,1024FUNC_SETOBJECTVALUE,1025FUNC_COPYOBJECT,1026FUNC_PRINT,10271028// Extras1029FUNC_CHECKCAMERAPROXIMITY,1030FUNC_SETSCREENCOUNT,1031FUNC_SETSCREENVERTICES,1032FUNC_GETINPUTDEVICEID,1033FUNC_GETFILTEREDINPUTDEVICEID,1034FUNC_GETINPUTDEVICETYPE,1035FUNC_ISINPUTDEVICEASSIGNED,1036FUNC_ASSIGNINPUTSLOTTODEVICE,1037FUNC_ISSLOTASSIGNED,1038FUNC_RESETINPUTSLOTASSIGNMENTS,1039FUNC_MAX_CNT1040};10411042} // namespace v410431044} // namespace Legacy1045} // namespace RSDK10461047#if LEGACY_RETRO_USE_COMPILER1048void RSDK::Legacy::v4::CheckAliasText(char *text)1049{1050if (FindStringToken(text, "publicalias", 1) == 0) {1051#if !RETRO_USE_ORIGINAL_CODE1052if (scriptValueListCount >= LEGACY_v4_SCRIPT_VAR_COUNT) {1053RSDK::PrintLog(PRINT_SCRIPTERR, "SCRIPT ERROR: Too many aliases, static values, and tables\nFILE: %s", scriptFile);1054gameMode = ENGINE_SCRIPTERROR;1055return;1056}1057#endif10581059ScriptVariableInfo *variable = &scriptValueList[scriptValueListCount];1060MEM_ZERO(*variable);10611062int32 textStrPos = 11;1063int32 varStrPos = 0;1064int32 parseMode = 0;10651066while (text[textStrPos]) {1067switch (parseMode) {1068default: break;10691070case 0:1071if (text[textStrPos] == ':') {1072textStrPos++;1073variable->value[varStrPos] = 0;1074varStrPos = 0;1075parseMode = 1;1076}1077else {1078variable->value[varStrPos++] = text[textStrPos++];1079}1080break;10811082case 1: variable->name[varStrPos++] = text[textStrPos++]; break;1083}1084}10851086variable->access = ACCESS_PUBLIC;10871088#if !RETRO_USE_ORIGINAL_CODE1089for (int32 v = 0; v < scriptValueListCount; ++v) {1090if (StrComp(scriptValueList[v].name, variable->name))1091PrintLog(PRINT_NORMAL, "WARNING: Variable Name '%s' has already been used!", variable->name);1092}1093#endif10941095++scriptValueListCount;1096}1097else if (FindStringToken(text, "privatealias", 1) == 0) {1098#if !RETRO_USE_ORIGINAL_CODE1099if (scriptValueListCount >= LEGACY_v4_SCRIPT_VAR_COUNT) {1100RSDK::PrintLog(PRINT_SCRIPTERR, "SCRIPT ERROR: Too many aliases, static values, and tables\nFILE: %s", scriptFile);1101gameMode = ENGINE_SCRIPTERROR;1102return;1103}1104#endif11051106ScriptVariableInfo *variable = &scriptValueList[scriptValueListCount];1107MEM_ZERO(*variable);11081109int32 textStrPos = 12;1110int32 varStrPos = 0;1111int32 parseMode = 0;11121113while (text[textStrPos]) {1114switch (parseMode) {1115default: break;11161117case 0:1118if (text[textStrPos] == ':') {1119textStrPos++;1120variable->value[varStrPos] = 0;1121varStrPos = 0;1122parseMode = 1;1123}1124else {1125variable->value[varStrPos++] = text[textStrPos++];1126}1127break;11281129case 1: variable->name[varStrPos++] = text[textStrPos++]; break;1130}1131}11321133variable->access = ACCESS_PRIVATE;11341135for (int32 v = 0; v < scriptValueListCount; ++v) {1136if (StrComp(scriptValueList[v].name, variable->name))1137PrintLog(PRINT_NORMAL, "WARNING: Variable Name '%s' has already been used!", variable->name);1138}11391140++scriptValueListCount;1141}1142}1143void RSDK::Legacy::v4::CheckStaticText(char *text)1144{1145if (FindStringToken(text, "publicvalue", 1) == 0) {1146#if !RETRO_USE_ORIGINAL_CODE1147if (scriptValueListCount >= LEGACY_v4_SCRIPT_VAR_COUNT) {1148RSDK::PrintLog(PRINT_SCRIPTERR, "SCRIPT ERROR: Too many aliases, static values, and tables\nFILE: %s", scriptFile);1149gameMode = ENGINE_SCRIPTERROR;1150return;1151}1152#endif11531154ScriptVariableInfo *variable = &scriptValueList[scriptValueListCount];1155MEM_ZERO(*variable);11561157int32 textStrPos = 11;1158int32 varStrPos = 0;1159int32 parseMode = 0;11601161StrCopy(variable->value, "0"); // default value is 01162while (text[textStrPos]) {1163switch (parseMode) {1164default: break;11651166case 0:1167if (text[textStrPos] == '=') {1168textStrPos++;1169variable->name[varStrPos] = 0;1170varStrPos = 0;1171parseMode = 1;1172}1173else {1174variable->name[varStrPos++] = text[textStrPos++];1175}1176break;11771178case 1: variable->value[varStrPos++] = text[textStrPos++]; break;1179}1180}11811182variable->access = ACCESS_PUBLIC;11831184if (!ConvertStringToInteger(variable->value, &scriptCode[scriptCodePos]))1185scriptCode[scriptCodePos] = 0;11861187StrCopy(variable->value, "local[");1188AppendIntegerToString(variable->value, scriptCodePos++);1189StrAdd(variable->value, "]");11901191#if !RETRO_USE_ORIGINAL_CODE1192for (int32 v = 0; v < scriptValueListCount; ++v) {1193if (StrComp(scriptValueList[v].name, variable->name))1194PrintLog(PRINT_NORMAL, "WARNING: Variable Name '%s' has already been used!", variable->name);1195}1196#endif11971198++scriptValueListCount;1199}1200else if (FindStringToken(text, "privatevalue", 1) == 0) {1201#if !RETRO_USE_ORIGINAL_CODE1202if (scriptValueListCount >= LEGACY_v4_SCRIPT_VAR_COUNT) {1203RSDK::PrintLog(PRINT_SCRIPTERR, "SCRIPT ERROR: Too many aliases, static values, and tables\nFILE: %s", scriptFile);1204gameMode = ENGINE_SCRIPTERROR;1205return;1206}1207#endif12081209ScriptVariableInfo *variable = &scriptValueList[scriptValueListCount];1210MEM_ZERO(*variable);12111212int32 textStrPos = 12;1213int32 varStrPos = 0;1214int32 parseMode = 0;12151216StrCopy(variable->value, "0"); // default value is 01217while (text[textStrPos]) {1218switch (parseMode) {1219default: break;12201221case 0:1222if (text[textStrPos] == '=') {1223textStrPos++;1224variable->name[varStrPos] = 0;1225varStrPos = 0;1226parseMode = 1;1227}1228else {1229variable->name[varStrPos++] = text[textStrPos++];1230}1231break;12321233case 1: variable->value[varStrPos++] = text[textStrPos++]; break;1234}1235}12361237variable->access = ACCESS_PRIVATE;12381239if (!ConvertStringToInteger(variable->value, &scriptCode[scriptCodePos]))1240scriptCode[scriptCodePos] = 0;12411242StrCopy(variable->value, "local[");1243AppendIntegerToString(variable->value, scriptCodePos++);1244StrAdd(variable->value, "]");12451246#if !RETRO_USE_ORIGINAL_CODE1247for (int32 v = 0; v < scriptValueListCount; ++v) {1248if (StrComp(scriptValueList[v].name, variable->name))1249PrintLog(PRINT_NORMAL, "WARNING: Variable Name '%s' has already been used!", variable->name);1250}1251#endif12521253++scriptValueListCount;1254}1255}1256bool32 RSDK::Legacy::v4::CheckTableText(char *text)1257{1258bool32 hasValues = false;12591260if (FindStringToken(text, "publictable", 1) == 0) {1261#if !RETRO_USE_ORIGINAL_CODE1262if (scriptValueListCount >= LEGACY_v4_SCRIPT_VAR_COUNT) {1263RSDK::PrintLog(PRINT_SCRIPTERR, "SCRIPT ERROR: Too many aliases, static values, and tables\nFILE: %s", scriptFile);1264gameMode = ENGINE_SCRIPTERROR;1265return false;1266}1267#endif12681269ScriptVariableInfo *variable = &scriptValueList[scriptValueListCount];1270MEM_ZERO(*variable);12711272int32 textStrPos = 11;1273int32 varStrPos = 0;12741275while (text[textStrPos]) {1276if (text[textStrPos] == '[' || text[textStrPos] == ']') {1277variable->name[varStrPos] = 0;1278textStrPos++;1279break;1280}1281else {1282variable->name[varStrPos++] = text[textStrPos++];1283}1284}12851286if (FindStringToken(text, "]", 1) < 1) {1287// has default values, we'll stop here and read stuff in a seperate mode1288scriptCode[scriptCodePos] = 0;1289StrCopy(variable->value, "");1290AppendIntegerToString(variable->value, scriptCodePos);1291scriptCodeOffset = scriptCodePos++;1292hasValues = true;1293}1294else {1295// no default values, just an array size12961297varStrPos = 0;1298while (text[textStrPos]) {1299if (text[textStrPos] == '[' || text[textStrPos] == ']') {1300variable->value[varStrPos] = 0;1301textStrPos++;1302break;1303}1304else {1305variable->value[varStrPos++] = text[textStrPos++];1306}1307}13081309// array size can be an variable (alias), how cool!1310for (int32 v = 0; v < scriptValueListCount; ++v) {1311if (StrComp(variable->value, scriptValueList[v].name))1312StrCopy(variable->value, scriptValueList[v].value);1313}13141315if (!ConvertStringToInteger(variable->value, &scriptCode[scriptCodePos])) {1316scriptCode[scriptCodePos] = 1;1317#if !RETRO_USE_ORIGINAL_CODE1318PrintLog(PRINT_NORMAL, "WARNING: Unable to parse table size!");1319#endif1320}13211322StrCopy(variable->value, "");1323AppendIntegerToString(variable->value, scriptCodePos);13241325int32 valueCount = scriptCode[scriptCodePos++];1326for (int32 v = 0; v < valueCount; ++v) scriptCode[scriptCodePos++] = 0;1327}13281329variable->access = ACCESS_PUBLIC;1330scriptValueListCount++;1331}1332else if (FindStringToken(text, "privatetable", 1) == 0) {1333#if !RETRO_USE_ORIGINAL_CODE1334if (scriptValueListCount >= LEGACY_v4_SCRIPT_VAR_COUNT) {1335RSDK::PrintLog(PRINT_SCRIPTERR, "SCRIPT ERROR: Too many aliases, static values, and tables\nFILE: %s", scriptFile);1336gameMode = ENGINE_SCRIPTERROR;1337return false;1338}1339#endif13401341ScriptVariableInfo *variable = &scriptValueList[scriptValueListCount];1342MEM_ZERO(*variable);13431344int32 textStrPos = 12;1345int32 varStrPos = 0;13461347while (text[textStrPos]) {1348if (text[textStrPos] == '[' || text[textStrPos] == ']') {1349variable->name[varStrPos] = 0;1350textStrPos++;1351break;1352}1353else {1354variable->name[varStrPos++] = text[textStrPos++];1355}1356}13571358if (FindStringToken(text, "]", 1) < 1) {1359// has default values, we'll stop here and read stuff in a seperate mode1360scriptCode[scriptCodePos] = 0;1361StrCopy(variable->value, "");1362AppendIntegerToString(variable->value, scriptCodePos);1363scriptCodeOffset = scriptCodePos++;1364hasValues = true;1365}1366else {1367// no default values, just an array size13681369varStrPos = 0;1370while (text[textStrPos]) {1371if (text[textStrPos] == '[' || text[textStrPos] == ']') {1372variable->value[varStrPos] = 0;1373textStrPos++;1374break;1375}1376else {1377variable->value[varStrPos++] = text[textStrPos++];1378}1379}13801381// array size can be an variable (alias), how cool!1382for (int32 v = 0; v < scriptValueListCount; ++v) {1383if (StrComp(variable->value, scriptValueList[v].name))1384StrCopy(variable->value, scriptValueList[v].value);1385}13861387if (!ConvertStringToInteger(variable->value, &scriptCode[scriptCodePos])) {1388scriptCode[scriptCodePos] = 1;1389#if !RETRO_USE_ORIGINAL_CODE1390PrintLog(PRINT_NORMAL, "WARNING: Unable to parse table size!");1391#endif1392}13931394StrCopy(variable->value, "");1395AppendIntegerToString(variable->value, scriptCodePos);13961397int32 valueCount = scriptCode[scriptCodePos++];1398for (int32 v = 0; v < valueCount; ++v) scriptCode[scriptCodePos++] = 0;1399}14001401variable->access = ACCESS_PRIVATE;1402scriptValueListCount++;1403}14041405return hasValues;1406}1407void RSDK::Legacy::v4::ConvertArithmaticSyntax(char *text)1408{1409int32 token = 0;1410int32 offset = 0;1411int32 findID = 0;1412char dest[260];14131414for (int32 i = FUNC_EQUAL; i <= FUNC_MOD; ++i) {1415findID = FindStringToken(text, scriptEvaluationTokens[i - 1], 1);1416if (findID > -1) {1417offset = findID;1418token = i;1419}1420}14211422if (token > 0) {1423StrCopy(dest, functions[token].name);1424StrAdd(dest, "(");1425findID = StrLength(dest);1426for (int32 i = 0; i < offset; ++i) dest[findID++] = text[i];1427if (functions[token].opcodeSize > 1) {1428dest[findID] = ',';1429int32 len = StrLength(scriptEvaluationTokens[token - 1]);1430offset += len;1431++findID;1432while (text[offset]) dest[findID++] = text[offset++];1433}1434dest[findID] = 0;1435StrAdd(dest, ")");1436StrCopy(text, dest);1437}1438}1439void RSDK::Legacy::v4::ConvertConditionalStatement(char *text)1440{1441char dest[260];1442int32 compareOp = -1;1443int32 strPos = 0;1444int32 destStrPos = 0;14451446if (FindStringToken(text, "if", 1) == 0) {1447for (int32 i = 0; i < 6; ++i) {1448destStrPos = FindStringToken(text, scriptEvaluationTokens[i + FUNC_MOD], 1);1449if (destStrPos > -1) {1450strPos = destStrPos;1451compareOp = i;1452}1453}14541455if (compareOp > -1) {1456text[strPos] = ',';1457StrCopy(dest, functions[compareOp + FUNC_IFEQUAL].name);1458StrAdd(dest, "(");1459AppendIntegerToString(dest, jumpTablePos - jumpTableOffset);1460StrAdd(dest, ",");14611462destStrPos = StrLength(dest);1463for (int32 i = 2; text[i]; ++i) {1464if (text[i] != '=' && text[i] != '(' && text[i] != ')')1465dest[destStrPos++] = text[i];1466}1467dest[destStrPos] = 0;14681469StrAdd(dest, ")");1470StrCopy(text, dest);14711472jumpTableStack[++jumpTableStackPos] = jumpTablePos;1473jumpTable[jumpTablePos++] = -1;1474jumpTable[jumpTablePos++] = 0;1475}1476}1477else if (FindStringToken(text, "while", 1) == 0) {1478for (int32 i = 0; i < 6; ++i) {1479destStrPos = FindStringToken(text, scriptEvaluationTokens[i + FUNC_MOD], 1);1480if (destStrPos > -1) {1481strPos = destStrPos;1482compareOp = i;1483}1484}14851486if (compareOp > -1) {1487text[strPos] = ',';1488StrCopy(dest, functions[compareOp + FUNC_WEQUAL].name);1489StrAdd(dest, "(");1490AppendIntegerToString(dest, jumpTablePos - jumpTableOffset);1491StrAdd(dest, ",");14921493destStrPos = StrLength(dest);1494for (int32 i = 5; text[i]; ++i) {1495if (text[i] != '=' && text[i] != '(' && text[i] != ')')1496dest[destStrPos++] = text[i];1497}1498dest[destStrPos] = 0;14991500StrAdd(dest, ")");1501StrCopy(text, dest);15021503jumpTableStack[++jumpTableStackPos] = jumpTablePos;1504jumpTable[jumpTablePos++] = scriptCodePos - scriptCodeOffset;1505jumpTable[jumpTablePos++] = 0;1506}1507}1508else if (FindStringToken(text, "foreach", 1) == 0) {1509int32 argStrPos = FindStringToken(text, ",", 2);15101511if (argStrPos > -1) {1512StrCopy(dest, functions[text[argStrPos + 2] == 'C' ? (int32)FUNC_FOREACHACTIVE : (int32)FUNC_FOREACHALL].name);1513StrAdd(dest, "(");1514AppendIntegerToString(dest, jumpTablePos - jumpTableOffset);1515StrAdd(dest, ",");15161517destStrPos = StrLength(dest);1518for (int32 i = 7; text[i] && i < argStrPos; ++i) {1519if (text[i] != '(' && text[i] != ')')1520dest[destStrPos++] = text[i];1521}1522dest[destStrPos] = 0;15231524StrAdd(dest, ")");1525StrCopy(text, dest);15261527jumpTableStack[++jumpTableStackPos] = jumpTablePos;1528jumpTable[jumpTablePos++] = scriptCodePos - scriptCodeOffset;1529jumpTable[jumpTablePos++] = 0;1530}1531}1532}1533bool32 RSDK::Legacy::v4::ConvertSwitchStatement(char *text)1534{1535if (FindStringToken(text, "switch", 1) != 0)1536return false;15371538char switchText[260];15391540StrCopy(switchText, "switch");1541StrAdd(switchText, "(");1542AppendIntegerToString(switchText, jumpTablePos - jumpTableOffset);1543StrAdd(switchText, ",");15441545int32 pos = StrLength(switchText);1546for (int32 i = 6; text[i]; ++i) {1547if (text[i] != '=' && text[i] != '(' && text[i] != ')')1548switchText[pos++] = text[i];1549}1550switchText[pos] = 0;15511552StrAdd(switchText, ")");1553StrCopy(text, switchText);15541555jumpTableStack[++jumpTableStackPos] = jumpTablePos;1556jumpTable[jumpTablePos++] = 0x10000;1557jumpTable[jumpTablePos++] = -0x10000;1558jumpTable[jumpTablePos++] = -1;1559jumpTable[jumpTablePos++] = 0;15601561return true;1562}1563void RSDK::Legacy::v4::ConvertFunctionText(char *text)1564{1565char arrayStr[0x80];1566char funcName[132];15671568int32 opcode = 0;1569int32 opcodeSize = 0;1570int32 textPos = 0;1571int32 namePos = 0;15721573for (namePos = 0; text[namePos] != '(' && text[namePos]; ++namePos) funcName[namePos] = text[namePos];1574funcName[namePos] = 0;15751576for (int32 i = 0; i < FUNC_MAX_CNT; ++i) {1577if (StrComp(funcName, functions[i].name)) {1578opcode = i;1579opcodeSize = functions[i].opcodeSize;1580textPos = StrLength(functions[i].name);1581i = FUNC_MAX_CNT;1582}1583}15841585if (opcode <= 0) {1586PrintLog(PRINT_SCRIPTERR, "SCRIPT ERROR: Operand not found\nOPERAND: %s\nLINE: %d\nFILE: %s", funcName, lineID, scriptFile);1587gameMode = ENGINE_SCRIPTERROR;1588}1589else {1590scriptCode[scriptCodePos++] = opcode;1591if (StrComp("else", functions[opcode].name))1592jumpTable[jumpTableStack[jumpTableStackPos]] = scriptCodePos - scriptCodeOffset;15931594if (StrComp("endif", functions[opcode].name) == 1) {1595int32 jPos = jumpTableStack[jumpTableStackPos];1596jumpTable[jPos + 1] = scriptCodePos - scriptCodeOffset;1597if (jumpTable[jPos] == -1)1598jumpTable[jPos] = (scriptCodePos - scriptCodeOffset) - 1;1599--jumpTableStackPos;1600}16011602if (StrComp("endswitch", functions[opcode].name)) {1603int32 jPos = jumpTableStack[jumpTableStackPos];1604jumpTable[jPos + 3] = scriptCodePos - scriptCodeOffset;1605if (jumpTable[jPos + 2] == -1) {1606jumpTable[jPos + 2] = (scriptCodePos - scriptCodeOffset) - 1;1607int32 caseCnt = abs(jumpTable[jPos + 1] - jumpTable[jPos]) + 1;16081609int32 jOffset = jPos + 4;1610for (int32 c = 0; c < caseCnt; ++c) {1611if (jumpTable[jOffset + c] < 0)1612jumpTable[jOffset + c] = jumpTable[jPos + 2];1613}1614}1615--jumpTableStackPos;1616}16171618if (StrComp("loop", functions[opcode].name) || StrComp("next", functions[opcode].name)) {1619jumpTable[jumpTableStack[jumpTableStackPos--] + 1] = scriptCodePos - scriptCodeOffset;1620}16211622for (int32 i = 0; i < opcodeSize; ++i) {1623++textPos;1624int32 funcNamePos = 0;1625int32 mode = 0;1626int32 prevMode = 0;1627int32 arrayStrPos = 0;1628while (((text[textPos] != ',' && text[textPos] != ')') || mode == 2) && text[textPos]) {1629switch (mode) {1630case 0: // normal1631if (text[textPos] == '[')1632mode = 1;1633else if (text[textPos] == '"') {1634prevMode = mode;1635mode = 2;1636funcName[funcNamePos++] = '"';1637}1638else1639funcName[funcNamePos++] = text[textPos];1640++textPos;1641break;16421643case 1: // array val1644if (text[textPos] == ']')1645mode = 0;1646else if (text[textPos] == '"') {1647prevMode = mode;1648mode = 2;1649}1650else1651arrayStr[arrayStrPos++] = text[textPos];1652++textPos;1653break;16541655case 2: // string1656if (text[textPos] == '"') {1657mode = prevMode;1658funcName[funcNamePos++] = '"';1659}1660else1661funcName[funcNamePos++] = text[textPos];1662++textPos;1663break;1664}1665}1666funcName[funcNamePos] = 0;1667arrayStr[arrayStrPos] = 0;16681669for (int32 v = 0; v < scriptValueListCount; ++v) {1670if (StrComp(funcName, scriptValueList[v].name)) {1671CopyAliasStr(funcName, scriptValueList[v].value, 0);1672if (FindStringToken(scriptValueList[v].value, "[", 1) > -1)1673CopyAliasStr(arrayStr, scriptValueList[v].value, 1);1674}1675}16761677if (arrayStr[0]) {1678char arrStrBuf[0x80];1679int32 arrPos = 0;1680int32 bufPos = 0;1681if (arrayStr[0] == '+' || arrayStr[0] == '-')1682++arrPos;1683while (arrayStr[arrPos]) arrStrBuf[bufPos++] = arrayStr[arrPos++];1684arrStrBuf[bufPos] = 0;16851686for (int32 v = 0; v < scriptValueListCount; ++v) {1687if (StrComp(arrStrBuf, scriptValueList[v].name)) {1688char pref = arrayStr[0];1689CopyAliasStr(arrayStr, scriptValueList[v].value, 0);16901691if (pref == '+' || pref == '-') {1692int32 len = StrLength(arrayStr);1693for (int32 i = len; i >= 0; --i) arrayStr[i + 1] = arrayStr[i];1694arrayStr[0] = pref;1695}1696}1697}1698}16991700// Eg: temp0 = game.variable1701for (int32 v = 0; v < globalVariablesCount; ++v) {1702if (StrComp(funcName, globalVariables[v].name)) {1703StrCopy(funcName, "global");1704arrayStr[0] = 0;1705AppendIntegerToString(arrayStr, v);1706}1707}17081709// Eg: temp0 = Function11710for (int32 f = 0; f < scriptFunctionCount; ++f) {1711if (StrComp(funcName, scriptFunctionList[f].name)) {1712funcName[0] = 0;1713AppendIntegerToString(funcName, f);1714}1715}17161717// Eg: temp0 = TypeName[Player Object]1718if (StrComp(funcName, "TypeName")) {1719funcName[0] = '0';1720funcName[1] = 0;17211722int32 o = 0;1723for (; o < LEGACY_v4_OBJECT_COUNT; ++o) {1724if (StrComp(arrayStr, typeNames[o])) {1725funcName[0] = 0;1726AppendIntegerToString(funcName, o);1727break;1728}1729}17301731if (o == LEGACY_v4_OBJECT_COUNT)1732PrintLog(PRINT_NORMAL, "WARNING: Unknown typename \"%s\", on line %d", arrayStr, lineID);1733}17341735// Eg: temp0 = SfxName[Jump]1736if (StrComp(funcName, "SfxName")) {1737funcName[0] = '0';1738funcName[1] = 0;17391740int32 s = 0;1741for (; s < SFX_COUNT; ++s) {1742if (StrComp(arrayStr, sfxNames[s])) {1743funcName[0] = 0;1744AppendIntegerToString(funcName, s);1745break;1746}1747}17481749if (s == SFX_COUNT)1750PrintLog(PRINT_NORMAL, "WARNING: Unknown sfxName \"%s\", on line %d", arrayStr, lineID);1751}17521753#if !RETRO_USE_ORIGINAL_CODE1754// Eg: temp0 = VarName[player.lives]1755if (StrComp(funcName, "VarName")) {1756funcName[0] = '0';1757funcName[1] = 0;17581759int32 v = 0;1760for (; v < globalVariablesCount; ++v) {1761if (StrComp(arrayStr, globalVariables[v].name)) {1762funcName[0] = 0;1763AppendIntegerToString(funcName, v);1764break;1765}1766}17671768if (v == globalVariablesCount)1769PrintLog(PRINT_NORMAL, "WARNING: Unknown varName \"%s\", on line %d", arrayStr, lineID);1770}17711772// Eg: temp0 = AchievementName[ACH_RING_KING]1773if (StrComp(funcName, "AchievementName")) {1774funcName[0] = '0';1775funcName[1] = 0;17761777int32 a = 0;1778for (; a < (int32)achievementList.size(); ++a) {1779char buf[0x40];1780const char *str = achievementList[a].identifier.c_str();1781int32 pos = 0;17821783while (*str) {1784if (*str != ' ')1785buf[pos++] = *str;1786str++;1787}1788buf[pos] = 0;17891790if (StrComp(arrayStr, buf)) {1791funcName[0] = 0;1792AppendIntegerToString(funcName, a);1793break;1794}1795}17961797if (a == (int32)achievementList.size())1798PrintLog(PRINT_NORMAL, "WARNING: Unknown AchievementName \"%s\", on line %d", arrayStr, lineID);1799}18001801#if RETRO_USE_MOD_LOADER1802// Eg: temp0 = PlayerName[SONIC]1803if (StrComp(funcName, "PlayerName")) {1804funcName[0] = '0';1805funcName[1] = 0;18061807int32 p = 0;1808for (; p < LEGACY_PLAYERNAME_COUNT; ++p) {1809char buf[0x40];1810char *str = modSettings.playerNames[p];1811int32 pos = 0;18121813while (*str) {1814if (*str != ' ')1815buf[pos++] = *str;1816str++;1817}1818buf[pos] = 0;18191820if (StrComp(arrayStr, buf)) {1821funcName[0] = 0;1822AppendIntegerToString(funcName, p);1823break;1824}1825}18261827if (p == LEGACY_PLAYERNAME_COUNT)1828PrintLog(PRINT_NORMAL, "WARNING: Unknown PlayerName \"%s\", on line %d", arrayStr, lineID);1829}18301831// Eg: temp0 = StageName[R - GREEN HILL ZONE 1]1832if (StrComp(funcName, "StageName")) {1833funcName[0] = '0';1834funcName[1] = 0;18351836int32 s = -1;1837if (StrLength(arrayStr) >= 2) {1838char list = arrayStr[0];1839switch (list) {1840case 'P': list = STAGELIST_PRESENTATION; break;1841case 'R': list = STAGELIST_REGULAR; break;1842case 'B': list = STAGELIST_BONUS; break;1843case 'S': list = STAGELIST_SPECIAL; break;1844}1845if (list <= 3) {1846char scnName[0x40];1847int32 scnPos = 0;1848int32 pos = 0;1849const char *sceneName = &arrayStr[2];18501851while (sceneName[scnPos]) {1852if (sceneName[scnPos] != ' ')1853scnName[pos++] = sceneName[scnPos];1854++scnPos;1855}1856scnName[pos] = 0;1857SceneListInfo *listCat = &sceneInfo.listCategory[list];1858int32 l = listCat->sceneOffsetStart;1859for (int32 c = 0; c < listCat->sceneCount; ++c) {1860char nameBuffer[0x40];18611862scnPos = 0;1863pos = 0;1864while (sceneInfo.listData[l].name[scnPos]) {1865if (sceneInfo.listData[l].name[scnPos] != ' ')1866nameBuffer[pos++] = sceneInfo.listData[l].name[scnPos];1867++scnPos;1868}1869nameBuffer[pos] = 0;18701871if (StrComp(scnName, nameBuffer)) {1872s = c;1873break;1874}1875l++;1876}1877}1878}18791880if (s == -1) {1881PrintLog(PRINT_NORMAL, "WARNING: Unknown StageName \"%s\", on line %d", arrayStr, lineID);1882s = 0;1883}1884funcName[0] = 0;1885AppendIntegerToString(funcName, s);1886}1887#endif1888#endif18891890// Storing Values1891int32 constant = 0;1892if (ConvertStringToInteger(funcName, &constant)) {1893scriptCode[scriptCodePos++] = SCRIPTVAR_INTCONST;1894scriptCode[scriptCodePos++] = constant;1895}1896else if (funcName[0] == '"') {1897scriptCode[scriptCodePos++] = SCRIPTVAR_STRCONST;1898scriptCode[scriptCodePos++] = StrLength(funcName) - 2;18991900int32 scriptTextPos = 1;1901arrayStrPos = 0;1902while (scriptTextPos > -1) {1903switch (arrayStrPos) {1904case 0:1905scriptCode[scriptCodePos] = funcName[scriptTextPos] << 24;1906++arrayStrPos;1907break;19081909case 1:1910scriptCode[scriptCodePos] += funcName[scriptTextPos] << 16;1911++arrayStrPos;1912break;19131914case 2:1915scriptCode[scriptCodePos] += funcName[scriptTextPos] << 8;1916++arrayStrPos;1917break;19181919case 3:1920scriptCode[scriptCodePos++] += funcName[scriptTextPos];1921arrayStrPos = 0;1922break;19231924default: break;1925}19261927if (funcName[scriptTextPos] == '"') {1928if (arrayStrPos > 0)1929++scriptCodePos;1930scriptTextPos = -1;1931}1932else {1933scriptTextPos++;1934}1935}1936}1937else {1938scriptCode[scriptCodePos++] = SCRIPTVAR_VAR;19391940if (arrayStr[0]) {1941scriptCode[scriptCodePos] = VARARR_ARRAY;19421943if (arrayStr[0] == '+')1944scriptCode[scriptCodePos] = VARARR_ENTNOPLUS1;19451946if (arrayStr[0] == '-')1947scriptCode[scriptCodePos] = VARARR_ENTNOMINUS1;19481949++scriptCodePos;19501951if (arrayStr[0] == '-' || arrayStr[0] == '+') {1952for (int32 i = 0; i < StrLength(arrayStr); ++i) arrayStr[i] = arrayStr[i + 1];1953}19541955if (ConvertStringToInteger(arrayStr, &constant) == 1) {1956scriptCode[scriptCodePos++] = 0;1957scriptCode[scriptCodePos++] = constant;1958}1959else {1960if (StrComp(arrayStr, "arrayPos0"))1961constant = 0;1962if (StrComp(arrayStr, "arrayPos1"))1963constant = 1;1964if (StrComp(arrayStr, "arrayPos2"))1965constant = 2;1966if (StrComp(arrayStr, "arrayPos3"))1967constant = 3;1968if (StrComp(arrayStr, "arrayPos4"))1969constant = 4;1970if (StrComp(arrayStr, "arrayPos5"))1971constant = 5;1972if (StrComp(arrayStr, "arrayPos6"))1973constant = 6;1974if (StrComp(arrayStr, "arrayPos7"))1975constant = 7;1976if (StrComp(arrayStr, "tempObjectPos"))1977constant = 8;19781979scriptCode[scriptCodePos++] = 1;1980scriptCode[scriptCodePos++] = constant;1981}1982}1983else {1984scriptCode[scriptCodePos++] = VARARR_NONE;1985}19861987constant = -1;1988for (int32 i = 0; i < VAR_MAX_CNT; ++i) {1989if (StrComp(funcName, variableNames[i]))1990constant = i;1991}19921993if (constant == -1 && gameMode != ENGINE_SCRIPTERROR) {1994PrintLog(PRINT_SCRIPTERR, "SCRIPT ERROR: Operand not found\nOPERAND: %s\nLINE: %d\nFILE: %s", funcName, lineID, scriptFile);19951996gameMode = ENGINE_SCRIPTERROR;1997constant = 0;1998}19992000scriptCode[scriptCodePos++] = constant;2001}2002}2003}2004}2005void RSDK::Legacy::v4::CheckCaseNumber(char *text)2006{2007if (FindStringToken(text, "case", 1) != 0)2008return;20092010char caseString[128];2011char caseChar = text[4];20122013int32 textPos = 5;2014int32 caseStrPos = 0;2015while (caseChar) {2016if (caseChar != ':')2017caseString[caseStrPos++] = caseChar;2018caseChar = text[textPos++];2019}2020caseString[caseStrPos] = 0;20212022bool foundValue = false;20232024if (FindStringToken(caseString, "[", 1) >= 0) {2025char caseValue[0x80];2026char arrayStr[0x80];20272028int32 textPos = 0;2029int32 funcNamePos = 0;2030int32 mode = 0;2031int32 arrayStrPos = 0;2032while (caseString[textPos] != ':' && caseString[textPos]) {2033if (mode) {2034if (caseString[textPos] == ']')2035mode = 0;2036else2037arrayStr[arrayStrPos++] = caseString[textPos];2038++textPos;2039}2040else {2041if (caseString[textPos] == '[')2042mode = 1;2043else2044caseValue[funcNamePos++] = caseString[textPos];2045++textPos;2046}2047}2048caseValue[funcNamePos] = 0;2049arrayStr[arrayStrPos] = 0;20502051// Eg: temp0 = TypeName[Player Object]2052if (StrComp(caseValue, "TypeName")) {2053caseValue[0] = '0';2054caseValue[1] = 0;20552056int32 o = 0;2057for (; o < LEGACY_v4_OBJECT_COUNT; ++o) {2058if (StrComp(arrayStr, typeNames[o])) {2059caseValue[0] = 0;2060AppendIntegerToString(caseValue, o);2061break;2062}2063}20642065if (o == LEGACY_v4_OBJECT_COUNT)2066PrintLog(PRINT_NORMAL, "WARNING: Unknown typename \"%s\", on line %d", arrayStr, lineID);2067}20682069// Eg: temp0 = SfxName[Jump]2070if (StrComp(caseValue, "SfxName")) {2071caseValue[0] = '0';2072caseValue[1] = 0;20732074int32 s = 0;2075for (; s < SFX_COUNT; ++s) {2076if (StrComp(arrayStr, sfxNames[s])) {2077caseValue[0] = 0;2078AppendIntegerToString(caseValue, s);2079break;2080}2081}20822083if (s == SFX_COUNT)2084PrintLog(PRINT_NORMAL, "WARNING: Unknown sfxName \"%s\", on line %d", arrayStr, lineID);2085}20862087#if !RETRO_USE_ORIGINAL_CODE2088// Eg: temp0 = VarName[player.lives]2089if (StrComp(caseValue, "VarName")) {2090caseValue[0] = '0';2091caseValue[1] = 0;20922093int32 v = 0;2094for (; v < globalVariablesCount; ++v) {2095if (StrComp(arrayStr, globalVariables[v].name)) {2096caseValue[0] = 0;2097AppendIntegerToString(caseValue, v);2098break;2099}2100}21012102if (v == globalVariablesCount)2103PrintLog(PRINT_NORMAL, "WARNING: Unknown varName \"%s\", on line %d", arrayStr, lineID);2104}21052106// Eg: temp0 = AchievementName[ACH_RING_KING]2107if (StrComp(caseValue, "AchievementName")) {2108caseValue[0] = '0';2109caseValue[1] = 0;21102111int32 a = 0;2112for (; a < (int32)achievementList.size(); ++a) {2113char buf[0x40];2114const char *str = achievementList[a].identifier.c_str();2115int32 pos = 0;21162117while (*str) {2118if (*str != ' ')2119buf[pos++] = *str;2120str++;2121}2122buf[pos] = 0;21232124if (StrComp(arrayStr, buf)) {2125caseValue[0] = 0;2126AppendIntegerToString(caseValue, a);2127break;2128}2129}21302131if (a == (int32)achievementList.size())2132PrintLog(PRINT_NORMAL, "WARNING: Unknown AchievementName \"%s\", on line %d", arrayStr, lineID);2133}21342135#if RETRO_USE_MOD_LOADER2136// Eg: temp0 = PlayerName[SONIC]2137if (StrComp(caseValue, "PlayerName")) {2138caseValue[0] = '0';2139caseValue[1] = 0;21402141int32 p = 0;2142for (; p < LEGACY_PLAYERNAME_COUNT; ++p) {2143char buf[0x40];2144char *str = modSettings.playerNames[p];2145int32 pos = 0;21462147while (*str) {2148if (*str != ' ')2149buf[pos++] = *str;2150str++;2151}2152buf[pos] = 0;21532154if (StrComp(arrayStr, buf)) {2155caseValue[0] = 0;2156AppendIntegerToString(caseValue, p);2157break;2158}2159}21602161if (p == LEGACY_PLAYERNAME_COUNT)2162PrintLog(PRINT_NORMAL, "WARNING: Unknown PlayerName \"%s\", on line %d", arrayStr, lineID);2163}21642165// Eg: temp0 = StageName[R - GREEN HILL ZONE 1]2166if (StrComp(caseValue, "StageName")) {2167caseValue[0] = '0';2168caseValue[1] = 0;21692170int32 s = -1;2171if (StrLength(arrayStr) >= 2) {2172char list = arrayStr[0];2173switch (list) {2174case 'P': list = STAGELIST_PRESENTATION; break;2175case 'R': list = STAGELIST_REGULAR; break;2176case 'B': list = STAGELIST_BONUS; break;2177case 'S': list = STAGELIST_SPECIAL; break;2178}2179if (list <= 3) {2180char scnName[0x40];2181int32 scnPos = 0;2182int32 pos = 0;2183const char *sceneName = &arrayStr[2];21842185while (sceneName[scnPos]) {2186if (sceneName[scnPos] != ' ')2187scnName[pos++] = sceneName[scnPos];2188++scnPos;2189}2190scnName[pos] = 0;2191SceneListInfo *listCat = &sceneInfo.listCategory[list];2192int32 l = listCat->sceneOffsetStart;2193for (int32 c = 0; c < listCat->sceneCount; ++c) {2194char nameBuffer[0x40];21952196scnPos = 0;2197pos = 0;2198while (sceneInfo.listData[l].name[scnPos]) {2199if (sceneInfo.listData[l].name[scnPos] != ' ')2200nameBuffer[pos++] = sceneInfo.listData[l].name[scnPos];2201++scnPos;2202}2203nameBuffer[pos] = 0;22042205if (StrComp(scnName, nameBuffer)) {2206s = c;2207break;2208}2209l++;2210}2211}2212}22132214if (s == -1) {2215PrintLog(PRINT_NORMAL, "WARNING: Unknown StageName \"%s\", on line %d", arrayStr, lineID);2216s = 0;2217}2218caseValue[0] = 0;2219AppendIntegerToString(caseValue, s);2220}2221#endif2222#endif2223StrCopy(caseString, caseValue);2224foundValue = true;2225}22262227for (int32 a = 0; a < scriptValueListCount && !foundValue; ++a) {2228if (StrComp(scriptValueList[a].name, caseString)) {2229StrCopy(caseString, scriptValueList[a].value);2230break;2231}2232}22332234int32 caseID = 0;2235if (ConvertStringToInteger(caseString, &caseID)) {2236int32 stackValue = jumpTableStack[jumpTableStackPos];2237if (caseID < jumpTable[stackValue])2238jumpTable[stackValue] = caseID;2239stackValue++;2240if (caseID > jumpTable[stackValue])2241jumpTable[stackValue] = caseID;2242}2243else {2244PrintLog(PRINT_NORMAL, "WARNING: unable to convert case string \"%s\" to int32, on line %d", caseString, lineID);2245}2246}2247bool32 RSDK::Legacy::v4::ReadSwitchCase(char *text)2248{2249char caseText[0x80];2250if (FindStringToken(text, "case", 1) == 0) {2251int32 textPos = 4;2252int32 caseStringPos = 0;2253while (text[textPos]) {2254if (text[textPos] != ':')2255caseText[caseStringPos++] = text[textPos];2256++textPos;2257}2258caseText[caseStringPos] = 0;22592260bool foundValue = false;2261if (FindStringToken(caseText, "[", 1) >= 0) {2262char caseValue[0x80];2263char arrayStr[0x80];22642265int32 textPos = 0;2266int32 funcNamePos = 0;2267int32 mode = 0;2268int32 arrayStrPos = 0;2269while (caseText[textPos] != ':' && caseText[textPos]) {2270if (mode) {2271if (caseText[textPos] == ']')2272mode = 0;2273else2274arrayStr[arrayStrPos++] = caseText[textPos];2275++textPos;2276}2277else {2278if (caseText[textPos] == '[')2279mode = 1;2280else2281caseValue[funcNamePos++] = caseText[textPos];2282++textPos;2283}2284}2285caseValue[funcNamePos] = 0;2286arrayStr[arrayStrPos] = 0;22872288// Eg: temp0 = TypeName[Player Object]2289if (StrComp(caseValue, "TypeName")) {2290caseValue[0] = '0';2291caseValue[1] = 0;22922293int32 o = 0;2294for (; o < LEGACY_v4_OBJECT_COUNT; ++o) {2295if (StrComp(arrayStr, typeNames[o])) {2296caseValue[0] = 0;2297AppendIntegerToString(caseValue, o);2298break;2299}2300}23012302if (o == LEGACY_v4_OBJECT_COUNT)2303PrintLog(PRINT_NORMAL, "WARNING: Unknown typename \"%s\", on line %d", arrayStr, lineID);2304}23052306// Eg: temp0 = SfxName[Jump]2307if (StrComp(caseValue, "SfxName")) {2308caseValue[0] = '0';2309caseValue[1] = 0;23102311int32 s = 0;2312for (; s < SFX_COUNT; ++s) {2313if (StrComp(arrayStr, sfxNames[s])) {2314caseValue[0] = 0;2315AppendIntegerToString(caseValue, s);2316break;2317}2318}23192320if (s == SFX_COUNT)2321PrintLog(PRINT_NORMAL, "WARNING: Unknown sfxName \"%s\", on line %d", arrayStr, lineID);2322}23232324#if !RETRO_USE_ORIGINAL_CODE2325// Eg: temp0 = VarName[player.lives]2326if (StrComp(caseValue, "VarName")) {2327caseValue[0] = '0';2328caseValue[1] = 0;23292330int32 v = 0;2331for (; v < globalVariablesCount; ++v) {2332if (StrComp(arrayStr, globalVariables[v].name)) {2333caseValue[0] = 0;2334AppendIntegerToString(caseValue, v);2335break;2336}2337}23382339if (v == globalVariablesCount)2340PrintLog(PRINT_NORMAL, "WARNING: Unknown varName \"%s\", on line %d", arrayStr, lineID);2341}23422343// Eg: temp0 = AchievementName[ACH_RING_KING]2344if (StrComp(caseValue, "AchievementName")) {2345caseValue[0] = '0';2346caseValue[1] = 0;23472348int32 a = 0;2349for (; a < (int32)achievementList.size(); ++a) {2350char buf[0x40];2351const char *str = achievementList[a].identifier.c_str();2352int32 pos = 0;23532354while (*str) {2355if (*str != ' ')2356buf[pos++] = *str;2357str++;2358}2359buf[pos] = 0;23602361if (StrComp(arrayStr, buf)) {2362caseValue[0] = 0;2363AppendIntegerToString(caseValue, a);2364break;2365}2366}23672368if (a == (int32)achievementList.size())2369PrintLog(PRINT_NORMAL, "WARNING: Unknown AchievementName \"%s\", on line %d", arrayStr, lineID);2370}23712372#if RETRO_USE_MOD_LOADER2373// Eg: temp0 = PlayerName[SONIC]2374if (StrComp(caseValue, "PlayerName")) {2375caseValue[0] = '0';2376caseValue[1] = 0;23772378int32 p = 0;2379for (; p < LEGACY_PLAYERNAME_COUNT; ++p) {2380char buf[0x40];2381char *str = modSettings.playerNames[p];2382int32 pos = 0;23832384while (*str) {2385if (*str != ' ')2386buf[pos++] = *str;2387str++;2388}2389buf[pos] = 0;23902391if (StrComp(arrayStr, buf)) {2392caseValue[0] = 0;2393AppendIntegerToString(caseValue, p);2394break;2395}2396}23972398if (p == LEGACY_PLAYERNAME_COUNT)2399PrintLog(PRINT_NORMAL, "WARNING: Unknown PlayerName \"%s\", on line %d", arrayStr, lineID);2400}24012402// Eg: temp0 = StageName[R - GREEN HILL ZONE 1]2403if (StrComp(caseValue, "StageName")) {2404caseValue[0] = '0';2405caseValue[1] = 0;24062407int32 s = -1;2408if (StrLength(arrayStr) >= 2) {2409char list = arrayStr[0];2410switch (list) {2411case 'P': list = STAGELIST_PRESENTATION; break;2412case 'R': list = STAGELIST_REGULAR; break;2413case 'B': list = STAGELIST_BONUS; break;2414case 'S': list = STAGELIST_SPECIAL; break;2415}2416if (list <= 3) {2417char scnName[0x40];2418int32 scnPos = 0;2419int32 pos = 0;2420const char *sceneName = &arrayStr[2];24212422while (sceneName[scnPos]) {2423if (sceneName[scnPos] != ' ')2424scnName[pos++] = sceneName[scnPos];2425++scnPos;2426}2427scnName[pos] = 0;2428SceneListInfo *listCat = &sceneInfo.listCategory[list];2429int32 l = listCat->sceneOffsetStart;2430for (int32 c = 0; c < listCat->sceneCount; ++c) {2431char nameBuffer[0x40];24322433scnPos = 0;2434pos = 0;2435while (sceneInfo.listData[l].name[scnPos]) {2436if (sceneInfo.listData[l].name[scnPos] != ' ')2437nameBuffer[pos++] = sceneInfo.listData[l].name[scnPos];2438++scnPos;2439}2440nameBuffer[pos] = 0;24412442if (StrComp(scnName, nameBuffer)) {2443s = c;2444break;2445}2446l++;2447}2448}2449}24502451if (s == -1) {2452PrintLog(PRINT_NORMAL, "WARNING: Unknown StageName \"%s\", on line %d", arrayStr, lineID);2453s = 0;2454}2455caseValue[0] = 0;2456AppendIntegerToString(caseValue, s);2457}2458#endif2459#endif2460StrCopy(caseText, caseValue);2461foundValue = true;2462}24632464for (int32 v = 0; v < scriptValueListCount && !foundValue; ++v) {2465if (StrComp(caseText, scriptValueList[v].name)) {2466StrCopy(caseText, scriptValueList[v].value);2467break;2468}2469}24702471int32 val = 0;24722473int32 jPos = jumpTableStack[jumpTableStackPos];2474int32 jOffset = jPos + 4;2475if (ConvertStringToInteger(caseText, &val))2476jumpTable[val - jumpTable[jPos] + jOffset] = scriptCodePos - scriptCodeOffset;2477else2478PrintLog(PRINT_NORMAL, "WARNING: unable to read case string \"%s\" as an int32, on line %d", caseText, lineID);24792480return true;2481}2482else if (FindStringToken(text, "default", 1) == 0) {2483int32 jumpTablepos = jumpTableStack[jumpTableStackPos];2484jumpTable[jumpTablepos + 2] = scriptCodePos - scriptCodeOffset;2485int32 cnt = abs(jumpTable[jumpTablepos + 1] - jumpTable[jumpTablepos]) + 1;24862487int32 jOffset = jumpTablepos + 4;2488for (int32 i = 0; i < cnt; ++i) {2489if (jumpTable[jOffset + i] < 0)2490jumpTable[jOffset + i] = scriptCodePos - scriptCodeOffset;2491}24922493return true;2494}24952496return false;2497}2498void RSDK::Legacy::v4::ReadTableValues(char *text)2499{2500int32 textStrPos = 0;25012502char valueBuffer[256];2503int32 valueBufferPos = 0;25042505while (text[textStrPos]) {2506valueBuffer[valueBufferPos++] = text[textStrPos++];25072508while (text[textStrPos] == ',') {2509valueBuffer[valueBufferPos] = 0;2510++scriptCode[scriptCodeOffset];2511if (!ConvertStringToInteger(valueBuffer, &scriptCode[scriptCodePos])) {2512scriptCode[scriptCodePos] = 0;2513#if !RETRO_USE_ORIGINAL_CODE2514PrintLog(PRINT_NORMAL, "WARNING: unable to parse table value \"%s\" as an int, on line %d", valueBuffer, lineID);2515#endif2516}2517scriptCodePos++;2518valueBufferPos = 0;2519textStrPos++;2520}2521}25222523if (StrLength(valueBuffer)) {2524valueBuffer[valueBufferPos] = 0;2525++scriptCode[scriptCodeOffset];2526if (!ConvertStringToInteger(valueBuffer, &scriptCode[scriptCodePos])) {2527scriptCode[scriptCodePos] = 0;2528#if !RETRO_USE_ORIGINAL_CODE2529PrintLog(PRINT_NORMAL, "WARNING: unable to parse table value \"%s\" as an int, on line %d", valueBuffer, lineID);2530#endif2531}2532scriptCodePos++;2533}2534}2535void RSDK::Legacy::v4::AppendIntegerToString(char *text, int32 value)2536{2537int32 textPos = 0;2538while (true) {2539if (!text[textPos])2540break;2541++textPos;2542}25432544int32 cnt = 0;2545int32 v = value;2546while (v != 0) {2547v /= 10;2548cnt++;2549}25502551v = 0;2552for (int32 i = cnt - 1; i >= 0; --i) {2553v = (int32)(value / pow(10, i));2554v %= 10;25552556int32 strValue = v + '0';2557if (strValue < '0' || strValue > '9') {2558// what2559}2560text[textPos++] = strValue;2561}2562if (value == 0)2563text[textPos++] = '0';2564text[textPos] = 0;2565}2566void RSDK::Legacy::v4::CopyAliasStr(char *dest, char *text, bool32 arrayIndex)2567{2568int32 textPos = 0;2569int32 destPos = 0;2570bool arrayValue = false;2571if (arrayIndex) {2572while (text[textPos]) {2573if (arrayValue) {2574if (text[textPos] == ']')2575arrayValue = false;2576else2577dest[destPos++] = text[textPos];2578++textPos;2579}2580else {2581if (text[textPos] == '[')2582arrayValue = true;2583++textPos;2584}2585}2586}2587else {2588while (text[textPos]) {2589if (arrayValue) {2590if (text[textPos] == ']')2591arrayValue = false;2592++textPos;2593}2594else {2595if (text[textPos] == '[')2596arrayValue = true;2597else2598dest[destPos++] = text[textPos];2599++textPos;2600}2601}2602}2603dest[destPos] = 0;2604}2605bool32 RSDK::Legacy::v4::CheckOpcodeType(char *text)2606{2607while (*text) {2608if (*text++ == '(')2609return false;2610}2611return true;2612}26132614void RSDK::Legacy::v4::ParseScriptFile(char *scriptName, int32 scriptID)2615{2616jumpTableStackPos = 0;2617lineID = 0;26182619scriptFile = scriptName;26202621for (int32 f = 0; f < scriptFunctionCount; ++f) {2622if (scriptFunctionList[f].access != ACCESS_PUBLIC)2623StrCopy(scriptFunctionList[f].name, "");2624}26252626int32 newScriptValueCount = LEGACY_v4_COMMON_SCRIPT_VAR_COUNT;2627for (int32 v = LEGACY_v4_COMMON_SCRIPT_VAR_COUNT; v < scriptValueListCount; ++v) {2628if (scriptValueList[v].access != ACCESS_PUBLIC) {2629StrCopy(scriptValueList[v].name, "");2630}2631else {2632if (newScriptValueCount != v)2633memcpy(&scriptValueList[newScriptValueCount], &scriptValueList[v], sizeof(ScriptVariableInfo));26342635newScriptValueCount++;2636}2637}2638scriptValueListCount = newScriptValueCount;26392640for (int32 v = scriptValueListCount; v < LEGACY_v4_SCRIPT_VAR_COUNT; ++v) {2641MEM_ZERO(scriptValueList[v]);2642}26432644FileInfo info;2645InitFileInfo(&info);26462647char scriptPath[0x40];26482649// Try the original script folder2650StrCopy(scriptPath, "Data/Scripts/");2651StrAdd(scriptPath, scriptName);2652if (LoadFile(&info, scriptPath, FMODE_RB)) {2653int32 readMode = READMODE_NORMAL;2654int32 parseMode = PARSEMODE_SCOPELESS;2655int32 storedPos = 0;2656char prevChar = 0;2657char curChar = 0;2658int32 switchDeep = 0;26592660while (readMode < READMODE_EOF) {2661int32 textPos = 0;2662readMode = READMODE_NORMAL;2663bool32 disableLineIncrement = false;26642665while (readMode < READMODE_ENDLINE) {2666prevChar = curChar;2667curChar = ReadInt8(&info);26682669if (readMode == READMODE_STRING) {2670if (curChar == '\t' || curChar == '\r' || curChar == '\n' || curChar == ';' || readMode >= READMODE_COMMENTLINE) {2671if ((curChar == '\n' && prevChar != '\r') || (curChar == '\n' && prevChar == '\r')) {2672readMode = READMODE_ENDLINE;2673scriptText[textPos] = 0;2674if (curChar == ';')2675disableLineIncrement = true;2676}2677}2678else if (curChar != '/' || textPos <= 0) {2679scriptText[textPos++] = curChar;2680if (curChar == '"')2681readMode = READMODE_NORMAL;2682}2683else if (curChar == '/' && prevChar == '/') {2684readMode = READMODE_COMMENTLINE;2685scriptText[--textPos] = 0;2686}2687else {2688scriptText[textPos++] = curChar;2689}2690}2691else if (curChar == ' ' || curChar == '\t' || curChar == '\r' || curChar == '\n' || curChar == ';'2692|| readMode >= READMODE_COMMENTLINE) {2693if ((curChar == '\n' && prevChar != '\r') || (curChar == '\n' && prevChar == '\r') || curChar == ';') {2694readMode = READMODE_ENDLINE;2695scriptText[textPos] = 0;2696if (curChar == ';')2697disableLineIncrement = true;2698}2699}2700else if (curChar != '/' || textPos <= 0) {2701scriptText[textPos++] = curChar;2702if (curChar == '"' && !readMode)2703readMode = READMODE_STRING;2704}2705else if (curChar == '/' && prevChar == '/') {2706readMode = READMODE_COMMENTLINE;2707scriptText[--textPos] = 0;2708}2709else {2710scriptText[textPos++] = curChar;2711}27122713if (info.readPos >= info.fileSize) {2714scriptText[textPos] = 0;2715readMode = READMODE_EOF;2716}2717}27182719switch (parseMode) {2720case PARSEMODE_SCOPELESS:2721if (!disableLineIncrement)2722++lineID;27232724CheckAliasText(scriptText);2725CheckStaticText(scriptText);27262727if (CheckTableText(scriptText)) {2728parseMode = PARSEMODE_TABLEREAD;2729StrCopy(scriptText, "");2730}27312732if (StrComp(scriptText, "eventObjectUpdate")) {2733parseMode = PARSEMODE_FUNCTION;2734objectScriptList[scriptID].eventUpdate.scriptCodePtr = scriptCodePos;2735objectScriptList[scriptID].eventUpdate.jumpTablePtr = jumpTablePos;2736scriptCodeOffset = scriptCodePos;2737jumpTableOffset = jumpTablePos;2738}27392740if (StrComp(scriptText, "eventObjectDraw")) {2741parseMode = PARSEMODE_FUNCTION;2742objectScriptList[scriptID].eventDraw.scriptCodePtr = scriptCodePos;2743objectScriptList[scriptID].eventDraw.jumpTablePtr = jumpTablePos;2744scriptCodeOffset = scriptCodePos;2745jumpTableOffset = jumpTablePos;2746}27472748if (StrComp(scriptText, "eventObjectStartup")) {2749parseMode = PARSEMODE_FUNCTION;2750objectScriptList[scriptID].eventStartup.scriptCodePtr = scriptCodePos;2751objectScriptList[scriptID].eventStartup.jumpTablePtr = jumpTablePos;2752scriptCodeOffset = scriptCodePos;2753jumpTableOffset = jumpTablePos;2754}27552756if (FindStringToken(scriptText, "reservefunction", 1) == 0) { // forward decl2757char funcName[0x40];2758for (textPos = 15; scriptText[textPos]; ++textPos) funcName[textPos - 15] = scriptText[textPos];2759funcName[textPos - 15] = 0;2760int32 funcID = -1;2761for (int32 f = 0; f < scriptFunctionCount; ++f) {2762if (StrComp(funcName, scriptFunctionList[f].name))2763funcID = f;2764}27652766if (scriptFunctionCount < LEGACY_v4_FUNCTION_COUNT && funcID == -1) {2767StrCopy(scriptFunctionList[scriptFunctionCount++].name, funcName);2768}2769else {2770PrintLog(PRINT_NORMAL, "WARNING: Function %s has already been reserved!", funcName);2771}27722773parseMode = PARSEMODE_SCOPELESS;2774}2775else if (FindStringToken(scriptText, "publicfunction", 1) == 0) { // regular public decl2776char funcName[0x40];2777for (textPos = 14; scriptText[textPos]; ++textPos) funcName[textPos - 14] = scriptText[textPos];27782779funcName[textPos - 14] = 0;2780int32 funcID = -1;2781for (int32 f = 0; f < scriptFunctionCount; ++f) {2782if (StrComp(funcName, scriptFunctionList[f].name))2783funcID = f;2784}27852786if (funcID <= -1) {2787if (scriptFunctionCount >= LEGACY_v4_FUNCTION_COUNT) {2788parseMode = PARSEMODE_SCOPELESS;2789}2790else {2791StrCopy(scriptFunctionList[scriptFunctionCount].name, funcName);2792scriptFunctionList[scriptFunctionCount].access = ACCESS_PUBLIC;2793scriptFunctionList[scriptFunctionCount].ptr.scriptCodePtr = scriptCodePos;2794scriptFunctionList[scriptFunctionCount].ptr.jumpTablePtr = jumpTablePos;27952796scriptCodeOffset = scriptCodePos;2797jumpTableOffset = jumpTablePos;2798parseMode = PARSEMODE_FUNCTION;2799++scriptFunctionCount;2800}2801}2802else {2803StrCopy(scriptFunctionList[funcID].name, funcName);2804scriptFunctionList[funcID].access = ACCESS_PUBLIC;2805scriptFunctionList[funcID].ptr.scriptCodePtr = scriptCodePos;2806scriptFunctionList[funcID].ptr.jumpTablePtr = jumpTablePos;28072808scriptCodeOffset = scriptCodePos;2809jumpTableOffset = jumpTablePos;2810parseMode = PARSEMODE_FUNCTION;2811}2812}2813else if (FindStringToken(scriptText, "privatefunction", 1) == 0) { // regular private decl2814char funcName[0x40];2815for (textPos = 15; scriptText[textPos]; ++textPos) funcName[textPos - 15] = scriptText[textPos];28162817funcName[textPos - 15] = 0;2818int32 funcID = -1;2819for (int32 f = 0; f < scriptFunctionCount; ++f) {2820if (StrComp(funcName, scriptFunctionList[f].name))2821funcID = f;2822}28232824if (funcID <= -1) {2825if (scriptFunctionCount >= LEGACY_v4_FUNCTION_COUNT) {2826parseMode = PARSEMODE_SCOPELESS;2827}2828else {2829StrCopy(scriptFunctionList[scriptFunctionCount].name, funcName);2830scriptFunctionList[scriptFunctionCount].access = ACCESS_PRIVATE;2831scriptFunctionList[scriptFunctionCount].ptr.scriptCodePtr = scriptCodePos;2832scriptFunctionList[scriptFunctionCount].ptr.jumpTablePtr = jumpTablePos;28332834scriptCodeOffset = scriptCodePos;2835jumpTableOffset = jumpTablePos;2836parseMode = PARSEMODE_FUNCTION;2837++scriptFunctionCount;2838}2839}2840else {2841StrCopy(scriptFunctionList[funcID].name, funcName);2842scriptFunctionList[funcID].access = ACCESS_PRIVATE;2843scriptFunctionList[funcID].ptr.scriptCodePtr = scriptCodePos;2844scriptFunctionList[funcID].ptr.jumpTablePtr = jumpTablePos;28452846scriptCodeOffset = scriptCodePos;2847jumpTableOffset = jumpTablePos;2848parseMode = PARSEMODE_FUNCTION;2849}2850}2851break;28522853case PARSEMODE_PLATFORMSKIP:2854if (!disableLineIncrement)2855++lineID;28562857if (FindStringToken(scriptText, "#endplatform", 1) == 0)2858parseMode = PARSEMODE_FUNCTION;2859break;28602861case PARSEMODE_FUNCTION:2862if (!disableLineIncrement)2863++lineID;28642865if (scriptText[0]) {2866if (StrComp(scriptText, "endevent")) {2867scriptCode[scriptCodePos++] = FUNC_END;2868parseMode = PARSEMODE_SCOPELESS;2869}2870else if (StrComp(scriptText, "endfunction")) {2871scriptCode[scriptCodePos++] = FUNC_RETURN;2872parseMode = PARSEMODE_SCOPELESS;2873}2874else if (FindStringToken(scriptText, "#platform:", 1) == 0) {2875if (FindStringToken(scriptText, engine.gamePlatform, 1) == -12876&& FindStringToken(scriptText, engine.gameRenderType, 1) == -12877#if LEGACY_RETRO_USE_HAPTICS2878&& FindStringToken(scriptText, engine.gameHapticSetting, 1) == -12879#endif2880#if !RETRO_USE_ORIGINAL_CODE2881&& FindStringToken(scriptText, engine.releaseType, 1) == -1 // general flag for new stuff origins added2882#endif2883#if !RETRO_USE_ORIGINAL_CODE2884&& FindStringToken(scriptText, "USE_DECOMP", 1) == -1 // general flag for decomp-only stuff2885#endif2886#if RETRO_USE_MOD_LOADER2887&& FindStringToken(scriptText, "USE_MOD_LOADER", 1) == -12888#endif2889) {2890parseMode = PARSEMODE_PLATFORMSKIP;2891}2892}2893else if (FindStringToken(scriptText, "#endplatform", 1) == -1) {2894ConvertConditionalStatement(scriptText);2895if (ConvertSwitchStatement(scriptText)) {2896parseMode = PARSEMODE_SWITCHREAD;2897storedPos = (int32)info.readPos;2898switchDeep = 0;2899}2900ConvertArithmaticSyntax(scriptText);2901if (!ReadSwitchCase(scriptText)) {2902ConvertFunctionText(scriptText);29032904if (gameMode == ENGINE_SCRIPTERROR)2905parseMode = PARSEMODE_ERROR;2906}2907}2908}2909break;29102911case PARSEMODE_SWITCHREAD:2912if (FindStringToken(scriptText, "switch", 1) == 0)2913++switchDeep;29142915if (switchDeep) {2916if (FindStringToken(scriptText, "endswitch", 1) == 0)2917--switchDeep;2918}2919else if (FindStringToken(scriptText, "endswitch", 1) == 0) {2920Seek_Set(&info, storedPos);2921parseMode = PARSEMODE_FUNCTION;2922int32 jPos = jumpTableStack[jumpTableStackPos];2923switchDeep = abs(jumpTable[jPos + 1] - jumpTable[jPos]) + 1;2924for (textPos = 0; textPos < switchDeep; ++textPos) jumpTable[jumpTablePos++] = -1;2925}2926else {2927CheckCaseNumber(scriptText);2928}2929break;29302931case PARSEMODE_TABLEREAD:2932if (!disableLineIncrement)2933++lineID;29342935if (FindStringToken(scriptText, "endtable", 1) == 0) {2936parseMode = PARSEMODE_SCOPELESS;2937}2938else {2939if (StrLength(scriptText) >= 1)2940ReadTableValues(scriptText);29412942parseMode = PARSEMODE_TABLEREAD;2943}2944break;29452946default: break;2947}2948}29492950CloseFile(&info);2951}2952}2953#endif29542955void RSDK::Legacy::v4::LoadBytecode(int32 scriptID, bool32 globalCode)2956{2957char scriptPath[0x40];2958if (globalCode) {2959StrCopy(scriptPath, "Bytecode/GlobalCode.bin");2960}2961else {2962StrCopy(scriptPath, "Bytecode/");2963StrAdd(scriptPath, sceneInfo.listData[sceneInfo.listPos].folder);2964StrAdd(scriptPath, ".bin");2965}29662967FileInfo info;2968InitFileInfo(&info);2969if (LoadFile(&info, scriptPath, FMODE_RB)) {2970int32 *scriptCodePtr = &scriptCode[scriptCodePos];2971int32 *jumpTablePtr = &jumpTable[jumpTablePos];29722973int32 scriptCodeSize = ReadInt8(&info);2974scriptCodeSize |= ReadInt8(&info) << 8;2975scriptCodeSize |= ReadInt8(&info) << 16;2976scriptCodeSize |= ReadInt8(&info) << 24;29772978while (scriptCodeSize > 0) {2979uint8 fileBuffer = ReadInt8(&info);2980int32 blockSize = fileBuffer & 0x7F;2981if (fileBuffer >= 0x80) {2982while (blockSize > 0) {2983*scriptCodePtr = ReadInt8(&info);2984*scriptCodePtr |= ReadInt8(&info) << 8;2985*scriptCodePtr |= ReadInt8(&info) << 16;2986*scriptCodePtr |= ReadInt8(&info) << 24;29872988++scriptCodePtr;2989++scriptCodePos;2990--scriptCodeSize;2991--blockSize;2992}2993}2994else {2995while (blockSize > 0) {2996*scriptCodePtr = ReadInt8(&info);29972998++scriptCodePtr;2999++scriptCodePos;3000--scriptCodeSize;3001--blockSize;3002}3003}3004}30053006int32 jumpTableSize = ReadInt8(&info);3007jumpTableSize |= ReadInt8(&info) << 8;3008jumpTableSize |= ReadInt8(&info) << 16;3009jumpTableSize |= ReadInt8(&info) << 24;30103011while (jumpTableSize > 0) {3012uint8 fileBuffer = ReadInt8(&info);3013int32 blockSize = fileBuffer & 0x7F;30143015if (fileBuffer >= 0x80) {3016while (blockSize > 0) {3017*jumpTablePtr = ReadInt8(&info);3018*jumpTablePtr |= ReadInt8(&info) << 8;3019*jumpTablePtr |= ReadInt8(&info) << 16;3020*jumpTablePtr |= ReadInt8(&info) << 24;30213022++jumpTablePtr;3023++jumpTablePos;3024--jumpTableSize;3025--blockSize;3026}3027}3028else {3029while (blockSize > 0) {3030*jumpTablePtr = ReadInt8(&info);30313032++jumpTablePtr;3033++jumpTablePos;3034--jumpTableSize;3035--blockSize;3036}3037}3038}30393040int32 scriptCount = ReadInt8(&info);3041scriptCount |= ReadInt8(&info) << 8;30423043for (int32 s = 0; s < scriptCount; ++s) {3044ObjectScript *script = &objectScriptList[scriptID + s];30453046script->eventUpdate.scriptCodePtr = ReadInt8(&info);3047script->eventUpdate.scriptCodePtr |= ReadInt8(&info) << 8;3048script->eventUpdate.scriptCodePtr |= ReadInt8(&info) << 16;3049script->eventUpdate.scriptCodePtr |= ReadInt8(&info) << 24;30503051script->eventDraw.scriptCodePtr = ReadInt8(&info);3052script->eventDraw.scriptCodePtr |= ReadInt8(&info) << 8;3053script->eventDraw.scriptCodePtr |= ReadInt8(&info) << 16;3054script->eventDraw.scriptCodePtr |= ReadInt8(&info) << 24;30553056script->eventStartup.scriptCodePtr = ReadInt8(&info);3057script->eventStartup.scriptCodePtr |= ReadInt8(&info) << 8;3058script->eventStartup.scriptCodePtr |= ReadInt8(&info) << 16;3059script->eventStartup.scriptCodePtr |= ReadInt8(&info) << 24;3060}30613062for (int32 s = 0; s < scriptCount; ++s) {3063ObjectScript *script = &objectScriptList[scriptID + s];30643065script->eventUpdate.jumpTablePtr = ReadInt8(&info);3066script->eventUpdate.jumpTablePtr |= ReadInt8(&info) << 8;3067script->eventUpdate.jumpTablePtr |= ReadInt8(&info) << 16;3068script->eventUpdate.jumpTablePtr |= ReadInt8(&info) << 24;30693070script->eventDraw.jumpTablePtr = ReadInt8(&info);3071script->eventDraw.jumpTablePtr |= ReadInt8(&info) << 8;3072script->eventDraw.jumpTablePtr |= ReadInt8(&info) << 16;3073script->eventDraw.jumpTablePtr |= ReadInt8(&info) << 24;30743075script->eventStartup.jumpTablePtr = ReadInt8(&info);3076script->eventStartup.jumpTablePtr |= ReadInt8(&info) << 8;3077script->eventStartup.jumpTablePtr |= ReadInt8(&info) << 16;3078script->eventStartup.jumpTablePtr |= ReadInt8(&info) << 24;3079}30803081int32 functionCount = ReadInt8(&info);3082functionCount |= ReadInt8(&info) << 8;30833084for (int32 f = 0; f < functionCount; ++f) {3085ScriptFunction *function = &scriptFunctionList[f];30863087function->ptr.scriptCodePtr = ReadInt8(&info);3088function->ptr.scriptCodePtr |= ReadInt8(&info) << 8;3089function->ptr.scriptCodePtr |= ReadInt8(&info) << 16;3090function->ptr.scriptCodePtr |= ReadInt8(&info) << 24;3091}30923093for (int32 f = 0; f < functionCount; ++f) {3094ScriptFunction *function = &scriptFunctionList[f];30953096function->ptr.jumpTablePtr = ReadInt8(&info);3097function->ptr.jumpTablePtr |= ReadInt8(&info) << 8;3098function->ptr.jumpTablePtr |= ReadInt8(&info) << 16;3099function->ptr.jumpTablePtr |= ReadInt8(&info) << 24;3100}31013102CloseFile(&info);3103}3104}31053106void RSDK::Legacy::v4::ClearScriptData()3107{3108memset(scriptCode, 0, sizeof(scriptCode));3109memset(jumpTable, 0, sizeof(jumpTable));31103111memset(foreachStack, -1, sizeof(foreachStack));3112memset(jumpTableStack, 0, sizeof(jumpTableStack));3113memset(functionStack, 0, sizeof(functionStack));31143115scriptFrameCount = 0;31163117scriptCodePos = 0;3118jumpTablePos = 0;3119jumpTableStackPos = 0;3120functionStackPos = 0;31213122scriptCodePos = 0;3123scriptCodeOffset = 0;3124jumpTablePos = 0;3125jumpTableOffset = 0;31263127#if LEGACY_RETRO_USE_COMPILER3128scriptFunctionCount = 0;31293130lineID = 0;31313132scriptValueListCount = LEGACY_v4_COMMON_SCRIPT_VAR_COUNT;3133for (int32 v = LEGACY_v4_COMMON_SCRIPT_VAR_COUNT; v < LEGACY_v4_SCRIPT_VAR_COUNT; ++v) {3134MEM_ZERO(scriptValueList[v]);3135}3136#endif31373138ClearAnimationData();31393140for (int32 o = 0; o < LEGACY_v4_OBJECT_COUNT; ++o) {3141ObjectScript *scriptInfo = &objectScriptList[o];3142scriptInfo->eventUpdate.scriptCodePtr = LEGACY_v4_SCRIPTCODE_COUNT - 1;3143scriptInfo->eventUpdate.jumpTablePtr = LEGACY_v4_JUMPTABLE_COUNT - 1;3144scriptInfo->eventDraw.scriptCodePtr = LEGACY_v4_SCRIPTCODE_COUNT - 1;3145scriptInfo->eventDraw.jumpTablePtr = LEGACY_v4_JUMPTABLE_COUNT - 1;3146scriptInfo->eventStartup.scriptCodePtr = LEGACY_v4_SCRIPTCODE_COUNT - 1;3147scriptInfo->eventStartup.jumpTablePtr = LEGACY_v4_JUMPTABLE_COUNT - 1;3148scriptInfo->frameListOffset = 0;3149scriptInfo->spriteSheetID = 0;3150scriptInfo->animFile = GetDefaultAnimationRef();3151typeNames[o][0] = 0;3152}31533154for (int32 s = globalSFXCount; s < globalSFXCount + stageSFXCount; ++s) {3155sfxNames[s][0] = 0;3156}31573158for (int32 f = 0; f < LEGACY_v4_FUNCTION_COUNT; ++f) {3159scriptFunctionList[f].ptr.scriptCodePtr = LEGACY_v4_SCRIPTCODE_COUNT - 1;3160scriptFunctionList[f].ptr.jumpTablePtr = LEGACY_v4_JUMPTABLE_COUNT - 1;3161}31623163SetObjectTypeName("Blank Object", OBJ_TYPE_BLANKOBJECT);3164}31653166void RSDK::Legacy::v4::ProcessScript(int32 scriptCodeStart, int32 jumpTableStart, uint8 scriptEvent)3167{3168bool running = true;3169int32 scriptCodePtr = scriptCodeStart;3170jumpTableStackPos = 0;3171functionStackPos = 0;3172foreachStackPos = 0;31733174while (running) {3175int32 opcode = scriptCode[scriptCodePtr++];3176int32 opcodeSize = functions[opcode].opcodeSize;3177int32 scriptCodeOffset = scriptCodePtr;31783179scriptText[0] = '\0';31803181// Get Values3182for (int32 i = 0; i < opcodeSize; ++i) {3183int32 opcodeType = scriptCode[scriptCodePtr++];31843185if (opcodeType == SCRIPTVAR_VAR) {3186int32 arrayVal = 0;3187switch (scriptCode[scriptCodePtr++]) {3188case VARARR_NONE: arrayVal = objectEntityPos; break;3189case VARARR_ARRAY:3190if (scriptCode[scriptCodePtr++] == 1)3191arrayVal = scriptEng.arrayPosition[scriptCode[scriptCodePtr++]];3192else3193arrayVal = scriptCode[scriptCodePtr++];3194break;3195case VARARR_ENTNOPLUS1:3196if (scriptCode[scriptCodePtr++] == 1)3197arrayVal = scriptEng.arrayPosition[scriptCode[scriptCodePtr++]] + objectEntityPos;3198else3199arrayVal = scriptCode[scriptCodePtr++] + objectEntityPos;3200break;3201case VARARR_ENTNOMINUS1:3202if (scriptCode[scriptCodePtr++] == 1)3203arrayVal = objectEntityPos - scriptEng.arrayPosition[scriptCode[scriptCodePtr++]];3204else3205arrayVal = objectEntityPos - scriptCode[scriptCodePtr++];3206break;3207default: break;3208}32093210// Variables3211switch (scriptCode[scriptCodePtr++]) {3212default: break;3213case VAR_TEMP0: scriptEng.operands[i] = scriptEng.temp[0]; break;3214case VAR_TEMP1: scriptEng.operands[i] = scriptEng.temp[1]; break;3215case VAR_TEMP2: scriptEng.operands[i] = scriptEng.temp[2]; break;3216case VAR_TEMP3: scriptEng.operands[i] = scriptEng.temp[3]; break;3217case VAR_TEMP4: scriptEng.operands[i] = scriptEng.temp[4]; break;3218case VAR_TEMP5: scriptEng.operands[i] = scriptEng.temp[5]; break;3219case VAR_TEMP6: scriptEng.operands[i] = scriptEng.temp[6]; break;3220case VAR_TEMP7: scriptEng.operands[i] = scriptEng.temp[7]; break;3221case VAR_CHECKRESULT: scriptEng.operands[i] = scriptEng.checkResult; break;3222case VAR_ARRAYPOS0: scriptEng.operands[i] = scriptEng.arrayPosition[0]; break;3223case VAR_ARRAYPOS1: scriptEng.operands[i] = scriptEng.arrayPosition[1]; break;3224case VAR_ARRAYPOS2: scriptEng.operands[i] = scriptEng.arrayPosition[2]; break;3225case VAR_ARRAYPOS3: scriptEng.operands[i] = scriptEng.arrayPosition[3]; break;3226case VAR_ARRAYPOS4: scriptEng.operands[i] = scriptEng.arrayPosition[4]; break;3227case VAR_ARRAYPOS5: scriptEng.operands[i] = scriptEng.arrayPosition[5]; break;3228case VAR_ARRAYPOS6: scriptEng.operands[i] = scriptEng.arrayPosition[6]; break;3229case VAR_ARRAYPOS7: scriptEng.operands[i] = scriptEng.arrayPosition[7]; break;3230case VAR_GLOBAL: scriptEng.operands[i] = globalVariables[arrayVal].value; break;3231case VAR_LOCAL: scriptEng.operands[i] = scriptCode[arrayVal]; break;3232case VAR_OBJECTENTITYPOS: scriptEng.operands[i] = arrayVal; break;3233case VAR_OBJECTGROUPID: {3234scriptEng.operands[i] = objectEntityList[arrayVal].groupID;3235break;3236}3237case VAR_OBJECTTYPE: {3238scriptEng.operands[i] = objectEntityList[arrayVal].type;3239break;3240}3241case VAR_OBJECTPROPERTYVALUE: {3242scriptEng.operands[i] = objectEntityList[arrayVal].propertyValue;3243break;3244}3245case VAR_OBJECTXPOS: {3246scriptEng.operands[i] = objectEntityList[arrayVal].xpos;3247break;3248}3249case VAR_OBJECTYPOS: {3250scriptEng.operands[i] = objectEntityList[arrayVal].ypos;3251break;3252}3253case VAR_OBJECTIXPOS: {3254scriptEng.operands[i] = objectEntityList[arrayVal].xpos >> 16;3255break;3256}3257case VAR_OBJECTIYPOS: {3258scriptEng.operands[i] = objectEntityList[arrayVal].ypos >> 16;3259break;3260}3261case VAR_OBJECTXVEL: {3262scriptEng.operands[i] = objectEntityList[arrayVal].xvel;3263break;3264}3265case VAR_OBJECTYVEL: {3266scriptEng.operands[i] = objectEntityList[arrayVal].yvel;3267break;3268}3269case VAR_OBJECTSPEED: {3270scriptEng.operands[i] = objectEntityList[arrayVal].speed;3271break;3272}3273case VAR_OBJECTSTATE: {3274scriptEng.operands[i] = objectEntityList[arrayVal].state;3275break;3276}3277case VAR_OBJECTROTATION: {3278scriptEng.operands[i] = objectEntityList[arrayVal].rotation;3279break;3280}3281case VAR_OBJECTSCALE: {3282scriptEng.operands[i] = objectEntityList[arrayVal].scale;3283break;3284}3285case VAR_OBJECTPRIORITY: {3286scriptEng.operands[i] = objectEntityList[arrayVal].priority;3287break;3288}3289case VAR_OBJECTDRAWORDER: {3290scriptEng.operands[i] = objectEntityList[arrayVal].drawOrder;3291break;3292}3293case VAR_OBJECTDIRECTION: {3294scriptEng.operands[i] = objectEntityList[arrayVal].direction;3295break;3296}3297case VAR_OBJECTINKEFFECT: {3298scriptEng.operands[i] = objectEntityList[arrayVal].inkEffect;3299break;3300}3301case VAR_OBJECTALPHA: {3302scriptEng.operands[i] = objectEntityList[arrayVal].alpha;3303break;3304}3305case VAR_OBJECTFRAME: {3306scriptEng.operands[i] = objectEntityList[arrayVal].frame;3307break;3308}3309case VAR_OBJECTANIMATION: {3310scriptEng.operands[i] = objectEntityList[arrayVal].animation;3311break;3312}3313case VAR_OBJECTPREVANIMATION: {3314scriptEng.operands[i] = objectEntityList[arrayVal].prevAnimation;3315break;3316}3317case VAR_OBJECTANIMATIONSPEED: {3318scriptEng.operands[i] = objectEntityList[arrayVal].animationSpeed;3319break;3320}3321case VAR_OBJECTANIMATIONTIMER: {3322scriptEng.operands[i] = objectEntityList[arrayVal].animationTimer;3323break;3324}3325case VAR_OBJECTANGLE: {3326scriptEng.operands[i] = objectEntityList[arrayVal].angle;3327break;3328}3329case VAR_OBJECTLOOKPOSX: {3330scriptEng.operands[i] = objectEntityList[arrayVal].lookPosX;3331break;3332}3333case VAR_OBJECTLOOKPOSY: {3334scriptEng.operands[i] = objectEntityList[arrayVal].lookPosY;3335break;3336}3337case VAR_OBJECTCOLLISIONMODE: {3338scriptEng.operands[i] = objectEntityList[arrayVal].collisionMode;3339break;3340}3341case VAR_OBJECTCOLLISIONPLANE: {3342scriptEng.operands[i] = objectEntityList[arrayVal].collisionPlane;3343break;3344}3345case VAR_OBJECTCONTROLMODE: {3346scriptEng.operands[i] = objectEntityList[arrayVal].controlMode;3347break;3348}3349case VAR_OBJECTCONTROLLOCK: {3350scriptEng.operands[i] = objectEntityList[arrayVal].controlLock;3351break;3352}3353case VAR_OBJECTPUSHING: {3354scriptEng.operands[i] = objectEntityList[arrayVal].pushing;3355break;3356}3357case VAR_OBJECTVISIBLE: {3358scriptEng.operands[i] = objectEntityList[arrayVal].visible;3359break;3360}3361case VAR_OBJECTTILECOLLISIONS: {3362scriptEng.operands[i] = objectEntityList[arrayVal].tileCollisions;3363break;3364}3365case VAR_OBJECTINTERACTION: {3366scriptEng.operands[i] = objectEntityList[arrayVal].objectInteractions;3367break;3368}3369case VAR_OBJECTGRAVITY: {3370scriptEng.operands[i] = objectEntityList[arrayVal].gravity;3371break;3372}3373case VAR_OBJECTUP: {3374scriptEng.operands[i] = objectEntityList[arrayVal].up;3375break;3376}3377case VAR_OBJECTDOWN: {3378scriptEng.operands[i] = objectEntityList[arrayVal].down;3379break;3380}3381case VAR_OBJECTLEFT: {3382scriptEng.operands[i] = objectEntityList[arrayVal].left;3383break;3384}3385case VAR_OBJECTRIGHT: {3386scriptEng.operands[i] = objectEntityList[arrayVal].right;3387break;3388}3389case VAR_OBJECTJUMPPRESS: {3390scriptEng.operands[i] = objectEntityList[arrayVal].jumpPress;3391break;3392}3393case VAR_OBJECTJUMPHOLD: {3394scriptEng.operands[i] = objectEntityList[arrayVal].jumpHold;3395break;3396}3397case VAR_OBJECTSCROLLTRACKING: {3398scriptEng.operands[i] = objectEntityList[arrayVal].scrollTracking;3399break;3400}3401case VAR_OBJECTFLOORSENSORL: {3402scriptEng.operands[i] = objectEntityList[arrayVal].floorSensors[0];3403break;3404}3405case VAR_OBJECTFLOORSENSORC: {3406scriptEng.operands[i] = objectEntityList[arrayVal].floorSensors[1];3407break;3408}3409case VAR_OBJECTFLOORSENSORR: {3410scriptEng.operands[i] = objectEntityList[arrayVal].floorSensors[2];3411break;3412}3413case VAR_OBJECTFLOORSENSORLC: {3414scriptEng.operands[i] = objectEntityList[arrayVal].floorSensors[3];3415break;3416}3417case VAR_OBJECTFLOORSENSORRC: {3418scriptEng.operands[i] = objectEntityList[arrayVal].floorSensors[4];3419break;3420}3421case VAR_OBJECTCOLLISIONLEFT: {3422AnimationFile *animFile = objectScriptList[objectEntityList[arrayVal].type].animFile;3423Entity *ent = &objectEntityList[arrayVal];3424if (animFile) {3425int32 h = animFrames[animationList[animFile->aniListOffset + ent->animation].frameListOffset + ent->frame].hitboxID;34263427scriptEng.operands[i] = hitboxList[animFile->hitboxListOffset + h].left[0];3428}3429else {3430scriptEng.operands[i] = 0;3431}3432break;3433}3434case VAR_OBJECTCOLLISIONTOP: {3435AnimationFile *animFile = objectScriptList[objectEntityList[arrayVal].type].animFile;3436Entity *ent = &objectEntityList[arrayVal];3437if (animFile) {3438int32 h = animFrames[animationList[animFile->aniListOffset + ent->animation].frameListOffset + ent->frame].hitboxID;34393440scriptEng.operands[i] = hitboxList[animFile->hitboxListOffset + h].top[0];3441}3442else {3443scriptEng.operands[i] = 0;3444}3445break;3446}3447case VAR_OBJECTCOLLISIONRIGHT: {3448AnimationFile *animFile = objectScriptList[objectEntityList[arrayVal].type].animFile;3449Entity *ent = &objectEntityList[arrayVal];3450if (animFile) {3451int32 h = animFrames[animationList[animFile->aniListOffset + ent->animation].frameListOffset + ent->frame].hitboxID;34523453scriptEng.operands[i] = hitboxList[animFile->hitboxListOffset + h].right[0];3454}3455else {3456scriptEng.operands[i] = 0;3457}3458break;3459}3460case VAR_OBJECTCOLLISIONBOTTOM: {3461AnimationFile *animFile = objectScriptList[objectEntityList[arrayVal].type].animFile;3462Entity *ent = &objectEntityList[arrayVal];3463if (animFile) {3464int32 h = animFrames[animationList[animFile->aniListOffset + ent->animation].frameListOffset + ent->frame].hitboxID;34653466scriptEng.operands[i] = hitboxList[animFile->hitboxListOffset + h].bottom[0];3467}3468else {3469scriptEng.operands[i] = 0;3470}3471break;3472}3473case VAR_OBJECTOUTOFBOUNDS: {3474int32 boundX1_2P = -(0x200 << 16);3475int32 boundX2_2P = (0x200 << 16);3476int32 boundX3_2P = -(0x180 << 16);3477int32 boundX4_2P = (0x180 << 16);34783479int32 boundY1_2P = -(0x180 << 16);3480int32 boundY2_2P = (0x180 << 16);3481int32 boundY3_2P = -(0x100 << 16);3482int32 boundY4_2P = (0x100 << 16);34833484Entity *entPtr = &objectEntityList[arrayVal];3485int32 x = entPtr->xpos >> 16;3486int32 y = entPtr->ypos >> 16;34873488if (entPtr->priority == PRIORITY_BOUNDS_SMALL || entPtr->priority == PRIORITY_ACTIVE_SMALL) {3489if (stageMode == STAGEMODE_2P) {3490x = entPtr->xpos;3491y = entPtr->ypos;34923493int32 boundL_P1 = objectEntityList[0].xpos + boundX3_2P;3494int32 boundR_P1 = objectEntityList[0].xpos + boundX4_2P;3495int32 boundT_P1 = objectEntityList[0].ypos + boundY3_2P;3496int32 boundB_P1 = objectEntityList[0].ypos + boundY4_2P;34973498int32 boundL_P2 = objectEntityList[1].xpos + boundX3_2P;3499int32 boundR_P2 = objectEntityList[1].xpos + boundX4_2P;3500int32 boundT_P2 = objectEntityList[1].ypos + boundY3_2P;3501int32 boundB_P2 = objectEntityList[1].ypos + boundY4_2P;35023503bool32 oobP1 = scriptEng.operands[i] = x <= boundL_P1 || x >= boundR_P1 || y <= boundT_P1 || y >= boundB_P1;3504bool32 oobP2 = scriptEng.operands[i] = x <= boundL_P2 || x >= boundR_P2 || y <= boundT_P2 || y >= boundB_P2;35053506scriptEng.operands[i] = oobP1 && oobP2;3507}3508else {3509int32 boundL = xScrollOffset - OBJECT_BORDER_X3;3510int32 boundR = xScrollOffset + OBJECT_BORDER_X4;3511int32 boundT = yScrollOffset - OBJECT_BORDER_Y3;3512int32 boundB = yScrollOffset + OBJECT_BORDER_Y4;35133514scriptEng.operands[i] = x <= boundL || x >= boundR || y <= boundT || y >= boundB;3515}3516}3517else {3518if (stageMode == STAGEMODE_2P) {3519x = entPtr->xpos;3520y = entPtr->ypos;35213522int32 boundL_P1 = objectEntityList[0].xpos + boundX1_2P;3523int32 boundR_P1 = objectEntityList[0].xpos + boundX2_2P;3524int32 boundT_P1 = objectEntityList[0].ypos + boundY1_2P;3525int32 boundB_P1 = objectEntityList[0].ypos + boundY2_2P;35263527int32 boundL_P2 = objectEntityList[1].xpos + boundX1_2P;3528int32 boundR_P2 = objectEntityList[1].xpos + boundX2_2P;3529int32 boundT_P2 = objectEntityList[1].ypos + boundY1_2P;3530int32 boundB_P2 = objectEntityList[1].ypos + boundY2_2P;35313532bool32 oobP1 = scriptEng.operands[i] = x <= boundL_P1 || x >= boundR_P1 || y <= boundT_P1 || y >= boundB_P1;3533bool32 oobP2 = scriptEng.operands[i] = x <= boundL_P2 || x >= boundR_P2 || y <= boundT_P2 || y >= boundB_P2;35343535scriptEng.operands[i] = oobP1 && oobP2;3536}3537else {3538int32 boundL = xScrollOffset - OBJECT_BORDER_X1;3539int32 boundR = xScrollOffset + OBJECT_BORDER_X2;3540int32 boundT = yScrollOffset - OBJECT_BORDER_Y1;3541int32 boundB = yScrollOffset + OBJECT_BORDER_Y2;35423543scriptEng.operands[i] = x <= boundL || x >= boundR || y <= boundT || y >= boundB;3544}3545}3546break;3547}3548case VAR_OBJECTSPRITESHEET: {3549scriptEng.operands[i] = objectScriptList[objectEntityList[arrayVal].type].spriteSheetID;3550break;3551}3552case VAR_OBJECTVALUE0: {3553scriptEng.operands[i] = objectEntityList[arrayVal].values[0];3554break;3555}3556case VAR_OBJECTVALUE1: {3557scriptEng.operands[i] = objectEntityList[arrayVal].values[1];3558break;3559}3560case VAR_OBJECTVALUE2: {3561scriptEng.operands[i] = objectEntityList[arrayVal].values[2];3562break;3563}3564case VAR_OBJECTVALUE3: {3565scriptEng.operands[i] = objectEntityList[arrayVal].values[3];3566break;3567}3568case VAR_OBJECTVALUE4: {3569scriptEng.operands[i] = objectEntityList[arrayVal].values[4];3570break;3571}3572case VAR_OBJECTVALUE5: {3573scriptEng.operands[i] = objectEntityList[arrayVal].values[5];3574break;3575}3576case VAR_OBJECTVALUE6: {3577scriptEng.operands[i] = objectEntityList[arrayVal].values[6];3578break;3579}3580case VAR_OBJECTVALUE7: {3581scriptEng.operands[i] = objectEntityList[arrayVal].values[7];3582break;3583}3584case VAR_OBJECTVALUE8: {3585scriptEng.operands[i] = objectEntityList[arrayVal].values[8];3586break;3587}3588case VAR_OBJECTVALUE9: {3589scriptEng.operands[i] = objectEntityList[arrayVal].values[9];3590break;3591}3592case VAR_OBJECTVALUE10: {3593scriptEng.operands[i] = objectEntityList[arrayVal].values[10];3594break;3595}3596case VAR_OBJECTVALUE11: {3597scriptEng.operands[i] = objectEntityList[arrayVal].values[11];3598break;3599}3600case VAR_OBJECTVALUE12: {3601scriptEng.operands[i] = objectEntityList[arrayVal].values[12];3602break;3603}3604case VAR_OBJECTVALUE13: {3605scriptEng.operands[i] = objectEntityList[arrayVal].values[13];3606break;3607}3608case VAR_OBJECTVALUE14: {3609scriptEng.operands[i] = objectEntityList[arrayVal].values[14];3610break;3611}3612case VAR_OBJECTVALUE15: {3613scriptEng.operands[i] = objectEntityList[arrayVal].values[15];3614break;3615}3616case VAR_OBJECTVALUE16: {3617scriptEng.operands[i] = objectEntityList[arrayVal].values[16];3618break;3619}3620case VAR_OBJECTVALUE17: {3621scriptEng.operands[i] = objectEntityList[arrayVal].values[17];3622break;3623}3624case VAR_OBJECTVALUE18: {3625scriptEng.operands[i] = objectEntityList[arrayVal].values[18];3626break;3627}3628case VAR_OBJECTVALUE19: {3629scriptEng.operands[i] = objectEntityList[arrayVal].values[19];3630break;3631}3632case VAR_OBJECTVALUE20: {3633scriptEng.operands[i] = objectEntityList[arrayVal].values[20];3634break;3635}3636case VAR_OBJECTVALUE21: {3637scriptEng.operands[i] = objectEntityList[arrayVal].values[21];3638break;3639}3640case VAR_OBJECTVALUE22: {3641scriptEng.operands[i] = objectEntityList[arrayVal].values[22];3642break;3643}3644case VAR_OBJECTVALUE23: {3645scriptEng.operands[i] = objectEntityList[arrayVal].values[23];3646break;3647}3648case VAR_OBJECTVALUE24: {3649scriptEng.operands[i] = objectEntityList[arrayVal].values[24];3650break;3651}3652case VAR_OBJECTVALUE25: {3653scriptEng.operands[i] = objectEntityList[arrayVal].values[25];3654break;3655}3656case VAR_OBJECTVALUE26: {3657scriptEng.operands[i] = objectEntityList[arrayVal].values[26];3658break;3659}3660case VAR_OBJECTVALUE27: {3661scriptEng.operands[i] = objectEntityList[arrayVal].values[27];3662break;3663}3664case VAR_OBJECTVALUE28: {3665scriptEng.operands[i] = objectEntityList[arrayVal].values[28];3666break;3667}3668case VAR_OBJECTVALUE29: {3669scriptEng.operands[i] = objectEntityList[arrayVal].values[29];3670break;3671}3672case VAR_OBJECTVALUE30: {3673scriptEng.operands[i] = objectEntityList[arrayVal].values[30];3674break;3675}3676case VAR_OBJECTVALUE31: {3677scriptEng.operands[i] = objectEntityList[arrayVal].values[31];3678break;3679}3680case VAR_OBJECTVALUE32: {3681scriptEng.operands[i] = objectEntityList[arrayVal].values[32];3682break;3683}3684case VAR_OBJECTVALUE33: {3685scriptEng.operands[i] = objectEntityList[arrayVal].values[33];3686break;3687}3688case VAR_OBJECTVALUE34: {3689scriptEng.operands[i] = objectEntityList[arrayVal].values[34];3690break;3691}3692case VAR_OBJECTVALUE35: {3693scriptEng.operands[i] = objectEntityList[arrayVal].values[35];3694break;3695}3696case VAR_OBJECTVALUE36: {3697scriptEng.operands[i] = objectEntityList[arrayVal].values[36];3698break;3699}3700case VAR_OBJECTVALUE37: {3701scriptEng.operands[i] = objectEntityList[arrayVal].values[37];3702break;3703}3704case VAR_OBJECTVALUE38: {3705scriptEng.operands[i] = objectEntityList[arrayVal].values[38];3706break;3707}3708case VAR_OBJECTVALUE39: {3709scriptEng.operands[i] = objectEntityList[arrayVal].values[39];3710break;3711}3712case VAR_OBJECTVALUE40: {3713scriptEng.operands[i] = objectEntityList[arrayVal].values[40];3714break;3715}3716case VAR_OBJECTVALUE41: {3717scriptEng.operands[i] = objectEntityList[arrayVal].values[41];3718break;3719}3720case VAR_OBJECTVALUE42: {3721scriptEng.operands[i] = objectEntityList[arrayVal].values[42];3722break;3723}3724case VAR_OBJECTVALUE43: {3725scriptEng.operands[i] = objectEntityList[arrayVal].values[43];3726break;3727}3728case VAR_OBJECTVALUE44: {3729scriptEng.operands[i] = objectEntityList[arrayVal].values[44];3730break;3731}3732case VAR_OBJECTVALUE45: {3733scriptEng.operands[i] = objectEntityList[arrayVal].values[45];3734break;3735}3736case VAR_OBJECTVALUE46: {3737scriptEng.operands[i] = objectEntityList[arrayVal].values[46];3738break;3739}3740case VAR_OBJECTVALUE47: {3741scriptEng.operands[i] = objectEntityList[arrayVal].values[47];3742break;3743}3744case VAR_STAGESTATE: scriptEng.operands[i] = stageMode; break;3745case VAR_STAGEACTIVELIST: scriptEng.operands[i] = sceneInfo.activeCategory; break;3746case VAR_STAGELISTPOS:3747scriptEng.operands[i] = sceneInfo.listPos - sceneInfo.listCategory[sceneInfo.activeCategory].sceneOffsetStart;3748break;3749case VAR_STAGETIMEENABLED: scriptEng.operands[i] = timeEnabled; break;3750case VAR_STAGEMILLISECONDS: scriptEng.operands[i] = stageMilliseconds; break;3751case VAR_STAGESECONDS: scriptEng.operands[i] = stageSeconds; break;3752case VAR_STAGEMINUTES: scriptEng.operands[i] = stageMinutes; break;3753case VAR_STAGEACTNUM: scriptEng.operands[i] = actID; break;3754case VAR_STAGEPAUSEENABLED: scriptEng.operands[i] = pauseEnabled; break;3755case VAR_STAGELISTSIZE: scriptEng.operands[i] = sceneInfo.listCategory[RSDK::sceneInfo.activeCategory].sceneCount; break;3756case VAR_STAGENEWXBOUNDARY1: scriptEng.operands[i] = newXBoundary1; break;3757case VAR_STAGENEWXBOUNDARY2: scriptEng.operands[i] = newXBoundary2; break;3758case VAR_STAGENEWYBOUNDARY1: scriptEng.operands[i] = newYBoundary1; break;3759case VAR_STAGENEWYBOUNDARY2: scriptEng.operands[i] = newYBoundary2; break;3760case VAR_STAGECURXBOUNDARY1: scriptEng.operands[i] = curXBoundary1; break;3761case VAR_STAGECURXBOUNDARY2: scriptEng.operands[i] = curXBoundary2; break;3762case VAR_STAGECURYBOUNDARY1: scriptEng.operands[i] = curYBoundary1; break;3763case VAR_STAGECURYBOUNDARY2: scriptEng.operands[i] = curYBoundary2; break;3764case VAR_STAGEDEFORMATIONDATA0: scriptEng.operands[i] = bgDeformationData0[arrayVal]; break;3765case VAR_STAGEDEFORMATIONDATA1: scriptEng.operands[i] = bgDeformationData1[arrayVal]; break;3766case VAR_STAGEDEFORMATIONDATA2: scriptEng.operands[i] = bgDeformationData2[arrayVal]; break;3767case VAR_STAGEDEFORMATIONDATA3: scriptEng.operands[i] = bgDeformationData3[arrayVal]; break;3768case VAR_STAGEWATERLEVEL: scriptEng.operands[i] = waterLevel; break;3769case VAR_STAGEACTIVELAYER: scriptEng.operands[i] = activeTileLayers[arrayVal]; break;3770case VAR_STAGEMIDPOINT: scriptEng.operands[i] = tLayerMidPoint; break;3771case VAR_STAGEPLAYERLISTPOS: scriptEng.operands[i] = playerListPos; break;3772case VAR_STAGEDEBUGMODE: scriptEng.operands[i] = debugMode; break;3773case VAR_STAGEENTITYPOS: scriptEng.operands[i] = objectEntityPos; break;3774case VAR_SCREENCAMERAENABLED: scriptEng.operands[i] = currentCamera->enabled; break;3775case VAR_SCREENCAMERATARGET: scriptEng.operands[i] = currentCamera->target; break;3776case VAR_SCREENCAMERASTYLE: scriptEng.operands[i] = currentCamera->style; break;3777case VAR_SCREENCAMERAX: scriptEng.operands[i] = currentCamera->xpos; break;3778case VAR_SCREENCAMERAY: scriptEng.operands[i] = currentCamera->ypos; break;3779case VAR_SCREENDRAWLISTSIZE: scriptEng.operands[i] = drawListEntries[arrayVal].listSize; break;3780case VAR_SCREENXCENTER: scriptEng.operands[i] = SCREEN_CENTERX; break;3781case VAR_SCREENYCENTER: scriptEng.operands[i] = SCREEN_YSIZE / 2; break;3782case VAR_SCREENXSIZE: scriptEng.operands[i] = SCREEN_XSIZE; break;3783case VAR_SCREENYSIZE: scriptEng.operands[i] = SCREEN_YSIZE; break;3784case VAR_SCREENXOFFSET: scriptEng.operands[i] = xScrollOffset; break;3785case VAR_SCREENYOFFSET: scriptEng.operands[i] = yScrollOffset; break;3786case VAR_SCREENSHAKEX: scriptEng.operands[i] = cameraShakeX; break;3787case VAR_SCREENSHAKEY: scriptEng.operands[i] = cameraShakeY; break;3788case VAR_SCREENADJUSTCAMERAY: scriptEng.operands[i] = currentCamera->adjustY; break;3789case VAR_TOUCHSCREENDOWN: scriptEng.operands[i] = touchInfo.down[arrayVal]; break;3790case VAR_TOUCHSCREENXPOS: scriptEng.operands[i] = (int32)(touchInfo.x[arrayVal] * SCREEN_XSIZE); break;3791case VAR_TOUCHSCREENYPOS: scriptEng.operands[i] = (int32)(touchInfo.y[arrayVal] * SCREEN_YSIZE); break;3792case VAR_MUSICVOLUME: scriptEng.operands[i] = musicVolume; break;3793case VAR_MUSICCURRENTTRACK: scriptEng.operands[i] = musicCurrentTrack; break;3794case VAR_MUSICPOSITION: scriptEng.operands[i] = 0; break;3795case VAR_KEYDOWNUP: scriptEng.operands[i] = controller[arrayVal].keyUp.down; break;3796case VAR_KEYDOWNDOWN: scriptEng.operands[i] = controller[arrayVal].keyDown.down; break;3797case VAR_KEYDOWNLEFT: scriptEng.operands[i] = controller[arrayVal].keyLeft.down; break;3798case VAR_KEYDOWNRIGHT: scriptEng.operands[i] = controller[arrayVal].keyRight.down; break;3799case VAR_KEYDOWNBUTTONA: scriptEng.operands[i] = controller[arrayVal].keyA.down; break;3800case VAR_KEYDOWNBUTTONB: scriptEng.operands[i] = controller[arrayVal].keyB.down; break;3801case VAR_KEYDOWNBUTTONC: scriptEng.operands[i] = controller[arrayVal].keyC.down; break;3802case VAR_KEYDOWNBUTTONX: scriptEng.operands[i] = controller[arrayVal].keyX.down; break;3803case VAR_KEYDOWNBUTTONY: scriptEng.operands[i] = controller[arrayVal].keyY.down; break;3804case VAR_KEYDOWNBUTTONZ: scriptEng.operands[i] = controller[arrayVal].keyZ.down; break;3805case VAR_KEYDOWNBUTTONL: scriptEng.operands[i] = triggerL[arrayVal].keyBumper.down; break;3806case VAR_KEYDOWNBUTTONR: scriptEng.operands[i] = triggerR[arrayVal].keyBumper.down; break;3807case VAR_KEYDOWNSTART: scriptEng.operands[i] = controller[arrayVal].keyStart.down; break;3808case VAR_KEYDOWNSELECT: scriptEng.operands[i] = controller[arrayVal].keySelect.down; break;3809case VAR_KEYPRESSUP: scriptEng.operands[i] = controller[arrayVal].keyUp.press; break;3810case VAR_KEYPRESSDOWN: scriptEng.operands[i] = controller[arrayVal].keyDown.press; break;3811case VAR_KEYPRESSLEFT: scriptEng.operands[i] = controller[arrayVal].keyLeft.press; break;3812case VAR_KEYPRESSRIGHT: scriptEng.operands[i] = controller[arrayVal].keyRight.press; break;3813case VAR_KEYPRESSBUTTONA: scriptEng.operands[i] = controller[arrayVal].keyA.press; break;3814case VAR_KEYPRESSBUTTONB: scriptEng.operands[i] = controller[arrayVal].keyB.press; break;3815case VAR_KEYPRESSBUTTONC: scriptEng.operands[i] = controller[arrayVal].keyC.press; break;3816case VAR_KEYPRESSBUTTONX: scriptEng.operands[i] = controller[arrayVal].keyX.press; break;3817case VAR_KEYPRESSBUTTONY: scriptEng.operands[i] = controller[arrayVal].keyY.press; break;3818case VAR_KEYPRESSBUTTONZ: scriptEng.operands[i] = controller[arrayVal].keyZ.press; break;3819case VAR_KEYPRESSBUTTONL: scriptEng.operands[i] = triggerL[arrayVal].keyBumper.down; break;3820case VAR_KEYPRESSBUTTONR: scriptEng.operands[i] = triggerR[arrayVal].keyBumper.down; break;3821case VAR_KEYPRESSSTART: scriptEng.operands[i] = controller[arrayVal].keyStart.press; break;3822case VAR_KEYPRESSSELECT: scriptEng.operands[i] = controller[arrayVal].keySelect.press; break;3823case VAR_MENU1SELECTION: scriptEng.operands[i] = gameMenu[0].selection1; break;3824case VAR_MENU2SELECTION: scriptEng.operands[i] = gameMenu[1].selection1; break;3825case VAR_TILELAYERXSIZE: scriptEng.operands[i] = stageLayouts[arrayVal].xsize; break;3826case VAR_TILELAYERYSIZE: scriptEng.operands[i] = stageLayouts[arrayVal].ysize; break;3827case VAR_TILELAYERTYPE: scriptEng.operands[i] = stageLayouts[arrayVal].type; break;3828case VAR_TILELAYERANGLE: scriptEng.operands[i] = stageLayouts[arrayVal].angle; break;3829case VAR_TILELAYERXPOS: scriptEng.operands[i] = stageLayouts[arrayVal].xpos; break;3830case VAR_TILELAYERYPOS: scriptEng.operands[i] = stageLayouts[arrayVal].ypos; break;3831case VAR_TILELAYERZPOS: scriptEng.operands[i] = stageLayouts[arrayVal].zpos; break;3832case VAR_TILELAYERPARALLAXFACTOR: scriptEng.operands[i] = stageLayouts[arrayVal].parallaxFactor; break;3833case VAR_TILELAYERSCROLLSPEED: scriptEng.operands[i] = stageLayouts[arrayVal].scrollSpeed; break;3834case VAR_TILELAYERSCROLLPOS: scriptEng.operands[i] = stageLayouts[arrayVal].scrollPos; break;3835case VAR_TILELAYERDEFORMATIONOFFSET: scriptEng.operands[i] = stageLayouts[arrayVal].deformationOffset; break;3836case VAR_TILELAYERDEFORMATIONOFFSETW: scriptEng.operands[i] = stageLayouts[arrayVal].deformationOffsetW; break;3837case VAR_HPARALLAXPARALLAXFACTOR: scriptEng.operands[i] = hParallax.parallaxFactor[arrayVal]; break;3838case VAR_HPARALLAXSCROLLSPEED: scriptEng.operands[i] = hParallax.scrollSpeed[arrayVal]; break;3839case VAR_HPARALLAXSCROLLPOS: scriptEng.operands[i] = hParallax.scrollPos[arrayVal]; break;3840case VAR_VPARALLAXPARALLAXFACTOR: scriptEng.operands[i] = vParallax.parallaxFactor[arrayVal]; break;3841case VAR_VPARALLAXSCROLLSPEED: scriptEng.operands[i] = vParallax.scrollSpeed[arrayVal]; break;3842case VAR_VPARALLAXSCROLLPOS: scriptEng.operands[i] = vParallax.scrollPos[arrayVal]; break;3843case VAR_SCENE3DVERTEXCOUNT: scriptEng.operands[i] = vertexCount; break;3844case VAR_SCENE3DFACECOUNT: scriptEng.operands[i] = faceCount; break;3845case VAR_SCENE3DPROJECTIONX: scriptEng.operands[i] = projectionX; break;3846case VAR_SCENE3DPROJECTIONY: scriptEng.operands[i] = projectionY; break;3847case VAR_SCENE3DFOGCOLOR: scriptEng.operands[i] = fogColor; break;3848case VAR_SCENE3DFOGSTRENGTH: scriptEng.operands[i] = fogStrength; break;3849case VAR_VERTEXBUFFERX: scriptEng.operands[i] = vertexBuffer[arrayVal].x; break;3850case VAR_VERTEXBUFFERY: scriptEng.operands[i] = vertexBuffer[arrayVal].y; break;3851case VAR_VERTEXBUFFERZ: scriptEng.operands[i] = vertexBuffer[arrayVal].z; break;3852case VAR_VERTEXBUFFERU: scriptEng.operands[i] = vertexBuffer[arrayVal].u; break;3853case VAR_VERTEXBUFFERV: scriptEng.operands[i] = vertexBuffer[arrayVal].v; break;3854case VAR_FACEBUFFERA: scriptEng.operands[i] = faceBuffer[arrayVal].a; break;3855case VAR_FACEBUFFERB: scriptEng.operands[i] = faceBuffer[arrayVal].b; break;3856case VAR_FACEBUFFERC: scriptEng.operands[i] = faceBuffer[arrayVal].c; break;3857case VAR_FACEBUFFERD: scriptEng.operands[i] = faceBuffer[arrayVal].d; break;3858case VAR_FACEBUFFERFLAG: scriptEng.operands[i] = faceBuffer[arrayVal].flag; break;3859case VAR_FACEBUFFERCOLOR: scriptEng.operands[i] = faceBuffer[arrayVal].color; break;3860case VAR_SAVERAM: scriptEng.operands[i] = saveRAM[arrayVal]; break;3861case VAR_ENGINESTATE: scriptEng.operands[i] = gameMode; break;3862case VAR_ENGINELANGUAGE: scriptEng.operands[i] = language; break;3863case VAR_ENGINEONLINEACTIVE: scriptEng.operands[i] = onlineActive; break;3864case VAR_ENGINESFXVOLUME: scriptEng.operands[i] = sfxVolume; break;3865case VAR_ENGINEBGMVOLUME: scriptEng.operands[i] = bgmVolume; break;3866case VAR_ENGINETRIALMODE: scriptEng.operands[i] = trialMode; break;3867case VAR_ENGINEDEVICETYPE: scriptEng.operands[i] = deviceType; break;38683869// Origins Extras3870case VAR_SCREENCURRENTID: scriptEng.operands[i] = sceneInfo.currentScreenID; break;3871case VAR_CAMERAENABLED: scriptEng.operands[i] = cameras[arrayVal].enabled; break;3872case VAR_CAMERATARGET: scriptEng.operands[i] = cameras[arrayVal].target; break;3873case VAR_CAMERASTYLE: scriptEng.operands[i] = cameras[arrayVal].style; break;3874case VAR_CAMERAXPOS: scriptEng.operands[i] = cameras[arrayVal].xpos; break;3875case VAR_CAMERAYPOS: scriptEng.operands[i] = cameras[arrayVal].ypos; break;3876case VAR_CAMERAADJUSTY: scriptEng.operands[i] = cameras[arrayVal].adjustY; break;38773878#if LEGACY_RETRO_USE_HAPTICS3879case VAR_HAPTICSENABLED: scriptEng.operands[i] = hapticsEnabled; break;3880#endif3881}3882}3883else if (opcodeType == SCRIPTVAR_INTCONST) { // int32 constant3884scriptEng.operands[i] = scriptCode[scriptCodePtr++];3885}3886else if (opcodeType == SCRIPTVAR_STRCONST) { // string constant3887int32 strLen = scriptCode[scriptCodePtr++];3888scriptText[strLen] = 0;3889for (int32 c = 0; c < strLen; ++c) {3890switch (c % 4) {3891case 0: {3892scriptText[c] = scriptCode[scriptCodePtr] >> 24;3893break;3894}3895case 1: {3896scriptText[c] = (0xFFFFFF & scriptCode[scriptCodePtr]) >> 16;3897break;3898}3899case 2: {3900scriptText[c] = (0xFFFF & scriptCode[scriptCodePtr]) >> 8;3901break;3902}3903case 3: {3904scriptText[c] = scriptCode[scriptCodePtr++];3905break;3906}3907default: break;3908}3909}3910scriptCodePtr++;3911}3912}39133914ObjectScript *scriptInfo = &objectScriptList[objectEntityList[objectEntityPos].type];3915Entity *entity = &objectEntityList[objectEntityPos];3916SpriteFrame *spriteFrame = nullptr;39173918// Functions3919switch (opcode) {3920default: break;3921case FUNC_END: running = false; break;3922case FUNC_EQUAL: scriptEng.operands[0] = scriptEng.operands[1]; break;3923case FUNC_ADD: scriptEng.operands[0] += scriptEng.operands[1]; break;3924case FUNC_SUB: scriptEng.operands[0] -= scriptEng.operands[1]; break;3925case FUNC_INC: ++scriptEng.operands[0]; break;3926case FUNC_DEC: --scriptEng.operands[0]; break;3927case FUNC_MUL: scriptEng.operands[0] *= scriptEng.operands[1]; break;3928case FUNC_DIV: scriptEng.operands[0] /= scriptEng.operands[1]; break;3929case FUNC_SHR: scriptEng.operands[0] >>= scriptEng.operands[1]; break;3930case FUNC_SHL: scriptEng.operands[0] <<= scriptEng.operands[1]; break;3931case FUNC_AND: scriptEng.operands[0] &= scriptEng.operands[1]; break;3932case FUNC_OR: scriptEng.operands[0] |= scriptEng.operands[1]; break;3933case FUNC_XOR: scriptEng.operands[0] ^= scriptEng.operands[1]; break;3934case FUNC_MOD: scriptEng.operands[0] %= scriptEng.operands[1]; break;3935case FUNC_FLIPSIGN: scriptEng.operands[0] = -scriptEng.operands[0]; break;3936case FUNC_CHECKEQUAL:3937scriptEng.checkResult = scriptEng.operands[0] == scriptEng.operands[1];3938opcodeSize = 0;3939break;3940case FUNC_CHECKGREATER:3941scriptEng.checkResult = scriptEng.operands[0] > scriptEng.operands[1];3942opcodeSize = 0;3943break;3944case FUNC_CHECKLOWER:3945scriptEng.checkResult = scriptEng.operands[0] < scriptEng.operands[1];3946opcodeSize = 0;3947break;3948case FUNC_CHECKNOTEQUAL:3949scriptEng.checkResult = scriptEng.operands[0] != scriptEng.operands[1];3950opcodeSize = 0;3951break;3952case FUNC_IFEQUAL:3953if (scriptEng.operands[1] != scriptEng.operands[2])3954scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0]];3955jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];3956opcodeSize = 0;3957break;3958case FUNC_IFGREATER:3959if (scriptEng.operands[1] <= scriptEng.operands[2])3960scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0]];3961jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];3962opcodeSize = 0;3963break;3964case FUNC_IFGREATEROREQUAL:3965if (scriptEng.operands[1] < scriptEng.operands[2])3966scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0]];3967jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];3968opcodeSize = 0;3969break;3970case FUNC_IFLOWER:3971if (scriptEng.operands[1] >= scriptEng.operands[2])3972scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0]];3973jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];3974opcodeSize = 0;3975break;3976case FUNC_IFLOWEROREQUAL:3977if (scriptEng.operands[1] > scriptEng.operands[2])3978scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0]];3979jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];3980opcodeSize = 0;3981break;3982case FUNC_IFNOTEQUAL:3983if (scriptEng.operands[1] == scriptEng.operands[2])3984scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0]];3985jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];3986opcodeSize = 0;3987break;3988case FUNC_ELSE:3989opcodeSize = 0;3990scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + jumpTableStack[jumpTableStackPos--] + 1];3991break;3992case FUNC_ENDIF:3993opcodeSize = 0;3994--jumpTableStackPos;3995break;3996case FUNC_WEQUAL:3997if (scriptEng.operands[1] != scriptEng.operands[2])3998scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0] + 1];3999else4000jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];4001opcodeSize = 0;4002break;4003case FUNC_WGREATER:4004if (scriptEng.operands[1] <= scriptEng.operands[2])4005scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0] + 1];4006else4007jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];4008opcodeSize = 0;4009break;4010case FUNC_WGREATEROREQUAL:4011if (scriptEng.operands[1] < scriptEng.operands[2])4012scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0] + 1];4013else4014jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];4015opcodeSize = 0;4016break;4017case FUNC_WLOWER:4018if (scriptEng.operands[1] >= scriptEng.operands[2])4019scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0] + 1];4020else4021jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];4022opcodeSize = 0;4023break;4024case FUNC_WLOWEROREQUAL:4025if (scriptEng.operands[1] > scriptEng.operands[2])4026scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0] + 1];4027else4028jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];4029opcodeSize = 0;4030break;4031case FUNC_WNOTEQUAL:4032if (scriptEng.operands[1] == scriptEng.operands[2])4033scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0] + 1];4034else4035jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];4036opcodeSize = 0;4037break;4038case FUNC_LOOP:4039opcodeSize = 0;4040scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + jumpTableStack[jumpTableStackPos--]];4041break;4042case FUNC_FOREACHACTIVE: {4043int32 groupID = scriptEng.operands[1];4044if (groupID < LEGACY_v4_TYPEGROUP_COUNT) {4045int32 loop = foreachStack[++foreachStackPos] + 1;4046foreachStack[foreachStackPos] = loop;4047if (loop >= objectTypeGroupList[groupID].listSize) {4048opcodeSize = 0;4049foreachStack[foreachStackPos--] = -1;4050scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0] + 1];4051break;4052}4053else {4054scriptEng.operands[2] = objectTypeGroupList[groupID].entityRefs[loop];4055jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];4056}4057}4058else {4059opcodeSize = 0;4060scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0] + 1];4061}4062break;4063}4064case FUNC_FOREACHALL: {4065int32 objType = scriptEng.operands[1];4066if (objType < LEGACY_v4_OBJECT_COUNT) {4067int32 loop = foreachStack[++foreachStackPos] + 1;4068foreachStack[foreachStackPos] = loop;40694070if (scriptEvent == EVENT_SETUP) {4071while (true) {4072if (loop >= LEGACY_v4_TEMPENTITY_START) {4073opcodeSize = 0;4074foreachStack[foreachStackPos--] = -1;4075scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0] + 1];4076break;4077}4078else if (objType == objectEntityList[loop].type) {4079scriptEng.operands[2] = loop;4080jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];4081break;4082}4083else {4084foreachStack[foreachStackPos] = ++loop;4085}4086}4087}4088else {4089while (true) {4090if (loop >= LEGACY_v4_ENTITY_COUNT) {4091opcodeSize = 0;4092foreachStack[foreachStackPos--] = -1;4093scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0] + 1];4094break;4095}4096else if (objType == objectEntityList[loop].type) {4097scriptEng.operands[2] = loop;4098jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];4099break;4100}4101else {4102foreachStack[foreachStackPos] = ++loop;4103}4104}4105}4106}4107else {4108opcodeSize = 0;4109scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0] + 1];4110}4111break;4112}4113case FUNC_NEXT:4114opcodeSize = 0;4115scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + jumpTableStack[jumpTableStackPos--]];4116--foreachStackPos;4117break;4118case FUNC_SWITCH:4119jumpTableStack[++jumpTableStackPos] = scriptEng.operands[0];4120if (scriptEng.operands[1] < jumpTable[jumpTableStart + scriptEng.operands[0]]4121|| scriptEng.operands[1] > jumpTable[jumpTableStart + scriptEng.operands[0] + 1])4122scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + scriptEng.operands[0] + 2];4123else4124scriptCodePtr = scriptCodeStart4125+ jumpTable[jumpTableStart + scriptEng.operands[0] + 44126+ (scriptEng.operands[1] - jumpTable[jumpTableStart + scriptEng.operands[0]])];4127opcodeSize = 0;4128break;4129case FUNC_BREAK:4130opcodeSize = 0;4131scriptCodePtr = scriptCodeStart + jumpTable[jumpTableStart + jumpTableStack[jumpTableStackPos--] + 3];4132break;4133case FUNC_ENDSWITCH:4134opcodeSize = 0;4135--jumpTableStackPos;4136break;4137case FUNC_RAND: scriptEng.operands[0] = rand() % scriptEng.operands[1]; break;4138case FUNC_SIN: {4139scriptEng.operands[0] = Sin512(scriptEng.operands[1]);4140break;4141}4142case FUNC_COS: {4143scriptEng.operands[0] = Cos512(scriptEng.operands[1]);4144break;4145}4146case FUNC_SIN256: {4147scriptEng.operands[0] = Sin256(scriptEng.operands[1]);4148break;4149}4150case FUNC_COS256: {4151scriptEng.operands[0] = Cos256(scriptEng.operands[1]);4152break;4153}4154case FUNC_ATAN2: {4155scriptEng.operands[0] = ArcTanLookup(scriptEng.operands[1], scriptEng.operands[2]);4156break;4157}4158case FUNC_INTERPOLATE:4159scriptEng.operands[0] =4160(scriptEng.operands[2] * (0x100 - scriptEng.operands[3]) + scriptEng.operands[3] * scriptEng.operands[1]) >> 8;4161break;4162case FUNC_INTERPOLATEXY:4163scriptEng.operands[0] =4164(scriptEng.operands[3] * (0x100 - scriptEng.operands[6]) >> 8) + ((scriptEng.operands[6] * scriptEng.operands[2]) >> 8);4165scriptEng.operands[1] =4166(scriptEng.operands[5] * (0x100 - scriptEng.operands[6]) >> 8) + (scriptEng.operands[6] * scriptEng.operands[4] >> 8);4167break;4168case FUNC_LOADSPRITESHEET:4169opcodeSize = 0;4170scriptInfo->spriteSheetID = AddGraphicsFile(scriptText);4171break;4172case FUNC_REMOVESPRITESHEET:4173opcodeSize = 0;4174RemoveGraphicsFile(scriptText, -1);4175break;4176case FUNC_DRAWSPRITE:4177opcodeSize = 0;4178spriteFrame = &scriptFrames[scriptInfo->frameListOffset + scriptEng.operands[0]];4179DrawSprite((entity->xpos >> 16) - xScrollOffset + spriteFrame->pivotX, (entity->ypos >> 16) - yScrollOffset + spriteFrame->pivotY,4180spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4181break;4182case FUNC_DRAWSPRITEXY:4183opcodeSize = 0;4184spriteFrame = &scriptFrames[scriptInfo->frameListOffset + scriptEng.operands[0]];4185DrawSprite((scriptEng.operands[1] >> 16) - xScrollOffset + spriteFrame->pivotX,4186(scriptEng.operands[2] >> 16) - yScrollOffset + spriteFrame->pivotY, spriteFrame->width, spriteFrame->height,4187spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4188break;4189case FUNC_DRAWSPRITESCREENXY:4190opcodeSize = 0;4191spriteFrame = &scriptFrames[scriptInfo->frameListOffset + scriptEng.operands[0]];4192DrawSprite(scriptEng.operands[1] + spriteFrame->pivotX, scriptEng.operands[2] + spriteFrame->pivotY, spriteFrame->width,4193spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4194break;4195case FUNC_DRAWTINTRECT:4196opcodeSize = 0;4197DrawTintRectangle(scriptEng.operands[0], scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]);4198break;4199case FUNC_DRAWNUMBERS: {4200opcodeSize = 0;4201int32 i = 10;4202if (scriptEng.operands[6]) {4203while (scriptEng.operands[4] > 0) {4204int32 frameID = scriptEng.operands[3] % i / (i / 10) + scriptEng.operands[0];4205spriteFrame = &scriptFrames[scriptInfo->frameListOffset + frameID];4206DrawSprite(spriteFrame->pivotX + scriptEng.operands[1], spriteFrame->pivotY + scriptEng.operands[2], spriteFrame->width,4207spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4208scriptEng.operands[1] -= scriptEng.operands[5];4209i *= 10;4210--scriptEng.operands[4];4211}4212}4213else {4214int32 extra = 10;4215if (scriptEng.operands[3])4216extra = 10 * scriptEng.operands[3];4217while (scriptEng.operands[4] > 0) {4218if (extra >= i) {4219int32 frameID = scriptEng.operands[3] % i / (i / 10) + scriptEng.operands[0];4220spriteFrame = &scriptFrames[scriptInfo->frameListOffset + frameID];4221DrawSprite(spriteFrame->pivotX + scriptEng.operands[1], spriteFrame->pivotY + scriptEng.operands[2], spriteFrame->width,4222spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4223}4224scriptEng.operands[1] -= scriptEng.operands[5];4225i *= 10;4226--scriptEng.operands[4];4227}4228}4229break;4230}4231case FUNC_DRAWACTNAME: {4232opcodeSize = 0;4233int32 charID = 0;4234switch (scriptEng.operands[3]) { // Draw Mode4235case 0: // Draw Word 1 (but aligned from the right instead of left)4236charID = 0;42374238for (charID = 0;; ++charID) {4239int32 nextChar = titleCardText[charID + 1];4240if (nextChar == '-' || !nextChar)4241break;4242}42434244while (charID >= 0) {4245int32 character = titleCardText[charID];4246if (character == ' ')4247character = -1; // special space char4248if (character == '-')4249character = 0;4250if (character >= '0' && character <= '9')4251character -= 22;4252if (character > '9' && character < 'f')4253character -= 'A';42544255if (character <= -1) {4256scriptEng.operands[1] -= scriptEng.operands[5] + scriptEng.operands[6]; // spaceWidth + spacing4257}4258else {4259character += scriptEng.operands[0];4260spriteFrame = &scriptFrames[scriptInfo->frameListOffset + character];42614262scriptEng.operands[1] -= spriteFrame->width + scriptEng.operands[6];42634264DrawSprite(scriptEng.operands[1] + spriteFrame->pivotX, scriptEng.operands[2] + spriteFrame->pivotY,4265spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4266}4267charID--;4268}4269break;42704271case 1: // Draw Word 14272charID = 0;42734274// Draw the first letter as a capital letter, the rest are lowercase4275// (if scriptEng.operands[4] is trueotherwise they're all uppercase)4276if (scriptEng.operands[4] == 1 && titleCardText[charID] != 0) {4277int32 character = titleCardText[charID];4278if (character == ' ')4279character = 0;4280if (character == '-')4281character = 0;4282if (character >= '0' && character <= '9')4283character -= 22;4284if (character > '9' && character < 'f')4285character -= 'A';42864287if (character <= -1) {4288scriptEng.operands[1] += scriptEng.operands[5] + scriptEng.operands[6]; // spaceWidth + spacing4289}4290else {4291character += scriptEng.operands[0];4292spriteFrame = &scriptFrames[scriptInfo->frameListOffset + character];4293DrawSprite(scriptEng.operands[1] + spriteFrame->pivotX, scriptEng.operands[2] + spriteFrame->pivotY,4294spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4295scriptEng.operands[1] += spriteFrame->width + scriptEng.operands[6];4296}42974298scriptEng.operands[0] += 26;4299charID++;4300}43014302while (titleCardText[charID] != 0 && titleCardText[charID] != '-') {4303int32 character = titleCardText[charID];4304if (character == ' ')4305character = 0;4306if (character == '-')4307character = 0;4308if (character > '/' && character < ':')4309character -= 22;4310if (character > '9' && character < 'f')4311character -= 'A';43124313if (character <= -1) {4314scriptEng.operands[1] += scriptEng.operands[5] + scriptEng.operands[6]; // spaceWidth + spacing4315}4316else {4317character += scriptEng.operands[0];4318spriteFrame = &scriptFrames[scriptInfo->frameListOffset + character];4319DrawSprite(scriptEng.operands[1] + spriteFrame->pivotX, scriptEng.operands[2] + spriteFrame->pivotY,4320spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4321scriptEng.operands[1] += spriteFrame->width + scriptEng.operands[6];4322}4323charID++;4324}4325break;43264327case 2: // Draw Word 24328charID = titleCardWord2;43294330// Draw the first letter as a capital letter, the rest are lowercase4331// (if scriptEng.operands[4] is true, otherwise they're all uppercase)4332if (scriptEng.operands[4] == 1 && titleCardText[charID] != 0) {4333int32 character = titleCardText[charID];4334if (character == ' ')4335character = 0;4336if (character == '-')4337character = 0;4338if (character >= '0' && character <= '9')4339character -= 22;4340if (character > '9' && character < 'f')4341character -= 'A';43424343if (character <= -1) {4344scriptEng.operands[1] += scriptEng.operands[5] + scriptEng.operands[6]; // spaceWidth + spacing4345}4346else {4347character += scriptEng.operands[0];4348spriteFrame = &scriptFrames[scriptInfo->frameListOffset + character];4349DrawSprite(scriptEng.operands[1] + spriteFrame->pivotX, scriptEng.operands[2] + spriteFrame->pivotY,4350spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4351scriptEng.operands[1] += spriteFrame->width + scriptEng.operands[6];4352}4353scriptEng.operands[0] += 26;4354charID++;4355}43564357while (titleCardText[charID] != 0) {4358int32 character = titleCardText[charID];4359if (character == ' ')4360character = 0;4361if (character == '-')4362character = 0;4363if (character >= '0' && character <= '9')4364character -= 22;4365if (character > '9' && character < 'f')4366character -= 'A';43674368if (character <= -1) {4369scriptEng.operands[1] += scriptEng.operands[5] + scriptEng.operands[6]; // spaceWidth + spacing4370}4371else {4372character += scriptEng.operands[0];4373spriteFrame = &scriptFrames[scriptInfo->frameListOffset + character];4374DrawSprite(scriptEng.operands[1] + spriteFrame->pivotX, scriptEng.operands[2] + spriteFrame->pivotY,4375spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4376scriptEng.operands[1] += spriteFrame->width + scriptEng.operands[6];4377}4378charID++;4379}4380break;4381}4382break;4383}4384case FUNC_DRAWMENU:4385opcodeSize = 0;4386textMenuSurfaceNo = scriptInfo->spriteSheetID;4387DrawTextMenu(&gameMenu[scriptEng.operands[0]], scriptEng.operands[1], scriptEng.operands[2]);4388break;4389case FUNC_SPRITEFRAME:4390opcodeSize = 0;4391if (scriptEvent == EVENT_SETUP && scriptFrameCount < LEGACY_SPRITEFRAME_COUNT) {4392scriptFrames[scriptFrameCount].pivotX = scriptEng.operands[0];4393scriptFrames[scriptFrameCount].pivotY = scriptEng.operands[1];4394scriptFrames[scriptFrameCount].width = scriptEng.operands[2];4395scriptFrames[scriptFrameCount].height = scriptEng.operands[3];4396scriptFrames[scriptFrameCount].sprX = scriptEng.operands[4];4397scriptFrames[scriptFrameCount].sprY = scriptEng.operands[5];4398++scriptFrameCount;4399}4400break;4401case FUNC_EDITFRAME: {4402opcodeSize = 0;4403spriteFrame = &scriptFrames[scriptInfo->frameListOffset + scriptEng.operands[0]];44044405spriteFrame->pivotX = scriptEng.operands[1];4406spriteFrame->pivotY = scriptEng.operands[2];4407spriteFrame->width = scriptEng.operands[3];4408spriteFrame->height = scriptEng.operands[4];4409spriteFrame->sprX = scriptEng.operands[5];4410spriteFrame->sprY = scriptEng.operands[6];4411} break;4412case FUNC_LOADPALETTE:4413opcodeSize = 0;4414LoadPalette(scriptText, scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3], scriptEng.operands[4]);4415break;4416case FUNC_ROTATEPALETTE:4417opcodeSize = 0;4418RotatePalette(scriptEng.operands[0], scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]);4419break;4420case FUNC_SETSCREENFADE:4421opcodeSize = 0;4422SetFade(scriptEng.operands[0], scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]);4423break;4424case FUNC_SETACTIVEPALETTE:4425opcodeSize = 0;4426SetActivePalette(scriptEng.operands[0], scriptEng.operands[1], scriptEng.operands[2]);4427break;4428case FUNC_SETPALETTEFADE:4429SetPaletteFade(scriptEng.operands[0], scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3], scriptEng.operands[4],4430scriptEng.operands[5]);4431break;4432case FUNC_SETPALETTEENTRY: SetPaletteEntryPacked(scriptEng.operands[0], scriptEng.operands[1], scriptEng.operands[2]); break;4433case FUNC_GETPALETTEENTRY: scriptEng.operands[2] = GetPaletteEntryPacked(scriptEng.operands[0], scriptEng.operands[1]); break;4434case FUNC_COPYPALETTE:4435opcodeSize = 0;4436CopyPalette(scriptEng.operands[0], scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3], scriptEng.operands[4]);4437break;4438case FUNC_CLEARSCREEN:4439opcodeSize = 0;4440ClearScreen(scriptEng.operands[0]);4441break;4442case FUNC_DRAWSPRITEFX:4443opcodeSize = 0;4444spriteFrame = &scriptFrames[scriptInfo->frameListOffset + scriptEng.operands[0]];4445switch (scriptEng.operands[1]) {4446default: break;44474448case FX_SCALE:4449DrawSpriteScaled(entity->direction, (scriptEng.operands[2] >> 16) - xScrollOffset,4450(scriptEng.operands[3] >> 16) - yScrollOffset, -spriteFrame->pivotX, -spriteFrame->pivotY, entity->scale,4451entity->scale, spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY,4452scriptInfo->spriteSheetID);4453break;44544455case FX_ROTATE:4456DrawSpriteRotated(entity->direction, (scriptEng.operands[2] >> 16) - xScrollOffset,4457(scriptEng.operands[3] >> 16) - yScrollOffset, -spriteFrame->pivotX, -spriteFrame->pivotY,4458spriteFrame->sprX, spriteFrame->sprY, spriteFrame->width, spriteFrame->height, entity->rotation,4459scriptInfo->spriteSheetID);4460break;44614462case FX_ROTOZOOM:4463DrawSpriteRotozoom(entity->direction, (scriptEng.operands[2] >> 16) - xScrollOffset,4464(scriptEng.operands[3] >> 16) - yScrollOffset, -spriteFrame->pivotX, -spriteFrame->pivotY,4465spriteFrame->sprX, spriteFrame->sprY, spriteFrame->width, spriteFrame->height, entity->rotation,4466entity->scale, scriptInfo->spriteSheetID);4467break;44684469case FX_INK:4470switch (entity->inkEffect) {4471case INK_NONE:4472DrawSprite((scriptEng.operands[2] >> 16) - xScrollOffset + spriteFrame->pivotX,4473(scriptEng.operands[3] >> 16) - yScrollOffset + spriteFrame->pivotY, spriteFrame->width,4474spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4475break;44764477case INK_BLEND:4478DrawBlendedSprite((scriptEng.operands[2] >> 16) - xScrollOffset + spriteFrame->pivotX,4479(scriptEng.operands[3] >> 16) - yScrollOffset + spriteFrame->pivotY, spriteFrame->width,4480spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4481break;44824483case INK_ALPHA:4484DrawAlphaBlendedSprite((scriptEng.operands[2] >> 16) - xScrollOffset + spriteFrame->pivotX,4485(scriptEng.operands[3] >> 16) - yScrollOffset + spriteFrame->pivotY, spriteFrame->width,4486spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, entity->alpha,4487scriptInfo->spriteSheetID);4488break;44894490case INK_ADD:4491DrawAdditiveBlendedSprite((scriptEng.operands[2] >> 16) - xScrollOffset + spriteFrame->pivotX,4492(scriptEng.operands[3] >> 16) - yScrollOffset + spriteFrame->pivotY, spriteFrame->width,4493spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, entity->alpha,4494scriptInfo->spriteSheetID);4495break;44964497case INK_SUB:4498DrawSubtractiveBlendedSprite((scriptEng.operands[2] >> 16) - xScrollOffset + spriteFrame->pivotX,4499(scriptEng.operands[3] >> 16) - yScrollOffset + spriteFrame->pivotY, spriteFrame->width,4500spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, entity->alpha,4501scriptInfo->spriteSheetID);4502break;4503}4504break;4505case FX_TINT:4506if (entity->inkEffect == INK_ALPHA) {4507DrawScaledTintMask(entity->direction, (scriptEng.operands[2] >> 16) - xScrollOffset,4508(scriptEng.operands[3] >> 16) - yScrollOffset, -spriteFrame->pivotX, -spriteFrame->pivotY,4509entity->scale, entity->scale, spriteFrame->width, spriteFrame->height, spriteFrame->sprX,4510spriteFrame->sprY, scriptInfo->spriteSheetID);4511}4512else {4513DrawSpriteScaled(entity->direction, (scriptEng.operands[2] >> 16) - xScrollOffset,4514(scriptEng.operands[3] >> 16) - yScrollOffset, -spriteFrame->pivotX, -spriteFrame->pivotY, entity->scale,4515entity->scale, spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY,4516scriptInfo->spriteSheetID);4517}4518break;45194520case FX_FLIP:4521switch (entity->direction) {4522default:4523case FLIP_NONE:4524DrawSpriteFlipped((scriptEng.operands[2] >> 16) - xScrollOffset + spriteFrame->pivotX,4525(scriptEng.operands[3] >> 16) - yScrollOffset + spriteFrame->pivotY, spriteFrame->width,4526spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, FLIP_NONE, scriptInfo->spriteSheetID);4527break;45284529case FLIP_X:4530DrawSpriteFlipped((scriptEng.operands[2] >> 16) - xScrollOffset - spriteFrame->width - spriteFrame->pivotX,4531(scriptEng.operands[3] >> 16) - yScrollOffset + spriteFrame->pivotY, spriteFrame->width,4532spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, FLIP_X, scriptInfo->spriteSheetID);4533break;45344535case FLIP_Y:4536DrawSpriteFlipped((scriptEng.operands[2] >> 16) - xScrollOffset + spriteFrame->pivotX,4537(scriptEng.operands[3] >> 16) - yScrollOffset - spriteFrame->height - spriteFrame->pivotY,4538spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, FLIP_Y,4539scriptInfo->spriteSheetID);4540break;45414542case FLIP_XY:4543DrawSpriteFlipped((scriptEng.operands[2] >> 16) - xScrollOffset - spriteFrame->width - spriteFrame->pivotX,4544(scriptEng.operands[3] >> 16) - yScrollOffset - spriteFrame->height - spriteFrame->pivotY,4545spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, FLIP_XY,4546scriptInfo->spriteSheetID);4547break;4548}4549break;4550}4551break;4552case FUNC_DRAWSPRITESCREENFX:4553opcodeSize = 0;4554spriteFrame = &scriptFrames[scriptInfo->frameListOffset + scriptEng.operands[0]];45554556switch (scriptEng.operands[1]) {4557default: break;45584559case FX_SCALE:4560DrawSpriteScaled(entity->direction, scriptEng.operands[2], scriptEng.operands[3], -spriteFrame->pivotX, -spriteFrame->pivotY,4561entity->scale, entity->scale, spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY,4562scriptInfo->spriteSheetID);4563break;45644565case FX_ROTATE:4566DrawSpriteRotated(entity->direction, scriptEng.operands[2], scriptEng.operands[3], -spriteFrame->pivotX, -spriteFrame->pivotY,4567spriteFrame->sprX, spriteFrame->sprY, spriteFrame->width, spriteFrame->height, entity->rotation,4568scriptInfo->spriteSheetID);4569break;45704571case FX_ROTOZOOM:4572DrawSpriteRotozoom(entity->direction, scriptEng.operands[2], scriptEng.operands[3], -spriteFrame->pivotX,4573-spriteFrame->pivotY, spriteFrame->sprX, spriteFrame->sprY, spriteFrame->width, spriteFrame->height,4574entity->rotation, entity->scale, scriptInfo->spriteSheetID);4575break;45764577case FX_INK:4578switch (entity->inkEffect) {4579case INK_NONE:4580DrawSprite(scriptEng.operands[2] + spriteFrame->pivotX, scriptEng.operands[3] + spriteFrame->pivotY,4581spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4582break;45834584case INK_BLEND:4585DrawBlendedSprite(scriptEng.operands[2] + spriteFrame->pivotX, scriptEng.operands[3] + spriteFrame->pivotY,4586spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY,4587scriptInfo->spriteSheetID);4588break;45894590case INK_ALPHA:4591DrawAlphaBlendedSprite(scriptEng.operands[2] + spriteFrame->pivotX, scriptEng.operands[3] + spriteFrame->pivotY,4592spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, entity->alpha,4593scriptInfo->spriteSheetID);4594break;45954596case INK_ADD:4597DrawAdditiveBlendedSprite(scriptEng.operands[2] + spriteFrame->pivotX, scriptEng.operands[3] + spriteFrame->pivotY,4598spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY,4599entity->alpha, scriptInfo->spriteSheetID);4600break;46014602case INK_SUB:4603DrawSubtractiveBlendedSprite(scriptEng.operands[2] + spriteFrame->pivotX, scriptEng.operands[3] + spriteFrame->pivotY,4604spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY,4605entity->alpha, scriptInfo->spriteSheetID);4606break;4607}4608break;46094610case FX_TINT:4611if (entity->inkEffect == INK_ALPHA) {4612DrawScaledTintMask(entity->direction, scriptEng.operands[2], scriptEng.operands[3], -spriteFrame->pivotX,4613-spriteFrame->pivotY, entity->scale, entity->scale, spriteFrame->width, spriteFrame->height,4614spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4615}4616else {4617DrawSpriteScaled(entity->direction, scriptEng.operands[2], scriptEng.operands[3], -spriteFrame->pivotX,4618-spriteFrame->pivotY, entity->scale, entity->scale, spriteFrame->width, spriteFrame->height,4619spriteFrame->sprX, spriteFrame->sprY, scriptInfo->spriteSheetID);4620}4621break;46224623case FX_FLIP:4624switch (entity->direction) {4625default:4626case FLIP_NONE:4627DrawSpriteFlipped(scriptEng.operands[2] + spriteFrame->pivotX, scriptEng.operands[3] + spriteFrame->pivotY,4628spriteFrame->width, spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, FLIP_NONE,4629scriptInfo->spriteSheetID);4630break;46314632case FLIP_X:4633DrawSpriteFlipped(scriptEng.operands[2] - spriteFrame->width - spriteFrame->pivotX,4634scriptEng.operands[3] + spriteFrame->pivotY, spriteFrame->width, spriteFrame->height,4635spriteFrame->sprX, spriteFrame->sprY, FLIP_X, scriptInfo->spriteSheetID);4636break;46374638case FLIP_Y:4639DrawSpriteFlipped(scriptEng.operands[2] + spriteFrame->pivotX,4640scriptEng.operands[3] - spriteFrame->height - spriteFrame->pivotY, spriteFrame->width,4641spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, FLIP_Y, scriptInfo->spriteSheetID);4642break;46434644case FLIP_XY:4645DrawSpriteFlipped(scriptEng.operands[2] - spriteFrame->width - spriteFrame->pivotX,4646scriptEng.operands[3] - spriteFrame->height - spriteFrame->pivotY, spriteFrame->width,4647spriteFrame->height, spriteFrame->sprX, spriteFrame->sprY, FLIP_XY, scriptInfo->spriteSheetID);4648break;4649}4650break;4651}4652break;46534654case FUNC_LOADANIMATION:4655opcodeSize = 0;4656scriptInfo->animFile = AddAnimationFile(scriptText);4657break;46584659case FUNC_SETUPMENU: {4660opcodeSize = 0;4661TextMenu *menu = &gameMenu[scriptEng.operands[0]];4662SetupTextMenu(menu, scriptEng.operands[1]);4663menu->selectionCount = scriptEng.operands[2];4664menu->alignment = scriptEng.operands[3];4665break;4666}4667case FUNC_ADDMENUENTRY: {4668opcodeSize = 0;4669TextMenu *menu = &gameMenu[scriptEng.operands[0]];4670menu->entryHighlight[menu->rowCount] = scriptEng.operands[2];4671AddTextMenuEntry(menu, scriptText);4672break;4673}4674case FUNC_EDITMENUENTRY: {4675opcodeSize = 0;4676TextMenu *menu = &gameMenu[scriptEng.operands[0]];4677EditTextMenuEntry(menu, scriptText, scriptEng.operands[2]);4678menu->entryHighlight[scriptEng.operands[2]] = scriptEng.operands[3];4679break;4680}4681case FUNC_LOADSTAGE:4682opcodeSize = 0;4683stageMode = STAGEMODE_LOAD;4684break;4685case FUNC_DRAWRECT:4686opcodeSize = 0;4687DrawRectangle(scriptEng.operands[0], scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3], scriptEng.operands[4],4688scriptEng.operands[5], scriptEng.operands[6], scriptEng.operands[7]);4689break;4690case FUNC_RESETOBJECTENTITY: {4691opcodeSize = 0;4692Entity *newEnt = &objectEntityList[scriptEng.operands[0]];4693memset(newEnt, 0, sizeof(Entity));4694newEnt->type = scriptEng.operands[1];4695newEnt->propertyValue = scriptEng.operands[2];4696newEnt->xpos = scriptEng.operands[3];4697newEnt->ypos = scriptEng.operands[4];4698newEnt->direction = FLIP_NONE;4699newEnt->priority = PRIORITY_BOUNDS;4700newEnt->drawOrder = 3;4701newEnt->scale = 512;4702newEnt->inkEffect = INK_NONE;4703newEnt->objectInteractions = true;4704newEnt->visible = true;4705newEnt->tileCollisions = true;4706break;4707}4708case FUNC_BOXCOLLISIONTEST:4709opcodeSize = 0;4710switch (scriptEng.operands[0]) {4711default: break;4712case C_TOUCH:4713TouchCollision(&objectEntityList[scriptEng.operands[1]], scriptEng.operands[2], scriptEng.operands[3], scriptEng.operands[4],4714scriptEng.operands[5], &objectEntityList[scriptEng.operands[6]], scriptEng.operands[7], scriptEng.operands[8],4715scriptEng.operands[9], scriptEng.operands[10]);4716break;4717case C_SOLID:4718BoxCollision(&objectEntityList[scriptEng.operands[1]], scriptEng.operands[2], scriptEng.operands[3], scriptEng.operands[4],4719scriptEng.operands[5], &objectEntityList[scriptEng.operands[6]], scriptEng.operands[7], scriptEng.operands[8],4720scriptEng.operands[9], scriptEng.operands[10]);4721break;4722case C_SOLID2:4723BoxCollision2(&objectEntityList[scriptEng.operands[1]], scriptEng.operands[2], scriptEng.operands[3], scriptEng.operands[4],4724scriptEng.operands[5], &objectEntityList[scriptEng.operands[6]], scriptEng.operands[7], scriptEng.operands[8],4725scriptEng.operands[9], scriptEng.operands[10]);4726break;4727case C_PLATFORM:4728PlatformCollision(&objectEntityList[scriptEng.operands[1]], scriptEng.operands[2], scriptEng.operands[3],4729scriptEng.operands[4], scriptEng.operands[5], &objectEntityList[scriptEng.operands[6]],4730scriptEng.operands[7], scriptEng.operands[8], scriptEng.operands[9], scriptEng.operands[10]);4731break;4732}4733break;4734case FUNC_CREATETEMPOBJECT: {4735opcodeSize = 0;4736if (objectEntityList[scriptEng.arrayPosition[8]].type > OBJ_TYPE_BLANKOBJECT4737&& ++scriptEng.arrayPosition[8] == LEGACY_v4_ENTITY_COUNT)4738scriptEng.arrayPosition[8] = LEGACY_v4_TEMPENTITY_START;4739Entity *temp = &objectEntityList[scriptEng.arrayPosition[8]];4740memset(temp, 0, sizeof(Entity));4741temp->type = scriptEng.operands[0];4742temp->propertyValue = scriptEng.operands[1];4743temp->xpos = scriptEng.operands[2];4744temp->ypos = scriptEng.operands[3];4745temp->direction = FLIP_NONE;4746temp->priority = PRIORITY_ACTIVE;4747temp->drawOrder = 3;4748temp->scale = 512;4749temp->inkEffect = INK_NONE;4750temp->objectInteractions = true;4751temp->visible = true;4752temp->tileCollisions = true;4753break;4754}4755case FUNC_PROCESSOBJECTMOVEMENT:4756opcodeSize = 0;4757if (entity->tileCollisions) {4758ProcessTileCollisions(entity);4759}4760else {4761entity->xpos += entity->xvel;4762entity->ypos += entity->yvel;4763}4764break;4765case FUNC_PROCESSOBJECTCONTROL:4766opcodeSize = 0;4767ProcessObjectControl(entity);4768break;4769case FUNC_PROCESSANIMATION:4770opcodeSize = 0;4771ProcessObjectAnimation(scriptInfo, entity);4772break;4773case FUNC_DRAWOBJECTANIMATION:4774opcodeSize = 0;4775if (entity->visible)4776DrawObjectAnimation(scriptInfo, entity, (entity->xpos >> 16) - xScrollOffset, (entity->ypos >> 16) - yScrollOffset);4777break;4778case FUNC_SETMUSICTRACK:4779opcodeSize = 0;4780if (scriptEng.operands[2] <= 1)4781SetMusicTrack(scriptText, scriptEng.operands[1], scriptEng.operands[2], 0);4782else4783SetMusicTrack(scriptText, scriptEng.operands[1], true, scriptEng.operands[2]);4784break;4785case FUNC_PLAYMUSIC:4786opcodeSize = 0;4787PlayMusic(scriptEng.operands[0]);4788break;4789case FUNC_STOPMUSIC:4790opcodeSize = 0;4791StopMusic();4792break;4793case FUNC_PAUSEMUSIC:4794opcodeSize = 0;4795PauseChannel(musicChannel);4796break;4797case FUNC_RESUMEMUSIC:4798opcodeSize = 0;4799ResumeChannel(musicChannel);4800break;4801case FUNC_SWAPMUSICTRACK:4802opcodeSize = 0;4803if (scriptEng.operands[2] <= 1)4804SwapMusicTrack(scriptText, scriptEng.operands[1], 0, scriptEng.operands[3]);4805else4806SwapMusicTrack(scriptText, scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]);4807break;4808case FUNC_PLAYSFX:4809opcodeSize = 0;4810PlaySfx(scriptEng.operands[0], scriptEng.operands[1]);4811break;4812case FUNC_STOPSFX:4813opcodeSize = 0;4814StopSfx(scriptEng.operands[0]);4815break;4816case FUNC_SETSFXATTRIBUTES:4817opcodeSize = 0;4818SetSfxAttributes(scriptEng.operands[0], scriptEng.operands[1], scriptEng.operands[2]);4819break;4820case FUNC_OBJECTTILECOLLISION:4821opcodeSize = 0;4822switch (scriptEng.operands[0]) {4823default: break;4824case CSIDE_FLOOR: ObjectFloorCollision(scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4825case CSIDE_LWALL: ObjectLWallCollision(scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4826case CSIDE_RWALL: ObjectRWallCollision(scriptEng.operands[1] - 1, scriptEng.operands[2], scriptEng.operands[3]); break;4827case CSIDE_ROOF: ObjectRoofCollision(scriptEng.operands[1], scriptEng.operands[2] - 1, scriptEng.operands[3]); break;4828case CSIDE_LENTITY: ObjectLWallCollision(scriptEng.operands[2], 0, objectEntityList[scriptEng.operands[1]].collisionPlane); break;4829case CSIDE_RENTITY: ObjectLWallCollision(scriptEng.operands[2] - 1, 0, objectEntityList[scriptEng.operands[1]].collisionPlane); break;4830}4831break;4832case FUNC_OBJECTTILEGRIP:4833opcodeSize = 0;4834switch (scriptEng.operands[0]) {4835default: break;4836case CSIDE_FLOOR: ObjectFloorGrip(scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4837case CSIDE_LWALL: ObjectLWallGrip(scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4838case CSIDE_RWALL: ObjectRWallGrip(scriptEng.operands[1] - 1, scriptEng.operands[2], scriptEng.operands[3]); break;4839case CSIDE_ROOF: ObjectRoofGrip(scriptEng.operands[1], scriptEng.operands[2] - 1, scriptEng.operands[3]); break;4840case CSIDE_LENTITY: ObjectLEntityGrip(scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4841case CSIDE_RENTITY: ObjectREntityGrip(scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4842}4843break;4844case FUNC_NOT: scriptEng.operands[0] = ~scriptEng.operands[0]; break;4845case FUNC_DRAW3DSCENE:4846opcodeSize = 0;4847TransformVertexBuffer();4848Sort3DDrawList();4849Draw3DScene(scriptInfo->spriteSheetID);4850break;4851case FUNC_SETIDENTITYMATRIX:4852opcodeSize = 0;4853switch (scriptEng.operands[0]) {4854case MAT_WORLD: SetIdentityMatrix(&matWorld); break;4855case MAT_VIEW: SetIdentityMatrix(&matView); break;4856case MAT_TEMP: SetIdentityMatrix(&matTemp); break;4857}4858break;4859case FUNC_MATRIXMULTIPLY:4860opcodeSize = 0;4861switch (scriptEng.operands[0]) {4862case MAT_WORLD:4863switch (scriptEng.operands[1]) {4864case MAT_WORLD: MatrixMultiply(&matWorld, &matWorld); break;4865case MAT_VIEW: MatrixMultiply(&matWorld, &matView); break;4866case MAT_TEMP: MatrixMultiply(&matWorld, &matTemp); break;4867}4868break;48694870case MAT_VIEW:4871switch (scriptEng.operands[1]) {4872case MAT_WORLD: MatrixMultiply(&matView, &matWorld); break;4873case MAT_VIEW: MatrixMultiply(&matView, &matView); break;4874case MAT_TEMP: MatrixMultiply(&matView, &matTemp); break;4875}4876break;48774878case MAT_TEMP:4879switch (scriptEng.operands[1]) {4880case MAT_WORLD: MatrixMultiply(&matTemp, &matWorld); break;4881case MAT_VIEW: MatrixMultiply(&matTemp, &matView); break;4882case MAT_TEMP: MatrixMultiply(&matTemp, &matTemp); break;4883}4884break;4885}4886break;4887case FUNC_MATRIXTRANSLATEXYZ:4888opcodeSize = 0;4889switch (scriptEng.operands[0]) {4890case MAT_WORLD: MatrixTranslateXYZ(&matWorld, scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4891case MAT_VIEW: MatrixTranslateXYZ(&matView, scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4892case MAT_TEMP: MatrixTranslateXYZ(&matTemp, scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4893}4894break;4895case FUNC_MATRIXSCALEXYZ:4896opcodeSize = 0;4897switch (scriptEng.operands[0]) {4898case MAT_WORLD: MatrixScaleXYZ(&matWorld, scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4899case MAT_VIEW: MatrixScaleXYZ(&matView, scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4900case MAT_TEMP: MatrixScaleXYZ(&matTemp, scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4901}4902break;4903case FUNC_MATRIXROTATEX:4904opcodeSize = 0;4905switch (scriptEng.operands[0]) {4906case MAT_WORLD: MatrixRotateX(&matWorld, scriptEng.operands[1]); break;4907case MAT_VIEW: MatrixRotateX(&matView, scriptEng.operands[1]); break;4908case MAT_TEMP: MatrixRotateX(&matTemp, scriptEng.operands[1]); break;4909}4910break;4911case FUNC_MATRIXROTATEY:4912opcodeSize = 0;4913switch (scriptEng.operands[0]) {4914case MAT_WORLD: MatrixRotateY(&matWorld, scriptEng.operands[1]); break;4915case MAT_VIEW: MatrixRotateY(&matView, scriptEng.operands[1]); break;4916case MAT_TEMP: MatrixRotateY(&matTemp, scriptEng.operands[1]); break;4917}4918break;4919case FUNC_MATRIXROTATEZ:4920opcodeSize = 0;4921switch (scriptEng.operands[0]) {4922case MAT_WORLD: MatrixRotateZ(&matWorld, scriptEng.operands[1]); break;4923case MAT_VIEW: MatrixRotateZ(&matView, scriptEng.operands[1]); break;4924case MAT_TEMP: MatrixRotateZ(&matTemp, scriptEng.operands[1]); break;4925}4926break;4927case FUNC_MATRIXROTATEXYZ:4928opcodeSize = 0;4929switch (scriptEng.operands[0]) {4930case MAT_WORLD: MatrixRotateXYZ(&matWorld, scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4931case MAT_VIEW: MatrixRotateXYZ(&matView, scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4932case MAT_TEMP: MatrixRotateXYZ(&matTemp, scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3]); break;4933}4934break;4935case FUNC_MATRIXINVERSE:4936opcodeSize = 0;4937switch (scriptEng.operands[0]) {4938case MAT_WORLD: MatrixInverse(&matWorld); break;4939case MAT_VIEW: MatrixInverse(&matView); break;4940case MAT_TEMP: MatrixInverse(&matTemp); break;4941}4942break;4943case FUNC_TRANSFORMVERTICES:4944opcodeSize = 0;4945switch (scriptEng.operands[0]) {4946case MAT_WORLD: TransformVertices(&matWorld, scriptEng.operands[1], scriptEng.operands[2]); break;4947case MAT_VIEW: TransformVertices(&matView, scriptEng.operands[1], scriptEng.operands[2]); break;4948case MAT_TEMP: TransformVertices(&matTemp, scriptEng.operands[1], scriptEng.operands[2]); break;4949}4950break;4951case FUNC_CALLFUNCTION: {4952opcodeSize = 0;4953functionStack[functionStackPos++] = scriptCodePtr;4954functionStack[functionStackPos++] = jumpTableStart;4955functionStack[functionStackPos++] = scriptCodeStart;4956scriptCodeStart = scriptFunctionList[scriptEng.operands[0]].ptr.scriptCodePtr;4957jumpTableStart = scriptFunctionList[scriptEng.operands[0]].ptr.jumpTablePtr;4958scriptCodePtr = scriptCodeStart;4959break;4960}4961case FUNC_RETURN:4962opcodeSize = 0;4963if (!functionStackPos) { // event, stop running4964running = false;4965}4966else { // function, jump out4967scriptCodeStart = functionStack[--functionStackPos];4968jumpTableStart = functionStack[--functionStackPos];4969scriptCodePtr = functionStack[--functionStackPos];4970}4971break;4972case FUNC_SETLAYERDEFORMATION:4973opcodeSize = 0;4974SetLayerDeformation(scriptEng.operands[0], scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3], scriptEng.operands[4],4975scriptEng.operands[5]);4976break;4977case FUNC_CHECKTOUCHRECT:4978opcodeSize = 0;4979scriptEng.checkResult = -1;49804981for (int32 f = 0; f < touchInfo.count; ++f) {4982if (touchInfo.down[f]) {4983int32 touchX = (int32)(touchInfo.x[f] * SCREEN_XSIZE);4984int32 touchY = (int32)(touchInfo.y[f] * SCREEN_YSIZE);49854986if (touchX > scriptEng.operands[0] && touchX < scriptEng.operands[2] && touchY > scriptEng.operands[1]4987&& touchY < scriptEng.operands[3]) {4988scriptEng.checkResult = f;4989}4990}4991}4992break;4993case FUNC_GETTILELAYERENTRY:4994scriptEng.operands[0] = stageLayouts[scriptEng.operands[1]].tiles[scriptEng.operands[2] + 0x100 * scriptEng.operands[3]];4995break;4996case FUNC_SETTILELAYERENTRY:4997stageLayouts[scriptEng.operands[1]].tiles[scriptEng.operands[2] + 0x100 * scriptEng.operands[3]] = scriptEng.operands[0];4998break;4999case FUNC_GETBIT: scriptEng.operands[0] = (scriptEng.operands[1] & (1 << scriptEng.operands[2])) >> scriptEng.operands[2]; break;5000case FUNC_SETBIT:5001if (scriptEng.operands[2] <= 0)5002scriptEng.operands[0] &= ~(1 << scriptEng.operands[1]);5003else5004scriptEng.operands[0] |= 1 << scriptEng.operands[1];5005break;5006case FUNC_CLEARDRAWLIST:5007opcodeSize = 0;5008drawListEntries[scriptEng.operands[0]].listSize = 0;5009break;5010case FUNC_ADDDRAWLISTENTITYREF: {5011opcodeSize = 0;5012drawListEntries[scriptEng.operands[0]].entityRefs[drawListEntries[scriptEng.operands[0]].listSize++] = scriptEng.operands[1];5013break;5014}5015case FUNC_GETDRAWLISTENTITYREF: scriptEng.operands[0] = drawListEntries[scriptEng.operands[1]].entityRefs[scriptEng.operands[2]]; break;5016case FUNC_SETDRAWLISTENTITYREF:5017opcodeSize = 0;5018drawListEntries[scriptEng.operands[1]].entityRefs[scriptEng.operands[2]] = scriptEng.operands[0];5019break;5020case FUNC_GET16X16TILEINFO: {5021scriptEng.operands[4] = scriptEng.operands[1] >> 7;5022scriptEng.operands[5] = scriptEng.operands[2] >> 7;5023scriptEng.operands[6] = stageLayouts[0].tiles[scriptEng.operands[4] + (scriptEng.operands[5] << 8)] << 6;5024scriptEng.operands[6] += ((scriptEng.operands[1] & 0x7F) >> 4) + 8 * ((scriptEng.operands[2] & 0x7F) >> 4);5025int32 index = tiles128x128.tileIndex[scriptEng.operands[6]];5026switch (scriptEng.operands[3]) {5027case TILEINFO_INDEX: scriptEng.operands[0] = tiles128x128.tileIndex[scriptEng.operands[6]]; break;5028case TILEINFO_DIRECTION: scriptEng.operands[0] = tiles128x128.direction[scriptEng.operands[6]]; break;5029case TILEINFO_VISUALPLANE: scriptEng.operands[0] = tiles128x128.visualPlane[scriptEng.operands[6]]; break;5030case TILEINFO_SOLIDITYA: scriptEng.operands[0] = tiles128x128.collisionFlags[0][scriptEng.operands[6]]; break;5031case TILEINFO_SOLIDITYB: scriptEng.operands[0] = tiles128x128.collisionFlags[1][scriptEng.operands[6]]; break;5032case TILEINFO_FLAGSA: scriptEng.operands[0] = collisionMasks[0].flags[index]; break;5033case TILEINFO_ANGLEA: scriptEng.operands[0] = collisionMasks[0].angles[index]; break;5034case TILEINFO_FLAGSB: scriptEng.operands[0] = collisionMasks[1].flags[index]; break;5035case TILEINFO_ANGLEB: scriptEng.operands[0] = collisionMasks[1].angles[index]; break;5036default: break;5037}5038break;5039}5040case FUNC_SET16X16TILEINFO: {5041scriptEng.operands[4] = scriptEng.operands[1] >> 7;5042scriptEng.operands[5] = scriptEng.operands[2] >> 7;5043scriptEng.operands[6] = stageLayouts[0].tiles[scriptEng.operands[4] + (scriptEng.operands[5] << 8)] << 6;5044scriptEng.operands[6] += ((scriptEng.operands[1] & 0x7F) >> 4) + 8 * ((scriptEng.operands[2] & 0x7F) >> 4);5045switch (scriptEng.operands[3]) {5046case TILEINFO_INDEX:5047tiles128x128.tileIndex[scriptEng.operands[6]] = scriptEng.operands[0];5048tiles128x128.gfxDataPos[scriptEng.operands[6]] = scriptEng.operands[0] << 8;5049break;5050case TILEINFO_DIRECTION: tiles128x128.direction[scriptEng.operands[6]] = scriptEng.operands[0]; break;5051case TILEINFO_VISUALPLANE: tiles128x128.visualPlane[scriptEng.operands[6]] = scriptEng.operands[0]; break;5052case TILEINFO_SOLIDITYA: tiles128x128.collisionFlags[0][scriptEng.operands[6]] = scriptEng.operands[0]; break;5053case TILEINFO_SOLIDITYB: tiles128x128.collisionFlags[1][scriptEng.operands[6]] = scriptEng.operands[0]; break;5054case TILEINFO_FLAGSA: collisionMasks[1].flags[tiles128x128.tileIndex[scriptEng.operands[6]]] = scriptEng.operands[0]; break;5055case TILEINFO_ANGLEA: collisionMasks[1].angles[tiles128x128.tileIndex[scriptEng.operands[6]]] = scriptEng.operands[0]; break;5056default: break;5057}5058break;5059}5060case FUNC_COPY16X16TILE:5061opcodeSize = 0;5062Copy16x16Tile(scriptEng.operands[0], scriptEng.operands[1]);5063break;5064case FUNC_GETANIMATIONBYNAME: {5065AnimationFile *animFile = scriptInfo->animFile;5066scriptEng.operands[0] = -1;5067int32 id = 0;5068while (scriptEng.operands[0] == -1) {5069SpriteAnimation *anim = &animationList[animFile->aniListOffset + id];5070if (StrComp(scriptText, anim->name))5071scriptEng.operands[0] = id;5072else if (++id == animFile->animCount)5073scriptEng.operands[0] = 0;5074}5075break;5076}5077case FUNC_READSAVERAM:5078opcodeSize = 0;5079scriptEng.checkResult = ReadSaveRAM();5080break;5081case FUNC_WRITESAVERAM:5082opcodeSize = 0;5083scriptEng.checkResult = WriteSaveRAM();5084break;5085case FUNC_LOADTEXTFILE: {5086opcodeSize = 0;5087TextMenu *menu = &gameMenu[scriptEng.operands[0]];5088LoadTextFile(menu, scriptText);5089break;5090}5091case FUNC_GETTEXTINFO: {5092TextMenu *menu = &gameMenu[scriptEng.operands[1]];5093switch (scriptEng.operands[2]) {5094case TEXTINFO_TEXTDATA:5095scriptEng.operands[0] = menu->textData[menu->entryStart[scriptEng.operands[3]] + scriptEng.operands[4]];5096break;5097case TEXTINFO_TEXTSIZE: scriptEng.operands[0] = menu->entrySize[scriptEng.operands[3]]; break;5098case TEXTINFO_ROWCOUNT: scriptEng.operands[0] = menu->rowCount; break;5099}5100break;5101}5102case FUNC_GETVERSIONNUMBER: {5103opcodeSize = 0;5104TextMenu *menu = &gameMenu[scriptEng.operands[0]];5105menu->entryHighlight[menu->rowCount] = scriptEng.operands[1];5106AddTextMenuEntry(menu, gameVerInfo.version);5107break;5108}5109case FUNC_GETTABLEVALUE: {5110int32 arrPos = scriptEng.operands[1];5111if (arrPos >= 0) {5112int32 pos = scriptEng.operands[2];5113int32 arrSize = scriptCode[pos];5114if (arrPos < arrSize)5115scriptEng.operands[0] = scriptCode[pos + arrPos + 1];5116}5117break;5118}5119case FUNC_SETTABLEVALUE: {5120opcodeSize = 0;5121int32 arrPos = scriptEng.operands[1];5122if (arrPos >= 0) {5123int32 pos = scriptEng.operands[2];5124int32 arrSize = scriptCode[pos];5125if (arrPos < arrSize)5126scriptCode[pos + arrPos + 1] = scriptEng.operands[0];5127}5128break;5129}5130case FUNC_CHECKCURRENTSTAGEFOLDER:5131opcodeSize = 0;5132scriptEng.checkResult = StrComp(sceneInfo.listData[sceneInfo.listPos].folder, scriptText);51335134// Mission Mode stuff5135if (!scriptEng.checkResult) {5136int32 targetLength = (int32)strlen(sceneInfo.listData[sceneInfo.listPos].folder);5137int32 currentLength = (int32)strlen(scriptText);5138if (targetLength > currentLength) {5139scriptEng.checkResult = StrComp(&sceneInfo.listData[sceneInfo.listPos].folder[targetLength - currentLength], scriptText);5140}5141}5142break;5143case FUNC_ABS: {5144scriptEng.operands[0] = abs(scriptEng.operands[0]);5145break;5146}5147case FUNC_CALLNATIVEFUNCTION:5148opcodeSize = 0;5149if (scriptEng.operands[0] >= 0 && scriptEng.operands[0] < LEGACY_v4_NATIIVEFUNCTION_COUNT) {5150void (*func)(void) = (void (*)(void))nativeFunction[scriptEng.operands[0]];5151if (func)5152func();5153}5154break;5155case FUNC_CALLNATIVEFUNCTION2:5156if (scriptEng.operands[0] >= 0 && scriptEng.operands[0] < LEGACY_v4_NATIIVEFUNCTION_COUNT) {5157if (StrLength(scriptText)) {5158void (*func)(int32 *, char *) = (void (*)(int32 *, char *))nativeFunction[scriptEng.operands[0]];5159if (func)5160func(&scriptEng.operands[2], scriptText);5161}5162else {5163void (*func)(int32 *, int32 *) = (void (*)(int32 *, int32 *))nativeFunction[scriptEng.operands[0]];5164if (func)5165func(&scriptEng.operands[1], &scriptEng.operands[2]);5166}5167}5168break;5169case FUNC_CALLNATIVEFUNCTION4:5170if (scriptEng.operands[0] >= 0 && scriptEng.operands[0] < LEGACY_v4_NATIIVEFUNCTION_COUNT) {5171if (StrLength(scriptText)) {5172void (*func)(int32 *, char *, int32 *, int32 *) =5173(void (*)(int32 *, char *, int32 *, int32 *))nativeFunction[scriptEng.operands[0]];5174if (func)5175func(&scriptEng.operands[1], scriptText, &scriptEng.operands[3], &scriptEng.operands[4]);5176}5177else {5178void (*func)(int32 *, int32 *, int32 *, int32 *) =5179(void (*)(int32 *, int32 *, int32 *, int32 *))nativeFunction[scriptEng.operands[0]];5180if (func)5181func(&scriptEng.operands[1], &scriptEng.operands[2], &scriptEng.operands[3], &scriptEng.operands[4]);5182}5183}5184break;5185case FUNC_SETOBJECTRANGE: {5186// FUNCTION PARAMS:5187// scriptEng.operands[0] = range51885189opcodeSize = 0;5190int32 offset = (scriptEng.operands[0] >> 1) - SCREEN_CENTERX;5191OBJECT_BORDER_X1 = offset + 0x80;5192OBJECT_BORDER_X2 = scriptEng.operands[0] + 0x80 - offset;5193OBJECT_BORDER_X3 = offset + 0x20;5194OBJECT_BORDER_X4 = scriptEng.operands[0] + 0x20 - offset;5195break;5196}5197case FUNC_GETOBJECTVALUE: {5198// FUNCTION PARAMS:5199// scriptEng.operands[0] = result5200// scriptEng.operands[1] = valueID5201// scriptEng.operands[2] = entitySlot52025203if (scriptEng.operands[1] < 48)5204scriptEng.operands[0] = objectEntityList[scriptEng.operands[2]].values[scriptEng.operands[1]];5205break;5206}5207case FUNC_SETOBJECTVALUE: {5208// FUNCTION PARAMS:5209// scriptEng.operands[0] = value5210// scriptEng.operands[1] = valueID5211// scriptEng.operands[2] = entitySlot52125213opcodeSize = 0;5214if (scriptEng.operands[1] < 48)5215objectEntityList[scriptEng.operands[2]].values[scriptEng.operands[1]] = scriptEng.operands[0];5216break;5217}5218case FUNC_COPYOBJECT: {5219// FUNCTION PARAMS:5220// scriptEng.operands[0] = destSlot5221// scriptEng.operands[1] = srcSlot5222// scriptEng.operands[2] = count52235224Entity *dstList = &objectEntityList[scriptEng.operands[0]];5225Entity *srcList = &objectEntityList[scriptEng.operands[1]];5226for (int32 i = 0; i < scriptEng.operands[2]; ++i) memcpy(&dstList[i], &srcList[i], sizeof(Entity));5227break;5228}5229case FUNC_PRINT: {5230// FUNCTION PARAMS:5231// scriptEng.operands[0] = message (can be a regular value or a string depending on scriptEng.operands[1])5232// scriptEng.operands[1] = isInt5233// scriptEng.operands[2] = useEndLine52345235useEndLine = false;5236if (scriptEng.operands[1])5237PrintLog(PRINT_NORMAL, "%d", scriptEng.operands[0]);5238else5239PrintLog(PRINT_NORMAL, "%s", scriptText);52405241if (scriptEng.operands[2])5242PrintLog(PRINT_NORMAL, "\n");5243useEndLine = true;5244break;5245}52465247// Extras for origins 2PVS5248case FUNC_CHECKCAMERAPROXIMITY:5249scriptEng.checkResult = false;52505251// FUNCTION PARAMS:5252// scriptEng.operands[0] = pos.x5253// scriptEng.operands[1] = pos.y5254// scriptEng.operands[2] = range.x5255// scriptEng.operands[3] = range.y5256//5257// FUNCTION NOTES:5258// - Sets scriptEng.checkResult52595260if (scriptEng.operands[2] > 0 && scriptEng.operands[3] > 0) {5261for (int32 s = 0; s < videoSettings.screenCount; ++s) {5262int32 sx = abs(scriptEng.operands[0] - cameras[s].xpos);5263int32 sy = abs(scriptEng.operands[1] - cameras[s].ypos);52645265if (sx < scriptEng.operands[2] && sy < scriptEng.operands[3]) {5266scriptEng.checkResult = true;5267break;5268}5269}5270}5271else {5272if (scriptEng.operands[2] > 0) {5273for (int32 s = 0; s < videoSettings.screenCount; ++s) {5274int32 sx = abs(scriptEng.operands[0] - cameras[s].xpos);52755276if (sx < scriptEng.operands[2]) {5277scriptEng.checkResult = true;5278break;5279}5280}5281}5282else if (scriptEng.operands[3] > 0) {5283for (int32 s = 0; s < videoSettings.screenCount; ++s) {5284int32 sy = abs(scriptEng.operands[1] - cameras[s].ypos);52855286if (sy < scriptEng.operands[3]) {5287scriptEng.checkResult = true;5288break;5289}5290}5291}5292}5293break;52945295case FUNC_SETSCREENCOUNT:5296// FUNCTION PARAMS:5297// scriptEng.operands[0] = screenCount52985299RSDK::SetVideoSetting(VIDEOSETTING_SCREENCOUNT, scriptEng.operands[0]);5300break;53015302case FUNC_SETSCREENVERTICES:5303// FUNCTION PARAMS:5304// scriptEng.operands[0] = startVert2P_S15305// scriptEng.operands[1] = startVert2P_S25306// scriptEng.operands[2] = startVert3P_S15307// scriptEng.operands[3] = startVert3P_S25308// scriptEng.operands[4] = startVert3P_S353095310RSDK::SetScreenVertices(scriptEng.operands[0], scriptEng.operands[1], scriptEng.operands[2], scriptEng.operands[3],5311scriptEng.operands[4]);5312break;53135314case FUNC_GETINPUTDEVICEID:5315// FUNCTION PARAMS:5316// scriptEng.operands[0] = deviceID5317// scriptEng.operands[1] = inputSlot5318//5319// FUNCTION NOTES:5320// - Assigns the device's id to scriptEng.operands[0]53215322scriptEng.operands[0] = GetInputDeviceID(scriptEng.operands[1]);5323break;53245325case FUNC_GETFILTEREDINPUTDEVICEID:5326// FUNCTION PARAMS:5327// scriptEng.operands[0] = deviceID5328// scriptEng.operands[1] = confirmOnly5329// scriptEng.operands[2] = unassignedOnly5330// scriptEng.operands[3] = maxInactiveTimer5331//5332// FUNCTION NOTES:5333// - Assigns the filtered device's id to scriptEng.operands[0]53345335scriptEng.operands[0] = GetFilteredInputDeviceID(scriptEng.operands[1], scriptEng.operands[2] > 0, scriptEng.operands[3]);5336break;53375338case FUNC_GETINPUTDEVICETYPE:5339// FUNCTION PARAMS:5340// scriptEng.operands[0] = deviceType5341// scriptEng.operands[1] = deviceID5342//5343// FUNCTION NOTES:5344// - Assigns the device's type to scriptEng.operands[0]53455346scriptEng.operands[0] = GetInputDeviceType(scriptEng.operands[1]);5347break;53485349case FUNC_ISINPUTDEVICEASSIGNED:5350// FUNCTION PARAMS:5351// scriptEng.operands[0] = deviceID53525353scriptEng.checkResult = IsInputDeviceAssigned(scriptEng.operands[0]);5354break;53555356case FUNC_ASSIGNINPUTSLOTTODEVICE:5357// FUNCTION PARAMS:5358// scriptEng.operands[0] = inputSlot5359// scriptEng.operands[1] = deviceID53605361AssignInputSlotToDevice(scriptEng.operands[0], scriptEng.operands[1]);5362break;53635364case FUNC_ISSLOTASSIGNED:5365// FUNCTION PARAMS:5366// scriptEng.operands[0] = inputSlot5367//5368// FUNCTION NOTES:5369// - Sets scriptEng.checkResult53705371scriptEng.checkResult = IsInputSlotAssigned(scriptEng.operands[0]);5372break;53735374case FUNC_RESETINPUTSLOTASSIGNMENTS:5375// FUNCTION PARAMS:5376// None53775378ResetInputSlotAssignments();5379break;5380}53815382// Set Values5383if (opcodeSize > 0)5384scriptCodePtr -= scriptCodePtr - scriptCodeOffset;5385for (int32 i = 0; i < opcodeSize; ++i) {5386int32 opcodeType = scriptCode[scriptCodePtr++];5387if (opcodeType == SCRIPTVAR_VAR) {5388int32 arrayVal = 0;5389switch (scriptCode[scriptCodePtr++]) { // variable5390case VARARR_NONE: arrayVal = objectEntityPos; break;5391case VARARR_ARRAY:5392if (scriptCode[scriptCodePtr++] == 1)5393arrayVal = scriptEng.arrayPosition[scriptCode[scriptCodePtr++]];5394else5395arrayVal = scriptCode[scriptCodePtr++];5396break;5397case VARARR_ENTNOPLUS1:5398if (scriptCode[scriptCodePtr++] == 1)5399arrayVal = objectEntityPos + scriptEng.arrayPosition[scriptCode[scriptCodePtr++]];5400else5401arrayVal = objectEntityPos + scriptCode[scriptCodePtr++];5402break;5403case VARARR_ENTNOMINUS1:5404if (scriptCode[scriptCodePtr++] == 1)5405arrayVal = objectEntityPos - scriptEng.arrayPosition[scriptCode[scriptCodePtr++]];5406else5407arrayVal = objectEntityPos - scriptCode[scriptCodePtr++];5408break;5409default: break;5410}54115412// Variables5413switch (scriptCode[scriptCodePtr++]) {5414default: break;5415case VAR_TEMP0: scriptEng.temp[0] = scriptEng.operands[i]; break;5416case VAR_TEMP1: scriptEng.temp[1] = scriptEng.operands[i]; break;5417case VAR_TEMP2: scriptEng.temp[2] = scriptEng.operands[i]; break;5418case VAR_TEMP3: scriptEng.temp[3] = scriptEng.operands[i]; break;5419case VAR_TEMP4: scriptEng.temp[4] = scriptEng.operands[i]; break;5420case VAR_TEMP5: scriptEng.temp[5] = scriptEng.operands[i]; break;5421case VAR_TEMP6: scriptEng.temp[6] = scriptEng.operands[i]; break;5422case VAR_TEMP7: scriptEng.temp[7] = scriptEng.operands[i]; break;5423case VAR_CHECKRESULT: scriptEng.checkResult = scriptEng.operands[i]; break;5424case VAR_ARRAYPOS0: scriptEng.arrayPosition[0] = scriptEng.operands[i]; break;5425case VAR_ARRAYPOS1: scriptEng.arrayPosition[1] = scriptEng.operands[i]; break;5426case VAR_ARRAYPOS2: scriptEng.arrayPosition[2] = scriptEng.operands[i]; break;5427case VAR_ARRAYPOS3: scriptEng.arrayPosition[3] = scriptEng.operands[i]; break;5428case VAR_ARRAYPOS4: scriptEng.arrayPosition[4] = scriptEng.operands[i]; break;5429case VAR_ARRAYPOS5: scriptEng.arrayPosition[5] = scriptEng.operands[i]; break;5430case VAR_ARRAYPOS6: scriptEng.arrayPosition[6] = scriptEng.operands[i]; break;5431case VAR_ARRAYPOS7: scriptEng.arrayPosition[7] = scriptEng.operands[i]; break;5432case VAR_GLOBAL: globalVariables[arrayVal].value = scriptEng.operands[i]; break;5433case VAR_LOCAL: scriptCode[arrayVal] = scriptEng.operands[i]; break;5434case VAR_OBJECTENTITYPOS: break;5435case VAR_OBJECTGROUPID: {5436objectEntityList[arrayVal].groupID = scriptEng.operands[i];5437break;5438}5439case VAR_OBJECTTYPE: {5440objectEntityList[arrayVal].type = scriptEng.operands[i];5441break;5442}5443case VAR_OBJECTPROPERTYVALUE: {5444objectEntityList[arrayVal].propertyValue = scriptEng.operands[i];5445break;5446}5447case VAR_OBJECTXPOS: {5448objectEntityList[arrayVal].xpos = scriptEng.operands[i];5449break;5450}5451case VAR_OBJECTYPOS: {5452objectEntityList[arrayVal].ypos = scriptEng.operands[i];5453break;5454}5455case VAR_OBJECTIXPOS: {5456objectEntityList[arrayVal].xpos = scriptEng.operands[i] << 16;5457break;5458}5459case VAR_OBJECTIYPOS: {5460objectEntityList[arrayVal].ypos = scriptEng.operands[i] << 16;5461break;5462}5463case VAR_OBJECTXVEL: {5464objectEntityList[arrayVal].xvel = scriptEng.operands[i];5465break;5466}5467case VAR_OBJECTYVEL: {5468objectEntityList[arrayVal].yvel = scriptEng.operands[i];5469break;5470}5471case VAR_OBJECTSPEED: {5472objectEntityList[arrayVal].speed = scriptEng.operands[i];5473break;5474}5475case VAR_OBJECTSTATE: {5476objectEntityList[arrayVal].state = scriptEng.operands[i];5477break;5478}5479case VAR_OBJECTROTATION: {5480objectEntityList[arrayVal].rotation = scriptEng.operands[i];5481break;5482}5483case VAR_OBJECTSCALE: {5484objectEntityList[arrayVal].scale = scriptEng.operands[i];5485break;5486}5487case VAR_OBJECTPRIORITY: {5488objectEntityList[arrayVal].priority = scriptEng.operands[i];5489break;5490}5491case VAR_OBJECTDRAWORDER: {5492objectEntityList[arrayVal].drawOrder = scriptEng.operands[i];5493break;5494}5495case VAR_OBJECTDIRECTION: {5496objectEntityList[arrayVal].direction = scriptEng.operands[i];5497break;5498}5499case VAR_OBJECTINKEFFECT: {5500objectEntityList[arrayVal].inkEffect = scriptEng.operands[i];5501break;5502}5503case VAR_OBJECTALPHA: {5504objectEntityList[arrayVal].alpha = scriptEng.operands[i];5505break;5506}5507case VAR_OBJECTFRAME: {5508objectEntityList[arrayVal].frame = scriptEng.operands[i];5509break;5510}5511case VAR_OBJECTANIMATION: {5512objectEntityList[arrayVal].animation = scriptEng.operands[i];5513break;5514}5515case VAR_OBJECTPREVANIMATION: {5516objectEntityList[arrayVal].prevAnimation = scriptEng.operands[i];5517break;5518}5519case VAR_OBJECTANIMATIONSPEED: {5520objectEntityList[arrayVal].animationSpeed = scriptEng.operands[i];5521break;5522}5523case VAR_OBJECTANIMATIONTIMER: {5524objectEntityList[arrayVal].animationTimer = scriptEng.operands[i];5525break;5526}5527case VAR_OBJECTANGLE: {5528objectEntityList[arrayVal].angle = scriptEng.operands[i];5529break;5530}5531case VAR_OBJECTLOOKPOSX: {5532objectEntityList[arrayVal].lookPosX = scriptEng.operands[i];5533break;5534}5535case VAR_OBJECTLOOKPOSY: {5536objectEntityList[arrayVal].lookPosY = scriptEng.operands[i];5537break;5538}5539case VAR_OBJECTCOLLISIONMODE: {5540objectEntityList[arrayVal].collisionMode = scriptEng.operands[i];5541break;5542}5543case VAR_OBJECTCOLLISIONPLANE: {5544objectEntityList[arrayVal].collisionPlane = scriptEng.operands[i];5545break;5546}5547case VAR_OBJECTCONTROLMODE: {5548objectEntityList[arrayVal].controlMode = scriptEng.operands[i];5549break;5550}5551case VAR_OBJECTCONTROLLOCK: {5552objectEntityList[arrayVal].controlLock = scriptEng.operands[i];5553break;5554}5555case VAR_OBJECTPUSHING: {5556objectEntityList[arrayVal].pushing = scriptEng.operands[i];5557break;5558}5559case VAR_OBJECTVISIBLE: {5560objectEntityList[arrayVal].visible = scriptEng.operands[i];5561break;5562}5563case VAR_OBJECTTILECOLLISIONS: {5564objectEntityList[arrayVal].tileCollisions = scriptEng.operands[i];5565break;5566}5567case VAR_OBJECTINTERACTION: {5568objectEntityList[arrayVal].objectInteractions = scriptEng.operands[i];5569break;5570}5571case VAR_OBJECTGRAVITY: {5572objectEntityList[arrayVal].gravity = scriptEng.operands[i];5573break;5574}5575case VAR_OBJECTUP: {5576objectEntityList[arrayVal].up = scriptEng.operands[i];5577break;5578}5579case VAR_OBJECTDOWN: {5580objectEntityList[arrayVal].down = scriptEng.operands[i];5581break;5582}5583case VAR_OBJECTLEFT: {5584objectEntityList[arrayVal].left = scriptEng.operands[i];5585break;5586}5587case VAR_OBJECTRIGHT: {5588objectEntityList[arrayVal].right = scriptEng.operands[i];5589break;5590}5591case VAR_OBJECTJUMPPRESS: {5592objectEntityList[arrayVal].jumpPress = scriptEng.operands[i];5593break;5594}5595case VAR_OBJECTJUMPHOLD: {5596objectEntityList[arrayVal].jumpHold = scriptEng.operands[i];5597break;5598}5599case VAR_OBJECTSCROLLTRACKING: {5600objectEntityList[arrayVal].scrollTracking = scriptEng.operands[i];5601break;5602}5603case VAR_OBJECTFLOORSENSORL: {5604objectEntityList[arrayVal].floorSensors[0] = scriptEng.operands[i];5605break;5606}5607case VAR_OBJECTFLOORSENSORC: {5608objectEntityList[arrayVal].floorSensors[1] = scriptEng.operands[i];5609break;5610}5611case VAR_OBJECTFLOORSENSORR: {5612objectEntityList[arrayVal].floorSensors[2] = scriptEng.operands[i];5613break;5614}5615case VAR_OBJECTFLOORSENSORLC: {5616objectEntityList[arrayVal].floorSensors[3] = scriptEng.operands[i];5617break;5618}5619case VAR_OBJECTFLOORSENSORRC: {5620objectEntityList[arrayVal].floorSensors[4] = scriptEng.operands[i];5621break;5622}5623case VAR_OBJECTCOLLISIONLEFT: {5624break;5625}5626case VAR_OBJECTCOLLISIONTOP: {5627break;5628}5629case VAR_OBJECTCOLLISIONRIGHT: {5630break;5631}5632case VAR_OBJECTCOLLISIONBOTTOM: {5633break;5634}5635case VAR_OBJECTOUTOFBOUNDS: {5636break;5637}5638case VAR_OBJECTSPRITESHEET: {5639objectScriptList[objectEntityList[arrayVal].type].spriteSheetID = scriptEng.operands[i];5640break;5641}5642case VAR_OBJECTVALUE0: {5643objectEntityList[arrayVal].values[0] = scriptEng.operands[i];5644break;5645}5646case VAR_OBJECTVALUE1: {5647objectEntityList[arrayVal].values[1] = scriptEng.operands[i];5648break;5649}5650case VAR_OBJECTVALUE2: {5651objectEntityList[arrayVal].values[2] = scriptEng.operands[i];5652break;5653}5654case VAR_OBJECTVALUE3: {5655objectEntityList[arrayVal].values[3] = scriptEng.operands[i];5656break;5657}5658case VAR_OBJECTVALUE4: {5659objectEntityList[arrayVal].values[4] = scriptEng.operands[i];5660break;5661}5662case VAR_OBJECTVALUE5: {5663objectEntityList[arrayVal].values[5] = scriptEng.operands[i];5664break;5665}5666case VAR_OBJECTVALUE6: {5667objectEntityList[arrayVal].values[6] = scriptEng.operands[i];5668break;5669}5670case VAR_OBJECTVALUE7: {5671objectEntityList[arrayVal].values[7] = scriptEng.operands[i];5672break;5673}5674case VAR_OBJECTVALUE8: {5675objectEntityList[arrayVal].values[8] = scriptEng.operands[i];5676break;5677}5678case VAR_OBJECTVALUE9: {5679objectEntityList[arrayVal].values[9] = scriptEng.operands[i];5680break;5681}5682case VAR_OBJECTVALUE10: {5683objectEntityList[arrayVal].values[10] = scriptEng.operands[i];5684break;5685}5686case VAR_OBJECTVALUE11: {5687objectEntityList[arrayVal].values[11] = scriptEng.operands[i];5688break;5689}5690case VAR_OBJECTVALUE12: {5691objectEntityList[arrayVal].values[12] = scriptEng.operands[i];5692break;5693}5694case VAR_OBJECTVALUE13: {5695objectEntityList[arrayVal].values[13] = scriptEng.operands[i];5696break;5697}5698case VAR_OBJECTVALUE14: {5699objectEntityList[arrayVal].values[14] = scriptEng.operands[i];5700break;5701}5702case VAR_OBJECTVALUE15: {5703objectEntityList[arrayVal].values[15] = scriptEng.operands[i];5704break;5705}5706case VAR_OBJECTVALUE16: {5707objectEntityList[arrayVal].values[16] = scriptEng.operands[i];5708break;5709}5710case VAR_OBJECTVALUE17: {5711objectEntityList[arrayVal].values[17] = scriptEng.operands[i];5712break;5713}5714case VAR_OBJECTVALUE18: {5715objectEntityList[arrayVal].values[18] = scriptEng.operands[i];5716break;5717}5718case VAR_OBJECTVALUE19: {5719objectEntityList[arrayVal].values[19] = scriptEng.operands[i];5720break;5721}5722case VAR_OBJECTVALUE20: {5723objectEntityList[arrayVal].values[20] = scriptEng.operands[i];5724break;5725}5726case VAR_OBJECTVALUE21: {5727objectEntityList[arrayVal].values[21] = scriptEng.operands[i];5728break;5729}5730case VAR_OBJECTVALUE22: {5731objectEntityList[arrayVal].values[22] = scriptEng.operands[i];5732break;5733}5734case VAR_OBJECTVALUE23: {5735objectEntityList[arrayVal].values[23] = scriptEng.operands[i];5736break;5737}5738case VAR_OBJECTVALUE24: {5739objectEntityList[arrayVal].values[24] = scriptEng.operands[i];5740break;5741}5742case VAR_OBJECTVALUE25: {5743objectEntityList[arrayVal].values[25] = scriptEng.operands[i];5744break;5745}5746case VAR_OBJECTVALUE26: {5747objectEntityList[arrayVal].values[26] = scriptEng.operands[i];5748break;5749}5750case VAR_OBJECTVALUE27: {5751objectEntityList[arrayVal].values[27] = scriptEng.operands[i];5752break;5753}5754case VAR_OBJECTVALUE28: {5755objectEntityList[arrayVal].values[28] = scriptEng.operands[i];5756break;5757}5758case VAR_OBJECTVALUE29: {5759objectEntityList[arrayVal].values[29] = scriptEng.operands[i];5760break;5761}5762case VAR_OBJECTVALUE30: {5763objectEntityList[arrayVal].values[30] = scriptEng.operands[i];5764break;5765}5766case VAR_OBJECTVALUE31: {5767objectEntityList[arrayVal].values[31] = scriptEng.operands[i];5768break;5769}5770case VAR_OBJECTVALUE32: {5771objectEntityList[arrayVal].values[32] = scriptEng.operands[i];5772break;5773}5774case VAR_OBJECTVALUE33: {5775objectEntityList[arrayVal].values[33] = scriptEng.operands[i];5776break;5777}5778case VAR_OBJECTVALUE34: {5779objectEntityList[arrayVal].values[34] = scriptEng.operands[i];5780break;5781}5782case VAR_OBJECTVALUE35: {5783objectEntityList[arrayVal].values[35] = scriptEng.operands[i];5784break;5785}5786case VAR_OBJECTVALUE36: {5787objectEntityList[arrayVal].values[36] = scriptEng.operands[i];5788break;5789}5790case VAR_OBJECTVALUE37: {5791objectEntityList[arrayVal].values[37] = scriptEng.operands[i];5792break;5793}5794case VAR_OBJECTVALUE38: {5795objectEntityList[arrayVal].values[38] = scriptEng.operands[i];5796break;5797}5798case VAR_OBJECTVALUE39: {5799objectEntityList[arrayVal].values[39] = scriptEng.operands[i];5800break;5801}5802case VAR_OBJECTVALUE40: {5803objectEntityList[arrayVal].values[40] = scriptEng.operands[i];5804break;5805}5806case VAR_OBJECTVALUE41: {5807objectEntityList[arrayVal].values[41] = scriptEng.operands[i];5808break;5809}5810case VAR_OBJECTVALUE42: {5811objectEntityList[arrayVal].values[42] = scriptEng.operands[i];5812break;5813}5814case VAR_OBJECTVALUE43: {5815objectEntityList[arrayVal].values[43] = scriptEng.operands[i];5816break;5817}5818case VAR_OBJECTVALUE44: {5819objectEntityList[arrayVal].values[44] = scriptEng.operands[i];5820break;5821}5822case VAR_OBJECTVALUE45: {5823objectEntityList[arrayVal].values[45] = scriptEng.operands[i];5824break;5825}5826case VAR_OBJECTVALUE46: {5827objectEntityList[arrayVal].values[46] = scriptEng.operands[i];5828break;5829}5830case VAR_OBJECTVALUE47: {5831objectEntityList[arrayVal].values[47] = scriptEng.operands[i];5832break;5833}5834case VAR_STAGESTATE: stageMode = scriptEng.operands[i]; break;5835case VAR_STAGEACTIVELIST: {5836int32 listID = scriptEng.operands[i];5837if (listID < sceneInfo.categoryCount) {5838int32 prevListPos = sceneInfo.listCategory[sceneInfo.activeCategory].sceneOffsetStart;58395840sceneInfo.activeCategory = listID;5841SceneListInfo *list = &sceneInfo.listCategory[sceneInfo.activeCategory];58425843sceneInfo.listPos = list->sceneOffsetStart + RSDK::sceneInfo.listPos - prevListPos;5844if (sceneInfo.listPos >= list->sceneOffsetEnd)5845sceneInfo.listPos = list->sceneOffsetEnd;5846}5847break;5848}5849case VAR_STAGELISTPOS: {5850SceneListInfo *list = &sceneInfo.listCategory[sceneInfo.activeCategory];58515852if (list->sceneOffsetStart + scriptEng.operands[i] <= list->sceneOffsetEnd)5853sceneInfo.listPos = list->sceneOffsetStart + scriptEng.operands[i];5854break;5855}5856case VAR_STAGETIMEENABLED: timeEnabled = scriptEng.operands[i]; break;5857case VAR_STAGEMILLISECONDS: stageMilliseconds = scriptEng.operands[i]; break;5858case VAR_STAGESECONDS: stageSeconds = scriptEng.operands[i]; break;5859case VAR_STAGEMINUTES: stageMinutes = scriptEng.operands[i]; break;5860case VAR_STAGEACTNUM: actID = scriptEng.operands[i]; break;5861case VAR_STAGEPAUSEENABLED: pauseEnabled = scriptEng.operands[i]; break;5862case VAR_STAGELISTSIZE: break;5863case VAR_STAGENEWXBOUNDARY1: newXBoundary1 = scriptEng.operands[i]; break;5864case VAR_STAGENEWXBOUNDARY2: newXBoundary2 = scriptEng.operands[i]; break;5865case VAR_STAGENEWYBOUNDARY1: newYBoundary1 = scriptEng.operands[i]; break;5866case VAR_STAGENEWYBOUNDARY2: newYBoundary2 = scriptEng.operands[i]; break;5867case VAR_STAGECURXBOUNDARY1:5868if (curXBoundary1 != scriptEng.operands[i]) {5869curXBoundary1 = scriptEng.operands[i];5870newXBoundary1 = scriptEng.operands[i];5871}5872break;5873case VAR_STAGECURXBOUNDARY2:5874if (curXBoundary2 != scriptEng.operands[i]) {5875curXBoundary2 = scriptEng.operands[i];5876newXBoundary2 = scriptEng.operands[i];5877}5878break;5879case VAR_STAGECURYBOUNDARY1:5880if (curYBoundary1 != scriptEng.operands[i]) {5881curYBoundary1 = scriptEng.operands[i];5882newYBoundary1 = scriptEng.operands[i];5883}5884break;5885case VAR_STAGECURYBOUNDARY2:5886if (curYBoundary2 != scriptEng.operands[i]) {5887curYBoundary2 = scriptEng.operands[i];5888newYBoundary2 = scriptEng.operands[i];5889}5890break;5891case VAR_STAGEDEFORMATIONDATA0: bgDeformationData0[arrayVal] = scriptEng.operands[i]; break;5892case VAR_STAGEDEFORMATIONDATA1: bgDeformationData1[arrayVal] = scriptEng.operands[i]; break;5893case VAR_STAGEDEFORMATIONDATA2: bgDeformationData2[arrayVal] = scriptEng.operands[i]; break;5894case VAR_STAGEDEFORMATIONDATA3: bgDeformationData3[arrayVal] = scriptEng.operands[i]; break;5895case VAR_STAGEWATERLEVEL: waterLevel = scriptEng.operands[i]; break;5896case VAR_STAGEACTIVELAYER: activeTileLayers[arrayVal] = scriptEng.operands[i]; break;5897case VAR_STAGEMIDPOINT: tLayerMidPoint = scriptEng.operands[i]; break;5898case VAR_STAGEPLAYERLISTPOS: playerListPos = scriptEng.operands[i]; break;5899case VAR_STAGEDEBUGMODE: debugMode = scriptEng.operands[i]; break;5900case VAR_STAGEENTITYPOS: objectEntityPos = scriptEng.operands[i]; break;5901case VAR_SCREENCAMERAENABLED: currentCamera->enabled = scriptEng.operands[i]; break;5902case VAR_SCREENCAMERATARGET: currentCamera->target = scriptEng.operands[i]; break;5903case VAR_SCREENCAMERASTYLE: currentCamera->style = scriptEng.operands[i]; break;5904case VAR_SCREENCAMERAX: currentCamera->xpos = scriptEng.operands[i]; break;5905case VAR_SCREENCAMERAY: currentCamera->ypos = scriptEng.operands[i]; break;5906case VAR_SCREENDRAWLISTSIZE: drawListEntries[arrayVal].listSize = scriptEng.operands[i]; break;5907case VAR_SCREENXCENTER: break;5908case VAR_SCREENYCENTER: break;5909case VAR_SCREENXSIZE: break;5910case VAR_SCREENYSIZE: break;5911case VAR_SCREENXOFFSET: xScrollOffset = scriptEng.operands[i]; break;5912case VAR_SCREENYOFFSET: yScrollOffset = scriptEng.operands[i]; break;5913case VAR_SCREENSHAKEX: cameraShakeX = scriptEng.operands[i]; break;5914case VAR_SCREENSHAKEY: cameraShakeY = scriptEng.operands[i]; break;5915case VAR_SCREENADJUSTCAMERAY: currentCamera->adjustY = scriptEng.operands[i]; break;5916case VAR_TOUCHSCREENDOWN: break;5917case VAR_TOUCHSCREENXPOS: break;5918case VAR_TOUCHSCREENYPOS: break;5919case VAR_MUSICVOLUME: SetMusicVolume(scriptEng.operands[i]); break;5920case VAR_MUSICCURRENTTRACK: break;5921case VAR_MUSICPOSITION: break;5922case VAR_KEYDOWNUP: controller[arrayVal].keyUp.down = scriptEng.operands[i]; break;5923case VAR_KEYDOWNDOWN: controller[arrayVal].keyDown.down = scriptEng.operands[i]; break;5924case VAR_KEYDOWNLEFT: controller[arrayVal].keyLeft.down = scriptEng.operands[i]; break;5925case VAR_KEYDOWNRIGHT: controller[arrayVal].keyRight.down = scriptEng.operands[i]; break;5926case VAR_KEYDOWNBUTTONA: controller[arrayVal].keyA.down = scriptEng.operands[i]; break;5927case VAR_KEYDOWNBUTTONB: controller[arrayVal].keyB.down = scriptEng.operands[i]; break;5928case VAR_KEYDOWNBUTTONC: controller[arrayVal].keyC.down = scriptEng.operands[i]; break;5929case VAR_KEYDOWNBUTTONX: controller[arrayVal].keyX.down = scriptEng.operands[i]; break;5930case VAR_KEYDOWNBUTTONY: controller[arrayVal].keyY.down = scriptEng.operands[i]; break;5931case VAR_KEYDOWNBUTTONZ: controller[arrayVal].keyZ.down = scriptEng.operands[i]; break;5932case VAR_KEYDOWNBUTTONL: triggerL[arrayVal].keyBumper.down = scriptEng.operands[i]; break;5933case VAR_KEYDOWNBUTTONR: triggerR[arrayVal].keyBumper.down = scriptEng.operands[i]; break;5934case VAR_KEYDOWNSTART: controller[arrayVal].keyStart.down = scriptEng.operands[i]; break;5935case VAR_KEYDOWNSELECT: controller[arrayVal].keySelect.down = scriptEng.operands[i]; break;5936case VAR_KEYPRESSUP: controller[arrayVal].keyUp.press = scriptEng.operands[i]; break;5937case VAR_KEYPRESSDOWN: controller[arrayVal].keyDown.press = scriptEng.operands[i]; break;5938case VAR_KEYPRESSLEFT: controller[arrayVal].keyLeft.press = scriptEng.operands[i]; break;5939case VAR_KEYPRESSRIGHT: controller[arrayVal].keyRight.press = scriptEng.operands[i]; break;5940case VAR_KEYPRESSBUTTONA: controller[arrayVal].keyA.press = scriptEng.operands[i]; break;5941case VAR_KEYPRESSBUTTONB: controller[arrayVal].keyB.press = scriptEng.operands[i]; break;5942case VAR_KEYPRESSBUTTONC: controller[arrayVal].keyC.press = scriptEng.operands[i]; break;5943case VAR_KEYPRESSBUTTONX: controller[arrayVal].keyX.press = scriptEng.operands[i]; break;5944case VAR_KEYPRESSBUTTONY: controller[arrayVal].keyY.press = scriptEng.operands[i]; break;5945case VAR_KEYPRESSBUTTONZ: controller[arrayVal].keyZ.press = scriptEng.operands[i]; break;5946case VAR_KEYPRESSBUTTONL: triggerL[arrayVal].keyBumper.press = scriptEng.operands[i]; break;5947case VAR_KEYPRESSBUTTONR: triggerR[arrayVal].keyBumper.press = scriptEng.operands[i]; break;5948case VAR_KEYPRESSSTART: controller[arrayVal].keyStart.press = scriptEng.operands[i]; break;5949case VAR_KEYPRESSSELECT: controller[arrayVal].keySelect.press = scriptEng.operands[i]; break;5950case VAR_MENU1SELECTION: gameMenu[0].selection1 = scriptEng.operands[i]; break;5951case VAR_MENU2SELECTION: gameMenu[1].selection1 = scriptEng.operands[i]; break;5952case VAR_TILELAYERXSIZE: stageLayouts[arrayVal].xsize = scriptEng.operands[i]; break;5953case VAR_TILELAYERYSIZE: stageLayouts[arrayVal].ysize = scriptEng.operands[i]; break;5954case VAR_TILELAYERTYPE: stageLayouts[arrayVal].type = scriptEng.operands[i]; break;5955case VAR_TILELAYERANGLE: {5956int32 angle = scriptEng.operands[i] + 0x200;5957if (scriptEng.operands[i] >= 0)5958angle = scriptEng.operands[i];5959stageLayouts[arrayVal].angle = angle & 0x1FF;5960break;5961}5962case VAR_TILELAYERXPOS: stageLayouts[arrayVal].xpos = scriptEng.operands[i]; break;5963case VAR_TILELAYERYPOS: stageLayouts[arrayVal].ypos = scriptEng.operands[i]; break;5964case VAR_TILELAYERZPOS: stageLayouts[arrayVal].zpos = scriptEng.operands[i]; break;5965case VAR_TILELAYERPARALLAXFACTOR: stageLayouts[arrayVal].parallaxFactor = scriptEng.operands[i]; break;5966case VAR_TILELAYERSCROLLSPEED: stageLayouts[arrayVal].scrollSpeed = scriptEng.operands[i]; break;5967case VAR_TILELAYERSCROLLPOS: stageLayouts[arrayVal].scrollPos = scriptEng.operands[i]; break;5968case VAR_TILELAYERDEFORMATIONOFFSET: stageLayouts[arrayVal].deformationOffset = scriptEng.operands[i]; break;5969case VAR_TILELAYERDEFORMATIONOFFSETW: stageLayouts[arrayVal].deformationOffsetW = scriptEng.operands[i]; break;5970case VAR_HPARALLAXPARALLAXFACTOR: hParallax.parallaxFactor[arrayVal] = scriptEng.operands[i]; break;5971case VAR_HPARALLAXSCROLLSPEED: hParallax.scrollSpeed[arrayVal] = scriptEng.operands[i]; break;5972case VAR_HPARALLAXSCROLLPOS: hParallax.scrollPos[arrayVal] = scriptEng.operands[i]; break;5973case VAR_VPARALLAXPARALLAXFACTOR: vParallax.parallaxFactor[arrayVal] = scriptEng.operands[i]; break;5974case VAR_VPARALLAXSCROLLSPEED: vParallax.scrollSpeed[arrayVal] = scriptEng.operands[i]; break;5975case VAR_VPARALLAXSCROLLPOS: vParallax.scrollPos[arrayVal] = scriptEng.operands[i]; break;5976case VAR_SCENE3DVERTEXCOUNT: vertexCount = scriptEng.operands[i]; break;5977case VAR_SCENE3DFACECOUNT: faceCount = scriptEng.operands[i]; break;5978case VAR_SCENE3DPROJECTIONX: projectionX = scriptEng.operands[i]; break;5979case VAR_SCENE3DPROJECTIONY: projectionY = scriptEng.operands[i]; break;5980case VAR_SCENE3DFOGCOLOR: fogColor = scriptEng.operands[i]; break;5981case VAR_SCENE3DFOGSTRENGTH: fogStrength = scriptEng.operands[i]; break;5982case VAR_VERTEXBUFFERX: vertexBuffer[arrayVal].x = scriptEng.operands[i]; break;5983case VAR_VERTEXBUFFERY: vertexBuffer[arrayVal].y = scriptEng.operands[i]; break;5984case VAR_VERTEXBUFFERZ: vertexBuffer[arrayVal].z = scriptEng.operands[i]; break;5985case VAR_VERTEXBUFFERU: vertexBuffer[arrayVal].u = scriptEng.operands[i]; break;5986case VAR_VERTEXBUFFERV: vertexBuffer[arrayVal].v = scriptEng.operands[i]; break;5987case VAR_FACEBUFFERA: faceBuffer[arrayVal].a = scriptEng.operands[i]; break;5988case VAR_FACEBUFFERB: faceBuffer[arrayVal].b = scriptEng.operands[i]; break;5989case VAR_FACEBUFFERC: faceBuffer[arrayVal].c = scriptEng.operands[i]; break;5990case VAR_FACEBUFFERD: faceBuffer[arrayVal].d = scriptEng.operands[i]; break;5991case VAR_FACEBUFFERFLAG: faceBuffer[arrayVal].flag = scriptEng.operands[i]; break;5992case VAR_FACEBUFFERCOLOR: faceBuffer[arrayVal].color = scriptEng.operands[i]; break;5993case VAR_SAVERAM: saveRAM[arrayVal] = scriptEng.operands[i]; break;5994case VAR_ENGINESTATE: gameMode = scriptEng.operands[i]; break;5995case VAR_ENGINELANGUAGE: language = scriptEng.operands[i]; break;5996case VAR_ENGINEONLINEACTIVE: onlineActive = scriptEng.operands[i]; break;5997case VAR_ENGINESFXVOLUME:5998sfxVolume = scriptEng.operands[i];5999// SetGameVolumes(bgmVolume, sfxVolume);6000break;6001case VAR_ENGINEBGMVOLUME:6002bgmVolume = scriptEng.operands[i];6003// SetGameVolumes(bgmVolume, sfxVolume);6004break;6005case VAR_ENGINETRIALMODE: trialMode = scriptEng.operands[i]; break;6006case VAR_ENGINEDEVICETYPE: break;60076008// Origins Extras6009case VAR_SCREENCURRENTID: break;6010case VAR_CAMERAENABLED: cameras[arrayVal].enabled = scriptEng.operands[i]; break;6011case VAR_CAMERATARGET: cameras[arrayVal].target = scriptEng.operands[i]; break;6012case VAR_CAMERASTYLE: cameras[arrayVal].style = scriptEng.operands[i]; break;6013case VAR_CAMERAXPOS: cameras[arrayVal].xpos = scriptEng.operands[i]; break;6014case VAR_CAMERAYPOS: cameras[arrayVal].ypos = scriptEng.operands[i]; break;6015case VAR_CAMERAADJUSTY: cameras[arrayVal].adjustY = scriptEng.operands[i]; break;60166017#if LEGACY_RETRO_USE_HAPTICS6018case VAR_HAPTICSENABLED: hapticsEnabled = scriptEng.operands[i]; break;6019#endif6020}6021}6022else if (opcodeType == SCRIPTVAR_INTCONST) { // int32 constant6023scriptCodePtr++;6024}6025else if (opcodeType == SCRIPTVAR_STRCONST) { // string constant6026int32 strLen = scriptCode[scriptCodePtr++];6027for (int32 c = 0; c < strLen; ++c) {6028switch (c % 4) {6029case 0: break;6030case 1: break;6031case 2: break;6032case 3: ++scriptCodePtr; break;6033default: break;6034}6035}6036scriptCodePtr++;6037}6038}6039}6040}604160426043