Path: blob/master/Sonic 1/Scripts/SBZ/SBZSetup.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 12// Script Description: SBZ Setup Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011// value0 is inused12private alias object.value1 : object.processBG1314private alias object.value2 : object.aniTilesTimerA15private alias object.value3 : object.aniTilesTimerB1617private alias object.value4 : object.palRotateTimerAct11819private alias object.value5 : object.palTimerA20private alias object.value6 : object.palTimerB21private alias object.value7 : object.palTimerC22private alias object.value8 : object.palTimerD23private alias object.value9 : object.palTimerE24// value10 is unused25private alias object.value11 : object.palTimerF26private alias object.value12 : object.palTimerG2728private alias object.value13 : object.palIndexA29private alias object.value14 : object.palIndexB30private alias object.value15 : object.palIndexC31private alias object.value16 : object.palIndexD32private alias object.value17 : object.palIndexE33// value18 is unused34private alias object.value19 : object.palIndexF35private alias object.value20 : object.palIndexG3637// Tile Flag Aliases38private alias 1 : TILE_CONVEYORBELT3940// Tile Info ID Aliases41private alias 1 : TILEINFO_DIRECTION42private alias 8 : TILEINFO_ANGLEB4344// Tracks45private alias 0 : TRACK_STAGE46private alias 2 : TRACK_INVINCIBLE4748// Reserved object slots49private alias 10 : SLOT_ZONESETUP50private alias 25 : SLOT_MUSICEVENT_CHANGE5152private alias 2 : MUSICEVENT_TRANSITION5354private alias 0 : MUSICEVENT_FLAG_NOCHANGE55private alias 1 : MUSICEVENT_FLAG_SPEEDUP56private alias 2 : MUSICEVENT_FLAG_SLOWDOWN5758// Player Aliases59private alias object.xpos : player.xpos60private alias object.ypos : player.ypos61private alias object.gravity : player.gravity62private alias object.collisionLeft : player.collisionLeft63private alias object.collisionRight : player.collisionRight64private alias object.collisionBottom : player.collisionBottom6566// Music Loops67private alias 1 : MUSIC_LOOP_SBZ68private alias 1 : MUSIC_LOOP_SBZ_F6970private alias 84680 : MUSIC_LOOP_FINAL7172private alias 39528 : MUSIC_LOOP_INV73private alias 30436 : MUSIC_LOOP_INV_F747576// ========================77// Function Declarations78// ========================7980reserve function SBZSetup_BGEffectsAct181reserve function SBZSetup_BGEffectsAct282reserve function SBZSetup_SpeedUpMusic83reserve function SBZSetup_SlowDownMusic848586// ========================87// Static Values88// ========================8990public value SBZSetup_electricOrbFrame = 091public value SBZSetup_electricOrbTimer = 092public value SBZSetup_platformTimer = 0939495// ========================96// Tables97// ========================9899private table SBZSetup_palTableB_11000x404000, 0x00A0E0, 0x404000, 0x00A0E0, 0x80E000, 0x80E000, 0x404000, 0xE040E0101end table102103private table SBZSetup_palTableC_11040xE0E000, 0xE08000, 0xE00000, 0x800000, 0x800000, 0xE00000, 0xE08000, 0xE0E000105end table106107private table SBZSetup_palTableD_11080xA00000, 0xA00000, 0x800000, 0x600000, 0x400000, 0x400000, 0x600000, 0x800000109end table110111private table SBZSetup_palTableE_11120xE00000, 0xE00000, 0xA00000, 0x800000, 0x600000, 0x600000, 0x800000, 0xA00000113end table114115private table SBZSetup_palTableB_21160x60E0C0, 0x60E0C0, 0x40C0A0, 0x20A080, 0x008060, 0x008060, 0x20A080, 0x40C0A0117end table118119private table SBZSetup_palTableF_11200x00A0E0, 0x6080E0, 0xA060E0, 0xE040E0, 0xE08080, 0xE0A040, 0xE0C020, 0xE0E0001210xE0E000, 0xE0C020, 0xE0A040, 0xE08080, 0xE040E0, 0xA060E0, 0x6080E0, 0x00A0E0122end table123124private table SBZSetup_palTableG_11250x00A0E0, 0x00A0E0, 0x4060A0, 0xA04060, 0xE00000, 0xE00000, 0xA04060, 0x4060A0126end table127128private table SBZSetup_electricOrbDelayTable12920, 3, 1, 2, 3, 313020, 3, 1, 2, 3, 313120, 3, 1, 2, 3, 313220, 3, 1, 2, 3, 3133end table134135private table SBZSetup_palTableA_11360xE0A0E0, 0xE040E0, 0x800080137end table138139private table SBZSetup_palTableA_21400xE040E0, 0x800080, 0xE0A0E0141end table142143private table SBZSetup_palTableA_31440x800080, 0xE0A0E0, 0xE040E0145end table146147private table SBZSetup_replay_credits_STK_21480x15700000, 0x16C00001490x00, 61500x04, 1941510x00, 1871520x04, 351530x00, 141540x04, 101550x00, 241560x04, 291570x00, 111580x08, 198159end table160161private table SBZSetup_replay_credits_STK_11620x1B00000, 0x72C00001630x00, 631640x08, 181650x00, 1131660x08, 461670x38, 11680x28, 71690x08, 961700x02, 471710x00, 431720x08, 341730x38, 11740x28, 161750x20, 81760x28, 55177end table178179180// ========================181// Function Definitions182// ========================183184private function SBZSetup_BGEffectsAct1185if object.aniTilesTimerA < 65186temp0 = object.aniTilesTimerA187temp0 &= 7188if temp0 == 0189temp0 = object.aniTilesTimerA190temp0 &= 63191temp0 >>= 3192temp0 <<= 2193temp0 += 604194Copy16x16Tile(592, temp0)195temp0++196Copy16x16Tile(593, temp0)197temp0++198Copy16x16Tile(594, temp0)199end if200end if201object.aniTilesTimerA++202object.aniTilesTimerA %= 192203204if object.aniTilesTimerB < 65205temp0 = object.aniTilesTimerB206temp0 &= 7207if temp0 == 0208temp0 = object.aniTilesTimerB209temp0 &= 63210temp0 >>= 3211temp0 <<= 2212temp0 += 604213Copy16x16Tile(596, temp0)214temp0++215Copy16x16Tile(597, temp0)216temp0++217Copy16x16Tile(598, temp0)218end if219end if220object.aniTilesTimerB++221object.aniTilesTimerB %= 144222223object.palRotateTimerAct1++224if object.palRotateTimerAct1 == 2225object.palRotateTimerAct1 = 0226RotatePalette(0, 172, 174, true)227end if228229object.palTimerD++230if object.palTimerD == 15231object.palTimerD = 0232object.palIndexD++233object.palIndexD &= 7234GetTableValue(temp0, object.palIndexD, SBZSetup_palTableD_1)235SetPaletteEntry(0, 183, temp0)236end if237238object.palTimerE++239if object.palTimerE == 12240object.palTimerE = 0241object.palIndexE++242object.palIndexE &= 7243GetTableValue(temp0, object.palIndexE, SBZSetup_palTableE_1)244SetPaletteEntry(0, 184, temp0)245end if246247object.palTimerF++248if object.palTimerF == 29249object.palTimerF = 0250object.palIndexF++251object.palIndexF &= 15252GetTableValue(temp0, object.palIndexF, SBZSetup_palTableF_1)253SetPaletteEntry(0, 191, temp0)254end if255end function256257258private function SBZSetup_BGEffectsAct2259RotatePalette(0, 172, 174, true)260261object.palTimerG++262if object.palTimerG == 10263object.palTimerG = 0264object.palIndexG++265object.palIndexG &= 7266GetTableValue(temp0, object.palIndexG, SBZSetup_palTableG_1)267SetPaletteEntry(0, 184, temp0)268end if269270// Process Conveyor Belts271foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)272if player[currentPlayer].gravity == 0273temp2 = player[currentPlayer].ypos274temp2 >>= 16275temp2 += player[currentPlayer].collisionBottom276temp2 += 2277temp1 = player[currentPlayer].xpos278temp1 >>= 16279temp1 += player[currentPlayer].collisionLeft280temp3 = 0281Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEB)282if temp0 == TILE_CONVEYORBELT283Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_DIRECTION)284if temp0 == FLIP_NONE285temp3 += 0x20000286else287temp3 -= 0x20000288end if289end if290291temp1 = player[currentPlayer].xpos292temp1 >>= 16293temp1 += player[currentPlayer].collisionRight294Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_ANGLEB)295if temp0 == TILE_CONVEYORBELT296Get16x16TileInfo(temp0, temp1, temp2, TILEINFO_DIRECTION)297if temp0 == FLIP_NONE298temp3 += 0x20000299if temp3 > 0x20000300temp3 = 0x20000301end if302else303temp3 -= 0x20000304if temp3 < -0x20000305temp3 = -0x20000306end if307end if308end if309310player[currentPlayer].xpos += temp3311end if312next313end function314315316private function SBZSetup_SpeedUpMusic317CheckEqual(object[SLOT_MUSICEVENT_CHANGE].type, TypeName[Music Event])318temp0 = checkResult319CheckEqual(object[SLOT_MUSICEVENT_CHANGE].propertyValue, MUSICEVENT_TRANSITION)320temp0 &= checkResult321CheckEqual(stage.musicFlag, MUSICEVENT_FLAG_NOCHANGE)322temp0 &= checkResult323if temp0 == false324switch music.currentTrack325case TRACK_STAGE326SetMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F)327SwapMusicTrack("ScrapBrain_F.ogg", TRACK_STAGE, MUSIC_LOOP_SBZ_F, 8000)328break329330case TRACK_INVINCIBLE331SetMusicTrack("ScrapBrain_F.ogg", TRACK_STAGE, MUSIC_LOOP_SBZ_F)332SwapMusicTrack("Invincibility_F.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV_F, 8000)333break334335// While other stage setups have a `case TRACK_BOSS` here, SBZ doesn't need it because the boss music never plays there336end switch337else338stage.musicFlag = MUSICEVENT_FLAG_SPEEDUP339end if340end function341342343private function SBZSetup_SlowDownMusic344CheckEqual(object[SLOT_MUSICEVENT_CHANGE].type, TypeName[Music Event])345temp0 = checkResult346CheckEqual(object[SLOT_MUSICEVENT_CHANGE].propertyValue, MUSICEVENT_TRANSITION)347temp0 &= checkResult348CheckEqual(stage.musicFlag, MUSICEVENT_FLAG_NOCHANGE)349temp0 &= checkResult350if temp0 == false351switch music.currentTrack352case TRACK_STAGE353SetMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV)354SwapMusicTrack("ScrapBrain.ogg", TRACK_STAGE, MUSIC_LOOP_SBZ, 12500)355break356357case TRACK_INVINCIBLE358SetMusicTrack("ScrapBrain.ogg", TRACK_STAGE, MUSIC_LOOP_SBZ)359SwapMusicTrack("Invincibility.ogg", TRACK_INVINCIBLE, MUSIC_LOOP_INV, 12500)360break361362// While other stage setups have a `case TRACK_BOSS` here, SBZ doesn't need it because the boss music never plays here363end switch364else365stage.musicFlag = MUSICEVENT_FLAG_SLOWDOWN366end if367end function368369370// ========================371// Events372// ========================373374event ObjectUpdate375CallFunction(object.processBG)376377SBZSetup_platformTimer++378if SBZSetup_electricOrbTimer > 1379SBZSetup_electricOrbTimer--380else381SBZSetup_electricOrbFrame++382SBZSetup_electricOrbFrame %= 24383GetTableValue(SBZSetup_electricOrbTimer, SBZSetup_electricOrbFrame, SBZSetup_electricOrbDelayTable)384end if385386object.palTimerA++387if object.palTimerA == 4388object.palTimerA = 0389object.palIndexA++390object.palIndexA %= 3391GetTableValue(temp0, object.palIndexA, SBZSetup_palTableA_1)392SetPaletteEntry(0, 188, temp0)393GetTableValue(temp0, object.palIndexA, SBZSetup_palTableA_2)394SetPaletteEntry(0, 189, temp0)395GetTableValue(temp0, object.palIndexA, SBZSetup_palTableA_3)396SetPaletteEntry(0, 190, temp0)397end if398399object.palTimerB++400if object.palTimerB == 8401object.palTimerB = 0402object.palIndexB++403object.palIndexB &= 7404GetTableValue(temp0, object.palIndexB, SBZSetup_palTableB_1)405SetPaletteEntry(0, 168, temp0)406GetTableValue(temp0, object.palIndexB, SBZSetup_palTableB_2)407SetPaletteEntry(0, 185, temp0)408end if409410object.palTimerC++411if object.palTimerC == 14412object.palTimerC = 0413object.palIndexC++414object.palIndexC &= 7415GetTableValue(temp0, object.palIndexC, SBZSetup_palTableC_1)416SetPaletteEntry(0, 169, temp0)417end if418end event419420421event ObjectStartup422if stage.actNum < 5423// If in acts 1-4, then play the SBZ music424SetMusicTrack("ScrapBrain.ogg", TRACK_STAGE, MUSIC_LOOP_SBZ)425SpeedUpMusic = SBZSetup_SpeedUpMusic426SlowDownMusic = SBZSetup_SlowDownMusic427else428// Act 5, play the Final Zone music429SetMusicTrack("Final.ogg", TRACK_STAGE, MUSIC_LOOP_FINAL)430end if431432// Cucky and Pocky are the animals that appear in Scrap Brain433animalType1 = TypeName[Cucky]434animalType2 = TypeName[Pocky]435436object[SLOT_ZONESETUP].type = TypeName[SBZ Setup]437object[SLOT_ZONESETUP].priority = PRIORITY_ACTIVE438object[SLOT_ZONESETUP].drawOrder = 0439440// Init aniTiles441Copy16x16Tile(592, 604)442Copy16x16Tile(593, 605)443Copy16x16Tile(594, 606)444Copy16x16Tile(596, 604)445Copy16x16Tile(597, 605)446Copy16x16Tile(598, 606)447448// Use different palette cycles and such based on the act449switch stage.actNum450case 1451object[SLOT_ZONESETUP].processBG = SBZSetup_BGEffectsAct1452break453454case 2455case 5 // Act 5 is Final Zone456SetPaletteEntry(0, 172, 0xC0E0E0)457SetPaletteEntry(0, 173, 0x60A0A0)458SetPaletteEntry(0, 174, 0x006060)459object[SLOT_ZONESETUP].processBG = SBZSetup_BGEffectsAct2460break461462end switch463464SBZSetup_electricOrbFrame = 0465GetTableValue(SBZSetup_electricOrbTimer, SBZSetup_electricOrbFrame, SBZSetup_electricOrbDelayTable)466467if options.attractMode == true468if credits.screen == 6469Player_attractTable = SBZSetup_replay_credits_STK_2 // All Characters470Player_attractTableSize = 22471else472Player_attractTable = SBZSetup_replay_credits_STK_1 // All Characters473Player_attractTableSize = 30474end if475476Player_attractDuration = 540477CallFunction(Player_SetupAttractDemo)478end if479end event480481482// ========================483// Editor Events484// ========================485486event RSDKDraw487DrawSprite(0)488end event489490491event RSDKLoad492LoadSpriteSheet("Global/Display.gif")493SpriteFrame(-16, -16, 32, 32, 1, 143)494495SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")496end event497498499