Path: blob/master/Sonic 2/Scripts/HTZ/SeeSaw.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: SeeSaw Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value0 : object.orbTimer // Always 0, its functionality is leftover from S1's SLZ12private alias object.value1 : object.tiltTimerL13private alias object.value2 : object.tiltTimerM14private alias object.value3 : object.tiltTimerR15private alias object.value4 : object.tilt16private alias object.value5 : object.prevTilt17private alias object.value6 : object.targetTilt18private alias object.value7 : object.launchVelocity19private alias object.value8 : object.orbTargetPos.x20private alias object.value9 : object.orbTargetPos.y21private alias object.value10 : object.orbFrame22private alias object.value11 : object.orbSide23private alias object.value12 : object.stood // it gets set a couple of times but otherwise it's unused2425private alias 0 : SEESAW_ORB_IDLE26private alias 1 : SEESAW_NONE27private alias 2 : SEESAW_ORB_LAUNCHED28private alias 3 : SEESAW_NO_ORB2930private alias 0 : SEESAW_TILT_L31private alias 1 : SEESAW_TILT_M32private alias 2 : SEESAW_TILT_R3334// Player Aliases35private alias object.state : player.state36private alias object.xpos : player.xpos37private alias object.ypos : player.ypos38private alias object.xvel : player.xvel39private alias object.yvel : player.yvel40private alias object.speed : player.speed41private alias object.gravity : player.gravity42private alias object.animation : player.animation43private alias object.value1 : player.timer444546// ========================47// Function Declarations48// ========================4950reserve function SeeSaw_DebugDraw51reserve function SeeSaw_DebugSpawn52reserve function SeeSaw_SetupHitbox535455// ========================56// Tables57// ========================5859private table SeeSaw_tiltHeightTable6036, 36, 38, 40, 42, 44, 42, 40, 38, 36, 35, 34, 33, 32, 31, 306129, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 146213, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 2, 2, 2, 263end table646566// ========================67// Function Definitions68// ========================6970private function SeeSaw_DebugDraw71DrawSprite(0)72end function737475private function SeeSaw_DebugSpawn76CreateTempObject(TypeName[SeeSaw], 0, object.xpos, object.ypos)77object[tempObjectPos].orbTargetPos.x = object.xpos78object[tempObjectPos].orbTargetPos.x += 0x28000079object[tempObjectPos].orbTargetPos.y = object.ypos80object[tempObjectPos].orbTargetPos.y -= 8 // Simply "8" is the wrong value, 0x80000 is actually what's needed. It doesn't matter, though, as the orb pos gets reset when the object updates anyway81object[tempObjectPos].orbFrame = 282object[tempObjectPos].tilt = SEESAW_TILT_R83object[tempObjectPos].targetTilt = SEESAW_TILT_R84if object[tempObjectPos].propertyValue != 0 // A propertyValue check for a newly created temp object? This won't do much...85object[tempObjectPos].state = SEESAW_NO_ORB86end if87end function888990private function SeeSaw_SetupHitbox91temp2 = 092if temp7 == SEESAW_TILT_M93temp0 = -2194temp1 = -695temp2 = 4896else97temp1 = player[currentPlayer].xpos98temp1 -= object.xpos99temp1 >>= 16100temp1 += 48101temp3 = temp1102if temp1 >= 0103if temp1 < 96104temp1 >>= 1105if temp7 == SEESAW_TILT_L106FlipSign(temp1)107temp1 += 47108end if109GetTableValue(temp0, temp1, SeeSaw_tiltHeightTable)110FlipSign(temp0)111temp1 = temp0112temp1 += 18113temp2 = 40114end if115end if116end if117end function118119120// ========================121// Events122// ========================123124event ObjectUpdate125temp0 = object.tiltTimerL126temp0 |= object.tiltTimerR127if temp0 == 0128if object.tiltTimerM != SEESAW_TILT_L129object.targetTilt = SEESAW_TILT_M130end if131else132if object.tiltTimerL == object.tiltTimerR133object.targetTilt = SEESAW_TILT_M134else135if object.tiltTimerL > object.tiltTimerR136object.targetTilt = SEESAW_TILT_L137else138object.targetTilt = SEESAW_TILT_R139end if140end if141end if142143if object.tilt != object.targetTilt144if object.tilt > object.targetTilt145object.tilt--146else147object.tilt++148end if149150if object.state == SEESAW_NONE151if object.targetTilt == SEESAW_TILT_M152temp0 = -0x11400153temp1 = -0x81800154else155if object.orbTimer == 0156if object.launchVelocity >= 0xA0000157temp0 = -0xA000158temp1 = -0xE0000159else160temp0 = -0xCC00161temp1 = -0xAF000162end if163else164if object.launchVelocity >= 0x9C000165temp0 = -0x8000166temp1 = -0xA2000167else168temp0 = -0xF400169temp1 = -0x96000170end if171end if172end if173174if object.orbTargetPos.x < object.xpos175FlipSign(temp0)176end if177object.xvel = temp0178object.yvel = temp1179object.state++180object.priority = PRIORITY_ACTIVE181end if182end if183184if object.orbTargetPos.x < object.xpos185switch object.tilt186case SEESAW_TILT_L187temp0 = -0x280000188temp1 = -0x80000189break190191case SEESAW_TILT_M192temp0 = -0x280000193temp1 = -0x1C0000194break195196case SEESAW_TILT_R197temp0 = -0x280000198temp1 = -0x2F0000199break200201end switch202else203switch object.tilt204case SEESAW_TILT_L205temp0 = 0x280000206temp1 = -0x2F0000207break208209case SEESAW_TILT_M210temp0 = 0x280000211temp1 = -0x1C0000212break213214case SEESAW_TILT_R215temp0 = 0x280000216temp1 = -0x80000217break218219end switch220end if221222switch object.state223case SEESAW_ORB_IDLE224object.orbTargetPos.x = object.xpos225object.orbTargetPos.x += temp0226object.orbTargetPos.y = object.ypos227object.orbTargetPos.y += temp1228object.launchVelocity = 0229break230231case SEESAW_NONE232break233234case SEESAW_ORB_LAUNCHED235object.orbTargetPos.x += object.xvel236object.orbTargetPos.y += object.yvel237object.yvel += 0x3800238if object.yvel > 0239temp1 += object.ypos240if object.orbTargetPos.y >= temp1241object.orbTargetPos.y = temp1242object.state = SEESAW_ORB_IDLE243if object.orbTimer != 0244if object.xvel != 0245CreateTempObject(TypeName[Smoke Puff], 0, object.orbTargetPos.x, object.orbTargetPos.y)246PlaySfx(SfxName[Explosion], false)247object.state = SEESAW_NO_ORB248object.orbTimer = 0249end if250end if251if object.orbTargetPos.x < object.xpos252object.targetTilt = SEESAW_TILT_L253object.orbSide = 1254else255object.targetTilt = SEESAW_TILT_R256object.orbSide = 2257end if258object.priority = PRIORITY_BOUNDS259end if260end if261break262263case SEESAW_NO_ORB264break265266end switch267268object.tiltTimerL = 0269object.tiltTimerM = 0270object.tiltTimerR = 0271object.stood = false272273foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)274temp7 = object.prevTilt275CallFunction(SeeSaw_SetupHitbox)276if temp2 != 0277temp3 = temp2278FlipSign(temp3)279if player[currentPlayer].yvel > object.launchVelocity280temp4 = player[currentPlayer].yvel281temp4 += 0x7000282else283temp4 = object.launchVelocity284end if285286BoxCollisionTest(C_PLATFORM, object.entityPos, temp3, temp0, temp2, temp1, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)287if checkResult == true288object.stood = true289if object.tilt != object.prevTilt290temp6 = temp0291temp7 = object.tilt292CallFunction(SeeSaw_SetupHitbox)293temp0 -= temp6294temp0 <<= 16295player[currentPlayer].ypos += temp0296end if297298player[currentPlayer].ypos += 0x20000299if object.orbSide == 0300if object.state == SEESAW_ORB_IDLE301object.state = SEESAW_NONE302else303if object.state == SEESAW_ORB_LAUNCHED304temp4 = object.launchVelocity305end if306end if307308temp0 = player[currentPlayer].xpos309temp0 -= object.xpos310Abs(temp0)311if temp0 < 0x80000312object.tiltTimerM++313else314if player[currentPlayer].xpos < object.xpos315object.tiltTimerL++316if object.targetTilt != SEESAW_TILT_L317object.launchVelocity = temp4318end if319else320object.tiltTimerR++321if object.targetTilt != SEESAW_TILT_R322object.launchVelocity = temp4323end if324end if325end if326else327temp0 = player[currentPlayer].xpos328temp0 -= object.xpos329Abs(temp0)330temp4 = object.yvel331if temp0 >= 0x80000332if player[currentPlayer].xpos < object.xpos333if object.orbSide == 1334temp4 = 0335end if336else337if object.orbSide == 2338temp4 = 0339end if340end if341end if342343if temp4 != 0344#platform: USE_STANDALONE345player[currentPlayer].state = Player_State_Air346#endplatform347#platform: USE_ORIGINS348player[currentPlayer].state = Player_State_Air_NoDropDash349#endplatform350player[currentPlayer].gravity = GRAVITY_AIR351player[currentPlayer].speed = player[currentPlayer].xvel352if object.state == SEESAW_NO_ORB353player[currentPlayer].animation = ANI_JUMPING354else355if object.orbTimer != 0356player[currentPlayer].animation = ANI_JUMPING357else358player[currentPlayer].animation = ANI_BOUNCING359end if360end if361player[currentPlayer].timer = 0362PlaySfx(SfxName[Spring], false)363player[currentPlayer].yvel = temp4364FlipSign(player[currentPlayer].yvel)365end if366end if367end if368end if369next370371object.orbSide = 0372object.prevTilt = object.tilt373374object.frame = object.tilt375object.frame &= 1376object.direction = object.tilt377object.direction >>= 1378object.direction ^= FLIP_X379380if object.orbTimer != 0381object.animationTimer--382if object.animationTimer <= 0383object.orbFrame ^= 1384if object.orbTimer > 120385object.animationTimer = 10386else387if object.orbTimer > 60388object.animationTimer = 5389else390object.animationTimer = 2391end if392end if393end if394395if object.state == SEESAW_ORB_IDLE396object.orbTimer--397if object.orbTimer == 0398CreateTempObject(TypeName[Smoke Puff], 0, object.orbTargetPos.x, object.orbTargetPos.y)399400// ???401// Seems like they just dummied out SLZ's orb explosion rather than actually removing it402// The [Bomb Shrapnel] object type doesn't exist in HTZ, so this effectively creates a bunch of useless Blank Objects403404CreateTempObject(TypeName[Bomb Shrapnel], 0, object.orbTargetPos.x, object.orbTargetPos.y)405object[tempObjectPos].xvel = -0x10000406object[tempObjectPos].yvel = -0x34000407408CreateTempObject(TypeName[Bomb Shrapnel], 0, object.orbTargetPos.x, object.orbTargetPos.y)409object[tempObjectPos].xvel = -0xA000410object[tempObjectPos].yvel = -0x24000411412CreateTempObject(TypeName[Bomb Shrapnel], 0, object.orbTargetPos.x, object.orbTargetPos.y)413object[tempObjectPos].xvel = 0x10000414object[tempObjectPos].yvel = -0x34000415416CreateTempObject(TypeName[Bomb Shrapnel], 0, object.orbTargetPos.x, object.orbTargetPos.y)417object[tempObjectPos].xvel = 0xA000418object[tempObjectPos].yvel = -0x24000419420PlaySfx(SfxName[Explosion], false)421object.state = SEESAW_NO_ORB422end if423end if424else425object.animationTimer++426object.animationTimer &= 7427object.orbFrame = object.animationTimer428object.orbFrame >>= 2429object.orbFrame += 2430end if431432if object.state < SEESAW_NO_ORB433temp0 = object.xpos434temp1 = object.ypos435436object.xpos = object.orbTargetPos.x437object.ypos = object.orbTargetPos.y438foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)439BoxCollisionTest(C_TOUCH, object.entityPos, -7, -7, 7, 7, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)440if checkResult == true441CallFunction(Player_Hit)442end if443next444445object.xpos = temp0446object.ypos = temp1447end if448end event449450451event ObjectDraw452if object.state < SEESAW_NO_ORB453temp0 = object.direction454if player[0].xpos < object.orbTargetPos.x455object.direction = FLIP_NONE456else457object.direction = FLIP_X458end if459460DrawSpriteFX(object.orbFrame, FX_FLIP, object.orbTargetPos.x, object.orbTargetPos.y)461object.direction = temp0462end if463464DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)465end event466467468event ObjectStartup469LoadSpriteSheet("HTZ/Objects.gif")470SpriteFrame(-44, -44, 91, 56, 164, 1) // SeeSaw (Tilted) - #0471SpriteFrame(-48, -24, 96, 36, 159, 58) // SeeSaw (Flat) - #1472SpriteFrame(-8, -8, 16, 16, 91, 222) // Orb (Red) - #2473SpriteFrame(-8, -8, 16, 16, 91, 239) // Orb (Yellow) - #3474475foreach (TypeName[SeeSaw], arrayPos0, ALL_ENTITIES)476object[arrayPos0].orbTargetPos.x = object[arrayPos0].xpos477object[arrayPos0].orbTargetPos.x += 0x280000478object[arrayPos0].orbTargetPos.y = object[arrayPos0].ypos479object[arrayPos0].orbTargetPos.y -= 8 // Just 8, that's it? This is supposed to be a 16-shifted position...480object[arrayPos0].orbFrame = 2481object[arrayPos0].tilt = SEESAW_TILT_R482object[arrayPos0].targetTilt = SEESAW_TILT_R483if object[arrayPos0].propertyValue != 0484object[arrayPos0].state = SEESAW_NO_ORB485end if486next487488SetTableValue(TypeName[SeeSaw], DebugMode_ObjCount, DebugMode_TypesTable)489SetTableValue(SeeSaw_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)490SetTableValue(SeeSaw_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)491DebugMode_ObjCount++492end event493494495// ========================496// Editor Events497// ========================498499event RSDKEdit500if editor.returnVariable == true501switch editor.variableID502case EDIT_VAR_PROPVAL // property value503checkResult = object.propertyValue504break505506case 0 // orbType507checkResult = object.propertyValue508break509510end switch511else512switch editor.variableID513case EDIT_VAR_PROPVAL // property value514object.propertyValue = editor.variableValue515break516517case 0 // orbType518object.propertyValue = editor.variableValue519break520521end switch522end if523end event524525526event RSDKDraw527if object.propertyValue == 0528temp0 = object.xpos529temp0 += 0x280000530temp1 = object.ypos531temp1 -= 0x80000532DrawSpriteXY(2, temp0, temp1)533end if534535DrawSprite(0)536end event537538539event RSDKLoad540LoadSpriteSheet("HTZ/Objects.gif")541SpriteFrame(-44, -44, 91, 56, 164, 1)542SpriteFrame(-48, -24, 96, 36, 159, 58)543SpriteFrame(-8, -8, 16, 16, 91, 222)544SpriteFrame(-8, -8, 16, 16, 91, 239)545546AddEditorVariable("orbType")547SetActiveVariable("orbType")548AddEnumVariable("Has Orb", 0)549AddEnumVariable("No Orb", 255)550end event551552553