Path: blob/main/Scripts/R7/Kabasira.txt
1319 views
//------------------Sonic CD Kabasira Script------------------//1//--------Scripted by Christian Whitehead 'The Taxman'--------//2//-------Unpacked By Rubberduckycooly's Script Unpacker-------//34// Aliases5#alias Object.Value0 : Object.Timer6#alias Object.Value1 : Object.Angle7#alias Object.Value2 : Object.StartPosX8#alias Object.Value3 : Object.StartPosY9#alias Object.Value4 : Object.DrawPosX10#alias Object.Value5 : Object.DrawPosY1112#alias Object.PropertyValue : Object.Quality1314// Kabasira Shot Aliases15#alias Object.Value1 : Object.XVelocity16#alias Object.Value2 : Object.YVelocity1718// States 0-1 are never used, aside from state 0 being the default state19#alias 2 : KABASIRA_INACTIVE2021// Ink Effect22#alias 2 : INK_ALPHA2324// Stage SFX25#alias 2 : SFX_S_SHOT2627// Badnik Quality / Property Values28#alias 0 : GOOD_QUALITY29#alias 1 : BAD_QUALITY303132sub ObjectMain33if Object.OutOfBounds == true34// The object is out of bounds, reset it35Object.State = KABASIRA_INACTIVE36Object.Timer = 03738// Neutral angle, right between 512 and 00039Object.Angle = 2564041// The object never seems to refrence its direction, nor does it use FX_FLIP, so I believe this is effectively unused?42Object.Direction = FACING_RIGHT4344// Move it back to its starting position45// (Although, normally there's a check to make sure the starting position is OOB too to prevent visible teleporting, why isn't there a check like that this time?)46Object.XPos = Object.StartPosX47Object.YPos = Object.StartPosY48end if4950if Object.Quality == GOOD_QUALITY51// Good variant of the object, able to attack5253Object.Angle += 254Object.Angle &= 51155Object.Frame = Object.AnimationTimer56Object.Frame >>= 357Object.AnimationTimer++58Object.AnimationTimer &= 155960if Object.Timer == 061Object.Timer = 2406263// Shoot a shot at the player6465PlayStageSfx(SFX_S_SHOT, false)6667// Different shot subtypes based on the player's position relative to the Kabasira68if Player.XPos > Object.XPos69CreateTempObject(TypeName[Kabasira Shot], 0, Object.XPos, Object.YPos)70else71CreateTempObject(TypeName[Kabasira Shot], 1, Object.XPos, Object.YPos)72end if7374Object[TempObjectPos].InkEffect = INK_ALPHA75Object[TempObjectPos].Alpha = 1927677// Find the velocities to send the shot at7879TempValue0 = Player.XPos80TempValue0 -= Object.XPos81TempValue1 = Player.YPos82TempValue1 -= Object.YPos8384ATan2(TempValue2, TempValue0, TempValue1)8586Cos256(Object[TempObjectPos].XVelocity, TempValue2)87Sin256(Object[TempObjectPos].YVelocity, TempValue2)88Object[TempObjectPos].XVelocity <<= 989Object[TempObjectPos].YVelocity <<= 990else91Object.Timer--92end if93else94// Peaceful variant of the object, no attacking the player needed so just float around95Object.Angle++96Object.Angle &= 5119798Object.Frame = Object.AnimationTimer99Object.Frame >>= 4100Object.AnimationTimer++101Object.AnimationTimer &= 31102end if103104Cos(Object.YPos, Object.Angle)105Object.YPos <<= 13106Object.YPos += Object.StartPosY107108TempValue0 = Object.Angle109TempValue0 <<= 1110111Sin(Object.XPos, TempValue0)112Object.XPos *= 0xA00113Object.XPos += Object.StartPosX114115CallFunction(StageSetup_CheckGoodFuture)116117end sub118119120sub ObjectPlayerInteraction121// Check if the player's touched the head122#platform: Use_Standalone123PlayerObjectCollision(C_TOUCH, -6, -6, 6, 6)124#endplatform125#platform: Use_Origins126PlayerObjectCollision(C_ENEMY, -6, -6, 6, 6)127#endplatform128129if CheckResult == true130CallFunction(Player_BadnikBreak)131end if132133// (No collision checks for the rest of the body)134135end sub136137138sub ObjectDraw139if Object.State < KABASIRA_INACTIVE140141// First, draw each body part142TempValue0 = 0143TempValue1 = 488144TempValue3 = Object.Angle145TempValue3 += 464146TempValue3 &= 511147Object.Alpha = 64148149while TempValue0 < 4150TempValue2 = Object.Angle151TempValue2 += TempValue1152TempValue2 &= 511153TempValue2 /= 42154TempValue2 %= 12155156Cos(Object.DrawPosY, TempValue3)157Object.DrawPosY <<= 13158Object.DrawPosY += Object.StartPosY159160TempValue4 = TempValue3161TempValue4 <<= 1162163Sin(Object.DrawPosX, TempValue4)164Object.DrawPosX *= 0xA00165Object.DrawPosX += Object.StartPosX166167switch TempValue2168case 0169case 6170DrawSpriteFX(TempValue2, FX_INK, Object.DrawPosX, Object.DrawPosY)171DrawSpriteFX(0, FX_INK, Object.DrawPosX, Object.DrawPosY)172TempValue2 = 6173TempValue2 += Object.Frame174break175176case 1177case 7178DrawSpriteFX(TempValue2, FX_INK, Object.DrawPosX, Object.DrawPosY)179DrawSpriteFX(1, FX_INK, Object.DrawPosX, Object.DrawPosY)180TempValue2 = 8181TempValue2 += Object.Frame182break183184case 2185case 8186DrawSpriteFX(TempValue2, FX_INK, Object.DrawPosX, Object.DrawPosY)187DrawSpriteFX(2, FX_INK, Object.DrawPosX, Object.DrawPosY)188TempValue2 = 10189TempValue2 += Object.Frame190break191192case 3193case 9194DrawSpriteFX(3, FX_INK, Object.DrawPosX, Object.DrawPosY)195TempValue2 = 12196TempValue2 += Object.Frame197DrawSpriteFX(TempValue2, FX_INK, Object.DrawPosX, Object.DrawPosY)198break199200case 4201case 10202TempValue2 = 14203TempValue2 += Object.Frame204DrawSpriteFX(TempValue2, FX_INK, Object.DrawPosX, Object.DrawPosY)205DrawSpriteFX(4, FX_INK, Object.DrawPosX, Object.DrawPosY)206break207208case 5209case 11210TempValue2 = 16211TempValue2 += Object.Frame212DrawSpriteFX(TempValue2, FX_INK, Object.DrawPosX, Object.DrawPosY)213DrawSpriteFX(5, FX_INK, Object.DrawPosX, Object.DrawPosY)214break215216end switch217218TempValue0++219TempValue1 += 8220TempValue3 += 12221TempValue3 &= 511222Object.Alpha += 32223loop224225// Draw the head & wings226// Different sprites & priority for the Kabasira's different directions227228TempValue0 = Object.Angle229TempValue0 += 8230TempValue0 &= 511231TempValue0 /= 42232TempValue0 %= 12233switch TempValue0234case 0235case 6236DrawSpriteXY(0, Object.DrawPosX, Object.DrawPosY)237TempValue2 = 6238TempValue2 += Object.Frame239DrawSpriteXY(TempValue2, Object.DrawPosX, Object.DrawPosY)240break241242case 1243case 7244DrawSpriteXY(1, Object.DrawPosX, Object.DrawPosY)245TempValue2 = 8246TempValue2 += Object.Frame247DrawSpriteXY(TempValue2, Object.DrawPosX, Object.DrawPosY)248break249250case 2251case 8252DrawSpriteXY(2, Object.DrawPosX, Object.DrawPosY)253TempValue2 = 10254TempValue2 += Object.Frame255DrawSpriteXY(TempValue2, Object.DrawPosX, Object.DrawPosY)256break257258case 3259case 9260DrawSpriteXY(3, Object.DrawPosX, Object.DrawPosY)261TempValue2 = 12262TempValue2 += Object.Frame263DrawSpriteXY(TempValue2, Object.DrawPosX, Object.DrawPosY)264break265266case 4267case 10268TempValue2 = 14269TempValue2 += Object.Frame270DrawSpriteXY(TempValue2, Object.DrawPosX, Object.DrawPosY)271DrawSpriteXY(4, Object.DrawPosX, Object.DrawPosY)272break273274case 5275case 11276TempValue2 = 16277TempValue2 += Object.Frame278DrawSpriteXY(TempValue2, Object.DrawPosX, Object.DrawPosY)279DrawSpriteXY(5, Object.DrawPosX, Object.DrawPosY)280break281282end switch283284end if285286end sub287288289sub ObjectStartup290291LoadSpriteSheet("R7/Objects.gif")292293// Kabasira Body Frames294SpriteFrame(-8, -8, 16, 16, 133, 100)295SpriteFrame(-8, -8, 16, 16, 150, 100)296SpriteFrame(-8, -8, 16, 16, 167, 100)297SpriteFrame(-8, -8, 16, 16, 184, 100)298SpriteFrame(-8, -8, 16, 16, 99, 100)299SpriteFrame(-8, -8, 16, 16, 116, 100)300301// Kabasira Wing Frames302SpriteFrame(-8, -6, 8, 8, 243, 101)303SpriteFrame(-8, -6, 8, 8, 243, 110)304SpriteFrame(-12, -6, 24, 8, 218, 101)305SpriteFrame(-12, -6, 24, 8, 218, 110)306SpriteFrame(-8, -6, 16, 8, 218, 92)307SpriteFrame(-8, -6, 16, 8, 235, 92)308SpriteFrame(0, -6, 8, 8, 240, 74)309SpriteFrame(0, -6, 8, 8, 240, 83)310SpriteFrame(-8, -6, 16, 8, 218, 92)311SpriteFrame(-8, -6, 16, 8, 235, 92)312SpriteFrame(-12, -6, 24, 8, 218, 101)313SpriteFrame(-12, -6, 24, 8, 218, 110)314315// Setup all Kabasira objects in the level316ArrayPos0 = 32317while ArrayPos0 < 1056318if Object[ArrayPos0].Type == TypeName[Kabasira]319320// Store the starting Positions since the Kabasira moves around321Object[ArrayPos0].StartPosX = Object[ArrayPos0].XPos322Object[ArrayPos0].StartPosY = Object[ArrayPos0].YPos323324// Kabasira's tail has a fade effect, so give it the INK_ALPHA effect325Object[ArrayPos0].InkEffect = INK_ALPHA326327// Give it 2 seconds of starting idle time before it starts to shoot328Object[ArrayPos0].Timer = 120329330end if331332ArrayPos0++333loop334335end sub336337338// ========================339// Editor Subs340// ========================341342sub RSDKEdit343if Editor.ReturnVariable == true344switch Editor.VariableID345case EDIT_VAR_PROPVAL // Property Value346CheckResult = Object.PropertyValue347break348case 0 // Condition349CheckResult = Object.PropertyValue350break351end switch352else353switch Editor.VariableID354case EDIT_VAR_PROPVAL // Property Value355Object.PropertyValue = Editor.VariableValue356break357case 0 // Condition358Object.PropertyValue = Editor.VariableValue359break360end switch361end if362end sub363364365sub RSDKDraw366DrawSprite(1)367DrawSprite(0)368end sub369370371sub RSDKLoad372LoadSpriteSheet("R7/Objects.gif")373SpriteFrame(-8, -8, 16, 16, 116, 100)374SpriteFrame(-8, -6, 8, 8, 243, 101)375376AddEditorVariable("Condition")377SetActiveVariable("Condition")378AddEnumVariable("Good", GOOD_QUALITY)379AddEnumVariable("Bad", BAD_QUALITY)380end sub381382383