Path: blob/main/Scripts/Global/Monitor.txt
1319 views
//-----------------Sonic CD Monitor Script--------------------//1//--------Scripted by Christian Whitehead 'The Taxman'--------//2//-------Unpacked By Rubberduckycooly's Script Unpacker-------//34// Aliases5#alias Object.Value1 : Object.GravityStrength6#alias Object.Value2 : Object.CollisionPlane78// Broken Monitor Aliases9#alias Object.Value0 : BrokenMonitor.YVelocity10#alias Object.Value1 : BrokenMonitor.Timer11#alias Object.Priority : BrokenMonitor.Priority12#alias Object.Alpha : BrokenMonitor.Alpha1314// Gravity15#alias 1 : GRAVITY_AIR1617// States18#alias 0 : MONITOR_IDLE19#alias 1 : MONITOR_FALLING2021// Priority22#alias 1 : PRIORITY_ACTIVE2324// Collision Sides25#alias 0 : CSIDE_FLOOR2627// Players28#alias 1 : PLAYER_TAILS_A2930// Hit Values31#alias 4 : PLAYER_COL_ROOF3233// Global SFX34#alias 8 : SFX_G_DESTROY3536// Property Values37#alias 1 : SCREEN_RING38#alias 2 : SCREEN_SHIELD39#alias 3 : SCREEN_INVINCIBILITY40#alias 4 : SCREEN_POWER_SNEAKERS41#alias 5 : SCREEN_SONIC42#alias 6 : SCREEN_TIME43#alias 7 : SCREEN_TAILS44#alias 8 : SCREEN_S_MONITOR45#alias 9 : SCREEN_KNUCKLES46#alias 10 : SCREEN_AMY4748// Standalone:49//#alias 9 : SCREEN_STATIC150//#alias 10 : SCREEN_STATIC251// Origins:52//#alias 11 : SCREEN_STATIC153//#alias 12 : SCREEN_STATIC254// Using values bigger than 9(or 11 in origins) on a level editor will swap the collision plane55// and restart the cycle, with 10/12 being Ring monitor5657// Game Mode Aliases58#alias 2 : MODE_TIMEATTACK5960// Collision Plane61#alias 1 : COLLISION_PLANE_B626364sub ObjectMain65if Object.State == MONITOR_FALLING66Object.GravityStrength += 0x380067Object.YPos += Object.GravityStrength6869if Object.GravityStrength >= 070ObjectTileCollision(CSIDE_FLOOR, 0, 16, 0)71if CheckResult == true72Object.GravityStrength = 073Object.State = MONITOR_IDLE74end if75end if76end if77end sub787980sub ObjectPlayerInteraction81if Player.CollisionPlane == Object.CollisionPlane82TempValue0 = false83if Player.Gravity == GRAVITY_AIR84if Player.YVelocity < 085TempValue0 = true86end if87end if8889if TempValue0 == false90// Technically also part of the origins code below91// but it would make a mess just for keeping essentially the same check so92CheckResult = false93if Player.Animation == ANI_JUMPING94CheckResult = true95end if96#platform: Use_Origins97if Stage.PlayerListPos == PLAYER_KNUCKLES98if Player.Animation == ANI_GLIDING99CheckResult = true100end if101if Player.Animation == ANI_GLIDING_STOP102CheckResult = true103end if104end if105106if Stage.PlayerListPos == PLAYER_AMY107if Player.Animation == ANI_HAMMER_JUMP108CheckResult = true109end if110if Player.Animation == ANI_HAMMER_DASH111CheckResult = true112end if113end if114#endplatform115if CheckResult == true116PlayerObjectCollision(C_TOUCH, -16, -14, 16, 16)117if CheckResult == true118Object.State = MONITOR_IDLE119120CreateTempObject(TypeName[Smoke Puff], 0, Object.XPos, Object.YPos)121122Object[TempObjectPos].DrawOrder = 4123124FlipSign(Player.YVelocity)125if Player.YVelocity > -0x20000126Player.YVelocity = -0x20000127end if128129Object.Type = TypeName[Broken Monitor]130BrokenMonitor.Priority = PRIORITY_ACTIVE131BrokenMonitor.Alpha = 255132BrokenMonitor.YVelocity = Object.YPos133BrokenMonitor.Timer = -0x30000134PlaySfx(SFX_G_DESTROY, false)135136#platform: Use_Haptics137HapticEffect(16, 0, 0, 0)138#endplatform139140end if141else142PlayerObjectCollision(C_BOX, -15, -14, 15, 16)143end if144else145PlayerObjectCollision(C_BOX, -15, -16, 15, 16)146if CheckResult == PLAYER_COL_ROOF147Object.State = MONITOR_FALLING148Object.GravityStrength = -0x20000149150Player.YVelocity = 0x20000151end if152end if153end if154end sub155156157sub ObjectDraw158Object.Frame++159if Object.Frame > 17160Object.Frame = 0161end if162163switch Object.Frame164case 0165case 1166DrawSprite(0)167break168169case 6170case 7171#platform: Use_Standalone172DrawSprite(9)173#endplatform174#platform: Use_Origins175DrawSprite(11)176#endplatform177break178179case 12180case 13181#platform: Use_Standalone182DrawSprite(10)183#endplatform184#platform: Use_Origins185DrawSprite(12)186#endplatform187break188189default190DrawSprite(Object.PropertyValue)191192end switch193end sub194195196197sub ObjectStartup198LoadSpriteSheet("Global/Items.gif")199200SpriteFrame(-16, -16, 32, 32, 51, 67) // #0 - Monitor201202SpriteFrame(-16, -16, 32, 32, 18, 1) // #1 - Ring Monitor203SpriteFrame(-16, -16, 32, 32, 18, 34) // #2 - Blue Shield Monitor204SpriteFrame(-16, -16, 32, 32, 18, 67) // #3 - Invincibility Monitor205SpriteFrame(-16, -16, 32, 32, 18, 100) // #4 - Power Sneakers Monitor206#platform: Use_Origins207if game.coinMode == false208SpriteFrame(-16, -16, 32, 32, 18, 133) // #5 - Sonic Monitor209SpriteFrame(-16, -16, 32, 32, 18, 166) // #6 - Time Monitor210SpriteFrame(-16, -16, 32, 32, 51, 100) // #7 - Tails Monitor211SpriteFrame(-16, -16, 32, 32, 51, 133) // #8 - S Monitor212SpriteFrame(-16, -16, 32, 32, 34, 256) // #9 - Knuckles Monitor213SpriteFrame(-16, -16, 32, 32, 1, 256) // #10 - Amy Monitor214else215SpriteFrame(-16, -16, 32, 32, 84, 200) // #5 - Coin Monitor (Sonic)216SpriteFrame(-16, -16, 32, 32, 18, 166) // #6 - Time Monitor217SpriteFrame(-16, -16, 32, 32, 84, 200) // #7 - Coin Monitor (Tails)218SpriteFrame(-16, -16, 32, 32, 51, 133) // #8 - S Monitor219SpriteFrame(-16, -16, 32, 32, 84, 200) // #9 - Coin Monitor (Knuckles)220SpriteFrame(-16, -16, 32, 32, 84, 200) // #10 - Coin Monitor (Amy)221end if222#endplatform223224#platform: Use_Standalone225SpriteFrame(-16, -16, 32, 32, 18, 133) // #5 - Sonic Monitor226SpriteFrame(-16, -16, 32, 32, 18, 166) // #6 - Time Monitor227SpriteFrame(-16, -16, 32, 32, 51, 100) // #7 - Tails Monitor228SpriteFrame(-16, -16, 32, 32, 51, 133) // #8 - S Monitor229#endplatform230231SpriteFrame(-16, -16, 32, 32, 51, 1) // #9 - Monitor Static 1232SpriteFrame(-16, -16, 32, 32, 51, 34) // #10 - Monitor Static 2233234#platform: Use_Standalone235ArrayPos0 = 32236while ArrayPos0 < 1056237if Object[ArrayPos0].Type == TypeName[Monitor]238if Object[ArrayPos0].PropertyValue > 9239Object[ArrayPos0].PropertyValue -= 10240Object[ArrayPos0].DrawOrder = 1241Object[ArrayPos0].CollisionPlane = COLLISION_PLANE_B242end if243end if244ArrayPos0++245loop246247if Stage.PlayerListPos == PLAYER_TAILS_A248ArrayPos0 = 32249while ArrayPos0 < 1056250if Object[ArrayPos0].Type == TypeName[Monitor]251if Object[ArrayPos0].PropertyValue == SCREEN_SONIC252Object[ArrayPos0].PropertyValue = SCREEN_TAILS253end if254end if255ArrayPos0++256loop257end if258#endplatform259260#platform: Use_Origins261// Note - (used to be a Bug Detail but then they fixed it :( ):262// Sonic Team adjusted how Monitors' plane value work in Plus.. but they didn't actually update the scenes for it263// In 99% of cases it doesn't matter, since almost all monitors are Plane A,264// but monitors that are intended to be Plane B monitors never had their property values updated.. leading to the weird invalid monitor in Metallic Madness 2265// (this got fixed in 2.0.1, but leaving these comments here anyways)266ArrayPos0 = 32267while ArrayPos0 < 1056268if Object[ArrayPos0].Type == TypeName[Monitor]269if Object[ArrayPos0].PropertyValue > 11270Object[ArrayPos0].PropertyValue -= 12271Object[ArrayPos0].DrawOrder = 1272Object[ArrayPos0].CollisionPlane = COLLISION_PLANE_B273end if274end if275ArrayPos0++276loop277278ArrayPos0 = 32279while ArrayPos0 < 1056280if Object[ArrayPos0].Type == TypeName[Monitor]281if Object[ArrayPos0].PropertyValue == SCREEN_SONIC282if Stage.PlayerListPos == PLAYER_TAILS283Object[ArrayPos0].PropertyValue = SCREEN_TAILS284end if285286if Stage.PlayerListPos == PLAYER_KNUCKLES287Object[ArrayPos0].PropertyValue = SCREEN_KNUCKLES288end if289290if Stage.PlayerListPos == PLAYER_AMY291Object[ArrayPos0].PropertyValue = SCREEN_AMY292end if293end if294end if295ArrayPos0++296loop297#endplatform298299if Options.GameMode == MODE_TIMEATTACK300ArrayPos0 = 32301while ArrayPos0 < 1056302if Object[ArrayPos0].Type == TypeName[Monitor]303if Object[ArrayPos0].PropertyValue == SCREEN_SONIC304Object[ArrayPos0].Type = TypeName[Blank Object]305end if306end if307ArrayPos0++308loop309end if310end sub311312313// ========================314// Editor Subs315// ========================316317sub RSDKEdit318if Editor.ReturnVariable == true319switch Editor.VariableID320case EDIT_VAR_PROPVAL // Property Value321CheckResult = Object.PropertyValue322break323case 0 // Contents (Standalone)324CheckResult = Object.PropertyValue325break326case 1 // Contents (Origins)327CheckResult = Object.PropertyValue328break329end switch330else331switch Editor.VariableID332case EDIT_VAR_PROPVAL // Property Value333Object.PropertyValue = Editor.VariableValue334break335case 0 // Contents (Standalone)336Object.PropertyValue = Editor.VariableValue337break338case 1 // Contents (Origins)339Object.PropertyValue = Editor.VariableValue340break341end switch342end if343end sub344345346sub RSDKDraw347TempValue0 = Object.PropertyValue348TempValue0 %= 11349DrawSprite(TempValue0)350end sub351352353sub RSDKLoad354LoadSpriteSheet("Global/Items.gif")355SpriteFrame(-16, -16, 32, 32, 51, 67) // #0 - Monitor356SpriteFrame(-16, -16, 32, 32, 18, 1) // #1 - Ring Monitor357SpriteFrame(-16, -16, 32, 32, 18, 34) // #2 - Blue Shield Monitor358SpriteFrame(-16, -16, 32, 32, 18, 67) // #3 - Invincibility Monitor359SpriteFrame(-16, -16, 32, 32, 18, 100) // #4 - Power Sneakers Monitor360SpriteFrame(-16, -16, 32, 32, 18, 133) // #5 - Sonic Monitor361SpriteFrame(-16, -16, 32, 32, 18, 166) // #6 - Time Monitor362SpriteFrame(-16, -16, 32, 32, 51, 100) // #7 - Tails Monitor363SpriteFrame(-16, -16, 32, 32, 51, 133) // #8 - S Monitor364SpriteFrame(-16, -16, 32, 32, 34, 256) // #9 - Knuckles Monitor365SpriteFrame(-16, -16, 32, 32, 1, 256) // #10 - Amy Monitor366SpriteFrame(-16, -16, 32, 32, 51, 1) // #11 - Monitor Static 1367SpriteFrame(-16, -16, 32, 32, 51, 34) // #12 - Monitor Static 2368369AddEditorVariable("Contents (Standalone)")370SetActiveVariable("Contents (Standalone)")371AddEnumVariable("None", 0)372AddEnumVariable("10 Rings", 1)373AddEnumVariable("Blue Shield", 2)374AddEnumVariable("Invincibility", 3)375AddEnumVariable("Speed Shoes", 4)376AddEnumVariable("1UP (Sonic)", 5)377AddEnumVariable("Clock (Unused)", 6)378AddEnumVariable("1UP (Tails)", 7)379AddEnumVariable("S Monitor", 8)380AddEnumVariable("Invalid (Static)", 9)381AddEnumVariable("10 Rings (Plane B)", 10)382AddEnumVariable("Blue Shield (Plane B)", 11)383AddEnumVariable("Invincibility (Plane B)", 12)384AddEnumVariable("Speed Shoes (Plane B)", 13)385AddEnumVariable("1UP (Sonic (Plane B))", 14)386AddEnumVariable("Clock (Unused) (Plane B)", 15)387AddEnumVariable("1UP (Tails) (Plane B)", 16)388AddEnumVariable("S Monitor (Plane B)", 17)389AddEnumVariable("Invalid (Static) (Plane B)", 18)390391AddEditorVariable("Contents (Origins)")392SetActiveVariable("Contents (Origins)")393AddEnumVariable("None", 0)394AddEnumVariable("10 Rings", 1)395AddEnumVariable("Blue Shield", 2)396AddEnumVariable("Invincibility", 3)397AddEnumVariable("Speed Shoes", 4)398AddEnumVariable("1UP (Sonic)", 5)399AddEnumVariable("Clock (Unused)", 6)400AddEnumVariable("1UP (Tails)", 7)401AddEnumVariable("S Monitor", 8)402AddEnumVariable("1UP (Knuckles)", 9)403AddEnumVariable("1UP (Amy)", 10)404AddEnumVariable("Invalid (Static)", 11)405AddEnumVariable("10 Rings (Plane B)", 12)406AddEnumVariable("Blue Shield (Plane B)", 13)407AddEnumVariable("Invincibility (Plane B)", 14)408AddEnumVariable("Speed Shoes (Plane B)", 15)409AddEnumVariable("1UP (Sonic (Plane B))", 16)410AddEnumVariable("Clock (Unused) (Plane B)", 17)411AddEnumVariable("1UP (Tails) (Plane B)", 18)412AddEnumVariable("S Monitor (Plane B)", 19)413AddEnumVariable("1UP (Knuckles)", 20)414AddEnumVariable("1UP (Amy)", 21)415AddEnumVariable("Invalid (Static) (Plane B)", 22)416end sub417418419