Path: blob/master/Sonic 1/Scripts/Global/BrokenMonitor.txt
1483 views
// ----------------------------------1// RSDK Project: Sonic 12// Script Description: Broken Monitor Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value0 : object.contentsPos.y12private alias object.value1 : object.timer1314// Monitor type aliases15private alias 0 : MONITOR_BLANK16private alias 1 : MONITOR_RINGS17private alias 2 : MONITOR_SHIELD_BLUE18private alias 3 : MONITOR_INVINCIBILITY19private alias 4 : MONITOR_SPEEDSHOES20private alias 5 : MONITOR_1UP_SONIC21private alias 6 : MONITOR_1UP_TAILS22private alias 7 : MONITOR_1UP_KNUX23private alias 8 : MONITOR_SUPER24private alias 9 : MONITOR_SHIELD_BUBBLE25private alias 10 : MONITOR_SHIELD_FIRE26private alias 11 : MONITOR_SHIELD_LIGHTNING27private alias 12 : MONITOR_EGGMAN28private alias 13 : MONITOR_SHIELD_GOGGLES29private alias 14 : MONITOR_DEBUG_SPIKES30private alias 15 : MONITOR_DEBUG_SHIELD31private alias 16 : MONITOR_DEBUG_EMERALDS3233// Monitor states34private alias 0 : MONITOR_STATE_RISE35private alias 1 : MONITOR_STATE_FADE36private alias 2 : MONITOR_STATE_IDLE3738// Player Aliases39private alias object.type : player.type40private alias object.xpos : player.xpos41private alias object.ypos : player.ypos42private alias object.value0 : player.rings43private alias object.value3 : player.drownTimer44private alias object.value4 : player.drownLevel45private alias object.value6 : player.speedShoesTimer46private alias object.value7 : player.invincibleTimer47private alias object.value37 : player.shield4849// Shields50private alias 0 : SHIELD_NONE51private alias 1 : SHIELD_NORMAL52private alias 2 : SHIELD_BUBBLE53private alias 3 : SHIELD_FIRE54private alias 4 : SHIELD_LIGHTNING55private alias 5 : SHIELD_GOGGLES5657// Game Mode Aliases58private alias 2 : MODE_TIMEATTACK5960// Shield Type Aliases61private alias 0 : SHIELDTYPE_S162private alias 1 : SHIELDTYPE_S263private alias 2 : SHIELDTYPE_S3_S164private alias 3 : SHIELDTYPE_S3_S26566// Tracks67private alias 2 : TRACK_INVINCIBLE6869// Music Events70private alias 25 : SLOT_MUSICEVENT_CHANGE7172private alias 2 : MUSICEVENT_TRANSITION7374// Super States75private alias 1 : SUPERSTATE_SUPER7677// Achievement Aliases78private alias 4 : ACHIEVEMENT_RINGKING798081// ========================82// Function Declarations83// ========================8485reserve function BrokenMonitor_Blank868788// ========================89// Static Values90// ========================9192public value BrokenMonitor_ResetDrownMusic = 0939495// ========================96// Function Definitions97// ========================9899// Dummy function100private function BrokenMonitor_Blank101// Not much to do, no drowning music to reset102end function103104105// ========================106// Events107// ========================108109event ObjectUpdate110switch object.state111case MONITOR_STATE_RISE112if object.timer < 0113object.contentsPos.y += object.timer114object.timer += 0x1800115else116object.timer = 0117end if118119if object.timer == 0120object.state = MONITOR_STATE_FADE121object.inkEffect = INK_ALPHA122switch object.propertyValue123case MONITOR_BLANK124default125break126127case MONITOR_RINGS128player[0].rings += 10129if ringPan == 0130PlaySfx(SfxName[Ring L], false)131SetSfxAttributes(SfxName[Ring L], -1, -100)132ringPan = 1133else134PlaySfx(SfxName[Ring R], false)135SetSfxAttributes(SfxName[Ring R], -1, 100)136ringPan = 0137end if138139if player[0].rings > 999140player[0].rings = 999141end if142143if player[0].rings >= ringExtraLife144if options.gameMode != MODE_TIMEATTACK145#platform: USE_ORIGINS146if game.coinMode == false147player.lives++148else149CallNativeFunction2(NotifyCallback, NOTIFY_ADD_COIN, 1)150end if151#endplatform152#platform: USE_STANDALONE153player.lives++154#endplatform155PlaySfx(SfxName[Life], false)156PauseMusic()157ResetObjectEntity(SLOT_MUSICEVENT_CHANGE, TypeName[Music Event], MUSICEVENT_TRANSITION, 0, 0)158object[SLOT_MUSICEVENT_CHANGE].priority = PRIORITY_ACTIVE159end if160161ringExtraLife += 100162if ringExtraLife > 300163ringExtraLife = 1000164end if165166if stage.debugMode == false167if player[0].rings >= 200168// Grant the "Ring King" Achievement169CallNativeFunction2(SetAchievement, ACHIEVEMENT_RINGKING, 100)170end if171end if172end if173break174175case MONITOR_SHIELD_BLUE176PlaySfx(SfxName[Blue Shield], false)177arrayPos0 = playerCount178currentPlayer = 0179player[currentPlayer].shield = SHIELD_NORMAL180181if Player_superState != SUPERSTATE_SUPER182if object[arrayPos0].type != invincibilityType183CallFunction(Player_ApplyShield)184end if185end if186break187188case MONITOR_INVINCIBILITY189if Player_superState != SUPERSTATE_SUPER190arrayPos0 = playerCount191currentPlayer = 0192ResetObjectEntity(arrayPos0, invincibilityType, 0, player[currentPlayer].xpos, player[currentPlayer].ypos)193object[arrayPos0].priority = PRIORITY_ACTIVE194player[currentPlayer].invincibleTimer = 1260195PlayMusic(TRACK_INVINCIBLE)196end if197break198199case MONITOR_SPEEDSHOES200currentPlayer = 0201if SpeedUpMusic != 0202if player[currentPlayer].speedShoesTimer == 0203CallFunction(SpeedUpMusic)204end if205end if206207player[currentPlayer].speedShoesTimer = 1320208CallFunction(Player_UpdatePhysicsState)209break210211case MONITOR_1UP_SONIC212case MONITOR_1UP_TAILS213case MONITOR_1UP_KNUX214#platform: USE_ORIGINS215if game.coinMode == false216player.lives++217else218CallNativeFunction2(NotifyCallback, NOTIFY_ADD_COIN, 1)219end if220#endplatform221#platform: USE_STANDALONE222player.lives++223#endplatform224PlaySfx(SfxName[Life], false)225PauseMusic()226ResetObjectEntity(SLOT_MUSICEVENT_CHANGE, TypeName[Music Event], MUSICEVENT_TRANSITION, 0, 0)227object[SLOT_MUSICEVENT_CHANGE].priority = PRIORITY_ACTIVE228break229230case MONITOR_SUPER231currentPlayer = 0232player[0].rings += 50233234if Player_superState != SUPERSTATE_SUPER235object.type = player[0].type236CallFunction(Player_TryTransform)237object.type = TypeName[Broken Monitor]238else239if ringPan == 0240PlaySfx(SfxName[Ring L], false)241SetSfxAttributes(SfxName[Ring L], -1, -100)242ringPan = 1243else244PlaySfx(SfxName[Ring R], false)245SetSfxAttributes(SfxName[Ring R], -1, 100)246ringPan = 0247end if248end if249250if player[0].rings > 999251player[0].rings = 999252end if253254if player[0].rings >= ringExtraLife255if options.gameMode != MODE_TIMEATTACK256#platform: USE_ORIGINS257if game.coinMode == false258player.lives++259else260CallNativeFunction2(NotifyCallback, NOTIFY_ADD_COIN, 1)261end if262#endplatform263#platform: USE_STANDALONE264player.lives++265#endplatform266PlaySfx(SfxName[Life], false)267PauseMusic()268ResetObjectEntity(SLOT_MUSICEVENT_CHANGE, TypeName[Music Event], MUSICEVENT_TRANSITION, 0, 0)269object[SLOT_MUSICEVENT_CHANGE].priority = PRIORITY_ACTIVE270end if271272ringExtraLife += 100273if ringExtraLife > 300274ringExtraLife = 1000275end if276end if277break278279case MONITOR_SHIELD_BUBBLE280PlaySfx(SfxName[Bubble Shield], false)281arrayPos0 = playerCount282currentPlayer = 0283player[currentPlayer].shield = SHIELD_BUBBLE284285if Player_superState != SUPERSTATE_SUPER286if object[arrayPos0].type != invincibilityType287CallFunction(Player_ApplyShield)288end if289end if290291if player[currentPlayer].drownLevel >= 3292player[currentPlayer].drownTimer = 0293player[currentPlayer].drownLevel = 0294CallFunction(BrokenMonitor_ResetDrownMusic)295end if296break297298case MONITOR_SHIELD_FIRE299PlaySfx(SfxName[Fire Shield], false)300arrayPos0 = playerCount301currentPlayer = 0302player[currentPlayer].shield = SHIELD_FIRE303304if Player_superState != SUPERSTATE_SUPER305if object[arrayPos0].type != invincibilityType306CallFunction(Player_ApplyShield)307end if308end if309break310311case MONITOR_SHIELD_LIGHTNING312PlaySfx(SfxName[Lightning Shield], false)313arrayPos0 = playerCount314currentPlayer = 0315player[currentPlayer].shield = SHIELD_LIGHTNING316317if Player_superState != SUPERSTATE_SUPER318if object[arrayPos0].type != invincibilityType319CallFunction(Player_ApplyShield)320end if321end if322break323324case MONITOR_EGGMAN325currentPlayer = 0326CallFunction(Player_Hit)327break328329case MONITOR_SHIELD_GOGGLES330PlaySfx(SfxName[Catch], false)331arrayPos0 = playerCount332currentPlayer = 0333player[currentPlayer].shield = SHIELD_GOGGLES334335if Player_superState != SUPERSTATE_SUPER336if object[arrayPos0].type != invincibilityType337CallFunction(Player_ApplyShield)338end if339end if340break341342case MONITOR_DEBUG_SPIKES343PlaySfx(SfxName[Spike], false)344options.spikeBehavior ^= true345break346347case MONITOR_DEBUG_SHIELD348PlaySfx(SfxName[Blue Shield], false)349options.shieldType++350options.shieldType &= SHIELDTYPE_S3_S2351switch options.shieldType352case SHIELDTYPE_S1353case SHIELDTYPE_S3_S1354blueShieldType = TypeName[Blue Shield]355invincibilityType = TypeName[Invincibility 2]356break357358case SHIELDTYPE_S2359case SHIELDTYPE_S3_S2360blueShieldType = TypeName[Blue Shield 2]361invincibilityType = TypeName[Invincibility 2]362break363364end switch365arrayPos0 = playerCount366currentPlayer = 0367CallFunction(Player_ApplyShield)368break369370case MONITOR_DEBUG_EMERALDS371if specialStage.emeralds >= 0x40 // Does the player have the 7th emerald?372if specialStage.emeralds == 0x7F373options.superStates = false374specialStage.emeralds = 0375else376PlaySfx(SfxName[Transform], false)377specialStage.emeralds = 0x7F378end if379else380PlaySfx(SfxName[Transform], false)381options.superStates = true382specialStage.emeralds |= 0x40 // Give the Player the 7th emerald383end if384break385386end switch387end if388break389390case MONITOR_STATE_FADE391object.timer++392if object.timer == 30393object.timer = 0394object.state = MONITOR_STATE_IDLE395object.propertyValue = MONITOR_BLANK396if object.priority != PRIORITY_XBOUNDS_DESTROY397object.priority = PRIORITY_BOUNDS398end if399else400if object.timer > 14401object.alpha -= 16402end if403end if404break405406case MONITOR_STATE_IDLE407break408409end switch410end event411412413event ObjectDraw414DrawSprite(0)415416if object.propertyValue > MONITOR_BLANK417DrawSpriteFX(object.propertyValue, FX_INK, object.xpos, object.contentsPos.y)418end if419end event420421422event ObjectStartup423LoadSpriteSheet("Global/Items.gif")424425// Broken monitor frame426SpriteFrame(-16, 0, 32, 16, 51, 166)427428// Icons429SpriteFrame(-8, -9, 16, 14, 51, 16) // 1 - MONITOR_RINGS430SpriteFrame(-8, -9, 16, 14, 68, 16) // 2 - MONITOR_SHIELD_BLUE431SpriteFrame(-8, -9, 16, 14, 51, 31) // 3 - MONITOR_INVINCIBILITY432SpriteFrame(-8, -9, 16, 14, 68, 31) // 4 - MONITOR_SPEEDSHOES433#platform: USE_ORIGINS434if game.coinMode == false435if stage.playerListPos == PLAYER_AMY436SpriteFrame(-8, -9, 16, 14, 166, 118) // 5 - MONITOR_1UP_SONIC, except it's actually Amy437else438SpriteFrame(-8, -9, 16, 14, 51, 46) // 5 - MONITOR_1UP_SONIC, actually Sonic this time439end if440#endplatform441#platform: USE_STANDALONE442SpriteFrame(-8, -9, 16, 14, 51, 46) // 5 - MONITOR_1UP_SONIC443#endplatform444SpriteFrame(-8, -9, 16, 14, 68, 46) // 6 - MONITOR_1UP_TAILS445SpriteFrame(-8, -9, 16, 14, 51, 61) // 7 - MONITOR_1UP_KNUX446#platform: USE_ORIGINS447else448SpriteFrame(-8, -9, 16, 14, 35, 100) // 5 - MONITOR_1UP_SONIC (Coin)449SpriteFrame(-8, -9, 16, 14, 35, 100) // 6 - MONITOR_1UP_TAILS (Coin.. again)450SpriteFrame(-8, -9, 16, 14, 35, 100) // 7 - MONITOR_1UP_KNUX (Coin :D)451end if452#endplatform453SpriteFrame(-8, -9, 16, 14, 68, 61) // 8 - MONITOR_SUPER454SpriteFrame(-8, -9, 16, 14, 51, 91) // 9 - MONITOR_SHIELD_BUBBLE455SpriteFrame(-8, -9, 16, 14, 68, 76) // 10 - MONITOR_SHIELD_FIRE456SpriteFrame(-8, -9, 16, 14, 51, 76) // 11 - MONITOR_SHIELD_LIGHTNING457SpriteFrame(-8, -9, 16, 14, 68, 91) // 12 - MONITOR_EGGMAN458SpriteFrame(-8, -9, 16, 14, 18, 100) // 13 - MONITOR_SHIELD_GOGGLES459SpriteFrame(-8, -9, 16, 14, 117, 26) // 14 - MONITOR_DEBUG_SPIKES460SpriteFrame(-8, -9, 16, 14, 117, 41) // 15 - MONITOR_DEBUG_SHIELD461SpriteFrame(-8, -9, 16, 14, 117, 56) // 16 - MONITOR_DEBUG_EMERALDS462463BrokenMonitor_ResetDrownMusic = BrokenMonitor_Blank464end event465466467// ========================468// Editor Events469// ========================470471event RSDKDraw472DrawSprite(0)473end event474475476event RSDKLoad477LoadSpriteSheet("Global/Items.gif")478SpriteFrame(-16, 0, 32, 16, 51, 166)479480SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")481end event482483484