Path: blob/main/Scripts/R5/Bridge.txt
1319 views
//-------------------Sonic CD Bridge Script-------------------//1//--------Scripted by Christian Whitehead 'The Taxman'--------//2//-------Unpacked By Rubberduckycooly's Script Unpacker-------//34// Aliases5#alias Object.PropertyValue : Object.Length67#alias Object.Value0 : Object.WalkedOn8#alias Object.Value1 : Object.Depress9#alias Object.Value2 : Object.MidPoint10#alias Object.Value3 : Object.MidHeight11#alias Object.Value4 : Object.MidYPos12#alias Object.Value5 : Object.PlayerNo13#alias Object.Value6 : Object.Left14#alias Object.Value7 : Object.Right1516// Time Period Aliases17#alias Object[24].PropertyValue : HUD.CurrentTimePeriod1819// Flailing states, v4 names explains this much better20#alias Player.Flailing[0] : Player.FloorSensorL21#alias Player.Flailing[1] : Player.FloorSensorC22#alias Player.Flailing[2] : Player.FloorSensorR2324// Gravity25#alias 0 : GRAVITY_GROUND2627// Time Periods28#alias 0 : TIME_PRESENT29#alias 1 : TIME_PAST30#alias 2 : TIME_GOOD_FUTURE31#alias 3 : TIME_BAD_FUTURE323334// Note: This Object supports multiple players, but CD's locked to 1 Player anyway so all that logic goes unused in a way353637sub ObjectPlayerInteraction3839if Player.XPos > Object.Left40if Player.XPos < Object.Right41if Stage.ActivePlayer == Object.PlayerNo4243Object.MidPoint = Player.XPos44Object.MidPoint -= Object.Left4546TempValue0 = Object.MidPoint47TempValue0 >>= 84849TempValue1 = Object.Right50TempValue1 -= Object.Left5152TempValue2 = TempValue153TempValue2 >>= 165455TempValue0 /= TempValue25657Sin(Object.MidHeight, TempValue0)58TempValue1 >>= 1359Object.MidHeight *= TempValue16061TempValue0 = Object.YPos62TempValue0 -= 0x30000063if Player.YPos > TempValue064if Player.YVelocity >= 065TempValue2 = Player.CollisionBottom66FlipSign(TempValue2)67TempValue2 <<= 1668TempValue2 += Object.MidYPos69TempValue2 -= 0x800007071Object.WalkedOn++72Player.YPos = Object.YPos73Player.YPos += TempValue274Player.Gravity = 075Player.YVelocity = 07677Player.FloorSensorL = true78Player.FloorSensorR = true79Player.FloorSensorC = true80end if81end if8283else8485if Player.YVelocity >= 08687TempValue0 = Player.XPos88TempValue0 -= Object.Left8990if TempValue0 > Object.MidPoint91TempValue0 = Object.Right92TempValue0 -= Player.XPos9394TempValue3 = Object.Right95TempValue3 -= Object.Left96TempValue3 -= Object.MidPoint9798TempValue1 = TempValue099TempValue1 <<= 7100TempValue1 /= TempValue3101else102TempValue1 = TempValue0103TempValue1 <<= 7104TempValue1 /= Object.MidPoint105end if106107Sin(TempValue2, TempValue1)108TempValue2 *= Object.MidYPos109TempValue2 >>= 9110TempValue2 -= 0x80000111112if Player.YVelocity < 0x8000113TempValue3 = TempValue2114TempValue3 >>= 16115TempValue4 = TempValue3116TempValue3 -= 8117else118TempValue3 = TempValue2119TempValue3 >>= 16120TempValue4 = TempValue3121TempValue4 += 8122end if123124PlayerObjectCollision(C_TOUCH, -1024, TempValue3, 1024, TempValue4)125126if CheckResult == true127Object.WalkedOn++128Player.YPos = Player.CollisionBottom129FlipSign(Player.YPos)130Player.YPos <<= 16131Player.YPos += Object.YPos132Player.YPos += TempValue2133134Player.FloorSensorL = true135Player.FloorSensorR = true136Player.FloorSensorC = true137138if Player.YVelocity < 256139Object.Depress = 128140end if141142Player.Gravity = GRAVITY_GROUND143Player.YVelocity = 0144145// This check is always gonna be true, since CD only has P1 active ever146if Stage.ActivePlayer == 0147Object.PlayerNo = 0148end if149end if150151end if152153end if154end if155end if156157end sub158159160sub ObjectDraw161162TempValue0 = 0163164TempValue1 = Object.Left165TempValue1 += 0x80000166167TempValue4 = 0x80000168169TempValue5 = Object.MidPoint170TempValue5 >>= 20171172while TempValue0 < TempValue5173174TempValue3 = TempValue4175TempValue3 <<= 7176TempValue3 /= Object.MidPoint177178Sin(TempValue2, TempValue3)179TempValue2 *= Object.MidYPos180TempValue2 >>= 9181182TempValue2 += Object.YPos183184DrawSpriteXY(0, TempValue1, TempValue2)185TempValue1 += 0x100000186TempValue4 += 0x100000187TempValue0++188189loop190191TempValue2 = Object.MidYPos192TempValue2 += Object.YPos193DrawSpriteXY(0, TempValue1, TempValue2)194TempValue1 += 0x100000195TempValue0++196197TempValue5 = Object.Right198TempValue5 -= Object.Left199TempValue5 -= Object.MidPoint200201TempValue1 = Object.Right202TempValue1 -= 0x80000203204TempValue4 = 0x80000205206while TempValue0 < Object.Length207208TempValue3 = TempValue4209TempValue3 <<= 7210TempValue3 /= TempValue5211212Sin(TempValue2, TempValue3)213TempValue2 *= Object.MidYPos214TempValue2 >>= 9215216TempValue2 += Object.YPos217218DrawSpriteXY(0, TempValue1, TempValue2)219TempValue1 -= 0x100000220TempValue4 += 0x100000221TempValue0++222223loop224225if Object.WalkedOn > 0226if Object.Depress < 128227Object.Depress += 8228end if229else230if Object.Depress > 0231Object.Depress -= 8232Object.PlayerNo = -1233else234Object.MidHeight = 0235end if236end if237238Object.MidYPos = Object.MidHeight239Object.MidYPos *= Object.Depress240Object.MidYPos >>= 7241242Object.WalkedOn = 0243244end sub245246247sub ObjectStartup248LoadSpriteSheet("R5/Objects.gif")249250// Load different Sprite Frames for the different Time Periods251switch HUD.CurrentTimePeriod252case TIME_PRESENT253SpriteFrame(-8, -8, 16, 16, 35, 1)254break255256case TIME_PAST257SpriteFrame(-8, -8, 16, 16, 67, 174)258break259260case TIME_GOOD_FUTURE261SpriteFrame(-8, -8, 16, 16, 83, 174)262break263264case TIME_BAD_FUTURE265SpriteFrame(-8, -8, 16, 16, 83, 158)266break267268end switch269270// Setup the Bridge Sizes for all Bridge Objects in the level271ArrayPos0 = 32272while ArrayPos0 < 1056273if Object[ArrayPos0].Type == TypeName[Bridge]274Object[ArrayPos0].Left = Object[ArrayPos0].Length275Object[ArrayPos0].Left <<= 19276Object[ArrayPos0].Right = Object[ArrayPos0].Left277278FlipSign(Object[ArrayPos0].Left)279Object[ArrayPos0].Left += Object[ArrayPos0].XPos280Object[ArrayPos0].Right += Object[ArrayPos0].XPos281282Object[ArrayPos0].PlayerNo = -1283end if284285ArrayPos0++286loop287288end sub289290291// ========================292// Editor Subs293// ========================294295sub RSDKDraw296TempValue0 = Object.Length297TempValue2 = TempValue0298TempValue0 <<= 19299FlipSign(TempValue0)300TempValue0 += Object.XPos301TempValue0 += 0x80000302303TempValue1 = 0304while TempValue1 < TempValue2305DrawSpriteXY(0, TempValue0, Object.YPos)306TempValue0 += 0x100000307TempValue1++308loop309310if TempValue1 == 0311DrawSprite(0)312end if313end sub314315316sub RSDKLoad317LoadSpriteSheet("R5/Objects.gif")318319// TODO: support other time periods320// Surely there's a better way to do it than 10 separate checkCurrentStageFolder checks?321SpriteFrame(-8, -8, 16, 16, 35, 1)322323SetVariableAlias(ALIAS_VAR_PROPVAL, "length")324end sub325326327