Path: blob/master/Sonic 1/Scripts/SLZ/SeeSaw.txt
1483 views
// ----------------------------------1// RSDK Project: Sonic 12// Script Description: SeeSaw Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value0 : object.orbTimer12private 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 // uhhhhh... why only 8? this is a 16-bit shifted value81object[tempObjectPos].orbFrame = 282object[tempObjectPos].tilt = SEESAW_TILT_R83object[tempObjectPos].targetTilt = SEESAW_TILT_R84if object[tempObjectPos].propertyValue != 0 // we just spawned this object with a prop val of 0 already... this check feels a bit weird...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 != 0129object.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 if251252if object.orbTargetPos.x < object.xpos253object.targetTilt = SEESAW_TILT_L254object.orbSide = 1255else256object.targetTilt = SEESAW_TILT_R257object.orbSide = 2258end if259object.priority = PRIORITY_BOUNDS260end if261end if262break263264case SEESAW_NO_ORB265break266267end switch268269object.tiltTimerL = 0270object.tiltTimerM = 0271object.tiltTimerR = 0272object.stood = false273274foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)275temp7 = object.prevTilt276CallFunction(SeeSaw_SetupHitbox)277278if temp2 != 0279temp3 = temp2280FlipSign(temp3)281if player[currentPlayer].yvel > object.launchVelocity282temp4 = player[currentPlayer].yvel283temp4 += 0x7000284else285temp4 = object.launchVelocity286end if287288if player[currentPlayer].gravity == GRAVITY_AIR289BoxCollisionTest(C_PLATFORM, object.entityPos, temp3, temp0, temp2, temp1, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)290else291checkResult = false292end if293294if checkResult == true295object.stood = true296if object.tilt != object.prevTilt297temp6 = temp0298temp7 = object.tilt299CallFunction(SeeSaw_SetupHitbox)300temp0 -= temp6301temp0 <<= 16302player[currentPlayer].ypos += temp0303end if304305player[currentPlayer].ypos += 0x20000306if object.orbSide == 0307if object.state == SEESAW_ORB_IDLE308object.state = SEESAW_NONE309else310if object.state == SEESAW_ORB_LAUNCHED311temp4 = object.launchVelocity312end if313end if314315temp0 = player[currentPlayer].xpos316temp0 -= object.xpos317Abs(temp0)318if temp0 < 0x80000319object.tiltTimerM++320else321if player[currentPlayer].xpos < object.xpos322object.tiltTimerL++323if object.targetTilt != SEESAW_TILT_L324object.launchVelocity = temp4325end if326else327object.tiltTimerR++328if object.targetTilt != SEESAW_TILT_R329object.launchVelocity = temp4330end if331end if332end if333else334temp0 = player[currentPlayer].xpos335temp0 -= object.xpos336Abs(temp0)337temp4 = object.yvel338if temp0 >= 0x80000339if player[currentPlayer].xpos < object.xpos340if object.orbSide == 1341temp4 = 0342end if343else344if object.orbSide == 2345temp4 = 0346end if347end if348end if349350if temp4 != 0351#platform: USE_STANDALONE352player[currentPlayer].state = Player_State_Air353#endplatform354#platform: USE_ORIGINS355player[currentPlayer].state = Player_State_Air_NoDropDash356#endplatform357player[currentPlayer].gravity = GRAVITY_AIR358player[currentPlayer].speed = player[currentPlayer].xvel359if object.state == SEESAW_NO_ORB360player[currentPlayer].animation = ANI_JUMPING361else362if object.orbTimer != 0363player[currentPlayer].animation = ANI_JUMPING364else365player[currentPlayer].animation = ANI_BOUNCING366end if367end if368369player[currentPlayer].timer = 0370PlaySfx(SfxName[Spring], false)371player[currentPlayer].yvel = temp4372FlipSign(player[currentPlayer].yvel)373end if374end if375end if376end if377next378379object.orbSide = 0380object.prevTilt = object.tilt381object.frame = object.tilt382object.frame &= 1383object.direction = object.tilt384object.direction >>= 1385object.direction ^= 1386387if object.orbTimer != 0388object.animationTimer--389if object.animationTimer <= 0390object.orbFrame ^= 1391if object.orbTimer > 120392object.animationTimer = 10393else394if object.orbTimer > 60395object.animationTimer = 5396else397object.animationTimer = 2398end if399end if400end if401402if object.state == SEESAW_ORB_IDLE403object.orbTimer--404if object.orbTimer == 0405CreateTempObject(TypeName[Smoke Puff], 0, object.orbTargetPos.x, object.orbTargetPos.y)406407CreateTempObject(TypeName[Bomb Shrapnel], 0, object.orbTargetPos.x, object.orbTargetPos.y)408object[tempObjectPos].xvel = -0x10000409object[tempObjectPos].yvel = -0x34000410411CreateTempObject(TypeName[Bomb Shrapnel], 0, object.orbTargetPos.x, object.orbTargetPos.y)412object[tempObjectPos].xvel = -0xA000413object[tempObjectPos].yvel = -0x24000414415CreateTempObject(TypeName[Bomb Shrapnel], 0, object.orbTargetPos.x, object.orbTargetPos.y)416object[tempObjectPos].xvel = 0x10000417object[tempObjectPos].yvel = -0x34000418419CreateTempObject(TypeName[Bomb Shrapnel], 0, object.orbTargetPos.x, object.orbTargetPos.y)420object[tempObjectPos].xvel = 0xA000421object[tempObjectPos].yvel = -0x24000422423PlaySfx(SfxName[Explosion], false)424object.state = SEESAW_NO_ORB425end if426end if427end if428429if object.state < SEESAW_NO_ORB430temp0 = object.xpos431temp1 = object.ypos432object.xpos = object.orbTargetPos.x433object.ypos = object.orbTargetPos.y434foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)435BoxCollisionTest(C_TOUCH, object.entityPos, -7, -7, 7, 7, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)436if checkResult == true437CallFunction(Player_Hit)438end if439next440object.xpos = temp0441object.ypos = temp1442end if443end event444445446event ObjectDraw447if object.state < SEESAW_NO_ORB448DrawSpriteXY(object.orbFrame, object.orbTargetPos.x, object.orbTargetPos.y)449end if450DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)451end event452453454event ObjectStartup455LoadSpriteSheet("SLZ/Objects.gif")456SpriteFrame(-42, -44, 91, 56, 84, 59) // SeeSaw (Tilted) - #0457SpriteFrame(-48, -26, 96, 24, 84, 116) // SeeSaw (Flat) - #1458SpriteFrame(-12, -11, 24, 22, 156, 1) // Spike (Red) - #2459SpriteFrame(-12, -11, 24, 22, 131, 1) // Spike (Grey) - #3460461foreach (TypeName[SeeSaw], arrayPos0, ALL_ENTITIES)462object[arrayPos0].orbTargetPos.x = object[arrayPos0].xpos463object[arrayPos0].orbTargetPos.x += 0x280000464object[arrayPos0].orbTargetPos.y = object[arrayPos0].ypos465object[arrayPos0].orbTargetPos.y -= 8 // uhhhhh... why only 8? this is an 16-bit shifted value466object[arrayPos0].orbFrame = 2467object[arrayPos0].tilt = SEESAW_TILT_R468object[arrayPos0].targetTilt = SEESAW_TILT_R469if object[arrayPos0].propertyValue != 0470object[arrayPos0].state = SEESAW_NO_ORB471end if472next473474SetTableValue(TypeName[SeeSaw], DebugMode_ObjCount, DebugMode_TypesTable)475SetTableValue(SeeSaw_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)476SetTableValue(SeeSaw_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)477DebugMode_ObjCount++478end event479480481// ========================482// Editor Events483// ========================484485event RSDKEdit486if editor.returnVariable == true487switch editor.variableID488case EDIT_VAR_PROPVAL // property value489checkResult = object.propertyValue490break491492case 0 // orbType493checkResult = object.propertyValue494break495496end switch497else498switch editor.variableID499case EDIT_VAR_PROPVAL // property value500object.propertyValue = editor.variableValue501break502503case 0 // orbType504object.propertyValue = editor.variableValue505break506507end switch508end if509end event510511512event RSDKDraw513if object.propertyValue == 0514object.orbTargetPos.x = object.xpos515object.orbTargetPos.x += 0x280000516object.orbTargetPos.y = object.ypos517object.orbTargetPos.y -= 0x80000518DrawSpriteXY(1, object.orbTargetPos.x, object.orbTargetPos.y)519end if520521DrawSprite(0)522end event523524525event RSDKLoad526LoadSpriteSheet("SLZ/Objects.gif")527SpriteFrame(-42, -44, 91, 56, 84, 59) // SeeSaw (Tilted) - #0528SpriteFrame(-12, -11, 24, 22, 156, 1) // Spike (Red) - #1529530AddEditorVariable("orbType")531SetActiveVariable("orbType")532AddEnumVariable("Has Orb", 0)533AddEnumVariable("No Orb", 255)534end event535536537