Path: blob/master/Sonic 2/Scripts/Enemies/Shellcracker.txt
1478 views
// ----------------------------------1// RSDK Project: Sonic 22// Script Description: Shellcracker 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.startPos.y14private alias object.value3 : object.armLength15private alias object.value4 : object.canExtendArm16private alias object.value31 : object.wrapOffset.y1718// States19private alias 0 : SHELLCRACKER_MOVING20private alias 1 : SHELLCRACKER_PREPAREARMEXTEND21private alias 2 : SHELLCRACKER_EXTENDARM22private alias 3 : SHELLCRACKER_ARMEXTENDED23private alias 4 : SHELLCRACKER_RETRACTARM24private alias 5 : SHELLCRACKER_ARMDEBRIS2526// Player Aliases27private alias object.value40 : player.hitboxLeft28private alias object.value38 : player.hitboxTop29private alias object.value41 : player.hitboxRight30private alias object.value39 : player.hitboxBottom3132// Path ID Aliases33private alias 0 : PATH_A343536// ========================37// Function Declarations38// ========================3940reserve function Shellcracker_Setup41reserve function Shellcracker_DebugDraw42reserve function Shellcracker_DebugSpawn43reserve function Shellcracker_CheckPlayerInRange44reserve function Shellcracker_CheckOffScreen454647// ========================48// Function Definitions49// ========================5051private function Shellcracker_Setup52if object[arrayPos0].propertyValue == 053object[arrayPos0].direction = FLIP_NONE54object[arrayPos0].xvel = 0x400055else56object[arrayPos0].direction = FLIP_X57object[arrayPos0].xvel = -0x400058end if5960object[arrayPos0].frame = 061object[arrayPos0].timer = 32062object[arrayPos0].armLength = 0x14000063object[arrayPos0].canExtendArm = false64object[arrayPos0].state = SHELLCRACKER_MOVING65object[arrayPos0].priority = PRIORITY_BOUNDS66end function676869private function Shellcracker_DebugDraw70DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)71end function727374private function Shellcracker_DebugSpawn75CreateTempObject(TypeName[Shellcracker], object.direction, object.xpos, object.ypos)76arrayPos0 = object[tempObjectPos].entityPos77object[arrayPos0].startPos.x = object.xpos78object[arrayPos0].startPos.y = object.ypos79CallFunction(Shellcracker_Setup)80end function818283private function Shellcracker_CheckPlayerInRange84foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)85if object.direction == FLIP_NONE86BoxCollisionTest(C_TOUCH, object.entityPos, 0, -256, 96, 256, currentPlayer, -1, -1, 1, 1)87else88BoxCollisionTest(C_TOUCH, object.entityPos, -96, -256, 0, 256, currentPlayer, -1, -1, 1, 1)89end if9091if checkResult == true92object.timer = 093object.frame = 394object.state = SHELLCRACKER_EXTENDARM95end if96next97end function9899100private function Shellcracker_CheckOffScreen101if object.outOfBounds == true102temp0 = object.xpos103temp1 = object.ypos104105object.xpos = object.startPos.x106object.ypos = object.startPos.y107object.ypos += object.wrapOffset.y108if object.outOfBounds == true109arrayPos0 = object.entityPos110CallFunction(Shellcracker_Setup)111else112object.xpos = temp0113object.ypos = temp1114end if115end if116end function117118119// ========================120// Events121// ========================122123event ObjectUpdate124switch object.state125case SHELLCRACKER_MOVING126object.priority = PRIORITY_ACTIVE127object.xpos += object.xvel128129object.timer--130if object.timer == 0131object.frame = 0132object.animationTimer = 0133object.timer = 40134object.state = SHELLCRACKER_PREPAREARMEXTEND135end if136137ObjectTileGrip(CSIDE_FLOOR, 0, 12, PATH_A)138if checkResult == 0139object.frame = 0140object.animationTimer = 0141FlipSign(object.xvel)142object.timer = 60143object.state = SHELLCRACKER_PREPAREARMEXTEND144end if145146object.frame = object.animationTimer147object.frame >>= 4148object.animationTimer++149if object.animationTimer >= 48150object.animationTimer = 0151end if152153CallFunction(Shellcracker_CheckPlayerInRange)154if object.state == SHELLCRACKER_EXTENDARM155object.timer = 10156object.canExtendArm = true157object.frame = 0158object.state = SHELLCRACKER_PREPAREARMEXTEND159end if160161CallFunction(Shellcracker_CheckOffScreen)162break163164case SHELLCRACKER_PREPAREARMEXTEND165object.timer--166if object.timer == 0167object.timer = 320168object.state = SHELLCRACKER_MOVING169if object.canExtendArm == true170object.canExtendArm = false171object.timer = 0172object.frame = 3173object.state = SHELLCRACKER_EXTENDARM174else175CallFunction(Shellcracker_CheckPlayerInRange)176end if177end if178179CallFunction(Shellcracker_CheckOffScreen)180break181182case SHELLCRACKER_EXTENDARM183if object.armLength < 0x480000184object.armLength += 0x40000185else186object.timer = 8187object.state = SHELLCRACKER_ARMEXTENDED188end if189190CallFunction(Shellcracker_CheckOffScreen)191break192193case SHELLCRACKER_ARMEXTENDED194object.timer--195if object.timer == 0196object.state = SHELLCRACKER_RETRACTARM197end if198199CallFunction(Shellcracker_CheckOffScreen)200break201202case SHELLCRACKER_RETRACTARM203if object.armLength > 0x140000204object.armLength -= 0x40000205else206object.frame = 0207object.timer = 40208object.state = SHELLCRACKER_PREPAREARMEXTEND209end if210211CallFunction(Shellcracker_CheckOffScreen)212break213214case SHELLCRACKER_ARMDEBRIS215arrayPos0 = object.timer216if object[arrayPos0].type == TypeName[Shellcracker]217object.type = TypeName[Blank Object]218end if219220object.xpos += object.xvel221object.ypos += object.yvel222object.yvel += 0x3800223224temp1 = object.ypos225temp1 >>= 16226temp1 -= camera[0].ypos227Abs(temp1)228temp1 -= 32229if temp1 >= screen.ycenter230object.type = TypeName[Blank Object]231end if232break233234end switch235236temp6 = object.xpos237temp7 = object.ypos238foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)239if object.state < SHELLCRACKER_ARMDEBRIS240BoxCollisionTest(C_TOUCH, object.entityPos, -16, -8, 16, 8, currentPlayer, player[currentPlayer].hitboxLeft, player[currentPlayer].hitboxTop, player[currentPlayer].hitboxRight, player[currentPlayer].hitboxBottom)241if checkResult == true242CreateTempObject(TypeName[Shellcracker], 0, object.xpos, object.ypos)243object[tempObjectPos].armLength = object.armLength244object[tempObjectPos].direction = object.direction245object[tempObjectPos].state = SHELLCRACKER_ARMDEBRIS246object[tempObjectPos].timer = object.entityPos247if object.direction == FLIP_NONE248object[tempObjectPos].xvel = 0x40000249else250object[tempObjectPos].xvel = -0x40000251end if252253CallFunction(Player_BadnikBreak)254end if255256if object.type == TypeName[Shellcracker]257if object.direction == FLIP_NONE258object.xpos += object.armLength259else260object.xpos -= object.armLength261end if262object.ypos -= 0x80000263264BoxCollisionTest(C_TOUCH, object.entityPos, -10, -7, 10, 7, currentPlayer, C_BOX, C_BOX, C_BOX, C_BOX)265if checkResult == true266CallFunction(Player_Hit)267end if268269object.xpos = temp6270object.ypos = temp7271end if272end if273next274end event275276277event ObjectDraw278// Draw The Dude:tm:279if object.state < SHELLCRACKER_ARMDEBRIS280DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)281end if282283if object.state >= SHELLCRACKER_EXTENDARM284temp1 = object.ypos285temp1 -= 0x20000286temp2 = object.armLength287288// Draw Arm289temp7 = 0290while temp7 < 7291temp0 = object.xpos292if object.direction == FLIP_NONE293temp0 -= 0xA0000294else295temp0 += 0xA0000296end if297298if temp2 < 0x180000299temp2 = 0x180000300end if301302if object.direction == FLIP_NONE303temp0 += temp2304else305temp0 -= temp2306end if307DrawSpriteFX(4, FX_FLIP, temp0, temp1)308temp2 -= 0x80000309temp7++310loop311312// Draw Shell313temp0 = object.xpos314if object.direction == FLIP_NONE315temp0 += object.armLength316else317temp0 -= object.armLength318end if319temp1 = object.ypos320temp1 -= 0x80000321DrawSpriteFX(5, FX_FLIP, temp0, temp1)322end if323end event324325326event ObjectStartup327CheckCurrentStageFolder("Zone09")328if checkResult == true329LoadSpriteSheet("MPZ/Objects.gif")330SpriteFrame(-24, -19, 56, 31, 199, 30) // ShellCracker (Moving) - Frame 1 - #0331SpriteFrame(-24, -19, 56, 31, 199, 62) // ShellCracker (Moving) - Frame 2 - #1332SpriteFrame(-24, -19, 56, 31, 199, 94) // ShellCracker (Moving) - Frame 3 - #2333SpriteFrame(-24, -12, 47, 24, 208, 126) // ShellCracker (Extending Arm) - #3334SpriteFrame(-4, -4, 8, 8, 190, 53) // Arm Node - #4335SpriteFrame(-12, -11, 24, 22, 174, 30) // Shell - #5336else337LoadSpriteSheet("MBZ/Objects.gif")338339// These frame positions are just copied from MPZ's, they don't look quite right with MBZ340SpriteFrame(-24, -19, 56, 31, 199, 30) // ShellCracker (Moving) - Frame 1 - #0341SpriteFrame(-24, -19, 56, 31, 199, 62) // ShellCracker (Moving) - Frame 2 - #1342SpriteFrame(-24, -19, 56, 31, 199, 94) // ShellCracker (Moving) - Frame 3 - #2343SpriteFrame(-24, -12, 47, 24, 208, 126) // ShellCracker (Extending Arm) - #3344SpriteFrame(-4, -4, 8, 8, 190, 53) // Arm Node - #4345SpriteFrame(-12, -11, 24, 22, 174, 30) // Shell - #5346end if347348foreach (TypeName[Shellcracker], arrayPos0, ALL_ENTITIES)349object[arrayPos0].startPos.x = object[arrayPos0].xpos350object[arrayPos0].startPos.y = object[arrayPos0].ypos351object[arrayPos0].propertyValue ^= 1352CallFunction(Shellcracker_Setup)353next354SetTableValue(TypeName[Shellcracker], DebugMode_ObjCount, DebugMode_TypesTable)355SetTableValue(Shellcracker_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)356SetTableValue(Shellcracker_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)357DebugMode_ObjCount++358end event359360361// ========================362// Editor Events363// ========================364365event RSDKEdit366if editor.returnVariable == true367switch editor.variableID368case EDIT_VAR_PROPVAL // property value369checkResult = object.propertyValue370break371372case 0 // direction373checkResult = object.propertyValue374break375376end switch377else378switch editor.variableID379case EDIT_VAR_PROPVAL // property value380object.propertyValue = editor.variableValue381break382383case 0 // direction384object.propertyValue = editor.variableValue385break386387end switch388end if389end event390391392event RSDKDraw393object.direction = object.propertyValue394object.direction ^= FLIP_X395DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)396end event397398399event RSDKLoad400CheckCurrentStageFolder("Zone09")401if checkResult == true402LoadSpriteSheet("MPZ/Objects.gif")403SpriteFrame(-24, -19, 56, 31, 199, 30)404else405LoadSpriteSheet("MBZ/Objects.gif")406SpriteFrame(-24, -19, 56, 31, 132, 377) // Decomp note - using fixed frame here407end if408409AddEditorVariable("direction")410SetActiveVariable("direction")411AddEnumVariable("Left", 0)412AddEnumVariable("Right", 1)413end event414415416