Path: blob/master/Sonic 2/Scripts/Enemies/Spiker.txt
1482 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Spiker Object3// Script Author: Christian Whitehead/Simon Thomley4// Unpacked by Rubberduckycooly's script unpacker5// ----------------------------------67// ========================8// Aliases9// ========================1011private alias object.value0 : object.timer12private alias object.value1 : object.startPos.x13private alias object.value2 : object.coneState14private alias object.value3 : object.launchTimer // Separate from value0 since the two run alongside each other15private alias object.value4 : object.backupState1617private alias 0 : SPIKER_PAUSE18private alias 1 : SPIKER_WANDERING19private alias 2 : SPIKER_LAUNCHING20private alias 3 : SPIKER_CONE2122private alias 0 : CONE_NONE23private alias 1 : CONE_ATTACHED24private alias 2 : CONE_LAUNCHING2526// Player aliases27private alias object.value40 : player.hitboxLeft28private alias object.value38 : player.hitboxTop29private alias object.value41 : player.hitboxRight30private alias object.value39 : player.hitboxBottom313233// ========================34// Function Declarations35// ========================3637reserve function Spiker_Setup38reserve function Spiker_DebugDraw39reserve function Spiker_DebugSpawn404142private function Spiker_Setup43object[arrayPos0].direction = object[arrayPos0].propertyValue44GetBit(temp0, object[arrayPos0].direction, 0)45if temp0 == FACING_RIGHT46object[arrayPos0].xvel = -0x800047else48object[arrayPos0].xvel = 0x800049end if50object[arrayPos0].yvel = 051object[arrayPos0].timer = 6452object[arrayPos0].frame = 053object[arrayPos0].animation = 054object[arrayPos0].animationTimer = 055object[arrayPos0].coneState = CONE_ATTACHED56object[arrayPos0].priority = PRIORITY_BOUNDS57end function585960private function Spiker_DebugDraw61DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)62DrawSpriteFX(2, FX_FLIP, object.xpos, object.ypos)63end function646566private function Spiker_DebugSpawn67CreateTempObject(TypeName[Spiker], object.direction, object.xpos, object.ypos)68object[tempObjectPos].startPos.x = object.xpos69arrayPos0 = object[tempObjectPos].entityPos70CallFunction(Spiker_Setup)71end function727374// ========================75// Events76// ========================7778event ObjectUpdate79switch object.state80case SPIKER_PAUSE81object.priority = PRIORITY_ACTIVE82object.xpos += object.xvel8384object.timer--85if object.timer == 086object.timer = 1687object.state = SPIKER_WANDERING88end if8990object.frame = object.animationTimer91object.frame /= 1092object.animationTimer++93if object.animationTimer == 2094object.animationTimer = 095end if96break9798case SPIKER_WANDERING99object.timer--100if object.timer < 0101object.timer = 64102object.direction ^= FLIP_X103FlipSign(object.xvel)104object.state = SPIKER_PAUSE105end if106break107108case SPIKER_LAUNCHING109object.launchTimer--110if object.launchTimer < 0111object.coneState = CONE_NONE112CreateTempObject(TypeName[Spiker], 0, object.xpos, object.ypos)113object[tempObjectPos].coneState = CONE_ATTACHED114object[tempObjectPos].state = SPIKER_CONE115object[tempObjectPos].direction = object.direction116GetBit(temp0, object.direction, 1) // see if the Y flip bit is set117if temp0 == FLIP_NONE118object[tempObjectPos].yvel = -0x20000119else120object[tempObjectPos].yvel = 0x20000121end if122123object.state = object.backupState124end if125break126127case SPIKER_CONE128object.ypos += object.yvel129object.direction ^= FLIP_X130break131132end switch133134if object.outOfBounds == true135temp0 = object.xpos136object.xpos = object.startPos.x137138if object.outOfBounds == true139arrayPos0 = object.entityPos140CallFunction(Spiker_Setup)141else142object.xpos = temp0143end if144end if145146foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)147if object.state != SPIKER_CONE148BoxCollisionTest(C_TOUCH, object.entityPos, -8, -10, 8, 10, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)149if checkResult == true150CallFunction(Player_BadnikBreak)151end if152153if object.type != TypeName[Blank Object]154if object.coneState == CONE_ATTACHED155BoxCollisionTest(C_TOUCH, object.entityPos, -32, -128, 32, 128, currentPlayer, -1, -1, 1, 1)156if checkResult == true157object.coneState = CONE_LAUNCHING158object.launchTimer = 8159object.backupState = object.state160object.state = SPIKER_LAUNCHING161end if162end if163end if164end if165166if object.coneState >= CONE_ATTACHED167GetBit(temp0, object.direction, 1) // see if the Y flip bit is set168if temp0 == FLIP_NONE169BoxCollisionTest(C_TOUCH, object.entityPos, -8, -32, 8, 0, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)170else171BoxCollisionTest(C_TOUCH, object.entityPos, -8, 0, 8, 32, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)172end if173174if checkResult == true175CallFunction(Player_Hit)176end if177end if178next179end event180181182event ObjectDraw183if object.state != SPIKER_CONE184// Actual Spiker object, draw the body frame185DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)186end if187188if object.coneState >= CONE_ATTACHED189// Spiker cone projectile190DrawSpriteFX(2, FX_FLIP, object.xpos, object.ypos)191end if192end event193194195event ObjectStartup196CheckCurrentStageFolder("Zone05")197if checkResult == true198LoadSpriteSheet("HTZ/Objects.gif")199200// Walking Frames201SpriteFrame(-12, -8, 23, 24, 66, 206)202SpriteFrame(-12, -8, 24, 24, 66, 231)203204// Cone Frame205SpriteFrame(-12, -32, 24, 32, 66, 173)206else207LoadSpriteSheet("MBZ/Objects.gif")208209// Walking Frames210SpriteFrame(-12, -8, 23, 24, 67, 781)211SpriteFrame(-12, -8, 24, 24, 67, 806)212213// Cone Frame214SpriteFrame(-12, -32, 24, 32, 67, 748)215end if216217foreach (TypeName[Spiker], arrayPos0, ALL_ENTITIES)218object[arrayPos0].startPos.x = object[arrayPos0].xpos219GetBit(temp0, object[arrayPos0].propertyValue, 1)220if temp0 == 0221object[arrayPos0].ypos += 0x80000222else223object[arrayPos0].ypos -= 0x80000224end if225CallFunction(Spiker_Setup)226next227228SetTableValue(TypeName[Spiker], DebugMode_ObjCount, DebugMode_TypesTable)229SetTableValue(Spiker_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)230SetTableValue(Spiker_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)231DebugMode_ObjCount++232end event233234235// ========================236// Editor Events237// ========================238239event RSDKEdit240if editor.returnVariable == true241switch editor.variableID242case EDIT_VAR_PROPVAL // property value243checkResult = object.propertyValue244break245246case 0 // direction247checkResult = object.propertyValue248break249250end switch251else252switch editor.variableID253case EDIT_VAR_PROPVAL // property value254object.propertyValue = editor.variableValue255break256257case 0 // direction258object.propertyValue = editor.variableValue259break260261end switch262end if263end event264265266event RSDKDraw267object.direction = object.propertyValue268269DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)270DrawSpriteFX(1, FX_FLIP, object.xpos, object.ypos)271end event272273274event RSDKLoad275CheckCurrentStageFolder("Zone05")276if checkResult == true277LoadSpriteSheet("HTZ/Objects.gif")278SpriteFrame(-12, -8, 23, 24, 66, 206) // #0 - Walking - Frame 1279SpriteFrame(-12, -32, 24, 32, 66, 173) // #1 - Cone280else281LoadSpriteSheet("MBZ/Objects.gif")282SpriteFrame(-12, -8, 23, 24, 67, 781) // #0 - Walking - Frame 1283SpriteFrame(-12, -32, 24, 32, 67, 748) // #1 - Cone284end if285286AddEditorVariable("direction")287SetActiveVariable("direction")288AddEnumVariable("Left", 0)289AddEnumVariable("Right", 1)290AddEnumVariable("Left (Roof)", 2)291AddEnumVariable("Right (Roof)", 3)292end event293294295296