Path: blob/master/SonicMania/Objects/LRZ/Drillerdroid.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Drillerdroid Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectDrillerdroid *Drillerdroid;1011void Drillerdroid_Update(void)12{13RSDK_THIS(Drillerdroid);1415StateMachine_Run(self->state);16}1718void Drillerdroid_LateUpdate(void) {}1920void Drillerdroid_StaticUpdate(void)21{22if (Drillerdroid->drillSfxTimer) {23if (!Drillerdroid->playingDrillSfx) {24RSDK.PlaySfx(Drillerdroid->sfxDrill, 43643, 0xFF);25Drillerdroid->playingDrillSfx = true;26}2728Drillerdroid->drillSfxTimer = 0;29}30else if (Drillerdroid->playingDrillSfx) {31RSDK.StopSfx(Drillerdroid->sfxDrill);32Drillerdroid->playingDrillSfx = false;33}34}3536void Drillerdroid_Draw(void)37{38RSDK_THIS(Drillerdroid);3940StateMachine_Run(self->stateDraw);41}4243void Drillerdroid_Create(void *data)44{45RSDK_THIS(Drillerdroid);4647if (!SceneInfo->inEditor) {48if (globals->gameMode < MODE_TIMEATTACK) {49self->visible = true;50if (data)51self->type = VOID_TO_INT(data);5253switch (self->type) {54case DRILLERDROID_MAIN:55self->active = ACTIVE_BOUNDS;56self->updateRange.x = 0x800000;57self->updateRange.y = 0x800000;58RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 0, &self->mainAnimator, true, 0);59RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &self->armorAnimator, true, 0);60self->drawGroup = Zone->objectDrawGroup[1];61Drillerdroid->boss = self;62self->state = Drillerdroid_State_SetupArena;63self->stateDraw = Drillerdroid_Draw_Boss;64break;6566case DRILLERDROID_TARGET:67case DRILLERDROID_UNUSED:68self->active = ACTIVE_NORMAL;69self->drawFX = FX_FLIP;70self->updateRange.x = 0x800000;71self->updateRange.y = 0x800000;72RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 2, &self->mainAnimator, true, 0);73RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 3, &self->armorAnimator, true, 0);74self->drawGroup = Zone->objectDrawGroup[1];75self->state = Drillerdroid_State_Target;76self->stateDraw = Drillerdroid_Draw_Target;77break;78}79}80else {81destroyEntity(self);82}83}84}8586void Drillerdroid_StageLoad(void)87{88if (RSDK.CheckSceneFolder("LRZ1"))89Drillerdroid->aniFrames = RSDK.LoadSpriteAnimation("LRZ1/Drillerdroid.bin", SCOPE_STAGE);9091Drillerdroid->ticFrames = RSDK.LoadSpriteAnimation("Global/TicMark.bin", SCOPE_STAGE);9293Drillerdroid->hitboxCore.left = -25;94Drillerdroid->hitboxCore.top = -16;95Drillerdroid->hitboxCore.right = 25;96Drillerdroid->hitboxCore.bottom = 16;9798Drillerdroid->hitboxPistonL.left = -58;99Drillerdroid->hitboxPistonL.top = -74;100Drillerdroid->hitboxPistonL.right = -25;101Drillerdroid->hitboxPistonL.bottom = 16;102103Drillerdroid->hitboxPistonR.left = 25;104Drillerdroid->hitboxPistonR.top = -74;105Drillerdroid->hitboxPistonR.right = 58;106Drillerdroid->hitboxPistonR.bottom = 16;107108Drillerdroid->hitboxDrillL.left = -58;109Drillerdroid->hitboxDrillL.top = 16;110Drillerdroid->hitboxDrillL.right = -25;111Drillerdroid->hitboxDrillL.bottom = 53;112113Drillerdroid->hitboxDrillR.left = 25;114Drillerdroid->hitboxDrillR.top = 16;115Drillerdroid->hitboxDrillR.right = 58;116Drillerdroid->hitboxDrillR.bottom = 53;117118Drillerdroid->pistonPos[0] = 0;119Drillerdroid->pistonPos[1] = 0;120121Drillerdroid->drillPos[0] = 0x100000;122Drillerdroid->drillPos[1] = 0x100000;123124Drillerdroid->pistonDelay[0] = 4;125Drillerdroid->pistonDelay[1] = 0;126127Drillerdroid->drillDelay[0] = 4;128Drillerdroid->drillDelay[1] = 0;129130Drillerdroid->pistonMoveDir[0] = 0;131Drillerdroid->pistonMoveDir[1] = 0;132133Drillerdroid->drillMoveDir[0] = 0;134Drillerdroid->drillMoveDir[1] = 0;135136Drillerdroid->platformActive[0] = true;137Drillerdroid->platformActive[1] = true;138Drillerdroid->platformActive[2] = true;139Drillerdroid->platformActive[3] = true;140Drillerdroid->platformActive[4] = true;141142Drillerdroid->active = ACTIVE_ALWAYS;143144Drillerdroid->drillSfxTimer = 0;145Drillerdroid->playingDrillSfx = false;146147Drillerdroid->armorHealth = 3;148Drillerdroid->jumpsRemaining = 0;149150Drillerdroid->sfxHit = RSDK.GetSfx("Stage/BossHit.wav");151Drillerdroid->sfxExplosion = RSDK.GetSfx("Stage/Explosion2.wav");152Drillerdroid->sfxDrill = RSDK.GetSfx("LRZ/Drill.wav");153Drillerdroid->sfxImpact = RSDK.GetSfx("Stage/Impact4.wav");154Drillerdroid->sfxJump = RSDK.GetSfx("LRZ/DrillJump.wav");155Drillerdroid->sfxTargeting = RSDK.GetSfx("Stage/Targeting1.wav");156Drillerdroid->sfxSizzle = RSDK.GetSfx("LRZ/Sizzle.wav");157Drillerdroid->sfxDrop = RSDK.GetSfx("Stage/Drop.wav");158Drillerdroid->sfxFail = RSDK.GetSfx("Stage/Fail.wav");159Drillerdroid->sfxClang = RSDK.GetSfx("Stage/Clang2.wav");160}161162void Drillerdroid_Hit(void)163{164RSDK_THIS(Drillerdroid);165166if (--self->health > 0) {167RSDK.PlaySfx(Drillerdroid->sfxHit, false, 255);168self->invincibilityTimer = 45;169}170else {171SceneInfo->timeEnabled = false;172Player_GiveScore(RSDK_GET_ENTITY(SLOT_PLAYER1, Player), 1000);173self->invincibilityTimer = 60;174self->state = Drillerdroid_State_Destroyed;175}176}177178void Drillerdroid_CheckPlayerCollisions(void)179{180RSDK_THIS(Drillerdroid);181182if (self->invincibilityTimer) {183self->invincibilityTimer--;184}185else {186foreach_active(Player, player)187{188if (!self->invincibilityTimer) {189int32 playerID = RSDK.GetEntitySlot(player);190191if (Drillerdroid->playerTimers[playerID]) {192Drillerdroid->playerTimers[playerID]--;193}194else if (Player_CheckBadnikTouch(player, self, &Drillerdroid->hitboxCore)) {195if (player->position.y < self->position.y) {196Player_Hurt(player, self);197}198else if (self->alpha > 0x80 && player->shield != SHIELD_FIRE && !player->blinkTimer && !player->invincibleTimer) {199Player_Hurt(player, self);200}201else if (Player_CheckBossHit(player, self)) {202if (Drillerdroid->armorHealth <= 1) {203Drillerdroid_Hit();204}205else {206RSDK.PlaySfx(Drillerdroid->sfxClang, false, 255);207Drillerdroid->playerTimers[playerID] = 15;208}209}210}211else {212if (Player_CheckBadnikTouch(player, self, &Drillerdroid->hitboxPistonL)213|| Player_CheckBadnikTouch(player, self, &Drillerdroid->hitboxPistonR)) {214if (self->alpha > 0x80 && player->shield != SHIELD_FIRE && !player->blinkTimer && !player->invincibleTimer) {215Player_Hurt(player, self);216}217else if (Player_CheckBossHit(player, self)) {218if (!Drillerdroid->armorHealth) {219Drillerdroid_Hit();220}221else {222RSDK.PlaySfx(Drillerdroid->sfxClang, false, 255);223Drillerdroid->playerTimers[playerID] = 15;224}225}226}227else if (Player_CheckCollisionTouch(player, self, &Drillerdroid->hitboxDrillL)228|| Player_CheckCollisionTouch(player, self, &Drillerdroid->hitboxDrillR)) {229Player_Hurt(player, self);230}231}232}233}234}235}236237void Drillerdroid_Explode(void)238{239RSDK_THIS(Drillerdroid);240241if (!(Zone->timer & 3)) {242RSDK.PlaySfx(Drillerdroid->sfxExplosion, false, 255);243244if (!(Zone->timer & 3)) {245int32 x = self->position.x + (RSDK.Rand(-19, 20) << 16);246int32 y = self->position.y + (RSDK.Rand(-24, 25) << 16);247CREATE_ENTITY(Explosion, INT_TO_VOID((RSDK.Rand(0, 256) > 192) + EXPLOSION_BOSS), x, y)->drawGroup = Zone->objectDrawGroup[1] + 2;248}249}250}251252void Drillerdroid_SpawnDebris(int32 offset)253{254RSDK_THIS(Drillerdroid);255256EntityDebris *debris = CREATE_ENTITY(Debris, Debris_State_Fall, offset + self->position.x, self->position.y + 0x400000);257RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 1, &debris->animator, true, RSDK.Rand(0, 8));258debris->velocity.x = RSDK.Rand(0, 6) << 15;259debris->velocity.y = RSDK.Rand(-12, -8) << 15;260debris->gravityStrength = 0x3800;261debris->drawGroup = Zone->objectDrawGroup[0];262debris->updateRange.x = 0x400000;263debris->updateRange.y = 0x400000;264265debris = CREATE_ENTITY(Debris, Debris_State_Fall, offset + self->position.x, self->position.y + 0x400000);266RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 1, &debris->animator, true, RSDK.Rand(0, 8));267debris->velocity.x = RSDK.Rand(-6, 0) << 15;268debris->velocity.y = RSDK.Rand(-12, -8) << 15;269debris->gravityStrength = 0x3800;270debris->drawGroup = Zone->objectDrawGroup[0];271debris->updateRange.x = 0x400000;272debris->updateRange.y = 0x400000;273}274275void Drillerdroid_State_SetupArena(void)276{277RSDK_THIS(Drillerdroid);278279if (++self->timer >= 2) {280self->timer = 0;281282Zone->playerBoundActiveR[0] = true;283Zone->playerBoundActiveB[0] = true;284Zone->cameraBoundsR[0] = (self->position.x >> 16) + 324;285Zone->cameraBoundsB[0] = (self->position.y >> 16) + 96;286Zone->cameraBoundsT[0] = Zone->cameraBoundsB[0] - SCREEN_YSIZE;287288self->startY = self->position.y;289self->active = ACTIVE_NORMAL;290self->position.y = (ScreenInfo->position.y - 192) << 16;291self->visible = true;292self->state = Drillerdroid_State_AwaitPlayer;293}294}295296void Drillerdroid_State_AwaitPlayer(void)297{298RSDK_THIS(Drillerdroid);299300EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);301302Zone->playerBoundActiveL[0] = true;303Zone->cameraBoundsL[0] = ScreenInfo->position.x;304305if (player1->position.x > self->position.x) {306Zone->playerBoundActiveL[0] = true;307Zone->cameraBoundsL[0] = (self->position.x >> 16) - 328;308309Music_TransitionTrack(TRACK_MINIBOSS, 0.0125);310self->health = 6;311CREATE_ENTITY(Drillerdroid, INT_TO_VOID(DRILLERDROID_TARGET), self->position.x, self->startY)->target = player1;312self->position.x = 0;313RSDK.PlaySfx(Drillerdroid->sfxTargeting, false, 255);314self->state = Drillerdroid_State_DecidingDropPos;315}316}317318void Drillerdroid_State_Dropping(void)319{320RSDK_THIS(Drillerdroid);321322self->position.y += self->velocity.y;323self->velocity.y += 0x3800;324325Drillerdroid_CheckPlayerCollisions();326327if (self->position.y >= ((Zone->cameraBoundsB[0] - 112) << 16)) {328self->position.y = ((Zone->cameraBoundsB[0] - 112) << 16);329330RSDK.PlaySfx(Drillerdroid->sfxImpact, false, 255);331Camera_ShakeScreen(0, 0, 4);332333self->velocity.y >>= 1;334self->startY = self->position.y + 0x100000;335336if (!Drillerdroid->canBreakSegment) {337for (int32 i = 0; i < 4; ++i) {338Drillerdroid_SpawnDebris(-0x300000);339Drillerdroid_SpawnDebris(0x300000);340Drillerdroid_SpawnDebris(-0x190000);341Drillerdroid_SpawnDebris(0x190000);342}343344Drillerdroid->jumpsRemaining = 2;345}346347self->timer = 7;348self->angle = 0;349self->state = Drillerdroid_State_Landed;350}351}352353void Drillerdroid_State_Landed(void)354{355RSDK_THIS(Drillerdroid);356357self->position.y += self->velocity.y;358Drillerdroid->drillPos[0] = self->startY - self->position.y;359Drillerdroid->drillPos[1] = self->startY - self->position.y;360361self->velocity.y -= 0xE000;362363Drillerdroid_CheckPlayerCollisions();364365if (self->velocity.y < 0) {366if (self->position.y < self->startY)367self->state = Drillerdroid_State_LandRecoil;368}369}370371void Drillerdroid_State_LandRecoil(void)372{373RSDK_THIS(Drillerdroid);374375self->position.y += self->velocity.y;376Drillerdroid->drillPos[0] = self->startY - self->position.y;377Drillerdroid->drillPos[1] = self->startY - self->position.y;378379self->velocity.y += 0x14000;380381Drillerdroid_CheckPlayerCollisions();382383if (self->velocity.y > 0) {384if (self->position.y > self->startY) {385self->position.y = self->startY;386Drillerdroid->drillPos[0] = 0;387Drillerdroid->drillPos[1] = 0;388self->state = Drillerdroid_State_DecideNextMove;389}390}391}392393void Drillerdroid_State_DecideNextMove(void)394{395RSDK_THIS(Drillerdroid);396397Drillerdroid_CheckPlayerCollisions();398399if (--self->timer <= 0) {400if (Drillerdroid->jumpsRemaining) {401self->timer = 240;402self->velocity.y = 0x27000;403RSDK.PlaySfx(Drillerdroid->sfxJump, false, 255);404self->state = Drillerdroid_State_PrepareJump;405}406else if (Drillerdroid->canBreakSegment) {407self->timer = 180;408Drillerdroid->stalactiteOffset = 6 * RSDK.Rand(-2, 3);409self->state = Drillerdroid_State_Drilling;410}411else {412self->timer = 60;413self->state = Drillerdroid_State_Overheat;414}415}416}417418void Drillerdroid_State_PrepareJump(void)419{420RSDK_THIS(Drillerdroid);421422self->position.y += self->velocity.y;423Drillerdroid->drillPos[0] = self->startY - self->position.y;424Drillerdroid->drillPos[1] = self->startY - self->position.y;425426self->velocity.y -= 0x8000;427428Drillerdroid_CheckPlayerCollisions();429430if (self->velocity.y < 0) {431if (Drillerdroid->drillPos[0] >= 0x40000) {432self->timer = self->velocity.y;433Drillerdroid->drillPos[0] = 0x40000;434Drillerdroid->drillPos[1] = 0x40000;435self->state = Drillerdroid_State_Jumping;436}437}438}439440void Drillerdroid_State_Jumping(void)441{442RSDK_THIS(Drillerdroid);443444self->position.y += self->velocity.y;445self->velocity.y += 0x3800;446447Drillerdroid_CheckPlayerCollisions();448449if (self->velocity.y > 0) {450if (self->position.y >= (Zone->cameraBoundsB[0] - 96) << 16) {451self->position.y = (Zone->cameraBoundsB[0] - 96) << 16;452453RSDK.PlaySfx(Drillerdroid->sfxImpact, false, 255);454Camera_ShakeScreen(0, 0, 4);455456self->velocity.y >>= 1;457self->startY = self->position.y;458self->angle = 0;459460if (--Drillerdroid->jumpsRemaining) {461RSDK.PlaySfx(Drillerdroid->sfxJump, false, 255);462self->state = Drillerdroid_State_PrepareJump;463}464else {465RSDK.PlaySfx(Drillerdroid->sfxDrop, false, 255);466EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);467468EntityBuckwildBall *ball = CREATE_ENTITY(BuckwildBall, NULL, self->position.x, ScreenInfo->position.y << 16);469ball->startPos.x = 0;470471int32 ballSlot = 0;472if (Drillerdroid->arenaSegment) {473if (Drillerdroid->arenaSegment == 4 || player1->position.x < self->position.x) {474ball->position.x -= 0x800000;475ball->direction = FLIP_NONE;476ballSlot = Drillerdroid->arenaSegment - 1;477}478else {479ball->position.x += 0x800000;480ball->direction = FLIP_X;481ballSlot = Drillerdroid->arenaSegment + 1;482}483}484else {485ball->position.x += 0x800000;486ball->direction = FLIP_X;487ballSlot = Drillerdroid->arenaSegment + 1;488}489490ball->bossBallSlot = ballSlot;491ball->visible = true;492ball->active = ACTIVE_NORMAL;493ball->drawGroup = Zone->objectDrawGroup[0];494ball->respawn = false;495ball->timerSfx = 0;496RSDK.SetSpriteAnimation(BuckwildBall->aniFrames, 0, &ball->animator, true, 0);497498ball->state = BuckwildBall_State_Falling;499self->state = Drillerdroid_State_Landed;500}501}502}503}504505void Drillerdroid_State_Drilling(void)506{507RSDK_THIS(Drillerdroid);508509++Drillerdroid->drillSfxTimer;510RSDK.ProcessAnimation(&self->mainAnimator);511512for (int32 i = 0; i < 2; ++i) {513if (Drillerdroid->pistonDelay[i]) {514Drillerdroid->pistonDelay[i]--;515}516else if (Drillerdroid->pistonMoveDir[i]) {517Drillerdroid->pistonPos[i] -= 0x20000;518519if (!Drillerdroid->pistonPos[i]) {520Drillerdroid->pistonMoveDir[i] = FLIP_NONE;521Drillerdroid->pistonDelay[i] = 10;522}523}524else {525Drillerdroid->pistonPos[i] += 0x40000;526527if (Drillerdroid->pistonPos[i] == 0x100000)528Drillerdroid->pistonMoveDir[i] = FLIP_X;529}530531if (Drillerdroid->drillDelay[i]) {532Drillerdroid->drillDelay[i]--;533}534else if (Drillerdroid->drillMoveDir[i]) {535Drillerdroid->drillPos[i] -= 0x40000;536537if (!Drillerdroid->drillPos[i]) {538Drillerdroid->drillMoveDir[i] = FLIP_NONE;539Drillerdroid->drillDelay[i] = 5;540}541}542else {543Drillerdroid->drillPos[i] += 0x80000;544545if (Drillerdroid->drillPos[i] == 0x100000)546Drillerdroid->drillMoveDir[i] = FLIP_X;547}548}549550if (Drillerdroid->canBreakSegment) {551if (self->timer == 120) {552EntityLavaGeyser *geyser = CREATE_ENTITY(LavaGeyser, NULL, self->position.x, self->position.y + 0x580000);553geyser->duration = 60;554geyser->active = ACTIVE_NORMAL;555geyser->force = 56 << 12;556geyser->drawGroup = Zone->objectDrawGroup[1] - 1;557geyser->state = LavaGeyser_HandleSetup;558}559else if (self->timer < 60) {560if (self->alpha < 0x200)561self->alpha += 4;562}563}564else if (Drillerdroid->drillPos[0] == 0x80000) {565Drillerdroid_SpawnDebris(-0x300000);566Drillerdroid_SpawnDebris(0x300000);567}568else if (Drillerdroid->drillPos[1] == 0x80000) {569Drillerdroid_SpawnDebris(-0x190000);570Drillerdroid_SpawnDebris(0x190000);571}572573EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);574if (!camera->shakePos.y)575camera->shakePos.y = 4;576577if (!(Zone->timer & 7)) {578if (Zone->timer & 0xF) {579int32 x = (32 * RSDK.Rand(0, ScreenInfo->size.x >> 5) + ScreenInfo->position.x) << 16;580int32 y = (ScreenInfo->position.y + 24) << 16;581EntityDebris *debris = CREATE_ENTITY(Debris, Debris_State_Fall, x, y);582583RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 7, &debris->animator, true, RSDK.Rand(0, 4));584debris->gravityStrength = 0x1800;585debris->drawGroup = Zone->objectDrawGroup[0];586debris->updateRange.x = 0x400000;587debris->updateRange.y = 0x400000;588}589else {590int32 x = (48 * RSDK.Rand(0, ScreenInfo->size.x / 48) + Drillerdroid->stalactiteOffset + ScreenInfo->position.x) << 16;591int32 y = (ScreenInfo->position.y + 24) << 16;592EntityStalactite *stalactite = CREATE_ENTITY(Stalactite, Stalactite_State_Falling_Boss, x, y);593594stalactite->updateRange.x = 0x400000;595stalactite->updateRange.y = 0x400000;596}597}598599self->position.y ^= 0x10000;600Drillerdroid_CheckPlayerCollisions();601602if (--self->timer <= 0)603self->state = Drillerdroid_State_FinishDrilling;604}605606void Drillerdroid_State_FinishDrilling(void)607{608RSDK_THIS(Drillerdroid);609610Drillerdroid->pistonPos[0] -= 0x20000;611if (Drillerdroid->pistonPos[0] < 0)612Drillerdroid->pistonPos[0] = 0;613614Drillerdroid->pistonPos[1] -= 0x20000;615if (Drillerdroid->pistonPos[1] < 0)616Drillerdroid->pistonPos[1] = 0;617618Drillerdroid->drillPos[0] -= 0x20000;619if (Drillerdroid->drillPos[0] < 0)620Drillerdroid->drillPos[0] = 0;621622Drillerdroid->drillPos[1] -= 0x20000;623if (Drillerdroid->drillPos[1] < 0)624Drillerdroid->drillPos[1] = 0;625626if (!Drillerdroid->pistonPos[0] && !Drillerdroid->pistonPos[1] && !Drillerdroid->drillPos[0] && !Drillerdroid->drillPos[1]) {627self->timer = 60;628self->state = Drillerdroid_State_Overheat;629}630}631632void Drillerdroid_State_Overheat(void)633{634RSDK_THIS(Drillerdroid);635636if (--self->timer <= 0) {637if (Drillerdroid->canBreakSegment) {638Drillerdroid->canBreakSegment = false;639RSDK.PlaySfx(Drillerdroid->sfxSizzle, false, 255);640641EntityDebris *debris = NULL;642switch (Drillerdroid->armorHealth) {643default: break;644645case 0:646self->state = Drillerdroid_State_OverheatRecoil_DestroyedSegment;647Drillerdroid_Hit();648break;649650case 1: {651debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x, self->position.y);652RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 6);653debris->velocity.x = -0x10000;654debris->velocity.y = -0x30000;655debris->gravityStrength = 0x3800;656debris->drawGroup = Zone->objectDrawGroup[1];657debris->updateRange.x = 0x400000;658debris->updateRange.y = 0x400000;659660debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x, self->position.y);661RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 6);662debris->direction = FLIP_X;663debris->drawFX = FX_FLIP;664debris->velocity.x = 0x10000;665debris->velocity.y = -0x30000;666debris->gravityStrength = 0x3800;667debris->drawGroup = Zone->objectDrawGroup[1];668debris->updateRange.x = 0x400000;669debris->updateRange.y = 0x400000;670671int32 spawnX = self->position.x - 0x300000;672debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, spawnX, self->position.y);673RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 7);674debris->velocity.x = -0x30000;675debris->velocity.y = -0x40000;676debris->gravityStrength = 0x3800;677debris->drawGroup = Zone->objectDrawGroup[1];678debris->updateRange.x = 0x400000;679debris->updateRange.y = 0x400000;680681spawnX += 0xD0000;682debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, spawnX, self->position.y);683RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 7);684debris->velocity.x = 0x20000;685debris->velocity.y = -0x40000;686debris->gravityStrength = 0x3800;687debris->drawGroup = Zone->objectDrawGroup[1];688debris->updateRange.x = 0x400000;689debris->updateRange.y = 0x400000;690691spawnX += 0x530000;692debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, spawnX, self->position.y);693RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 7);694debris->velocity.x = 0x30000;695debris->velocity.y = -0x40000;696debris->gravityStrength = 0x3800;697debris->drawGroup = Zone->objectDrawGroup[1];698debris->updateRange.x = 0x400000;699debris->updateRange.y = 0x400000;700701debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, spawnX - 851968, self->position.y);702RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 7);703debris->velocity.x = -0x20000;704debris->velocity.y = -0x40000;705debris->gravityStrength = 0x3800;706debris->drawGroup = Zone->objectDrawGroup[1];707debris->updateRange.x = 0x400000;708debris->updateRange.y = 0x400000;709break;710}711712case 2:713debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x, self->position.y);714RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 4);715debris->velocity.x = -0x10000;716debris->velocity.y = -0x40000;717debris->gravityStrength = 0x3800;718debris->drawGroup = Zone->objectDrawGroup[1];719debris->updateRange.x = 0x300000;720debris->updateRange.y = 0x300000;721722debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x, self->position.y);723RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 5);724debris->velocity.x = 0x10000;725debris->velocity.y = -0x40000;726debris->gravityStrength = 0x3800;727debris->drawGroup = Zone->objectDrawGroup[1];728debris->updateRange.x = 0x300000;729debris->updateRange.y = 0x300000;730break;731}732733if (Drillerdroid->armorHealth > 0) {734RSDK.PlaySfx(Drillerdroid->sfxHit, false, 255);735self->invincibilityTimer = 45;736--Drillerdroid->armorHealth;737self->state = Drillerdroid_State_OverheatRecoil_DestroyedSegment;738}739740}741else {742self->state = Drillerdroid_State_OverheatRecoil;743}744}745746Drillerdroid_CheckPlayerCollisions();747}748749void Drillerdroid_State_OverheatRecoil(void)750{751RSDK_THIS(Drillerdroid);752753Drillerdroid->drillPos[0] += 0x10000;754Drillerdroid->drillPos[1] += 0x10000;755756self->position.y -= 0x10000;757758Drillerdroid_CheckPlayerCollisions();759760if (Drillerdroid->drillPos[0] == 0x100000) {761self->timer = 15;762self->state = Drillerdroid_State_JumpTargetDelay;763}764}765766void Drillerdroid_State_JumpTargetDelay(void)767{768RSDK_THIS(Drillerdroid);769770Drillerdroid_CheckPlayerCollisions();771772if (--self->timer <= 0) {773self->velocity.y = 0x78000;774RSDK.PlaySfx(Drillerdroid->sfxJump, false, 0xFF);775self->state = Drillerdroid_State_PrepareJumpTarget;776}777}778779void Drillerdroid_State_PrepareJumpTarget(void)780{781RSDK_THIS(Drillerdroid);782783self->position.y += self->velocity.y;784self->velocity.y -= 0x1C000;785786Drillerdroid->drillPos[0] = self->startY - self->position.y;787Drillerdroid->drillPos[1] = self->startY - self->position.y;788789Drillerdroid_CheckPlayerCollisions();790791if (self->velocity.y < 0) {792if (Drillerdroid->drillPos[0] >= 0x100000) {793Drillerdroid->drillPos[0] = 0x100000;794Drillerdroid->drillPos[1] = 0x100000;795self->state = Drillerdroid_State_JumpTargeting;796}797}798}799800void Drillerdroid_State_JumpTargeting(void)801{802RSDK_THIS(Drillerdroid);803804self->position.y += self->velocity.y;805self->velocity.y += 0x3800;806807if (self->velocity.y >= 0) {808Drillerdroid->pistonPos[0] = 0;809Drillerdroid->pistonPos[1] = 0;810811Drillerdroid->drillPos[0] = 0x100000;812Drillerdroid->drillPos[1] = 0x100000;813814Drillerdroid->pistonDelay[0] = 4;815Drillerdroid->pistonDelay[1] = 0;816817Drillerdroid->drillDelay[0] = 4;818Drillerdroid->drillDelay[1] = 0;819820Drillerdroid->pistonMoveDir[0] = FLIP_NONE;821Drillerdroid->pistonMoveDir[1] = FLIP_NONE;822823Drillerdroid->drillMoveDir[0] = FLIP_NONE;824Drillerdroid->drillMoveDir[1] = FLIP_NONE;825826self->position.x = 0;827828EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);829CREATE_ENTITY(Drillerdroid, INT_TO_VOID(DRILLERDROID_TARGET), player1->position.x, player1->position.y)->target = player1;830RSDK.PlaySfx(Drillerdroid->sfxTargeting, false, 255);831self->state = Drillerdroid_State_DecidingDropPos;832}833}834835void Drillerdroid_State_DecidingDropPos(void)836{837RSDK_THIS(Drillerdroid);838839if (self->position.x) {840self->timer = 240;841self->velocity.y = -0x40000;842self->state = Drillerdroid_State_Dropping;843self->position.x = (RSDK_GET_ENTITY(SLOT_PLAYER1, Player)->position.x + 0x400000) & 0xFF800000;844845bool32 failed = self->position.x < Zone->cameraBoundsL[0] << 16 || self->position.x > Zone->cameraBoundsR[0] << 16;846bool32 platformActive = false;847if (!failed) {848Drillerdroid->arenaSegment = (((self->position.x >> 16) - Zone->cameraBoundsL[0] + 64) >> 7) - 1;849platformActive = Drillerdroid->platformActive[Drillerdroid->arenaSegment];850failed = platformActive == 0xFF;851}852853if (failed) {854self->position.x = 0;855RSDK.PlaySfx(Drillerdroid->sfxFail, false, 255);856RSDK.StopSfx(Drillerdroid->sfxTargeting);857self->timer = 60;858self->state = Drillerdroid_State_DropFailReset;859}860else if (platformActive) {861EntityLRZRockPile *rocks = RSDK_GET_ENTITY(SceneInfo->entitySlot + 1 + Drillerdroid->arenaSegment, LRZRockPile);862rocks->active = ACTIVE_NORMAL;863rocks->timer = 120;864rocks->canCollapse = true;865Drillerdroid->canBreakSegment = true;866Drillerdroid->platformActive[Drillerdroid->arenaSegment] = false;867}868}869}870871void Drillerdroid_State_DropFailReset(void)872{873RSDK_THIS(Drillerdroid);874875if (--self->timer <= 0) {876EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);877CREATE_ENTITY(Drillerdroid, INT_TO_VOID(DRILLERDROID_TARGET), player1->position.x, player1->position.y)->target = player1;878RSDK.PlaySfx(Drillerdroid->sfxTargeting, false, 255);879self->state = Drillerdroid_State_DecidingDropPos;880}881}882883void Drillerdroid_State_OverheatRecoil_DestroyedSegment(void)884{885RSDK_THIS(Drillerdroid);886887// Leftover from DrillerdroilO888++self->rotation;889890Drillerdroid->drillPos[0] += 0x4000;891Drillerdroid->drillPos[1] += 0x4000;892893Drillerdroid->pistonPos[0] += 0x4000;894Drillerdroid->pistonPos[1] += 0x4000;895896self->position.y -= 0x4000;897898Drillerdroid_CheckPlayerCollisions();899900if (Drillerdroid->drillPos[0] == 0x100000) {901self->timer = 90;902self->state = Drillerdroid_State_Cooldown;903}904}905906void Drillerdroid_State_Cooldown(void)907{908RSDK_THIS(Drillerdroid);909910Drillerdroid_CheckPlayerCollisions();911912self->alpha -= 8;913if (self->alpha <= 0) {914self->alpha = 0;915self->state = Drillerdroid_State_ResetFromCooldown;916}917}918919void Drillerdroid_State_ResetFromCooldown(void)920{921RSDK_THIS(Drillerdroid);922923// Leftover from DrillerdroilO924self->rotation -= 4;925926Drillerdroid->pistonPos[0] -= 0x10000;927Drillerdroid->pistonPos[1] -= 0x10000;928929Drillerdroid_CheckPlayerCollisions();930931if (!Drillerdroid->pistonPos[0]) {932self->timer = 30;933self->state = Drillerdroid_State_JumpTargetDelay;934}935}936937void Drillerdroid_State_Destroyed(void)938{939RSDK_THIS(Drillerdroid);940941Drillerdroid_Explode();942943if (!--self->invincibilityTimer) {944EntityDebris *debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x - 0x300000, self->position.y);945RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 0, &debris->animator, true, 1);946debris->velocity.x = RSDK.Rand(-6, 6) << 15;947debris->velocity.y = RSDK.Rand(-10, -6) << 15;948debris->gravityStrength = 0x3800;949debris->drawGroup = Zone->objectDrawGroup[1];950debris->updateRange.x = 0x400000;951debris->updateRange.y = 0x400000;952953debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x - 0x300000, self->position.y);954RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 0, &debris->animator, true, 2);955debris->velocity.x = RSDK.Rand(-6, 6) << 15;956debris->velocity.y = RSDK.Rand(0, 2) << 15;957debris->gravityStrength = 0x3800;958debris->drawGroup = Zone->objectDrawGroup[1];959debris->updateRange.x = 0x400000;960debris->updateRange.y = 0x400000;961962debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x - 0x230000, self->position.y);963RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 0, &debris->animator, true, 1);964debris->velocity.x = RSDK.Rand(-6, 6) << 15;965debris->velocity.y = RSDK.Rand(-10, -6) << 15;966debris->gravityStrength = 0x3800;967debris->drawGroup = Zone->objectDrawGroup[1];968debris->updateRange.x = 0x400000;969debris->updateRange.y = 0x400000;970971debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x - 0x230000, self->position.y);972RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 0, &debris->animator, true, 2);973debris->velocity.x = RSDK.Rand(-6, 6) << 15;974debris->velocity.y = RSDK.Rand(0, 2) << 15;975debris->gravityStrength = 0x3800;976debris->drawGroup = Zone->objectDrawGroup[1];977debris->updateRange.x = 0x400000;978debris->updateRange.y = 0x400000;979980debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x + 0x300000, self->position.y);981RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 0, &debris->animator, true, 1);982debris->velocity.x = RSDK.Rand(-6, 6) << 15;983debris->velocity.y = RSDK.Rand(-10, -6) << 15;984debris->gravityStrength = 0x3800;985debris->drawGroup = Zone->objectDrawGroup[1];986debris->updateRange.x = 0x400000;987debris->updateRange.y = 0x400000;988989debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x + 0x300000, self->position.y);990RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 0, &debris->animator, true, 2);991debris->velocity.x = RSDK.Rand(-6, 6) << 15;992debris->velocity.y = RSDK.Rand(0, 2) << 15;993debris->gravityStrength = 0x3800;994debris->drawGroup = Zone->objectDrawGroup[1];995debris->updateRange.x = 0x400000;996debris->updateRange.y = 0x400000;997998debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x + 0x230000, self->position.y);999RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 0, &debris->animator, true, 1);1000debris->velocity.x = RSDK.Rand(-6, 6) << 15;1001debris->velocity.y = RSDK.Rand(-10, -6) << 15;1002debris->gravityStrength = 0x3800;1003debris->drawGroup = Zone->objectDrawGroup[1];1004debris->updateRange.x = 0x400000;1005debris->updateRange.y = 0x400000;10061007debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x + 0x230000, self->position.y);1008RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 0, &debris->animator, true, 2);1009debris->velocity.x = RSDK.Rand(-6, 6) << 15;1010debris->velocity.y = RSDK.Rand(0, 2) << 15;1011debris->gravityStrength = 0x3800;1012debris->drawGroup = Zone->objectDrawGroup[1];1013debris->updateRange.x = 0x400000;1014debris->updateRange.y = 0x400000;10151016debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x, self->position.y);1017RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 0, &debris->animator, true, 3);1018debris->velocity.x = RSDK.Rand(-6, 6) << 15;1019debris->velocity.y = RSDK.Rand(-10, -6) << 15;1020debris->gravityStrength = 0x3800;1021debris->drawGroup = Zone->objectDrawGroup[1];1022debris->updateRange.x = 0x400000;1023debris->updateRange.y = 0x400000;10241025debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x, self->position.y);1026RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 0, &debris->animator, true, 5);1027debris->velocity.x = RSDK.Rand(-6, 6) << 15;1028debris->velocity.y = RSDK.Rand(-10, -6) << 15;1029debris->gravityStrength = 0x3800;1030debris->drawGroup = Zone->objectDrawGroup[1];1031debris->updateRange.x = 0x400000;1032debris->updateRange.y = 0x400000;10331034if (Drillerdroid->armorHealth == 1) {1035debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x, self->position.y);1036RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 6);1037debris->velocity.x = RSDK.Rand(-6, 6) << 15;1038debris->velocity.y = RSDK.Rand(-10, -6) << 15;1039debris->gravityStrength = 0x3800;1040debris->drawGroup = Zone->objectDrawGroup[1];1041debris->updateRange.x = 0x400000;1042debris->updateRange.y = 0x400000;10431044debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, self->position.x, self->position.y);1045RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 6);1046debris->direction = FLIP_X;1047debris->drawFX = FX_FLIP;1048debris->velocity.x = RSDK.Rand(-6, 6) << 15;1049debris->velocity.y = RSDK.Rand(-10, -6) << 15;1050debris->gravityStrength = 14336;1051debris->drawGroup = Zone->objectDrawGroup[1];1052debris->updateRange.x = 0x400000;1053debris->updateRange.y = 0x400000;10541055int32 spawnX = self->position.x - 0x300000;1056debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, spawnX, self->position.y);1057RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 7);1058debris->velocity.x = RSDK.Rand(-6, 6) << 15;1059debris->velocity.y = RSDK.Rand(-10, -6) << 15;1060debris->gravityStrength = 0x3800;1061debris->drawGroup = Zone->objectDrawGroup[1];1062debris->updateRange.x = 0x400000;1063debris->updateRange.y = 0x400000;10641065spawnX += 0xD0000;1066debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, spawnX, self->position.y);1067RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 7);1068debris->velocity.x = RSDK.Rand(-6, 6) << 15;1069debris->velocity.y = RSDK.Rand(-10, -6) << 15;1070debris->gravityStrength = 0x3800;1071debris->drawGroup = Zone->objectDrawGroup[1];1072debris->updateRange.x = 0x400000;1073debris->updateRange.y = 0x400000;10741075spawnX += 0x530000;1076debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, spawnX, self->position.y);1077RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 7);1078debris->velocity.x = RSDK.Rand(-6, 6) << 15;1079debris->velocity.y = RSDK.Rand(-10, -6) << 15;1080debris->gravityStrength = 0x3800;1081debris->drawGroup = Zone->objectDrawGroup[1];1082debris->updateRange.x = 0x400000;1083debris->updateRange.y = 0x400000;10841085debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, spawnX - 851968, self->position.y);1086RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &debris->animator, true, 7);1087debris->velocity.x = RSDK.Rand(-6, 6) << 15;1088debris->velocity.y = RSDK.Rand(-10, -6) << 15;1089debris->gravityStrength = 0x3800;1090debris->drawGroup = Zone->objectDrawGroup[1];1091debris->updateRange.x = 0x400000;1092debris->updateRange.y = 0x400000;1093}10941095self->velocity.x = RSDK.Rand(-6, 6) << 15;1096self->velocity.y = RSDK.Rand(-10, -6) << 15;1097self->mainAnimator.frameID = 4;1098self->stateDraw = Drillerdroid_Draw_Simple;1099self->state = Drillerdroid_State_Finish;11001101foreach_active(SignPost, signPost) { signPost->position.x = self->position.x; }1102}1103}11041105void Drillerdroid_State_Finish(void)1106{1107RSDK_THIS(Drillerdroid);11081109self->position.x += self->velocity.x;1110self->position.y += self->velocity.y;1111self->velocity.y += 0x3800;11121113self->visible ^= true;11141115Drillerdroid_Explode();11161117if (!RSDK.CheckOnScreen(self, NULL)) {1118Music_TransitionTrack(TRACK_STAGE, 0.0125);1119self->timer = 0;1120self->state = Drillerdroid_State_DropSignPost;1121}1122}11231124void Drillerdroid_State_DropSignPost(void)1125{1126RSDK_THIS(Drillerdroid);11271128if (++self->timer == 60) {1129foreach_all(SignPost, signPost)1130{1131signPost->active = ACTIVE_NORMAL;1132signPost->state = SignPost_State_Falling;1133RSDK.PlaySfx(SignPost->sfxTwinkle, false, 255);1134}11351136LRZ1Setup->fadeTimer = 1;1137destroyEntity(self);1138}1139}11401141void Drillerdroid_Draw_Boss(void)1142{1143RSDK_THIS(Drillerdroid);11441145RSDK.SetLimitedFade(0, 1, 2, self->alpha, 32, 41);11461147if (self->invincibilityTimer & 1) {1148RSDK.SetPaletteEntry(0, 32, 0xE0E0E0);1149RSDK.SetPaletteEntry(0, 128, 0xE0E0E0);1150}11511152// Piston (L1)1153self->mainAnimator.frameID = 1;1154Vector2 drawPos;1155drawPos.x = self->position.x - 0x300000;1156drawPos.y = self->position.y - Drillerdroid->pistonPos[0];1157RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);11581159// Drill (L1)1160self->mainAnimator.frameID = 2;1161drawPos.y = self->position.y + Drillerdroid->drillPos[0];1162RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);11631164// Piston (L2)1165self->mainAnimator.frameID = 1;1166drawPos.x += 0xD0000;1167drawPos.y = self->position.y - Drillerdroid->pistonPos[1];1168RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);11691170// Drill (L2)1171self->mainAnimator.frameID = 2;1172drawPos.y = self->position.y + Drillerdroid->drillPos[1];1173RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);11741175// Piston (R1)1176self->mainAnimator.frameID = 1;1177drawPos.x += 0x530000;1178drawPos.y = self->position.y - Drillerdroid->pistonPos[0];1179RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);11801181// Drill (R1)1182self->mainAnimator.frameID = 2;1183drawPos.y = self->position.y + Drillerdroid->drillPos[0];1184RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);11851186// Piston (R2)1187self->mainAnimator.frameID = 1;1188drawPos.x -= 0xD0000;1189drawPos.y = self->position.y - Drillerdroid->pistonPos[1];1190RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);11911192// Drill (R2)1193self->mainAnimator.frameID = 2;1194drawPos.y = self->position.y + Drillerdroid->drillPos[1];1195RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);11961197// Main Body1198self->mainAnimator.frameID = 0;1199RSDK.DrawSprite(&self->mainAnimator, NULL, false);12001201switch (Drillerdroid->armorHealth) {1202default:1203case 0: break;12041205case 1:1206// Drill (L) Armor1207drawPos = self->position;1208self->armorAnimator.frameID = 6;1209RSDK.DrawSprite(&self->armorAnimator, NULL, false);12101211// Drill (R) Armor1212self->drawFX |= FX_FLIP;1213self->direction = FLIP_X;1214RSDK.DrawSprite(&self->armorAnimator, NULL, false);12151216self->direction = FLIP_NONE;1217self->drawFX = FX_NONE;1218self->armorAnimator.frameID = 7;12191220// Piston (L1) Armor1221drawPos.x -= 0x300000;1222drawPos.y -= Drillerdroid->pistonPos[0];1223RSDK.DrawSprite(&self->armorAnimator, &drawPos, false);12241225// Piston (L2) Armor1226drawPos.x += 0xD0000;1227drawPos.y = self->position.y - Drillerdroid->pistonPos[1];1228RSDK.DrawSprite(&self->armorAnimator, &drawPos, false);12291230// Piston (R1) Armor1231drawPos.x += 0x530000;1232drawPos.y = self->position.y - Drillerdroid->pistonPos[0];1233RSDK.DrawSprite(&self->armorAnimator, &drawPos, false);12341235// Piston (R2) Armor1236drawPos.x -= 0xD0000;1237drawPos.y = self->position.y - Drillerdroid->pistonPos[1];1238RSDK.DrawSprite(&self->armorAnimator, &drawPos, false);1239break;12401241case 2:1242// Core Armor (L)1243drawPos.x = self->position.x + 0x10000;1244drawPos.y = self->position.y - 0x140000;1245self->armorAnimator.frameID = 4;1246RSDK.DrawSprite(&self->armorAnimator, &drawPos, false);12471248self->armorAnimator.frameID = 5;1249//[Fallthrough]12501251case 3:1252if (Drillerdroid->armorHealth == 3) {1253// Core Armor (R)1254drawPos.x = self->position.x + 0x10000;1255drawPos.y = self->position.y - 0x140000;1256self->armorAnimator.frameID = 0;1257RSDK.DrawSprite(&self->armorAnimator, &drawPos, false);12581259self->armorAnimator.frameID = 1;1260}12611262// Core Armor (R)1263RSDK.DrawSprite(&self->armorAnimator, &drawPos, false);12641265// Drill (L) Armor1266drawPos = self->position;1267self->armorAnimator.frameID = 2;1268RSDK.DrawSprite(&self->armorAnimator, NULL, false);12691270// Drill (R) Armor1271self->drawFX |= FX_FLIP;1272self->direction = FLIP_X;1273RSDK.DrawSprite(&self->armorAnimator, NULL, false);12741275self->direction = FLIP_NONE;1276self->drawFX = FX_NONE;1277self->armorAnimator.frameID = 3;12781279// Piston (L1) Armor1280drawPos.x -= 0x300000;1281drawPos.y = self->position.y - Drillerdroid->pistonPos[0];1282RSDK.DrawSprite(&self->armorAnimator, &drawPos, false);12831284// Piston (L2) Armor1285drawPos.x += 0xD0000;1286drawPos.y = self->position.y - Drillerdroid->pistonPos[1];1287RSDK.DrawSprite(&self->armorAnimator, &drawPos, false);12881289// Piston (R1) Armor1290drawPos.x += 0x530000;1291drawPos.y = self->position.y - Drillerdroid->pistonPos[0];1292RSDK.DrawSprite(&self->armorAnimator, &drawPos, false);12931294// Piston (R2) Armor1295drawPos.x -= 0xD0000;1296drawPos.y = self->position.y - Drillerdroid->pistonPos[1];1297RSDK.DrawSprite(&self->armorAnimator, &drawPos, false);1298break;1299}13001301RSDK.CopyPalette(1, 32, 0, 32, 10);1302RSDK.SetPaletteEntry(0, 32, 0x282028);1303RSDK.SetPaletteEntry(0, 128, 0x000000);1304}13051306void Drillerdroid_Draw_Simple(void)1307{1308RSDK_THIS(Drillerdroid);13091310RSDK.DrawSprite(&self->mainAnimator, NULL, false);1311}13121313void Drillerdroid_State_Target(void)1314{1315RSDK_THIS(Drillerdroid);13161317RSDK.ProcessAnimation(&self->armorAnimator);1318RSDK.ProcessAnimation(&self->targetLockAnimator);13191320if (self->target) {1321self->position.x = self->target->position.x;1322self->position.y = self->target->position.y;1323}13241325self->alpha += 0x20;1326self->targetEdgeOffset.x -= 0x20000;1327if (self->targetEdgeOffset.x <= 0xC0000) {1328self->alpha = 0;1329self->targetEdgeOffset.x = 0x2C0000;1330}13311332self->targetEdgeOffset.y = self->targetEdgeOffset.x;1333if (++self->timer == 60)1334RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 4, &self->targetLockAnimator, true, 0);13351336if (self->timer == 96) {1337self->target = NULL;1338Drillerdroid->boss->position.x = self->position.x;13391340if (self->position.x < (Zone->cameraBoundsL[0] + 64) << 16 || self->position.x > (Zone->cameraBoundsR[0] - 64) << 16)1341Drillerdroid->boss->position.x = (Zone->cameraBoundsL[0] + 64) << 16;1342else if (self->position.x > (Zone->cameraBoundsR[0] - 64) << 16)1343Drillerdroid->boss->position.x = (Zone->cameraBoundsR[0] - 64) << 16;1344}13451346if (self->timer == 128)1347destroyEntity(self);1348}13491350void Drillerdroid_Draw_Target(void)1351{1352RSDK_THIS(Drillerdroid);13531354int32 x = ((self->position.x + 0x400000) & 0xFF800000) - 0x400000;1355if (!(Zone->timer & 8)) {1356RSDK.DrawLine(x + 0x10000, self->position.y, x + 0x7F0000, self->position.y, 0xE0E0E0, 192, INK_ADD, false);1357RSDK.DrawLine(x, self->position.y - 0x80000, x, self->position.y + 0x80000, 0xE0E0E0, 160, INK_ADD, false);1358RSDK.DrawLine(x + 0x800000, self->position.y - 0x80000, x + 0x800000, self->position.y + 0x80000, 0xE0E0E0, 160, INK_ADD, false);1359}13601361// Top-Left Edge1362self->mainAnimator.frameID = 0;1363self->inkEffect = INK_ALPHA;1364self->direction = FLIP_NONE;1365Vector2 drawPos;1366drawPos.x = self->position.x - self->targetEdgeOffset.x;1367drawPos.y = self->position.y - self->targetEdgeOffset.y;1368RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);13691370// Top-Right Edge1371self->direction = FLIP_X;1372drawPos.x = self->position.x + self->targetEdgeOffset.x;1373drawPos.y = self->position.y - self->targetEdgeOffset.y;1374RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);13751376// Bottom-Left Edge1377self->mainAnimator.frameID = 1;1378self->direction = FLIP_NONE;1379drawPos.x = self->position.x - self->targetEdgeOffset.x;1380drawPos.y = self->position.y + self->targetEdgeOffset.y;1381RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);13821383// Bottom-Right Edge1384self->direction = FLIP_X;1385drawPos.x = self->position.x + self->targetEdgeOffset.x;1386drawPos.y = self->position.y + self->targetEdgeOffset.y;1387RSDK.DrawSprite(&self->mainAnimator, &drawPos, false);13881389// Target Reticle1390self->inkEffect = INK_NONE;1391self->direction = FLIP_NONE;1392RSDK.DrawSprite(&self->armorAnimator, NULL, false);1393RSDK.DrawSprite(&self->targetLockAnimator, NULL, false);1394}13951396#if GAME_INCLUDE_EDITOR1397void Drillerdroid_EditorDraw(void)1398{1399RSDK_THIS(Drillerdroid);14001401Drillerdroid->pistonPos[0] = 0;1402Drillerdroid->pistonPos[1] = 0;14031404Drillerdroid->drillPos[0] = 0x100000;1405Drillerdroid->drillPos[1] = 0x100000;14061407self->drawFX = FX_NONE;1408RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 0, &self->mainAnimator, true, 0);1409RSDK.SetSpriteAnimation(Drillerdroid->aniFrames, 5, &self->armorAnimator, true, 0);14101411Drillerdroid_Draw_Boss();14121413if (showGizmos()) {1414RSDK_DRAWING_OVERLAY(true);14151416DrawHelpers_DrawArenaBounds(-328, -SCREEN_YSIZE, 324, 96, 1 | 2 | 4 | 8, 0x00C0F0);14171418if (CollapsingPlatform) {1419int32 slot = SceneInfo->entitySlot + 1;1420for (int32 s = 0; s < 5; ++s) {1421EntityCollapsingPlatform *platform = RSDK_GET_ENTITY(slot++, CollapsingPlatform);14221423if (platform && platform->classID == CollapsingPlatform->classID)1424DrawHelpers_DrawArrow(self->position.x, self->position.y, platform->position.x, platform->position.y, 0xFFFF00, INK_NONE, 0xFF);1425}1426}14271428RSDK_DRAWING_OVERLAY(false);1429}1430}14311432void Drillerdroid_EditorLoad(void)1433{1434Drillerdroid->aniFrames = RSDK.LoadSpriteAnimation("LRZ1/Drillerdroid.bin", SCOPE_STAGE);1435Drillerdroid->ticFrames = RSDK.LoadSpriteAnimation("Global/TicMark.bin", SCOPE_STAGE);14361437RSDK_ACTIVE_VAR(Drillerdroid, type);1438RSDK_ENUM_VAR("Drillerdroid", DRILLERDROID_MAIN);1439}1440#endif14411442void Drillerdroid_Serialize(void) { RSDK_EDITABLE_VAR(Drillerdroid, VAR_UINT8, type); }144314441445