Path: blob/master/Sonic 2/Scripts/EHZ/EHZSetup.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: EHZ Setup Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value1 : object.bgWaterPaletteTimer12private alias object.value4 : object.deformTimer1314private alias object.value5 : object.bgLightDuration15private alias object.value6 : object.bgLightFrame1617private alias object.value7 : object.pinkFlowerDuration18private alias object.value8 : object.pinkFlowerFrame1920private alias object.value9 : object.redFlowerDuration21private alias object.value10 : object.redFlowerFrame2223private alias object.value11 : object.rectFlowerDuration24private alias object.value12 : object.rectFlowerFrame2526private alias object.value13 : object.pointyFlowerDuration27private alias object.value14 : object.pointyFlowerFrame2829// Game Modes30private alias 0 : MODE_NOSAVE31private alias 1 : MODE_SAVEGAME32private alias 2 : MODE_TIMEATTACK3334// 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 slots45private alias 10 : SLOT_ZONESETUP46private alias 25 : SLOT_MUSICEVENT_CHANGE47private alias 26 : SLOT_MUSICEVENT_BOSS4849// Music Events50private alias 2 : MUSICEVENT_TRANSITION5152private alias 0 : MUSICEVENT_FLAG_NOCHANGE53private alias 1 : MUSICEVENT_FLAG_SPEEDUP54private alias 2 : MUSICEVENT_FLAG_SLOWDOWN5556// Music Loops57private alias 152750 : MUSIC_LOOP_EHZ_1P58private alias 122240 : MUSIC_LOOP_EHZ_1P_F5960private alias 99572 : MUSIC_LOOP_EHZ_2P61private alias 79604 : MUSIC_LOOP_EHZ_2P_F6263private alias 38679 : MUSIC_LOOP_INV64private alias 30897 : MUSIC_LOOP_INV_F6566// Achievement Aliases67private alias 2 : ACHIEVEMENT_EARLYBIRDSPECIAL686970// ========================71// Function Declarations72// ========================7374reserve function EHZSetup_SpeedUpMusic1P75reserve function EHZSetup_SlowDownMusic1P76reserve function EHZSetup_SpeedUpMusic2P77reserve function EHZSetup_SlowDownMusic2P787980// ========================81// Static Values82// ========================8384private value EHZSetup_hasAchievement = 0858687// ========================88// Tables89// ========================9091private table EHZSetup_bgLightFrameTable92508, 2493509, 1094510, 1295511, 2496510, 1297509, 1098end table99100private table EHZSetup_pinkFlowerFrameTable101512, 128102513, 20103512, 8104513, 8105512, 8106513, 8107end table108109private table EHZSetup_redFlowerFrameTable110514, 128111515, 12112514, 12113515, 12114514, 6115515, 6116514, 6117515, 6118end table119120private table EHZSetup_rectFlowerFrameTable121516, 8122517, 8123end table124125private table EHZSetup_pointyFlowerFrameTable126518, 128127519, 8128518, 8129519, 8130518, 8131519, 12132518, 12133519, 12134end table135136private table EHZSetup_deformationTable1371, 2, 1, 3, 1, 2, 2, 1, 2, 3, 1, 2, 1, 2, 0, 01382, 0, 3, 2, 2, 3, 2, 2, 1, 3, 0, 0, 1, 0, 1, 31391, 2, 1, 3, 1, 2, 2, 1, 2, 3, 1, 2, 1, 2, 0, 01402, 0, 3, 2, 2, 3, 2, 2, 1, 3, 0, 0, 1, 0, 1, 3141end table142143private table EHZSetup_replay_attract_S1440x440000, 0x29100001450x20, 11460x28, 271470x08, 391480x38, 11490x28, 91500x08, 401510x38, 11520x28, 61530x08, 81540x38, 11550x28, 61560x08, 1751570x38, 11580x28, 71590x08, 1111600x00, 21610x04, 351620x34, 11630x24, 71640x04, 731650x00, 41660x08, 41670x38, 11680x28, 71690x08, 681700x00, 51710x04, 301720x00, 81730x02, 41740x32, 11750x22, 11760x32, 11770x20, 41780x00, 151790x08, 561800x00, 11810x02, 321820x32, 11830x22, 11840x2A, 11850x28, 31860x08, 2551870x08, 971880x00, 121890x04, 51900x00, 261910x08, 211920x38, 11930x28, 91940x08, 2551950x08, 41960x0A, 31970x02, 71980x0A, 2199end table200201private table EHZSetup_replay_attract_T2020x440000, 0x29500002030x20, 132040x28, 382050x08, 472060x38, 12070x28, 122080x08, 2242090x38, 12100x28, 52110x08, 692120x38, 12130x28, 82140x20, 22150x00, 22160x08, 122170x00, 282180x08, 162190x00, 12200x08, 2552210x08, 52220x38, 12230x28, 242240x08, 2182250x38, 12260x28, 92270x08, 502280x00, 12290x04, 72300x00, 162310x08, 1742320x38, 12330x28, 122340x08, 72350x38, 12360x28, 82370x08, 42380x38, 12390x28, 52400x08, 32410x04, 22420x34, 12430x24, 52440x04, 42450x34, 12460x20, 52470x00, 42480x04, 12490x34, 12500x24, 32510x04, 42520x34, 12530x24, 42540x04, 52550x34, 12560x24, 32570x04, 12580x00, 22590x08, 22600x38, 12610x28, 32620x20, 22630x00, 12640x08, 52650x00, 52660x08, 32670x38, 12680x28, 22690x08, 12700x00, 92710x08, 52720x00, 152730x08, 222740x00, 32750x04, 22760x34, 12770x24, 92780x20, 22790x28, 82800x08, 42810x38, 12820x28, 42830x20, 12840x00, 32850x30, 12860x20, 62870x00, 42880x30, 12890x20, 52900x00, 12910x08, 32920x00, 12930x30, 12940x20, 52950x00, 32960x30, 12970x20, 32980x28, 32990x08, 23000x00, 13010x30, 13020x20, 53030x00, 53040x30, 13050x20, 43060x00, 43070x30, 13080x20, 43090x00, 53100x30, 13110x20, 43120x00, 43130x30, 13140x20, 53150x00, 43160x30, 13170x20, 43180x00, 53190x30, 13200x20, 43210x00, 53220x30, 13230x20, 43240x00, 53250x30, 13260x20, 53270x00, 33280x30, 13290x20, 43300x00, 43310x30, 13320x20, 53330x00, 33340x30, 13350x20, 53360x00, 33370x30, 13380x20, 63390x00, 33400x30, 13410x20, 43420x00, 43430x30, 13440x20, 43450x00, 43460x30, 13470x20, 43480x00, 43490x30, 13500x20, 43510x28, 23520x08, 393530x38, 13540x28, 123550x08, 133560x00, 173570x08, 43580x00, 123590x04, 113600x08, 8361end table362363private table EHZSetup_replay_attract_K3640x440000, 0x29100003650x00, 183660x08, 773670x38, 13680x28, 133690x08, 703700x38, 13710x28, 143720x08, 33730x00, 223740x04, 43750x00, 33760x30, 13770x20, 163780x28, 33790x08, 13800x00, 303810x30, 13820x20, 383830x28, 1493840x08, 113850x00, 33860x04, 63870x00, 43880x04, 53890x00, 53900x08, 133910x00, 143920x04, 893930x00, 63940x08, 443950x0A, 13960x02, 133970x00, 523980x08, 593990x38, 14000x28, 174010x08, 184020x00, 44030x04, 334040x00, 14050x08, 1054060x38, 14070x28, 304080x08, 454090x04, 64100x00, 524110x08, 64120x38, 14130x28, 194140x08, 544150x0A, 64160x02, 174170x0A, 24180x08, 584190x38, 14200x28, 44210x08, 1974220x38, 14230x29, 104240x09, 144250x39, 14260x29, 404270x21, 44280x01, 1264290x09, 124300x08, 64310x38, 14320x28, 12433end table434435436// ========================437// Function Definitions438// ========================439440private function EHZSetup_SpeedUpMusic1P441CheckEqual(object[SLOT_MUSICEVENT_CHANGE].type, TypeName[Music Event])442temp0 = checkResult443CheckEqual(object[SLOT_MUSICEVENT_CHANGE].propertyValue, MUSICEVENT_TRANSITION)444temp0 &= checkResult445CheckEqual(stage.musicFlag, MUSICEVENT_FLAG_NOCHANGE)446temp0 &= checkResult447if temp0 == false448switch music.currentTrack449case TRACK_STAGE450SetMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F)451SwapMusicTrack("EmeraldHill_F.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_1P_F, 8000)452break453454case TRACK_INVINCIBLE455SetMusicTrack("EmeraldHill_F.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_1P_F)456SwapMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F, 8000)457break458459case TRACK_BOSS460case TRACK_DROWNING461case TRACK_SUPER462SetMusicTrack("EmeraldHill_F.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_1P_F)463SetMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F)464break465466end switch467else468stage.musicFlag = MUSICEVENT_FLAG_SPEEDUP469end if470end function471472473private function EHZSetup_SlowDownMusic1P474CheckEqual(object[SLOT_MUSICEVENT_CHANGE].type, TypeName[Music Event])475temp0 = checkResult476CheckEqual(object[SLOT_MUSICEVENT_CHANGE].propertyValue, MUSICEVENT_TRANSITION)477temp0 &= checkResult478CheckEqual(stage.musicFlag, MUSICEVENT_FLAG_NOCHANGE)479temp0 &= checkResult480if temp0 == false481switch music.currentTrack482case TRACK_STAGE483SetMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV)484SwapMusicTrack("EmeraldHill.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_1P, 12500)485break486487case TRACK_INVINCIBLE488SetMusicTrack("EmeraldHill.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_1P)489SwapMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV, 12500)490break491492case TRACK_BOSS493case TRACK_DROWNING494case TRACK_SUPER495SetMusicTrack("EmeraldHill.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_1P)496SetMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV)497break498499end switch500else501stage.musicFlag = MUSICEVENT_FLAG_SLOWDOWN502end if503end function504505506private function EHZSetup_SpeedUpMusic2P507CheckEqual(object[SLOT_MUSICEVENT_CHANGE].type, TypeName[Music Event])508temp0 = checkResult509CheckEqual(object[SLOT_MUSICEVENT_CHANGE].propertyValue, MUSICEVENT_TRANSITION)510temp0 &= checkResult511CheckEqual(stage.musicFlag, MUSICEVENT_FLAG_NOCHANGE)512temp0 &= checkResult513if temp0 == false514switch music.currentTrack515case TRACK_STAGE516SetMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F)517SwapMusicTrack("EmeraldHill2_F.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_2P_F, 8000)518break519520case TRACK_INVINCIBLE521SetMusicTrack("EmeraldHill2_F.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_2P_F)522SwapMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F, 8000)523break524525case TRACK_BOSS526case TRACK_DROWNING527case TRACK_SUPER528SetMusicTrack("EmeraldHill2_F.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_2P_F)529SetMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F)530break531532end switch533else534stage.musicFlag = MUSICEVENT_FLAG_SPEEDUP535end if536end function537538539private function EHZSetup_SlowDownMusic2P540CheckEqual(object[SLOT_MUSICEVENT_CHANGE].type, TypeName[Music Event])541temp0 = checkResult542CheckEqual(object[SLOT_MUSICEVENT_CHANGE].propertyValue, MUSICEVENT_TRANSITION)543temp0 &= checkResult544CheckEqual(stage.musicFlag, MUSICEVENT_FLAG_NOCHANGE)545temp0 &= checkResult546if temp0 == false547switch music.currentTrack548case TRACK_STAGE549SetMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV)550SwapMusicTrack("EmeraldHill2.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_2P, 12500)551break552553case TRACK_INVINCIBLE554SetMusicTrack("EmeraldHill2.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_2P)555SwapMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV, 12500)556break557558case TRACK_BOSS559case TRACK_DROWNING560case TRACK_SUPER561SetMusicTrack("EmeraldHill2.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_2P)562SetMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV)563break564565end switch566else567stage.musicFlag = MUSICEVENT_FLAG_SLOWDOWN568end if569end function570571572// ========================573// Events574// ========================575576event ObjectUpdate577// What's this check supposed to be?578// This object's state always seems to be 0, and 5 is such a strange number...579// (S1's GHZ Setup had this same state check too and it made just as little sense there, as well...)580if object.state < 5581object.bgWaterPaletteTimer++582if object.bgWaterPaletteTimer == 8583object.bgWaterPaletteTimer = 0584GetPaletteEntry(0, 159, temp1)585586GetPaletteEntry(0, 158, temp0)587SetPaletteEntry(0, 159, temp0)588589GetPaletteEntry(0, 148, temp0)590SetPaletteEntry(0, 158, temp0)591592GetPaletteEntry(0, 147, temp0)593SetPaletteEntry(0, 148, temp0)594595SetPaletteEntry(0, 147, temp1)596end if597end if598599// Update the shimmering water in the background600object.deformTimer++601if object.deformTimer > 7602tileLayer[1].deformationOffset++603object.deformTimer = 0604end if605606if object.bgLightDuration < 2607GetTableValue(temp0, object.bgLightFrame, EHZSetup_bgLightFrameTable)608609Copy16x16Tile(502, temp0)610temp0 += 12611612Copy16x16Tile(503, temp0)613temp0 += 4614615Copy16x16Tile(504, temp0)616object.bgLightFrame++617618GetTableValue(object.bgLightDuration, object.bgLightFrame, EHZSetup_bgLightFrameTable)619object.bgLightFrame++620621object.bgLightFrame %= 12622else623object.bgLightDuration--624end if625626if object.pinkFlowerDuration < 2627GetTableValue(temp0, object.pinkFlowerFrame, EHZSetup_pinkFlowerFrameTable)628629Copy16x16Tile(764, temp0)630object.pinkFlowerFrame++631632GetTableValue(object.pinkFlowerDuration, object.pinkFlowerFrame, EHZSetup_pinkFlowerFrameTable)633object.pinkFlowerFrame++634635object.pinkFlowerFrame %= 12636else637object.pinkFlowerDuration--638end if639640if object.redFlowerDuration < 2641GetTableValue(temp0, object.redFlowerFrame, EHZSetup_redFlowerFrameTable)642643Copy16x16Tile(765, temp0)644object.redFlowerFrame++645646GetTableValue(object.redFlowerDuration, object.redFlowerFrame, EHZSetup_redFlowerFrameTable)647object.redFlowerFrame++648649object.redFlowerFrame &= 15650else651object.redFlowerDuration--652end if653654if object.rectFlowerDuration < 2655GetTableValue(temp0, object.rectFlowerFrame, EHZSetup_rectFlowerFrameTable)656657Copy16x16Tile(766, temp0)658object.rectFlowerFrame++659660GetTableValue(object.rectFlowerDuration, object.rectFlowerFrame, EHZSetup_rectFlowerFrameTable)661object.rectFlowerFrame++662663object.rectFlowerFrame &= 3664else665object.rectFlowerDuration--666end if667668if object.pointyFlowerDuration < 2669GetTableValue(temp0, object.pointyFlowerFrame, EHZSetup_pointyFlowerFrameTable)670671Copy16x16Tile(767, temp0)672object.pointyFlowerFrame++673674GetTableValue(object.pointyFlowerDuration, object.pointyFlowerFrame, EHZSetup_pointyFlowerFrameTable)675object.pointyFlowerFrame++676677object.pointyFlowerFrame &= 15678else679object.pointyFlowerDuration--680end if681682if EHZSetup_hasAchievement == false683if stage.debugMode == false684if specialStage.emeralds >= 0x7F685// Grant the "Early Bird Special" Achievement, if applicable686687if options.gameMode == MODE_NOSAVE688EHZSetup_hasAchievement = true689CallNativeFunction2(SetAchievement, ACHIEVEMENT_EARLYBIRDSPECIAL, 100)690end if691692if options.gameMode == MODE_SAVEGAME693arrayPos1 = options.saveSlot694arrayPos1 <<= 3695arrayPos1 += 4696if saveRAM[arrayPos1] < 20 // Make sure our save file hasn't been completed yet, you have to play by the rules and do it on the first go!697EHZSetup_hasAchievement = true698CallNativeFunction2(SetAchievement, ACHIEVEMENT_EARLYBIRDSPECIAL, 100)699end if700end if701end if702end if703end if704end event705706707event ObjectStartup708if stage.activeList != BONUS_STAGE709// Different music based on the current mode710// To accommodate the different music, there are also separate speedup and slowdown functions for each track711if options.vsMode == false712SetMusicTrack("EmeraldHill.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_1P)713SpeedUpMusic = EHZSetup_SpeedUpMusic1P714SlowDownMusic = EHZSetup_SlowDownMusic1P715else716SetMusicTrack("EmeraldHill2.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_2P)717SpeedUpMusic = EHZSetup_SpeedUpMusic2P718SlowDownMusic = EHZSetup_SlowDownMusic2P719end if720else721// In the Boss Attack version of the stage, play the DEZ track instead722// (This applies to both the 2013's Boss Attack as well as Origins's new Boss Attack)723SetMusicTrack("DeathEgg.ogg", TRACK_STAGE, true)724725// (Nothing for speed up or slow down here since a speed up version of DEZ's music doesn't exist, and it's not needed anyway)726end if727728#platform: USE_ORIGINS729// In Mission Mode, disregard the previous code and always play EHZ 1P730// (The Mission stages are all on the Bonus stage list, which triggers the DEZ music code)731if game.playMode == BOOT_PLAYMODE_MISSION732SetMusicTrack("EmeraldHill.ogg", TRACK_STAGE, MUSIC_LOOP_EHZ_1P)733SpeedUpMusic = EHZSetup_SpeedUpMusic1P734SlowDownMusic = EHZSetup_SlowDownMusic1P735end if736#endplatform737738animalType1 = TypeName[Flicky]739animalType2 = TypeName[Ricky]740741tileLayer[1].scrollPos = -0x80000742743arrayPos0 = 0744while arrayPos0 < 576745temp0 = arrayPos0746temp0 &= 0x3F747GetTableValue(stage.deformationData2[arrayPos0], temp0, EHZSetup_deformationTable)748arrayPos0++749loop750751object[SLOT_ZONESETUP].type = TypeName[EHZ Setup]752object[SLOT_ZONESETUP].priority = PRIORITY_ACTIVE753754// Reset the boss flash color755SetPaletteEntry(0, 192, 0x000000)756757if options.attractMode == true758switch stage.playerListPos759case PLAYER_SONIC_A760#platform: USE_ORIGINS761case PLAYER_AMY_A // Amy isn't even able to show up in demos, but check for her anyway I guess762#endplatform763Player_attractTable = EHZSetup_replay_attract_S764Player_attractTableSize = 110765Player_attractDuration = 1620766break767768case PLAYER_TAILS_A769Player_attractTable = EHZSetup_replay_attract_T770Player_attractTableSize = 318771Player_attractDuration = 1800772break773774case PLAYER_KNUCKLES_A775Player_attractTable = EHZSetup_replay_attract_K776Player_attractTableSize = 138777Player_attractDuration = 1800778break779end switch780781CallFunction(Player_SetupAttractDemo)782end if783end event784785786// ========================787// Editor Events788// ========================789790event RSDKDraw791DrawSprite(0)792end event793794795event RSDKLoad796LoadSpriteSheet("Global/Display.gif")797SpriteFrame(-16, -16, 32, 32, 1, 143)798799SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")800end event801802803