Path: blob/master/Sonic 1/Scripts/Global/Monitor.txt
1480 views
// ----------------------------------1// RSDK Project: Sonic 12// Script Description: 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// States15private alias 0 : MONITOR_STATE_IDLE16private alias 1 : MONITOR_STATE_FALL1718// Contents Types19private alias 0 : MONITOR_BLANK20private alias 1 : MONITOR_RINGS21private alias 2 : MONITOR_SHIELD_BLUE22private alias 3 : MONITOR_INVINCIBILITY23private alias 4 : MONITOR_SPEEDSHOES24private alias 5 : MONITOR_1UP_SONIC25private alias 6 : MONITOR_1UP_TAILS26private alias 7 : MONITOR_1UP_KNUX27private alias 8 : MONITOR_SUPER28private alias 9 : MONITOR_SHIELD_BUBBLE29private alias 10 : MONITOR_SHIELD_FIRE30private alias 11 : MONITOR_SHIELD_LIGHTNING31private alias 12 : MONITOR_EGGMAN32private alias 13 : MONITOR_SHIELD_GOGGLES33private alias 14 : MONITOR_DEBUG_SPIKES34private alias 15 : MONITOR_DEBUG_SHIELD35private alias 16 : MONITOR_DEBUG_EMERALDS36private alias 17 : MONITOR_COUNT3738// Broken Monitor Aliases39private alias 0 : MONITOR_STATE_RISE4041// Player Aliases42private alias object.yvel : player.yvel43private alias object.gravity : player.gravity44private alias object.animation : player.animation45private alias object.value16 : player.isSidekick46private alias object.value17 : debugMode.currentSelection47private alias object.value25 : player.gravityStrength48private alias object.value40 : player.hitboxLeft49private alias object.value38 : player.hitboxTop50private alias object.value41 : player.hitboxRight51private alias object.value39 : player.hitboxBottom5253// Game Mode Aliases54private alias 2 : MODE_TIMEATTACK5556// Path ID Aliases57private alias 0 : PATH_A5859// Shield Type Aliases60private alias 2 : SHIELDTYPE_S3_S16162// Regular Stage Aliases63private alias 12 : STAGE_R_SLZ164private alias 13 : STAGE_R_SLZ265private alias 17 : STAGE_R_SBZ3666768// ========================69// Function Declarations70// ========================7172reserve function Monitor_DebugDraw73reserve function Monitor_DebugSpawn747576// ========================77// Static Values78// ========================7980private value Monitor_startDebugID = 0818283// ========================84// Function Definitions85// ========================8687private function Monitor_DebugDraw88DrawSprite(0)8990temp0 = debugMode[0].currentSelection91temp0 -= Monitor_startDebugID92if temp0 == MONITOR_1UP_SONIC93#platform: USE_STANDALONE94temp0 += stage.playerListPos95#endplatform9697#platform: USE_ORIGINS98if stage.playerListPos != PLAYER_AMY_A99temp0 += stage.playerListPos100end if101#endplatform102103else104if temp0 > MONITOR_1UP_SONIC105temp0 += 2106end if107end if108109110if temp0 >= MONITOR_SHIELD_GOGGLES111// Only allow Goggles in Labyrinth, otherwise skip it112CheckCurrentStageFolder("Zone04")113if checkResult == false114temp0++115end if116end if117118DrawSprite(temp0)119end function120121122private function Monitor_DebugSpawn123temp0 = debugMode[0].currentSelection124temp0 -= Monitor_startDebugID125if temp0 == MONITOR_1UP_SONIC126#platform: USE_STANDALONE127temp0 += stage.playerListPos128#endplatform129130#platform: USE_ORIGINS131if stage.playerListPos != PLAYER_AMY_A132temp0 += stage.playerListPos133end if134#endplatform135else136if temp0 > MONITOR_1UP_SONIC137temp0 += 2138end if139end if140141142if temp0 >= MONITOR_SHIELD_GOGGLES143// only allow goggles in labyrinth, otherwise skip it144CheckCurrentStageFolder("Zone04")145if checkResult == false146temp0++147end if148end if149150CreateTempObject(TypeName[Monitor], temp0, object.xpos, object.ypos)151end function152153154// ========================155// Events156// ========================157158event ObjectUpdate159if object.state == MONITOR_STATE_FALL160object.yvel += 0x3800161object.ypos += object.yvel162if object.yvel >= 0163ObjectTileCollision(CSIDE_FLOOR, 0, 16, PATH_A)164if checkResult == true165object.yvel = 0166object.state = MONITOR_STATE_IDLE167end if168end if169end if170171foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)172CheckGreater(player[currentPlayer].yvel, -1)173temp0 = checkResult174CheckEqual(player[currentPlayer].gravity, GRAVITY_GROUND)175temp0 |= checkResult176177if temp0 == true178CheckEqual(player[currentPlayer].animation, ANI_JUMPING)179temp0 = checkResult180CheckEqual(player[currentPlayer].animation, ANI_GLIDING)181temp0 |= checkResult182CheckEqual(player[currentPlayer].animation, ANI_GLIDING_STOP)183temp0 |= checkResult184#platform: USE_ORIGINS185CheckEqual(player[currentPlayer].animation, ANI_HAMMER_JUMP)186temp0 |= checkResult187CheckEqual(player[currentPlayer].animation, ANI_HAMMER_DASH)188temp0 |= checkResult189#endplatform190191192if temp0 == true193if player[currentPlayer].isSidekick == false // Only P1 should be able to break monitors194195// See if P1 has collided with the monitor196BoxCollisionTest(C_TOUCH, object.entityPos, -16, -14, 16, 16, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)197if checkResult == true198// Start resetting this object199object.state = MONITOR_STATE_RISE200201// Create and setup the smoke puff202CreateTempObject(TypeName[Smoke Puff], 0, object.xpos, object.ypos)203object[tempObjectPos].drawOrder = 4204player[currentPlayer].yvel += player[currentPlayer].gravityStrength205player[currentPlayer].yvel += player[currentPlayer].gravityStrength206207// Player recoil208FlipSign(player[currentPlayer].yvel)209210// Switch this item to the broken variant211object.type = TypeName[Broken Monitor]212213if object.priority != PRIORITY_XBOUNDS_DESTROY214object.priority = PRIORITY_ACTIVE215end if216217// Setup the alpha for the icon fading218object.alpha = 0x100219220object.contentsPos.y = object.ypos221object.timer = -0x30000222223PlaySfx(SfxName[Destroy], false)224end if225else226// Simply act as a box for P2 since only P1 can break monitors227BoxCollisionTest(C_SOLID, object.entityPos, -15, -14, 15, 16, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)228end if229else230// Player isn't in a state to break the monitor, just act as a solid box231BoxCollisionTest(C_SOLID, object.entityPos, -15, -14, 15, 16, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)232end if233else234// Check if the player hit the monitor235BoxCollisionTest(C_SOLID, object.entityPos, -15, -16, 15, 16, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)236237// Did the player hit the monitor from underneath?238if checkResult == COL_BOTTOM239object.state = MONITOR_STATE_FALL240object.yvel = -0x20000241player[currentPlayer].yvel = 0x20000242end if243end if244next245end event246247248event ObjectDraw249DrawSprite(0)250251switch StageSetup_monitorOverlayFrame252case 0253case 1254break255256case 6257case 7258DrawSprite(18)259break260261case 12262case 13263DrawSprite(19)264break265266default267DrawSprite(object.propertyValue)268end switch269end event270271272event ObjectStartup273LoadSpriteSheet("Global/Items.gif")274275// Monitor frames276277// Base monitor sprite278SpriteFrame(-16, -16, 32, 32, 18, 1)279280// Icons281SpriteFrame(-8, -9, 16, 14, 51, 16) // 1 - MONITOR_RINGS282SpriteFrame(-8, -9, 16, 14, 68, 16) // 2 - MONITOR_SHIELD_BLUE283SpriteFrame(-8, -9, 16, 14, 51, 31) // 3 - MONITOR_INVINCIBILITY284SpriteFrame(-8, -9, 16, 14, 68, 31) // 4 - MONITOR_SPEEDSHOES285#platform: USE_ORIGINS286if game.coinMode == false287if stage.playerListPos == PLAYER_AMY288SpriteFrame(-8, -9, 16, 14, 166, 118) // 5 - MONITOR_1UP_SONIC, except it's actually Amy289else290SpriteFrame(-8, -9, 16, 14, 51, 46) // 5 - MONITOR_1UP_SONIC, actually Sonic this time291end if292#endplatform293#platform: USE_STANDALONE294SpriteFrame(-8, -9, 16, 14, 51, 46) // 5 - MONITOR_1UP_SONIC295#endplatform296SpriteFrame(-8, -9, 16, 14, 68, 46) // 6 - MONITOR_1UP_TAILS297SpriteFrame(-8, -9, 16, 14, 51, 61) // 7 - MONITOR_1UP_KNUX298#platform: USE_ORIGINS299else300SpriteFrame(-8, -9, 16, 14, 35, 100) // 5 - MONITOR_1UP_SONIC (Coin)301SpriteFrame(-8, -9, 16, 14, 35, 100) // 6 - MONITOR_1UP_TAILS (Coin.. again)302SpriteFrame(-8, -9, 16, 14, 35, 100) // 7 - MONITOR_1UP_KNUX (Coin :D)303end if304#endplatform305SpriteFrame(-8, -9, 16, 14, 68, 61) // 8 - MONITOR_SUPER306SpriteFrame(-8, -9, 16, 14, 51, 91) // 9 - MONITOR_SHIELD_BUBBLE307SpriteFrame(-8, -9, 16, 14, 68, 76) // 10 - MONITOR_SHIELD_FIRE308SpriteFrame(-8, -9, 16, 14, 51, 76) // 11 - MONITOR_SHIELD_LIGHTNING309SpriteFrame(-8, -9, 16, 14, 68, 91) // 12 - MONITOR_EGGMAN310SpriteFrame(-8, -9, 16, 14, 18, 100) // 13 - MONITOR_SHIELD_GOGGLES311SpriteFrame(-8, -9, 16, 14, 117, 26) // 14 - MONITOR_DEBUG_SPIKES312SpriteFrame(-8, -9, 16, 14, 117, 41) // 15 - MONITOR_DEBUG_SHIELD313SpriteFrame(-8, -9, 16, 14, 117, 56) // 16 - MONITOR_DEBUG_EMERALDS314SpriteFrame(-8, -9, 16, 14, 117, 71) // 17 - unknown, it points to a Goggles sprite but it was probably an actual icon in earlier vers of the sheet315SpriteFrame(-8, -9, 16, 14, 51, 1) // 18 - Static 1316SpriteFrame(-8, -9, 16, 14, 68, 1) // 19 - Static 2317318Monitor_startDebugID = DebugMode_ObjCount319Monitor_startDebugID--320321// Loop to add all monitors to debug mode322temp0 = MONITOR_RINGS323while temp0 < MONITOR_COUNT324temp2 = true325326if temp0 >= MONITOR_1UP_SONIC327if temp0 <= MONITOR_1UP_KNUX328temp1 = temp0329temp1 -= MONITOR_1UP_SONIC330if stage.playerListPos != temp1331temp2 = false332#platform: USE_ORIGINS333if temp1 == PLAYER_SONIC334if stage.playerListPos == PLAYER_AMY335temp2 = true336end if337end if338#endplatform339end if340end if341end if342343if temp0 == MONITOR_SHIELD_GOGGLES344// Goggles are only for Labyrinth Zone345CheckCurrentStageFolder("Zone04")346if checkResult == false347temp2 = false348end if349end if350351if temp2 == true352SetTableValue(TypeName[Monitor], DebugMode_ObjCount, DebugMode_TypesTable)353SetTableValue(Monitor_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)354SetTableValue(Monitor_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)355DebugMode_ObjCount++356end if357358temp0++359loop360361// Switch life icons to the Tails variant if Tails is the main character362if stage.playerListPos == PLAYER_TAILS_A363foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)364if object[arrayPos0].propertyValue == MONITOR_1UP_SONIC365object[arrayPos0].propertyValue = MONITOR_1UP_TAILS366end if367next368end if369370// Switch life icons to the Knuckles variant if Knuckles is the main character371if stage.playerListPos == PLAYER_KNUCKLES_A372foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)373if object[arrayPos0].propertyValue == MONITOR_1UP_SONIC374object[arrayPos0].propertyValue = MONITOR_1UP_KNUX375end if376next377end if378379if options.shieldType < SHIELDTYPE_S3_S1 // Are S3 shields disabled?380switch stage.listPos381case STAGE_R_SLZ1382case STAGE_R_SLZ2383case STAGE_R_SBZ3 // (aka LZ4)384foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)385if object[arrayPos0].propertyValue >= MONITOR_SHIELD_BUBBLE386if object[arrayPos0].propertyValue <= MONITOR_SHIELD_LIGHTNING387// Completely erase all elemental shield monitors388object[arrayPos0].type = TypeName[Blank Object]389end if390end if391next392break393394default395foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)396if object[arrayPos0].propertyValue >= MONITOR_SHIELD_BUBBLE397if object[arrayPos0].propertyValue <= MONITOR_SHIELD_LIGHTNING398// Turn all elemental shield monitors into standard shields399object[arrayPos0].propertyValue = MONITOR_SHIELD_BLUE400end if401end if402next403break404405end switch406end if407408if options.gameMode == MODE_TIMEATTACK409// Delete every life monitor410foreach (TypeName[Monitor], arrayPos0, ALL_ENTITIES)411if object[arrayPos0].propertyValue == MONITOR_1UP_SONIC412object[arrayPos0].type = TypeName[Blank Object]413end if414next415end if416end event417418419// ========================420// Editor Events421// ========================422423event RSDKEdit424if editor.returnVariable == true425switch editor.variableID426case EDIT_VAR_PROPVAL // property value427checkResult = object.propertyValue428break429430case 0 // contents431checkResult = object.propertyValue432break433434end switch435else436switch editor.variableID437case EDIT_VAR_PROPVAL // property value438object.propertyValue = editor.variableValue439break440441case 0 // contents442object.propertyValue = editor.variableValue443break444445end switch446end if447end event448449450event RSDKDraw451DrawSprite(0)452DrawSprite(object.propertyValue)453end event454455456event RSDKLoad457LoadSpriteSheet("Global/Items.gif")458SpriteFrame(-16, -16, 32, 32, 18, 1)459SpriteFrame(-8, -9, 16, 14, 51, 16)460SpriteFrame(-8, -9, 16, 14, 68, 16)461SpriteFrame(-8, -9, 16, 14, 51, 31)462SpriteFrame(-8, -9, 16, 14, 68, 31)463SpriteFrame(-8, -9, 16, 14, 51, 46)464SpriteFrame(-8, -9, 16, 14, 68, 46)465SpriteFrame(-8, -9, 16, 14, 51, 61)466SpriteFrame(-8, -9, 16, 14, 68, 61)467SpriteFrame(-8, -9, 16, 14, 51, 91)468SpriteFrame(-8, -9, 16, 14, 68, 76)469SpriteFrame(-8, -9, 16, 14, 51, 76)470SpriteFrame(-8, -9, 16, 14, 68, 91)471SpriteFrame(-8, -9, 16, 14, 18, 100)472SpriteFrame(-8, -9, 16, 14, 117, 26)473SpriteFrame(-8, -9, 16, 14, 117, 41)474SpriteFrame(-8, -9, 16, 14, 117, 56)475SpriteFrame(-8, -9, 16, 14, 117, 71)476SpriteFrame(-8, -9, 16, 14, 51, 1)477SpriteFrame(-8, -9, 16, 14, 68, 1)478479AddEditorVariable("contents")480SetActiveVariable("contents")481AddEnumVariable("None", 0)482AddEnumVariable("10 Rings", 1)483AddEnumVariable("Blue Shield", 2)484AddEnumVariable("Invincibility", 3)485AddEnumVariable("Speed Shoes", 4)486AddEnumVariable("1UP (Sonic)", 5)487AddEnumVariable("1UP (Tails)", 6)488AddEnumVariable("1UP (Knux)", 7)489AddEnumVariable("Super", 8)490AddEnumVariable("Bubble Shield", 9)491AddEnumVariable("Fire Shield", 10)492AddEnumVariable("Lightning Shield", 11)493AddEnumVariable("Eggman", 12)494AddEnumVariable("Goggles", 13)495AddEnumVariable("Spike Toggle", 14)496AddEnumVariable("Shields Toggle", 15)497AddEnumVariable("Emeralds Toggle", 16)498end event499500501