Path: blob/master/Sonic 2/Scripts/Special/SpecialSetup.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Special Setup Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011public alias 256 : GROUP_PLAYERS12public alias arrayPos6 : currentPlayer13public alias arrayPos7 : playerCount1415// Gravity16public alias 0 : GRAVITY_GROUND17public alias 1 : GRAVITY_AIR1819// Priority20public alias 0 : PRIORITY_BOUNDS21public alias 1 : PRIORITY_ACTIVE22public alias 2 : PRIORITY_ALWAYS23public alias 3 : PRIORITY_XBOUNDS24public alias 4 : PRIORITY_XBOUNDS_DESTROY25public alias 5 : PRIORITY_INACTIVE26public alias 6 : PRIORITY_BOUNDS_SMALL27public alias 7 : PRIORITY_ACTIVE_SMALL2829// Control Modes30public alias -1 : CONTROLMODE_NONE31public alias 0 : CONTROLMODE_P132public alias 1 : CONTROLMODE_P233public alias 2 : CONTROLMODE_P334public alias 3 : CONTROLMODE_P43536// Camera Styles37public alias 0 : CAMERASTYLE_FOLLOW38public alias 1 : CAMERASTYLE_EXTENDED39public alias 2 : CAMERASTYLE_EXTENDED_OFFSET_L40public alias 3 : CAMERASTYLE_EXTENDED_OFFSET_R41public alias 4 : CAMERASTYLE_HLOCKED4243// Ink Effects44public alias 0 : INK_NONE45public alias 1 : INK_BLEND46public alias 2 : INK_ALPHA47public alias 3 : INK_ADD48public alias 4 : INK_SUB4950// Flip Directions51public alias 0 : FLIP_NONE52public alias 1 : FLIP_X53public alias 2 : FLIP_Y54public alias 3 : FLIP_XY5556// Collision Sides57public alias 0 : CSIDE_FLOOR58public alias 1 : CSIDE_LWALL59public alias 2 : CSIDE_RWALL60public alias 3 : CSIDE_ROOF6162// Collision Modes63public alias 0 : CMODE_FLOOR64public alias 1 : CMODE_LWALL65public alias 2 : CMODE_ROOF66public alias 3 : CMODE_RWALL6768// Collision Directions69public alias 0 : COL_NONE70public alias 1 : COL_TOP71public alias 2 : COL_LEFT72public alias 3 : COL_RIGHT73public alias 4 : COL_BOTTOM7475// Players List Pos Aliases76public alias 0 : PLAYER_SONIC_A77public alias 1 : PLAYER_TAILS_A78public alias 2 : PLAYER_KNUCKLES_A79public alias 3 : PLAYER_SONIC_TAILS_A80public alias 4 : PLAYER_KNUCKLES_TAILS_A81public alias 5 : PLAYER_AMY_A82public alias 6 : PLAYER_AMY_TAILS_A8384private alias object.value1 : object.palTimer85private alias object.value2 : object.palID186private alias object.value3 : object.palID28788// Start Message Aliases89private alias object.value0 : startMessage.ringCount2P90private alias object.value1 : startMessage.ringCountSonic91private alias object.value2 : startMessage.ringCountKnux9293// Checkpoint Aliases94private alias object.value0 : checkpoint.ringCount2P95private alias object.value1 : checkpoint.ringCountSonic96private alias object.value2 : checkpoint.ringCountKnux9798// Reserved object slots99private alias 9 : SLOT_SPECIALSETUP100private alias 10 : SLOT_SPECIALHUD101102// Tracks103private alias 0 : TRACK_STAGE104private alias 1 : TRACK_ACTFINISH105106// Music Loops107private alias 496644 : MUSIC_LOOP_SPECIAL108109110// ========================111// Static Values112// ========================113114public value SpecialSetup_gotEmerald = 0115public value SpecialSetup_StageColor1 = 0116public value SpecialSetup_StageColor2 = 0117public value SpecialSetup_checkpointID = 0118public value SpecialSetup_ringCountTable = 0119120121// ========================122// Tables123// ========================124125public table SpecialSetup_ringCount2P[3]126127public table SpecialSetup_ringCountSonic[3]128129public table SpecialSetup_ringCountKnux[3]130131private table SpecialSetup_starPalCycle1320xE0E0E0, 0xD0D0D0, 0xC0C0C0, 0xB0B0B0, 0xA0A0A0, 0x909090, 0x808080, 0x707070, 0x606060, 0x707070, 0x808080, 0x909090, 0xA0A0A0, 0xB0B0B0, 0xC0C0C0, 0xD0D0D0133end table134135136// ========================137// Events138// ========================139140event ObjectUpdate141ringTimer++142if ringTimer == 4143ringTimer = 0144ringFrame++145ringFrame &= 7146end if147148object.palTimer++149if object.palTimer == 4150object.palTimer = 0151152object.palID1++153object.palID1 &= 15154GetTableValue(temp0, object.palID1, SpecialSetup_starPalCycle)155SetPaletteEntry(0, 142, temp0)156157object.palID2++158object.palID2 &= 15159GetTableValue(temp0, object.palID2, SpecialSetup_starPalCycle)160SetPaletteEntry(0, 143, temp0)161end if162163#platform: USE_STANDALONE164// There aren't any demos in Special Stages I believe... so why is this here..?165// Best guess is that it's just a leftover from the standard Stage Setup script, but I can't say for sure166if options.attractMode == false167if object[2].controlMode > CONTROLMODE_NONE168options.touchControls = true169else170options.touchControls = false171end if172else173options.touchControls = false174end if175#endplatform176end event177178179event ObjectStartup180#platform: USE_ORIGINS181switch stage.playerListPos182case PLAYER_SONIC_TAILS_A183stage.playerListPos = PLAYER_SONIC184stage.player2Enabled = true185break186187case PLAYER_KNUCKLES_TAILS_A188stage.playerListPos = PLAYER_KNUCKLES189stage.player2Enabled = true190break191192case PLAYER_AMY_TAILS_A193stage.playerListPos = PLAYER_AMY194stage.player2Enabled = true195break196end switch197#endplatform198199SetMusicTrack("SpecialStage.ogg", TRACK_STAGE, MUSIC_LOOP_SPECIAL)200SetMusicTrack("ActComplete.ogg", TRACK_ACTFINISH, false)201SpecialSetup_gotEmerald = false202203#platform: USE_ORIGINS204// Sure, record the time for an autoscroller, you do you, Sonic Team205stage.timeEnabled = true206#endplatform207208object[SLOT_SPECIALSETUP].type = TypeName[Special Setup]209object[SLOT_SPECIALSETUP].priority = PRIORITY_ACTIVE210object[SLOT_SPECIALSETUP].drawOrder = 1211object[SLOT_SPECIALSETUP].palID2 = 8212213object[SLOT_SPECIALHUD].type = TypeName[HUD]214object[SLOT_SPECIALHUD].priority = PRIORITY_ACTIVE215object[SLOT_SPECIALHUD].drawOrder = 6216217#platform: USE_STANDALONE218if stage.playerListPos >= PLAYER_SONIC_TAILS_A219stage.playerListPos = PLAYER_SONIC_A220stage.player2Enabled = true221end if222#endplatform223224if options.vsMode == false225// In normal Special Stages, use a palette corresponding to the current act number226temp1 = stage.actNum227else228if vs.activeList == SPECIAL_STAGE229// Use a palette corresponding to the current act number, but offset a little230temp1 = stage.actNum231temp1 += 3232else233// Go all in, use a completely randomised number234vs.randomValue *= 1103515245235vs.randomValue += 12345236vs.randomValue &= 0x7FFFFFFF237temp1 = vs.randomValue238temp1 >>= 16239temp1 %= 12240temp1++241end if242end if243244temp1 <<= 3245temp0 = temp1246temp0 -= 8247LoadPalette("SpecialStage.act", 0, 192, temp0, temp1)248249// Grab the primary colors, for the Halfpipe vertex colors250GetPaletteEntry(0, 197, SpecialSetup_StageColor1)251SpecialSetup_StageColor1 |= 0xFF000000252253GetPaletteEntry(0, 192, SpecialSetup_StageColor2)254SpecialSetup_StageColor2 |= 0xFF000000255256if options.attractMode == false257// Huh. Normally there'd be STANDARD platform specific code here, but even Origins has this condition empty...258end if259260temp0 = 1261foreach (TypeName[Start Message], arrayPos0, ALL_ENTITIES)262object[11].type = TypeName[Start Message]263object[11].priority = PRIORITY_ALWAYS264object[11].drawOrder = 5265SetTableValue(startMessage[arrayPos0].ringCount2P, 0, SpecialSetup_ringCount2P)266SetTableValue(startMessage[arrayPos0].ringCountSonic, 0, SpecialSetup_ringCountSonic)267SetTableValue(startMessage[arrayPos0].ringCountKnux, 0, SpecialSetup_ringCountKnux)268ResetObjectEntity(arrayPos0, TypeName[Blank Object], 0, 0, 0)269next270271temp0 = 1272foreach (TypeName[Checkpoint], arrayPos0, ALL_ENTITIES)273if temp0 < 3274SetTableValue(checkpoint[arrayPos0].ringCount2P, temp0, SpecialSetup_ringCount2P)275SetTableValue(checkpoint[arrayPos0].ringCountSonic, temp0, SpecialSetup_ringCountSonic)276SetTableValue(checkpoint[arrayPos0].ringCountKnux, temp0, SpecialSetup_ringCountKnux)277temp0++278end if279280checkpoint[arrayPos0].ringCount2P = 0281checkpoint[arrayPos0].ringCountSonic = 0282checkpoint[arrayPos0].ringCountKnux = 0283next284285SpecialSetup_checkpointID = 0286if stage.player2Enabled == true287SpecialSetup_ringCountTable = SpecialSetup_ringCount2P288else289if stage.playerListPos == PLAYER_KNUCKLES_A290SpecialSetup_ringCountTable = SpecialSetup_ringCountKnux291else292SpecialSetup_ringCountTable = SpecialSetup_ringCountSonic293end if294end if295296arrayPos0 = 0x20297while arrayPos0 < 0x420298if object[arrayPos0].type == TypeName[Blank Object]299object[arrayPos0].ypos = 0x7FFF0000300else301object[arrayPos0].priority = PRIORITY_INACTIVE302end if303304arrayPos0++305loop306307// Sort all objects based on ypos308arrayPos0 = 0x20309while arrayPos0 < 0x300310arrayPos1 = 0x2FF311arrayPos2 = 0x2FE312while arrayPos1 > arrayPos0313if object[arrayPos1].ypos < object[arrayPos2].ypos314temp0 = object[arrayPos1].type315temp1 = object[arrayPos1].propertyValue316temp2 = object[arrayPos1].xpos317temp3 = object[arrayPos1].ypos318319object[arrayPos1].type = object[arrayPos2].type320object[arrayPos1].propertyValue = object[arrayPos2].propertyValue321object[arrayPos1].xpos = object[arrayPos2].xpos322object[arrayPos1].ypos = object[arrayPos2].ypos323324object[arrayPos2].type = temp0325object[arrayPos2].propertyValue = temp1326object[arrayPos2].xpos = temp2327object[arrayPos2].ypos = temp3328end if329arrayPos1--330arrayPos2--331loop332333arrayPos0++334loop335end event336337338// ========================339// Editor Events340// ========================341342event RSDKDraw343DrawSprite(0)344end event345346347event RSDKLoad348LoadSpriteSheet("Global/Display.gif")349SpriteFrame(-16, -16, 32, 32, 1, 143)350351SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")352end event353354355