Path: blob/master/SonicMania/Objects/OOZ/MeterDroid.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: MeterDroid Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectMeterDroid *MeterDroid;1011void MeterDroid_Update(void)12{13RSDK_THIS(MeterDroid);1415if (self->invincibilityTimer > 0)16self->invincibilityTimer--;1718StateMachine_Run(self->state);19}2021void MeterDroid_LateUpdate(void) {}2223void MeterDroid_StaticUpdate(void) {}2425void MeterDroid_Draw(void)26{27RSDK_THIS(MeterDroid);2829if (self->bgFadeAmount > 0)30RSDK.SetLimitedFade(0, 1, 3, self->bgFadeAmount, 32, 47);31else if (self->invincibilityTimer & 1)32RSDK.CopyPalette(2, 32, 0, 32, 16);3334if (self->stateDraw) {35StateMachine_Run(self->stateDraw);36}37else {38RSDK.DrawSprite(&self->mainAnimator, NULL, false);39}4041if (self->bgFadeAmount > 0 || (self->invincibilityTimer & 1))42RSDK.CopyPalette(1, 32, 0, 32, 16);43}4445void MeterDroid_Create(void *data)46{47RSDK_THIS(MeterDroid);4849if (!SceneInfo->inEditor) {50if (globals->gameMode == MODE_TIMEATTACK) {51destroyEntity(self);52}53else {54self->origin = self->position;55self->active = ACTIVE_BOUNDS;56self->updateRange.x = 0x800000;57self->updateRange.y = 0x800000;58self->health = 6;59self->drawGroup = Zone->objectDrawGroup[0];60self->state = MeterDroid_State_Init;6162RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 1, &self->mainAnimator, true, 0);63RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 8, &self->propellorAnimator, true, 0);64}65}66}6768void MeterDroid_StageLoad(void)69{70MeterDroid->aniFrames = RSDK.LoadSpriteAnimation("OOZ/MeterDroid.bin", SCOPE_STAGE);7172MeterDroid->hitboxBoss.left = -14;73MeterDroid->hitboxBoss.top = -14;74MeterDroid->hitboxBoss.right = 14;75MeterDroid->hitboxBoss.bottom = 14;7677MeterDroid->hitboxPropellor.left = 14;78MeterDroid->hitboxPropellor.top = -12;79MeterDroid->hitboxPropellor.right = 32;80MeterDroid->hitboxPropellor.bottom = 12;8182MeterDroid->hitboxWrench.left = -14;83MeterDroid->hitboxWrench.top = -14;84MeterDroid->hitboxWrench.right = 14;85MeterDroid->hitboxWrench.bottom = 14;8687MeterDroid->sfxHit = RSDK.GetSfx("Stage/BossHit.wav");88MeterDroid->sfxExplosion = RSDK.GetSfx("Stage/Explosion2.wav");89MeterDroid->sfxDestroy = RSDK.GetSfx("Global/Destroy.wav");90MeterDroid->sfxToss = RSDK.GetSfx("OOZ/Toss.wav");91MeterDroid->sfxGrab = RSDK.GetSfx("Global/Grab.wav");92MeterDroid->sfxValve = RSDK.GetSfx("OOZ/Valve.wav");93MeterDroid->sfxWrench = RSDK.GetSfx("OOZ/Wrench.wav");94}9596void MeterDroid_CheckPlayerCollisions_NoWrench_UseFlip(void)97{98RSDK_THIS(MeterDroid);99100foreach_active(Player, player)101{102if (!self->invincibilityTimer) {103if (Player_CheckBadnikTouch(player, self, &MeterDroid->hitboxBoss) && Player_CheckBossHit(player, self)) {104MeterDroid_Hit();105}106107if (!self->invincibilityTimer) {108if (Player_CheckCollisionTouch(player, self, &MeterDroid->hitboxPropellor)) {109#if MANIA_USE_PLUS110if (!Player_CheckMightyUnspin(player, 0x400, false, &player->uncurlTimer))111#endif112Player_Hurt(player, self);113}114}115}116}117118self->direction = RSDK_GET_ENTITY(SLOT_PLAYER1, Player)->position.x >= self->position.x;119}120121void MeterDroid_CheckPlayerCollisions_Wrench_NoFlip(void)122{123RSDK_THIS(MeterDroid);124125foreach_active(Player, player)126{127int32 storeX = self->position.x;128int32 storeY = self->position.y;129130if (!self->invincibilityTimer) {131if (Player_CheckBadnikTouch(player, self, &MeterDroid->hitboxBoss) && Player_CheckBossHit(player, self)) {132MeterDroid_Hit();133}134135if (!self->invincibilityTimer) {136if (Player_CheckCollisionTouch(player, self, &MeterDroid->hitboxPropellor)) {137#if MANIA_USE_PLUS138if (!Player_CheckMightyUnspin(player, 0x400, false, &player->uncurlTimer))139#endif140Player_Hurt(player, self);141}142}143}144145self->position.x = self->wrenchPos.x;146self->position.y = self->wrenchPos.y;147148if (Player_CheckCollisionTouch(player, self, &MeterDroid->hitboxWrench)) {149#if MANIA_USE_PLUS150if (!Player_CheckMightyUnspin(player, 0x600, false, &player->uncurlTimer))151#endif152Player_Hurt(player, self);153}154155self->position.x = storeX;156self->position.y = storeY;157}158}159160void MeterDroid_CheckPlayerCollisions_NoWrench_NoFlip(void)161{162RSDK_THIS(MeterDroid);163164foreach_active(Player, player)165{166if (!self->invincibilityTimer) {167if (Player_CheckBadnikTouch(player, self, &MeterDroid->hitboxBoss) && Player_CheckBossHit(player, self)) {168MeterDroid_Hit();169}170171if (!self->invincibilityTimer) {172if (Player_CheckCollisionTouch(player, self, &MeterDroid->hitboxPropellor)) {173#if MANIA_USE_PLUS174if (!Player_CheckMightyUnspin(player, 0x400, false, &player->uncurlTimer))175#endif176Player_Hurt(player, self);177}178}179}180}181}182183void MeterDroid_Hit(void)184{185RSDK_THIS(MeterDroid);186187if (--self->health <= 0) {188self->state = MeterDroid_State_Destroyed;189self->timer = 0;190191if (self->stateDraw == MeterDroid_Draw_ThrownWrench) {192int32 x = RSDK.Rand(MeterDroid->hitboxBoss.left, MeterDroid->hitboxBoss.right) << 16;193int32 y = RSDK.Rand(MeterDroid->hitboxBoss.top, MeterDroid->hitboxBoss.bottom) << 16;194195CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_BOSS), x + self->wrenchPos.x, y + self->wrenchPos.y)->drawGroup = Zone->objectDrawGroup[1];196self->stateDraw = MeterDroid_Draw_Normal;197}198199SceneInfo->timeEnabled = false;200Player_GiveScore(RSDK_GET_ENTITY(SLOT_PLAYER1, Player), 1000);201}202else {203self->invincibilityTimer = 48;204RSDK.PlaySfx(MeterDroid->sfxHit, false, 0xFF);205}206}207208void MeterDroid_Explode(void)209{210RSDK_THIS(MeterDroid);211212if (!(Zone->timer % 3)) {213if (self->state == MeterDroid_State_FinishAct) {214if (self->timer < 180) {215if (self->timer <= 60)216RSDK.PlaySfx(MeterDroid->sfxExplosion, Zone->timer % 3, 255);217else218RSDK.PlaySfx(MeterDroid->sfxDestroy, Zone->timer % 3, 255);219}220}221else {222RSDK.PlaySfx(MeterDroid->sfxExplosion, false, 255);223}224225if (Zone->timer & 4) {226int32 x = (RSDK.Rand(-208, 208) + ScreenInfo->center.x + ScreenInfo->position.x) << 16;227int32 y = (RSDK.Rand(-112, 112) + ScreenInfo->center.y + ScreenInfo->position.y) << 16;228EntityExplosion *explosion = CREATE_ENTITY(Explosion, INT_TO_VOID(2 * (RSDK.Rand(0, 256) > 192) + EXPLOSION_BOSS), x, y);229explosion->drawGroup = Zone->objectDrawGroup[1];230}231}232}233234void MeterDroid_FindTargetValve(void)235{236RSDK_THIS(MeterDroid);237238EntityValve *valves[5];239for (int32 i = 0; i < 5; ++i) valves[i] = NULL;240241int32 id = 1;242foreach_active(Valve, valve) { valves[id++] = valve; }243244valves[0] = valves[RSDK.Rand(1, id)];245self->targetValve = valves[0];246self->direction = valves[0]->direction ^ FLIP_X;247self->targetPos.x = valves[0]->position.x;248self->targetPos.y = valves[0]->position.y;249250self->targetPos.x += valves[0]->direction == FLIP_NONE ? 0x2E0000 : -0x2E0000;251self->targetPos.y -= 0xC0000;252253self->moveVel.x = (self->targetPos.x - self->position.x) >> 11;254self->moveVel.y = (self->targetPos.y - self->position.y) >> 11;255256self->velocity.x = 0;257self->velocity.y = 0;258}259260void MeterDroid_PopPlatforms(void)261{262int32 delay = 30;263264foreach_active(GasPlatform, platform)265{266platform->type = GASPLATFORM_BOSS;267platform->timer = delay;268platform->state = GasPlatform_State_Shaking;269delay += 16;270}271}272273void MeterDroid_Draw_Normal(void)274{275RSDK_THIS(MeterDroid);276277self->drawFX = FX_FLIP;278RSDK.DrawSprite(&self->mainAnimator, NULL, false);279280self->drawFX = FX_NONE;281RSDK.DrawSprite(&self->propellorAnimator, NULL, false);282}283284void MeterDroid_Draw_SpinningValve(void)285{286RSDK_THIS(MeterDroid);287288self->drawFX = FX_FLIP;289RSDK.DrawSprite(&self->armAnimator, NULL, false);290291RSDK.DrawSprite(&self->mainAnimator, NULL, false);292293self->drawFX = FX_NONE;294RSDK.DrawSprite(&self->propellorAnimator, NULL, false);295}296297void MeterDroid_Draw_ThrownWrench(void)298{299RSDK_THIS(MeterDroid);300301self->drawFX = FX_FLIP;302RSDK.DrawSprite(&self->mainAnimator, NULL, false);303304self->drawFX = FX_NONE;305RSDK.DrawSprite(&self->propellorAnimator, NULL, false);306307self->drawFX = FX_FLIP;308RSDK.DrawSprite(&self->wrenchAnimator, &self->wrenchPos, false);309}310311void MeterDroid_State_Init(void)312{313RSDK_THIS(MeterDroid);314315if (++self->timer >= 8) {316self->timer = 0;317318Zone->playerBoundActiveL[0] = true;319Zone->playerBoundActiveR[0] = true;320Zone->cameraBoundsL[0] = (self->position.x >> 16) - ScreenInfo->center.x;321Zone->cameraBoundsR[0] = (self->position.x >> 16) + ScreenInfo->center.x;322Zone->cameraBoundsT[0] = Zone->cameraBoundsB[0] - ScreenInfo->size.y - 64;323324MeterDroid->boundsL = (Zone->cameraBoundsL[0] + 64) << 16;325MeterDroid->boundsR = (Zone->cameraBoundsR[0] - 64) << 16;326MeterDroid->boundsM = self->position.x;327MeterDroid->boundsT = (Zone->cameraBoundsT[0] + 48) << 16;328MeterDroid->boundsB = (Zone->cameraBoundsB[0] - 8) << 16;329330self->position.x += 0x800000;331self->visible = true;332self->stateDraw = MeterDroid_Draw_Normal;333self->state = MeterDroid_State_StartFight;334}335}336337void MeterDroid_State_StartFight(void)338{339RSDK_THIS(MeterDroid);340341self->position.y = BadnikHelpers_Oscillate(self->origin.y, 4, 10);342343RSDK.ProcessAnimation(&self->mainAnimator);344RSDK.ProcessAnimation(&self->propellorAnimator);345346if (self->timer) {347if (++self->timer == 120) {348self->timer = 0;349self->state = MeterDroid_State_Idle;350}351}352else {353EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);354355if (player1->position.x > self->position.x - 0x800000) {356Music_TransitionTrack(TRACK_MINIBOSS, 0.0125);357++self->timer;358}359}360}361362void MeterDroid_State_Idle(void)363{364RSDK_THIS(MeterDroid);365366self->position.y = BadnikHelpers_Oscillate(self->origin.y, 4, 10);367368RSDK.ProcessAnimation(&self->mainAnimator);369RSDK.ProcessAnimation(&self->propellorAnimator);370371if (++self->timer == 90) {372self->timer = 0;373self->state = MeterDroid_State_PickMoveDir;374}375376MeterDroid_CheckPlayerCollisions_NoWrench_UseFlip();377}378379void MeterDroid_State_PickMoveDir(void)380{381RSDK_THIS(MeterDroid);382383self->position.y = BadnikHelpers_Oscillate(self->origin.y, 4, 10);384385RSDK.ProcessAnimation(&self->mainAnimator);386RSDK.ProcessAnimation(&self->propellorAnimator);387388if (++self->timer == 60) {389self->timer = 0;390self->moveRadius = 0;391self->angle = 64;392393if (self->position.x < MeterDroid->boundsM) {394self->direction = FLIP_X;395self->state = MeterDroid_State_MoveLeft;396}397else {398self->direction = FLIP_NONE;399self->state = MeterDroid_State_MoveRight;400}401}402403MeterDroid_CheckPlayerCollisions_NoWrench_UseFlip();404}405406void MeterDroid_State_MoveRight(void)407{408RSDK_THIS(MeterDroid);409410RSDK.ProcessAnimation(&self->mainAnimator);411RSDK.ProcessAnimation(&self->propellorAnimator);412413self->position.x += (self->moveRadius * RSDK.Cos256(self->angle)) >> 8;414self->position.y += (self->moveRadius * RSDK.Sin256(self->angle)) >> 8;415416if (self->angle > 0x80) {417self->moveRadius -= 0x1400;418if (self->position.y < self->origin.y)419self->position.y = self->origin.y;420}421else {422self->moveRadius += 0x1400;423}424425if (++self->angle == 0xC0) {426self->origin.x = self->position.x;427self->origin.y = self->position.y;428self->angle = 0;429self->state = MeterDroid_State_ThrowWrench;430}431432MeterDroid_CheckPlayerCollisions_NoWrench_UseFlip();433}434435void MeterDroid_State_MoveLeft(void)436{437RSDK_THIS(MeterDroid);438439RSDK.ProcessAnimation(&self->mainAnimator);440RSDK.ProcessAnimation(&self->propellorAnimator);441442self->position.x += (self->moveRadius * RSDK.Cos256(self->angle)) >> 8;443self->position.y += (self->moveRadius * RSDK.Sin256(self->angle)) >> 8;444445if (self->angle < 0) {446self->moveRadius -= 0x1400;447448if (self->position.y < self->origin.y)449self->position.y = self->origin.y;450}451else {452self->moveRadius += 0x1400;453}454455if (--self->angle == -0x40) {456self->origin.x = self->position.x;457self->origin.y = self->position.y;458self->angle = 0;459self->state = MeterDroid_State_ThrowWrench;460}461462MeterDroid_CheckPlayerCollisions_NoWrench_UseFlip();463}464465void MeterDroid_State_ThrowWrench(void)466{467RSDK_THIS(MeterDroid);468469self->position.y = BadnikHelpers_Oscillate(self->origin.y, 4, 10);470471RSDK.ProcessAnimation(&self->mainAnimator);472RSDK.ProcessAnimation(&self->propellorAnimator);473RSDK.ProcessAnimation(&self->wrenchAnimator);474475if (++self->timer >= 18) {476if (self->mainAnimator.animationID == 2 && self->mainAnimator.frameID == self->mainAnimator.frameCount - 1)477RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 0, &self->mainAnimator, true, 0);478}479else if (self->timer == 16) {480RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 2, &self->mainAnimator, true, 0);481}482483if (self->timer == 36) {484self->wrenchPos.x = self->position.x + (self->direction == FLIP_NONE ? -0x300000 : 0x300000);485self->wrenchPos.y = self->position.y - 0x100000;486487self->targetPos.x = self->wrenchPos.x;488self->targetPos.y = self->wrenchPos.y;489490EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);491self->wrenchMoveVel.x = (player1->position.x + 16 * player1->velocity.x - self->wrenchPos.x) >> 5;492self->wrenchMoveVel.y = (player1->position.y + 16 * player1->velocity.y - self->wrenchPos.y) >> 5;493self->wrenchMoveInc.x = -(self->wrenchMoveVel.x >> 6);494self->wrenchMoveInc.y = -(self->wrenchMoveVel.y >> 6);495496RSDK.PlaySfx(MeterDroid->sfxToss, false, 255);497RSDK.PlaySfx(MeterDroid->sfxWrench, false, 255);498RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 9, &self->wrenchAnimator, true, 0);499500self->stateDraw = MeterDroid_Draw_ThrownWrench;501}502503if (self->stateDraw == MeterDroid_Draw_ThrownWrench) {504self->wrenchMoveVel.x += self->wrenchMoveInc.x;505self->wrenchMoveVel.y += self->wrenchMoveInc.y;506self->wrenchPos.x += self->wrenchMoveVel.x;507self->wrenchPos.y += self->wrenchMoveVel.y;508509if (self->timer == 60)510self->state = MeterDroid_State_ThrownWrench;511512MeterDroid_CheckPlayerCollisions_Wrench_NoFlip();513}514else {515MeterDroid_CheckPlayerCollisions_NoWrench_UseFlip();516}517}518519void MeterDroid_State_ThrownWrench(void)520{521RSDK_THIS(MeterDroid);522523self->position.y = BadnikHelpers_Oscillate(self->origin.y, 4, 10);524525RSDK.ProcessAnimation(&self->mainAnimator);526RSDK.ProcessAnimation(&self->propellorAnimator);527RSDK.ProcessAnimation(&self->wrenchAnimator);528529self->wrenchMoveVel.x += self->wrenchMoveInc.x;530self->wrenchMoveVel.y += self->wrenchMoveInc.y;531self->wrenchPos.x += self->wrenchMoveVel.x;532self->wrenchPos.y += self->wrenchMoveVel.y;533534int32 rx = abs(self->targetPos.x - self->wrenchPos.x) >> 16;535int32 ry = abs(self->targetPos.y - self->wrenchPos.y) >> 16;536537if (rx * rx + ry * ry < 0x200) {538RSDK.PlaySfx(MeterDroid->sfxGrab, false, 0xFF);539RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 3, &self->mainAnimator, true, 0);540541self->stateDraw = MeterDroid_Draw_Normal;542self->state = MeterDroid_State_CaughtWrench;543}544545MeterDroid_CheckPlayerCollisions_Wrench_NoFlip();546}547548void MeterDroid_State_CaughtWrench(void)549{550RSDK_THIS(MeterDroid);551552self->position.y = BadnikHelpers_Oscillate(self->origin.y, 4, 10);553554RSDK.ProcessAnimation(&self->mainAnimator);555RSDK.ProcessAnimation(&self->propellorAnimator);556557MeterDroid_CheckPlayerCollisions_NoWrench_UseFlip();558559if (self->mainAnimator.frameID == self->mainAnimator.frameCount - 1) {560self->timer = 0;561RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 1, &self->mainAnimator, true, 0);562MeterDroid_FindTargetValve();563self->state = MeterDroid_State_MoveToValve;564}565566MeterDroid_CheckPlayerCollisions_NoWrench_UseFlip();567}568569void MeterDroid_State_MoveToValve(void)570{571RSDK_THIS(MeterDroid);572573RSDK.ProcessAnimation(&self->mainAnimator);574RSDK.ProcessAnimation(&self->propellorAnimator);575576if (abs(self->velocity.x) < 0x40000) {577if (abs(self->velocity.x) < 0x40000)578self->velocity.x += self->moveVel.x;579}580581self->velocity.y += self->moveVel.y;582self->position.x += self->velocity.x;583self->position.y += self->velocity.y;584585int32 rx = abs(self->targetPos.x - self->position.x) >> 16;586int32 ry = abs(self->targetPos.y - self->position.y) >> 16;587588if (rx * rx + ry * ry < 96) {589self->direction = self->targetValve->direction;590self->drawGroup = Zone->objectDrawGroup[0] - 1;591self->state = MeterDroid_State_MoveIntoBG;592}593594MeterDroid_CheckPlayerCollisions_NoWrench_NoFlip();595}596597void MeterDroid_State_MoveIntoBG(void)598{599RSDK_THIS(MeterDroid);600601RSDK.ProcessAnimation(&self->mainAnimator);602RSDK.ProcessAnimation(&self->propellorAnimator);603604self->bgFadeAmount += 10;605606self->velocity.x = self->velocity.x - (self->velocity.x >> 3);607self->velocity.y = self->velocity.y - (self->velocity.y >> 3);608self->position.x += ((self->targetPos.x - self->position.x) >> 3) + self->velocity.x;609self->position.y += ((self->targetPos.y - self->position.y) >> 3) + self->velocity.y;610611if (++self->timer == 24) {612self->position.x = self->targetPos.x;613self->position.y = self->targetPos.y;614self->timer = 0;615616EntityValve *valve = self->targetValve;617RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 4, &self->mainAnimator, true, 0);618RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 6, &self->armAnimator, true, 0);619RSDK.SetSpriteAnimation(Valve->aniFrames, 0, &valve->valveAnimator, true, 0);620RSDK.SetSpriteAnimation(Valve->aniFrames, 2, &valve->wheelAnimator, true, 0);621RSDK.PlaySfx(MeterDroid->sfxValve, false, 255);622623self->state = MeterDroid_State_TurningValve;624self->stateDraw = MeterDroid_Draw_SpinningValve;625}626MeterDroid_CheckPlayerCollisions_NoWrench_NoFlip();627}628629void MeterDroid_State_TurningValve(void)630{631RSDK_THIS(MeterDroid);632633RSDK.ProcessAnimation(&self->mainAnimator);634RSDK.ProcessAnimation(&self->armAnimator);635RSDK.ProcessAnimation(&self->propellorAnimator);636637if (++self->timer == 60)638MeterDroid_PopPlatforms();639640if (self->timer == 90) {641self->timer = 0;642643EntityValve *valve = self->targetValve;644RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 5, &self->mainAnimator, true, 0);645RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 7, &self->armAnimator, true, 0);646RSDK.SetSpriteAnimation(Valve->aniFrames, 1, &valve->valveAnimator, true, 0);647RSDK.SetSpriteAnimation(Valve->aniFrames, 3, &valve->wheelAnimator, true, 0);648649self->state = MeterDroid_State_StopTurningValve;650}651}652653void MeterDroid_State_StopTurningValve(void)654{655RSDK_THIS(MeterDroid);656657RSDK.ProcessAnimation(&self->mainAnimator);658RSDK.ProcessAnimation(&self->armAnimator);659RSDK.ProcessAnimation(&self->propellorAnimator);660661if (self->mainAnimator.frameID == self->mainAnimator.frameCount - 1)662self->state = MeterDroid_State_WatchPlatformsPopUp;663}664665void MeterDroid_State_WatchPlatformsPopUp(void)666{667RSDK_THIS(MeterDroid);668669RSDK.ProcessAnimation(&self->propellorAnimator);670671++self->timer;672if (self->timer > 30) {673if (self->bgFadeAmount > 0)674self->bgFadeAmount -= 16;675}676677if (self->timer == 60) {678self->timer = 0;679RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 1, &self->mainAnimator, true, 0);680681self->origin.x = self->position.x;682self->origin.y = self->position.y;683self->drawGroup = Zone->objectDrawGroup[0];684self->state = MeterDroid_State_PickMoveDir;685self->stateDraw = MeterDroid_Draw_Normal;686}687}688689void MeterDroid_State_Destroyed(void)690{691RSDK_THIS(MeterDroid);692693MeterDroid_Explode();694695if (++self->timer == 60) {696MeterDroid->debrisSpeeds[2] = self->direction;697MeterDroid->debrisSpeeds[6] = self->direction;698MeterDroid->debrisSpeeds[10] = self->direction;699MeterDroid->debrisSpeeds[14] = self->direction;700701if (self->direction == FLIP_X) {702MeterDroid->debrisSpeeds[3] = -MeterDroid->debrisSpeeds[3];703MeterDroid->debrisSpeeds[7] = -MeterDroid->debrisSpeeds[7];704MeterDroid->debrisSpeeds[11] = -MeterDroid->debrisSpeeds[11];705MeterDroid->debrisSpeeds[15] = -MeterDroid->debrisSpeeds[15];706}707708Debris_CreateFromEntries(MeterDroid->aniFrames, MeterDroid->debrisSpeeds, 10);709self->visible = false;710}711else if (self->timer == 90) {712self->timer = 0;713self->visible = false;714Music_FadeOut(0.025);715CREATE_ENTITY(OOZFlames, NULL, self->position.x, self->position.y);716self->state = MeterDroid_State_FinishAct;717}718}719720void MeterDroid_State_FinishAct(void)721{722RSDK_THIS(MeterDroid);723724MeterDroid_Explode();725726if (++self->timer == 180) {727for (int32 p = 0; p < Player->playerCount; ++p) StarPost->postIDs[p] = 0;728729SaveGame_SavePlayerState();730globals->enableIntro = true;731++SceneInfo->listPos;732if (!RSDK.CheckValidScene())733RSDK.SetScene("Presentation", "Title Screen");734735Zone_StartFadeOut(10, 0xF0F0F0);736}737738if (self->timer == 240)739destroyEntity(self);740}741742#if GAME_INCLUDE_EDITOR743void MeterDroid_EditorDraw(void)744{745RSDK_THIS(MeterDroid);746747RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 1, &self->mainAnimator, false, 0);748RSDK.SetSpriteAnimation(MeterDroid->aniFrames, 8, &self->propellorAnimator, false, 0);749750RSDK.DrawSprite(&self->mainAnimator, NULL, false);751752if (showGizmos()) {753RSDK_DRAWING_OVERLAY(true);754755DrawHelpers_DrawArenaBounds(-WIDE_SCR_XCENTER, -SCREEN_YSIZE - 64, WIDE_SCR_XCENTER, 0, 1 | 0 | 4 | 0, 0x00C0F0);756757RSDK_DRAWING_OVERLAY(false);758}759}760761void MeterDroid_EditorLoad(void) { MeterDroid->aniFrames = RSDK.LoadSpriteAnimation("OOZ/MeterDroid.bin", SCOPE_STAGE); }762#endif763764void MeterDroid_Serialize(void) {}765766767