Path: blob/master/Sonic 1/Scripts/Mission/MissionWater.txt
1482 views
// ----------------------------------1// RSDK Project: Sonic 12// Script Description: MissionWater Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// Any water objects in the scene should be followed by THREE blank objects, these manage player stuff89// ========================10// Aliases11// ========================1213private alias object.value1 : object.constBubbleTimer14private alias object.value2 : object.randBubbleTimer15private alias object.value3 : object.proccessActEffects16private alias object.value8 : object.nextTrackID // Stores the track that should play after the drowning one stops1718// Player Aliases19private alias object.type : player.type20private alias object.state : player.state21private alias object.xpos : player.xpos22private alias object.ypos : player.ypos23private alias object.xvel : player.xvel24private alias object.yvel : player.yvel25private alias object.speed : player.speed26private alias object.gravity : player.gravity27private alias object.animation : player.animation28private alias object.direction : player.direction29private alias object.tileCollisions : player.tileCollisions30private alias object.interaction : player.interaction3132private alias object.value1 : player.timer33private alias object.value3 : player.drownTimer34private alias object.value4 : player.drownLevel35private alias object.value18 : player.sortedDrawOrder36private alias object.value20 : player.topSpeed37private alias object.value21 : player.acceleration38private alias object.value22 : player.deceleration39private alias object.value23 : player.airAcceleration40private alias object.value24 : player.airDeceleration41private alias object.value25 : player.gravityStrength42private alias object.value27 : player.jumpStrength43private alias object.value28 : player.jumpCap44private alias object.value37 : player.shield4546// AirBubble Aliases47private alias object.value1 : airBubble.originPos.x48private alias object.value2 : airBubble.targetPlayer4950// CountdownBubble Aliases51private alias object.value1 : countdownBubble.drawPos.x52private alias object.value2 : countdownBubble.drawPos.y5354// Death Event Aliases55private alias object.value4 : object.timeOver5657// Shields58private alias 0 : SHIELD_NONE59private alias 1 : SHIELD_NORMAL60private alias 2 : SHIELD_BUBBLE61private alias 3 : SHIELD_FIRE62private alias 4 : SHIELD_LIGHTNING63private alias 5 : SHIELD_GOGGLES // LZ goggles, debug mode only6465// Tracks66private alias 0 : TRACK_STAGE67private alias 2 : TRACK_INVINCIBLE68private alias 6 : TRACK_DROWNING6970// Super States71private alias 1 : SUPERSTATE_SUPER727374// ========================75// Function Declarations76// ========================7778reserve function MissionWater_SmallAirBubble79reserve function MissionWater_SpawnCountDownBubble80reserve function MissionWater_ResetDrownMusic818283// ========================84// Static Values85// ========================8687public value MissionWater_waterSlotID = 088public value MissionWater_activateFlag = 0899091// ========================92// Function Definitions93// ========================9495private function MissionWater_SmallAirBubble96if object[+0].constBubbleTimer > 097object[+0].constBubbleTimer--9899if object[+0].randBubbleTimer > 0100object[+0].randBubbleTimer--101else102CreateTempObject(TypeName[Air Bubble], 2, player[0].xpos, player[0].ypos)103object[tempObjectPos].drawOrder = 4104object[tempObjectPos].yvel = -0x8800105airBubble[tempObjectPos].targetPlayer = 0106if player[0].direction == FLIP_NONE107object[tempObjectPos].xpos += 0x60000108else109object[tempObjectPos].xpos -= 0x60000110object[tempObjectPos].angle = 256111end if112airBubble[tempObjectPos].originPos.x = object[tempObjectPos].xpos113object[+0].randBubbleTimer = 512114end if115else116Rand(temp0, 3)117if temp0 == 1118Rand(object[+0].randBubbleTimer, 16)119object[+0].randBubbleTimer += 8120else121object[+0].randBubbleTimer = 512122end if123124object[+0].constBubbleTimer = 60125CreateTempObject(TypeName[Air Bubble], 2, player[0].xpos, player[0].ypos)126object[tempObjectPos].drawOrder = 4127object[tempObjectPos].yvel = -0x8800128airBubble[tempObjectPos].targetPlayer = 0129if player[0].direction == FLIP_NONE130object[tempObjectPos].xpos += 0x60000131else132object[tempObjectPos].xpos -= 0x60000133object[tempObjectPos].angle = 256134end if135136airBubble[tempObjectPos].originPos.x = object[tempObjectPos].xpos137end if138end function139140141private function MissionWater_SpawnCountDownBubble142CreateTempObject(TypeName[Countdown Bubble], temp0, player[0].xpos, player[0].ypos)143object[tempObjectPos].drawOrder = 5144object[tempObjectPos].yvel = -0x8800145countdownBubble[tempObjectPos].drawPos.y = 0 // this is odd... this is drawPos.y, not "targetPlayer", likely a leftover from AirBubble spawning146147if player[0].direction == FLIP_NONE148object[tempObjectPos].xpos += 0x60000149else150object[tempObjectPos].xpos -= 0x60000151object[tempObjectPos].angle = 0x100152end if153154countdownBubble[tempObjectPos].drawPos.x = object[tempObjectPos].xpos155end function156157158private function MissionWater_ResetDrownMusic159arrayPos0 = MissionWater_waterSlotID160arrayPos0 += 0161if player[0].type != TypeName[Death Event]162if music.currentTrack == TRACK_DROWNING163if object[arrayPos0].nextTrackID == TRACK_INVINCIBLE164arrayPos1 = 0165arrayPos1 += playerCount166if object[arrayPos1].type != TypeName[Invincibility]167if Player_superState != SUPERSTATE_SUPER168object[arrayPos0].nextTrackID = TRACK_STAGE169end if170end if171end if172173PlayMusic(object[arrayPos0].nextTrackID)174end if175end if176end function177178179// ========================180// Events181// ========================182183// It seems for whatever reason, Sonic Team replaced all instances of currentPlayer with 0184// They just found and replaced every instance with no further adjustments, so if you see "if 0 == 0" or "object[+0]" anywhere, that's why185186event ObjectUpdate187if object.ypos < stage.newWaterLevel188object.ypos += 0x10000189end if190if object.ypos > stage.newWaterLevel191object.ypos -= 0x10000192end if193194temp0 = oscillation195temp0 <<= 1196Sin(stage.waterLevel, temp0)197stage.waterLevel <<= 10198stage.waterLevel += object.ypos199temp7 = stage.waterLevel200stage.waterLevel >>= 16201202if stage.timeEnabled == false203if object[0].type == TypeName[Player Object]204player[0].drownTimer = 0205end if206207if object[0].type == TypeName[Death Event]208object[0].timeOver = 11209end if210end if211212if player[0].gravityStrength == 0x3800213CheckNotEqual(player[0].type, TypeName[Debug Mode])214temp0 = checkResult215CheckNotEqual(player[0].state, Player_State_Death)216temp0 &= checkResult217CheckGreater(player[0].ypos, temp7)218temp0 &= checkResult219if temp0 == true220if player[0].yvel > 0221player[0].yvel >>= 2222end if223224if object.ypos < stage.newWaterLevel225player[0].yvel += 0x10000226end if227228if player[0].state == Player_State_Fly229StopSfx(SfxName[Flying])230StopSfx(SfxName[Jump])231end if232233player[0].xvel >>= 1234player[0].speed >>= 1235236CallFunction(Player_UpdatePhysicsState)237if player[0].yvel != 0238CreateTempObject(TypeName[Water Splash], 0, player[0].xpos, temp7)239object[tempObjectPos].drawOrder = 4240PlaySfx(SfxName[Water Splash], false)241end if242243object[+0].constBubbleTimer = 52244player[0].drownTimer = 0245end if246else247if player[0].shield == SHIELD_FIRE248temp2 = 0249while temp2 < 8250Rand(temp0, 32)251Rand(temp1, 32)252temp0 -= 16253temp0 <<= 16254temp0 += player[0].xpos255temp1 -= 16256temp1 <<= 16257temp1 += player[0].ypos258CreateTempObject(TypeName[Dust Puff], 0, temp0, temp1)259object[tempObjectPos].drawOrder = player[0].sortedDrawOrder260object[tempObjectPos].drawOrder++261object[tempObjectPos].xvel = player[0].xvel262object[tempObjectPos].yvel = player[0].yvel263temp2++264loop265266player[0].shield = SHIELD_NONE267arrayPos0 = 0268arrayPos0 += playerCount269CallFunction(Player_ApplyShield)270end if271272if player[0].shield == SHIELD_LIGHTNING273player[0].shield = SHIELD_NONE274arrayPos0 = 0275arrayPos0 += playerCount276CallFunction(Player_ApplyShield)277Water_flashTimer = 4278end if279280if player[0].shield != SHIELD_BUBBLE281if player[0].drownTimer == 0282player[0].drownLevel = 0283CallFunction(MissionWater_ResetDrownMusic)284end if285286switch player[0].drownLevel287case 0288CallFunction(MissionWater_SmallAirBubble)289player[0].drownTimer++290if player[0].drownTimer == 360291if 0 == 0292PlaySfx(SfxName[Drown Alert], false)293end if294player[0].drownLevel++295end if296break297298case 1299CallFunction(MissionWater_SmallAirBubble)300player[0].drownTimer++301if player[0].drownTimer == 660302if 0 == 0303PlaySfx(SfxName[Drown Alert], false)304end if305player[0].drownLevel++306end if307break308309case 2310CallFunction(MissionWater_SmallAirBubble)311player[0].drownTimer++312if player[0].drownTimer == 960313if 0 == 0314PlaySfx(SfxName[Drown Alert], false)315end if316player[0].drownLevel++317end if318break319320case 3321CallFunction(MissionWater_SmallAirBubble)322player[0].drownTimer++323if player[0].drownTimer == 1080324if 0 == 0325object.nextTrackID = music.currentTrack326PlayMusic(TRACK_DROWNING)327end if328329temp0 = 0330CallFunction(MissionWater_SpawnCountDownBubble)331player[0].drownLevel++332end if333break334335case 4336CallFunction(MissionWater_SmallAirBubble)337player[0].drownTimer++338if player[0].drownTimer == 1200339temp0 = 1340CallFunction(MissionWater_SpawnCountDownBubble)341player[0].drownLevel++342end if343break344345case 5346CallFunction(MissionWater_SmallAirBubble)347player[0].drownTimer++348if player[0].drownTimer == 1320349temp0 = 2350CallFunction(MissionWater_SpawnCountDownBubble)351player[0].drownLevel++352end if353break354355case 6356CallFunction(MissionWater_SmallAirBubble)357player[0].drownTimer++358if player[0].drownTimer == 1440359temp0 = 3360CallFunction(MissionWater_SpawnCountDownBubble)361player[0].drownLevel++362end if363break364365case 7366CallFunction(MissionWater_SmallAirBubble)367player[0].drownTimer++368if player[0].drownTimer == 1560369temp0 = 4370CallFunction(MissionWater_SpawnCountDownBubble)371player[0].drownLevel++372end if373break374375case 8376CallFunction(MissionWater_SmallAirBubble)377player[0].drownTimer++378if player[0].drownTimer == 1680379temp0 = 5380CallFunction(MissionWater_SpawnCountDownBubble)381player[0].drownLevel++382end if383break384385case 9386CallFunction(MissionWater_SmallAirBubble)387player[0].drownTimer++388if player[0].drownTimer == 1800389if player[0].state != Player_State_Death390if 0 == 0391stage.timeEnabled = false392camera[0].enabled = false393end if394player[0].state = Player_State_Drown395player[0].animation = ANI_DROWNING396player[0].speed = 0397player[0].xvel = 0398player[0].yvel = 0399player[0].tileCollisions = false400player[0].interaction = false401player[0].sortedDrawOrder = 5402object[+0].constBubbleTimer = 2403PlaySfx(SfxName[Drowning], false)404player[0].drownLevel++405end if406end if407break408409case 10410player[0].drownTimer++411if player[0].drownTimer == 1860412player[0].drownLevel++413end if414415if object[+0].constBubbleTimer > 0416object[+0].constBubbleTimer--417if object[+0].randBubbleTimer > 0418object[+0].randBubbleTimer--419else420Rand(temp1, 2)421temp1 += 2422CreateTempObject(TypeName[Air Bubble], temp1, player[0].xpos, player[0].ypos)423object[tempObjectPos].drawOrder = 5424object[tempObjectPos].yvel = -0x8800425object[tempObjectPos].ypos -= 0x60000426airBubble[tempObjectPos].targetPlayer = 0427Rand(object[tempObjectPos].angle, 256)428airBubble[tempObjectPos].originPos.x = object[tempObjectPos].xpos429object[+0].randBubbleTimer = 512430end if431else432Rand(temp0, 5)433if temp0 == 1434object[+0].randBubbleTimer = 2435else436object[+0].randBubbleTimer = 512437end if438object[+0].constBubbleTimer = 6439440Rand(temp1, 2)441temp1 += 2442CreateTempObject(TypeName[Air Bubble], temp1, player[0].xpos, player[0].ypos)443object[tempObjectPos].drawOrder = 5444object[tempObjectPos].yvel = -0x8800445object[tempObjectPos].ypos -= 0x60000446airBubble[tempObjectPos].targetPlayer = 0447Rand(object[tempObjectPos].angle, 0x100)448airBubble[tempObjectPos].originPos.x = object[tempObjectPos].xpos449end if450break451end switch452end if453454CheckEqual(player[0].type, TypeName[Debug Mode])455temp0 = checkResult456CheckLower(player[0].ypos, temp7)457temp0 |= checkResult458if temp0 == true459if player[0].state != Player_State_Death460player[0].yvel <<= 1461if player[0].yvel < -0x100000462player[0].yvel = -0x100000463end if464465// plucked this from the forever version, *this* is the water jump bug fix466if player[0].animation == ANI_JUMPING467if player[0].timer > 0468if player[0].yvel < -0x68000469player[0].yvel = -0x68000470end if471end if472end if473474if player[0].state == Player_State_Fly475if player[0].timer < 480476PlaySfx(SfxName[Flying], true)477else478PlaySfx(SfxName[Jump], true)479end if480end if481482483CallFunction(Player_UpdatePhysicsState)484if player[0].yvel != 0485temp0 = object.ypos486temp0 -= player[0].ypos487if temp0 < 0xF00000488CreateTempObject(TypeName[Water Splash], 0, player[0].xpos, temp7)489object[tempObjectPos].drawOrder = 4490PlaySfx(SfxName[Water Splash], false)491end if492end if493494player[0].drownTimer = 0495CallFunction(MissionWater_ResetDrownMusic)496end if497end if498end if499500object.animationTimer++501object.animationTimer %= 24502object.frame = object.animationTimer503object.frame >>= 3504end event505506507event ObjectDraw508temp0 = screen.xoffset509Sin(temp1, oscillation)510temp1 >>= 5511temp0 += temp1512temp0 &= 63513FlipSign(temp0)514515temp1 = stage.waterLevel516temp1 -= screen.yoffset517DrawSpriteScreenFX(object.frame, FX_INK, temp0, temp1)518519temp0 += 256520DrawSpriteScreenFX(object.frame, FX_INK, temp0, temp1)521end event522523524event ObjectStartup525LoadSpriteSheet("LZ/Objects2.gif")526527foreach (TypeName[MissionWater], arrayPos0, ALL_ENTITIES)528object[arrayPos0].priority = PRIORITY_ACTIVE529object[arrayPos0].drawOrder = 5530object[arrayPos0].inkEffect = INK_ALPHA531object[arrayPos0].alpha = 0xA0532stage.newWaterLevel = object[arrayPos0].ypos533MissionWater_waterSlotID = arrayPos0534stage.waterLevel = stage.newWaterLevel535stage.waterLevel >>= 16536object[arrayPos0].ypos = stage.newWaterLevel537next538539if lampPostID > 31540stage.waterState = recWaterState541stage.waterLevel = recWaterLevel542stage.newWaterLevel = recWaterLevel543stage.newWaterLevel <<= 16544arrayPos0 = MissionWater_waterSlotID545object[arrayPos0].ypos = stage.newWaterLevel546else547stage.waterState = 0548end if549550MissionWater_activateFlag = false551552player[0].drownTimer = 0553if player[0].ypos > stage.newWaterLevel554player[0].yvel >>= 2555player[0].xvel >>= 1556player[0].speed >>= 1557player[0].topSpeed >>= 1558player[0].acceleration >>= 1559player[0].deceleration >>= 1560player[0].airAcceleration >>= 1561player[0].airDeceleration >>= 1562player[0].gravityStrength = 0x1000563if stage.playerListPos == PLAYER_KNUCKLES_A564player[0].jumpStrength = 0x30000565else566player[0].jumpStrength = 0x38000567end if568player[0].jumpCap = -0x20000569arrayPos0 = MissionWater_waterSlotID570arrayPos0 += 0 // Good job, Sonic Team571object[arrayPos0].constBubbleTimer = 52572end if573574SpriteFrame(0, -8, 256, 16, 0, 129)575SpriteFrame(0, -8, 256, 16, 0, 146)576SpriteFrame(0, -8, 256, 16, 0, 163)577578BrokenMonitor_ResetDrownMusic = MissionWater_ResetDrownMusic579end event580581582// ========================583// Editor Events584// ========================585586event RSDKDraw587DrawSprite(0)588end event589590591event RSDKLoad592LoadSpriteSheet("LZ/Objects2.gif")593SpriteFrame(0, -8, 256, 16, 0, 129)594595SetVariableAlias(ALIAS_VAR_PROPVAL, "unused")596end event597598599