Path: blob/master/Sonic 2/Scripts/Global/AnimalPrison.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Animal Prison Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value0 : object.timer12private alias object.value2 : object.buttonPos13private alias object.value3 : object.lockPos.x14private alias object.value4 : object.lockPos.y15private alias object.value5 : object.debrisEdgeFrame16private alias object.value6 : object.debrisCenterFrame1718// States19private alias 0 : ANIMALPRISON_AWAITOPEN20private alias 1 : ANIMALPRISON_OPENING21private alias 2 : ANIMALPRISON_SHOWDEBRIS22private alias 3 : ANIMALPRISON_HANDLEACTCLEAR23private alias 4 : ANIMALPRISON_OPENED2425// Animal Aliases26private alias object.value1 : animal.randomizeDir2728// Player Aliases29private alias object.xpos : player.xpos30private alias object.ypos : player.ypos31private alias object.xvel : player.xvel32private alias object.speed : player.speed33private alias object.collisionRight : player.collisionRight34private alias object.collisionBottom : player.collisionBottom3536// Super States37private alias 1 : SUPERSTATE_SUPER38private alias 2 : SUPERSTATE_FADEOUT3940// Game Modes41private alias 2 : MODE_TIMEATTACK4243// Tracks44private alias 1 : TRACK_ACTFINISH454647// ========================48// Function Declarations49// ========================5051reserve function AnimalPrison_DebugDraw52reserve function AnimalPrison_DebugSpawn535455// ========================56// Function Definitions57// ========================5859private function AnimalPrison_DebugDraw60DrawSprite(3)61DrawSprite(0)62DrawSprite(4)63end function646566private function AnimalPrison_DebugSpawn67CreateTempObject(TypeName[Animal Prison], 0, object.xpos, object.ypos)68end function697071// ========================72// Events73// ========================7475event ObjectUpdate76switch object.state77case ANIMALPRISON_AWAITOPEN78temp0 = object.ixpos79temp0 -= screen.xcenter80stage.newXBoundary1 = temp081temp0 = object.ixpos82temp0 += screen.xcenter83stage.newXBoundary2 = temp084break8586case ANIMALPRISON_OPENING87object.timer++8889object.lockPos.x += object.xvel90object.lockPos.y += object.yvel91object.yvel += 0x40009293if object.timer == 3094temp1 = object.ypos95temp1 += 0x4000096temp2 = 097temp3 = 3098while temp2 < 3299Rand(temp0, 48)100temp0 >>= 2101temp0 <<= 18102temp0 -= 0x180000103temp0 += object.xpos104temp4 = temp2105temp4 &= 1106if temp4 == false107CreateTempObject(animalType1, temp3, temp0, temp1)108else109CreateTempObject(animalType2, temp3, temp0, temp1)110end if111animal[tempObjectPos].randomizeDir = true112temp0 += 0x40000113temp2++114temp3 += 5115loop116object.drawOrder = 4117object.timer = 0118object.state++119object.debrisEdgeFrame = 5120object.debrisCenterFrame = 17121end if122break123124case ANIMALPRISON_SHOWDEBRIS125object.debrisEdgeFrame = object.timer126object.debrisEdgeFrame += 5127object.debrisCenterFrame = object.timer128object.debrisCenterFrame >>= 1129object.debrisCenterFrame += 17130131if object.timer < 12132object.timer++133else134object.timer = 0135object.state++136end if137break138139case ANIMALPRISON_HANDLEACTCLEAR140if object.timer < 300141object.timer++142if object.timer > 240143music.volume -= 2144end if145else146PlayMusic(TRACK_ACTFINISH)147object[30].type = TypeName[Act Finish]148object[30].drawOrder = 6149object[30].priority = PRIORITY_ACTIVE150object.timer = 0151object.state++152end if153break154155case ANIMALPRISON_OPENED156break157158end switch159160object.buttonPos = object.ypos161object.buttonPos -= 0x300000162163temp2 = object.buttonPos164temp2 += 0x80000165166// Check collision with players167foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)168BoxCollisionTest(C_SOLID, object.entityPos, -32, -24, 32, 32, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)169170BoxCollisionTest(C_SOLID, object.entityPos, -16, -40, 16, -24, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)171if object.state == ANIMALPRISON_AWAITOPEN172if checkResult == COL_TOP173object.state = ANIMALPRISON_OPENING174stage.timeEnabled = false175176if Player_superState == SUPERSTATE_SUPER177Player_superState = SUPERSTATE_FADEOUT178end if179180object.xvel = 0x80000181object.yvel = -0x40000182object.lockPos.x = object.xpos183object.lockPos.y = object.ypos184CreateTempObject(TypeName[Smoke Puff], 0, object.xpos, object.ypos)185object[tempObjectPos].ypos -= 0x180000186PlaySfx(SfxName[Destroy], false)187#platform: USE_ORIGINS188CallNativeFunction2(NotifyCallback, NOTIFY_BOSS_END, 1)189#endplatform190end if191end if192193BoxCollisionTest(C_TOUCH, object.entityPos, -15, -48, 15, -24, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)194if checkResult == true195temp0 = player[currentPlayer].collisionBottom196temp0 <<= 16197temp0 += player[currentPlayer].ypos198if temp0 > object.buttonPos199if temp0 <= temp2200object.buttonPos = temp0201end if202end if203end if204205// Boundary R206temp0 = player[currentPlayer].collisionRight207temp0 <<= 16208temp0 += player[currentPlayer].xpos209temp1 = stage.curXBoundary2210temp1 <<= 16211if temp0 > temp1212player[currentPlayer].xvel = 0213player[currentPlayer].speed = 0214player[currentPlayer].xpos = temp1215temp0 = player[currentPlayer].collisionRight216temp0 <<= 16217player[currentPlayer].xpos -= temp0218end if219next220end event221222223event ObjectDraw224switch object.state225case ANIMALPRISON_AWAITOPEN226DrawSpriteXY(2, object.xpos, object.buttonPos)227DrawSprite(0)228DrawSprite(4)229break230231case ANIMALPRISON_OPENING232DrawSpriteXY(2, object.xpos, object.buttonPos)233DrawSprite(0)234DrawSpriteXY(4, object.lockPos.x, object.lockPos.y)235break236237case ANIMALPRISON_SHOWDEBRIS238DrawSpriteXY(2, object.xpos, object.buttonPos)239DrawSprite(1)240241DrawSprite(object.debrisEdgeFrame)242243object.direction = FLIP_X244DrawSpriteFX(object.debrisEdgeFrame, FX_FLIP, object.xpos, object.ypos)245246DrawSprite(object.debrisCenterFrame)247break248249case ANIMALPRISON_HANDLEACTCLEAR250case ANIMALPRISON_OPENED251DrawSpriteXY(2, object.xpos, object.buttonPos)252DrawSprite(1)253break254255end switch256end event257258259event ObjectStartup260LoadSpriteSheet("Global/Items2.gif")261SpriteFrame(-32, -32, 64, 64, 83, 1) // capsule (closed) - #0262SpriteFrame(-32, -32, 64, 64, 148, 1) // capsule (open) - #1263SpriteFrame(-16, 0, 32, 16, 213, 1) // button (closed) - #2264SpriteFrame(-16, -48, 32, 16, 213, 1) // button (open) - #3265SpriteFrame(-8, -31, 16, 16, 213, 18) // lock - #4266SpriteFrame(-32, -16, 24, 24, 83, 17) // debris - #5267SpriteFrame(-32, -14, 24, 22, 83, 17) // debris - #6268SpriteFrame(-32, -12, 24, 20, 83, 17) // debris - #7269SpriteFrame(-32, -10, 24, 18, 83, 17) // debris - #8270SpriteFrame(-32, -8, 24, 16, 83, 17) // debris - #9271SpriteFrame(-32, -6, 24, 14, 83, 17) // debris - #10272SpriteFrame(-32, -4, 24, 12, 83, 17) // debris - #11273SpriteFrame(-32, -2, 24, 10, 83, 17) // debris - #12274SpriteFrame(-32, 0, 24, 8, 83, 17) // debris - #13275SpriteFrame(-32, 2, 24, 6, 83, 17) // debris - #14276SpriteFrame(-32, 4, 24, 4, 83, 17) // debris - #15277SpriteFrame(-32, 6, 24, 2, 83, 17) // debris - #16278SpriteFrame(-8, -16, 16, 24, 107, 17) // debris - #17279SpriteFrame(-8, -16, 16, 20, 107, 17) // debris - #18280SpriteFrame(-8, -16, 16, 16, 107, 17) // debris - #19281SpriteFrame(-8, -16, 16, 12, 107, 17) // debris - #20282SpriteFrame(-8, -16, 16, 8, 107, 17) // debris - #21283SpriteFrame(-8, -16, 16, 4, 107, 17) // debris - #22284285// Add this object to the debug item list286SetTableValue(TypeName[Animal Prison], DebugMode_ObjCount, DebugMode_TypesTable)287SetTableValue(AnimalPrison_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)288SetTableValue(AnimalPrison_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)289DebugMode_ObjCount++290291// Let all Animal Prisons load based on X only regardless of the player's Y, so that the player can't pass the Prison no matter how high they are292foreach (TypeName[Animal Prison], arrayPos0, ALL_ENTITIES)293object[arrayPos0].priority = PRIORITY_XBOUNDS294next295296// Erase all animal prisons if in VS mode, since SignPosts are used there instead297if options.vsMode == true298foreach (TypeName[Animal Prison], arrayPos0, ALL_ENTITIES)299object[arrayPos0].type = TypeName[Blank Object]300next301end if302end event303304305// ========================306// Editor Events307// ========================308309event RSDKDraw310object.buttonPos = object.ypos311object.buttonPos -= 0x300000312313DrawSpriteXY(1, object.xpos, object.buttonPos)314DrawSprite(0)315DrawSprite(2)316end event317318319event RSDKLoad320LoadSpriteSheet("Global/Items2.gif")321SpriteFrame(-32, -32, 64, 64, 83, 1)322SpriteFrame(-16, 0, 32, 16, 213, 1)323SpriteFrame(-8, -31, 16, 16, 213, 18)324325SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")326end event327328329