Path: blob/master/Sonic 2/Scripts/MPZ/MPZSetup.txt
1478 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: MPZ Setup Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value0 : object.paletteTimer12private alias object.value2 : object.cylinder1TileFrame13private alias object.value3 : object.cylinder2TileFrame14private alias object.value4 : object.bgPiston1TileFrame15private alias object.value5 : object.bgPiston2TileFrame16private alias object.value6 : object.lavaTileFrame17private alias object.value7 : object.bgPistonTileDuration18private alias object.value8 : object.bgPistonTileAnimID19private alias object.value9 : object.lavaTileDuration20private alias object.value10 : object.palCycle1Timer21private alias object.value11 : object.palCycle1Index22private alias object.value12 : object.palCycle2Timer23private alias object.value13 : object.palCycle2Index2425// Universal MPZ Object Aliases26// (As in, all objects in MPZ use their value31 like this)27private alias object.value31 : object.wrapOffset.y2829// Player Aliases30private alias object.state : player.state31private alias object.xpos : player.xpos32private alias object.ypos : player.ypos3334// Tracks35private alias 0 : TRACK_STAGE36private alias 1 : TRACK_ACTFINISH37private alias 2 : TRACK_INVINCIBLE38private alias 3 : TRACK_CONTINUE39private alias 4 : TRACK_BOSS40private alias 5 : TRACK_GAMEOVER41private alias 6 : TRACK_DROWNING42private alias 7 : TRACK_SUPER4344// Reserved Object Slots Aliases45private alias 10 : SLOT_ZONESETUP46private alias 25 : SLOT_MUSICEVENT_CHANGE47private alias 26 : SLOT_MUSICEVENT_BOSS4849// Tile Flag Aliases50private alias 1 : TILE_LAVA5152// Tile Info ID Aliases53private alias 8 : TILEINFO_ANGLEB5455// Music Events56private alias 2 : MUSICEVENT_TRANSITION5758private alias 0 : MUSICEVENT_FLAG_NOCHANGE59private alias 1 : MUSICEVENT_FLAG_SPEEDUP60private alias 2 : MUSICEVENT_FLAG_SLOWDOWN6162// Music Loops63private alias 309378 : MUSIC_LOOP_MPZ64private alias 247394 : MUSIC_LOOP_MPZ_F6566private alias 38679 : MUSIC_LOOP_INV67private alias 30897 : MUSIC_LOOP_INV_F6869// Achievement Aliases70private alias 9 : ACHIEVEMENT_MPZMASTER717273// ========================74// Function Declarations75// ========================7677reserve function MPZSetup_SpeedUpMusic78reserve function MPZSetup_SlowDownMusic798081// ========================82// Static Values83// ========================8485private value MPZSetup_prevStageWrap = 086public value MPZSetup_cogFrame = 087public value MPZSetup_cogTimer = 088private value MPZSetup_checkedAchievement = 089private value MPZSetup_playerWasHit = 090private value MPZSetup_unused1 = 0 // As the name suggests, it is not used91private value MPZSetup_unused2 = 0 // As the name suggests, it is not used929394// ========================95// Tables96// ========================9798private table MPZSetup_palCycle1990x00A000, 0x000000, 0xE0E000, 0x000000, 0xE020001000x000000, 0xE020E0, 0x000000, 0x0080E0, 0x000000101end table102103private table MPZSetup_palCycle21040x600000, 0x800000, 0xA000001050xC00000, 0xA00000, 0x800000106end table107108109// ========================110// Function Definitions111// ========================112113private function MPZSetup_SpeedUpMusic114CheckEqual(object[SLOT_MUSICEVENT_CHANGE].type, TypeName[Music Event])115temp0 = checkResult116CheckEqual(object[SLOT_MUSICEVENT_CHANGE].propertyValue, MUSICEVENT_TRANSITION)117temp0 &= checkResult118CheckEqual(stage.musicFlag, MUSICEVENT_FLAG_NOCHANGE)119temp0 &= checkResult120if temp0 == false121switch music.currentTrack122case TRACK_STAGE123SetMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F)124SwapMusicTrack("Metropolis_F.ogg", TRACK_STAGE, MUSIC_LOOP_MPZ_F, 8000)125break126127case TRACK_INVINCIBLE128SetMusicTrack("Metropolis_F.ogg", TRACK_STAGE, MUSIC_LOOP_MPZ_F)129SwapMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F, 8000)130break131132case TRACK_BOSS133case TRACK_GAMEOVER134case TRACK_SUPER135SetMusicTrack("Metropolis_F.ogg", TRACK_STAGE, MUSIC_LOOP_MPZ_F)136SetMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F)137break138139end switch140else141stage.musicFlag = MUSICEVENT_FLAG_SPEEDUP142end if143end function144145146private function MPZSetup_SlowDownMusic147CheckEqual(object[SLOT_MUSICEVENT_CHANGE].type, TypeName[Music Event])148temp0 = checkResult149CheckEqual(object[SLOT_MUSICEVENT_CHANGE].propertyValue, MUSICEVENT_TRANSITION)150temp0 &= checkResult151CheckEqual(stage.musicFlag, MUSICEVENT_FLAG_NOCHANGE)152temp0 &= checkResult153if temp0 == false154switch music.currentTrack155case TRACK_STAGE156SetMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV)157SwapMusicTrack("Metropolis.ogg", TRACK_STAGE, MUSIC_LOOP_MPZ, 12500)158break159160case TRACK_INVINCIBLE161SetMusicTrack("Metropolis.ogg", TRACK_STAGE, MUSIC_LOOP_MPZ)162SwapMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV, 12500)163break164165case TRACK_BOSS166case TRACK_GAMEOVER167case TRACK_SUPER168SetMusicTrack("Metropolis.ogg", TRACK_STAGE, MUSIC_LOOP_MPZ)169SetMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV)170break171172end switch173else174stage.musicFlag = MUSICEVENT_FLAG_SLOWDOWN175end if176end function177178// ========================179// Events180// ========================181182event ObjectUpdate183object.paletteTimer++184if object.paletteTimer > 2185object.paletteTimer = 0186RotatePalette(0, 161, 163, false)187end if188189object.palCycle1Timer++190if object.palCycle1Timer >= 10191object.palCycle1Timer = 0192object.palCycle1Index++193if object.palCycle1Index >= 10194object.palCycle1Index = 0195end if196GetTableValue(temp0, object.palCycle1Index, MPZSetup_palCycle1)197SetPaletteEntry(0, 175, temp0)198end if199200201object.palCycle2Timer++202if object.palCycle2Timer >= 18203object.palCycle2Timer = 0204object.palCycle2Index++205if object.palCycle2Index >= 6206object.palCycle2Index = 0207end if208GetTableValue(temp0, object.palCycle2Index, MPZSetup_palCycle2)209SetPaletteEntry(0, 168, temp0)210end if211212213// Cylinder Animations (Interactable)214Copy16x16Tile(760, object.cylinder1TileFrame)215object.cylinder1TileFrame++216217Copy16x16Tile(761, object.cylinder1TileFrame)218object.cylinder1TileFrame++219220Copy16x16Tile(762, object.cylinder1TileFrame)221object.cylinder1TileFrame++222223Copy16x16Tile(763, object.cylinder1TileFrame)224object.cylinder1TileFrame++225226Copy16x16Tile(764, object.cylinder1TileFrame)227object.cylinder1TileFrame++228229Copy16x16Tile(765, object.cylinder1TileFrame)230object.cylinder1TileFrame++231232Copy16x16Tile(766, object.cylinder1TileFrame)233object.cylinder1TileFrame++234235Copy16x16Tile(767, object.cylinder1TileFrame)236object.cylinder1TileFrame++237238if object.cylinder1TileFrame == 832239object.cylinder1TileFrame = 768240end if241242// Cylinder Animations (BG)243Copy16x16Tile(744, object.cylinder2TileFrame)244object.cylinder2TileFrame++245246Copy16x16Tile(745, object.cylinder2TileFrame)247object.cylinder2TileFrame++248249Copy16x16Tile(746, object.cylinder2TileFrame)250object.cylinder2TileFrame++251252Copy16x16Tile(747, object.cylinder2TileFrame)253object.cylinder2TileFrame++254255Copy16x16Tile(748, object.cylinder2TileFrame)256object.cylinder2TileFrame++257258Copy16x16Tile(749, object.cylinder2TileFrame)259object.cylinder2TileFrame++260261Copy16x16Tile(750, object.cylinder2TileFrame)262object.cylinder2TileFrame++263264Copy16x16Tile(751, object.cylinder2TileFrame)265object.cylinder2TileFrame++266267if object.cylinder2TileFrame == 896268object.cylinder2TileFrame = 832269end if270271if object.bgPistonTileDuration < 2272Copy16x16Tile(753, object.bgPiston1TileFrame)273object.bgPiston1TileFrame++274275Copy16x16Tile(754, object.bgPiston1TileFrame)276object.bgPiston1TileFrame++277278Copy16x16Tile(755, object.bgPiston1TileFrame)279object.bgPiston1TileFrame++280281if object.bgPiston1TileFrame == 908282object.bgPiston1TileFrame = 896283end if284285Copy16x16Tile(742, object.bgPiston2TileFrame)286object.bgPiston2TileFrame++287288Copy16x16Tile(743, object.bgPiston2TileFrame)289object.bgPiston2TileFrame++290291Copy16x16Tile(752, object.bgPiston2TileFrame)292object.bgPiston2TileFrame++293294if object.bgPiston2TileFrame == 908295object.bgPiston2TileFrame = 896296end if297298if object.bgPistonTileAnimID == 0299object.bgPistonTileDuration = 20300else301object.bgPistonTileDuration = 8302end if303object.bgPistonTileAnimID ^= 1304else305object.bgPistonTileDuration--306end if307308if object.lavaTileDuration < 2309Copy16x16Tile(756, object.lavaTileFrame)310object.lavaTileFrame++311312Copy16x16Tile(757, object.lavaTileFrame)313object.lavaTileFrame++314315Copy16x16Tile(758, object.lavaTileFrame)316object.lavaTileFrame++317318Copy16x16Tile(759, object.lavaTileFrame)319object.lavaTileFrame++320321if object.lavaTileFrame == 932322object.lavaTileFrame = 908323end if324object.lavaTileDuration = 14325else326object.lavaTileDuration--327end if328329// Cycle through all players330foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)331// Check if the player is on lava332temp1 = player[currentPlayer].xpos333temp1 >>= 16334335temp2 = player[currentPlayer].ypos336temp2 >>= 16337338temp2 += 4339340// First bit is set for lava tiles341Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEB)342temp0 &= TILE_LAVA343344if temp0 == TILE_LAVA345CallFunction(Player_FireHit)346end if347next348349MPZSetup_cogFrame += MPZSetup_cogTimer350MPZSetup_cogFrame &= 3351352if player[0].ypos >= 0x8F00000353temp1 = player[0].ypos354currentPlayer = 0355while currentPlayer < playerCount356temp0 = player[currentPlayer].ypos357temp0 -= temp1358Abs(temp0)359if temp0 < 0x8C0000360player[currentPlayer].ypos -= 0x8000000361end if362currentPlayer++363loop364365if camera[0].ypos >= 0x800366camera[0].ypos -= 0x800367screen.yoffset -= 0x800368end if369end if370371if player[0].ypos <= 0x900000372temp1 = player[0].ypos373currentPlayer = 0374while currentPlayer < playerCount375temp0 = player[currentPlayer].ypos376temp0 -= temp1377Abs(temp0)378if temp0 < 0x8C0000379player[currentPlayer].ypos += 0x8000000380end if381currentPlayer++382loop383384if camera[0].ypos <= 384385camera[0].ypos += 0x800386screen.yoffset += 0x800387end if388end if389390// Stage Wrap (Bottom)391if camera[0].ypos >= 1552392if MPZSetup_prevStageWrap == 0393MPZSetup_prevStageWrap = 1394arrayPos0 = 0x20395while arrayPos0 < 0x4A0396if object[arrayPos0].ypos <= 0x2800000397object[arrayPos0].ypos += 0x8000000398object[arrayPos0].wrapOffset.y += 0x8000000399end if400arrayPos0++401loop402end if403end if404405// Stage Wrap (Top)406if camera[0].ypos <= 640407if MPZSetup_prevStageWrap == 1408MPZSetup_prevStageWrap = 0409arrayPos0 = 32410while arrayPos0 < 0x4A0411if object[arrayPos0].ypos >= 0x6800000412object[arrayPos0].ypos -= 0x8000000413object[arrayPos0].wrapOffset.y -= 0x8000000414end if415arrayPos0++416loop417end if418end if419420if player[0].state == Player_State_Hurt421// The player has been hurt, the achievment is unobtainable now422MPZSetup_playerWasHit = true423end if424425if MPZSetup_checkedAchievement == false426if stage.debugMode == false427if object[30].type == TypeName[Act Finish]428MPZSetup_checkedAchievement = true429430if MPZSetup_playerWasHit == false431// Grant the "Metropolis Master" Achieve, since the player made it though without getting hit even once432CallNativeFunction2(SetAchievement, ACHIEVEMENT_MPZMASTER, 100)433end if434end if435end if436end if437end event438439440event ObjectStartup441SetMusicTrack("Metropolis.ogg", TRACK_STAGE, 309378)442SpeedUpMusic = MPZSetup_SpeedUpMusic443SlowDownMusic = MPZSetup_SlowDownMusic444445animalType1 = TypeName[Locky]446animalType2 = TypeName[Wocky]447448// Reset the color used for the boss flash449SetPaletteEntry(0, 192, 0x000000)450451object[SLOT_ZONESETUP].type = TypeName[MPZ Setup]452object[SLOT_ZONESETUP].priority = 1453object[SLOT_ZONESETUP].cylinder1TileFrame = 768454object[SLOT_ZONESETUP].cylinder2TileFrame = 832455object[SLOT_ZONESETUP].bgPiston1TileFrame = 896456object[SLOT_ZONESETUP].bgPiston2TileFrame = 902457object[SLOT_ZONESETUP].lavaTileFrame = 908458459MPZSetup_prevStageWrap = 0460MPZSetup_cogFrame = 0461MPZSetup_cogTimer = 0462MPZSetup_checkedAchievement = false463if starPostID == 0464MPZSetup_playerWasHit = false465end if466end event467468469// ========================470// Editor Events471// ========================472473event RSDKDraw474DrawSprite(0)475end event476477478event RSDKLoad479LoadSpriteSheet("Global/Display.gif")480SpriteFrame(-16, -16, 32, 32, 1, 143)481482SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")483end event484485486