Path: blob/master/SonicMania/Objects/LRZ/HeavyRider.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: HeavyRider Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectHeavyRider *HeavyRider;1011void HeavyRider_Update(void)12{13RSDK_THIS(HeavyRider);1415StateMachine_Run(self->state);16}1718void HeavyRider_LateUpdate(void) {}1920void HeavyRider_StaticUpdate(void) {}2122void HeavyRider_Draw(void)23{24RSDK_THIS(HeavyRider);2526StateMachine_Run(self->stateDraw);27}2829void HeavyRider_Create(void *data)30{31RSDK_THIS(HeavyRider);3233self->drawFX = FX_ROTATE | FX_FLIP;3435if (!SceneInfo->inEditor) {36if (globals->gameMode < MODE_TIMEATTACK) {37if (!self->type)38self->type = VOID_TO_INT(data);3940switch (self->type) {41case HEAVYRIDER_RIDER:42self->active = ACTIVE_BOUNDS;43self->visible = false;44self->drawGroup = Zone->objectDrawGroup[1];4546RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 0, &self->mainAnimator, true, 0);47RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 5, &self->thrustAnimator, true, 0);48RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 7, &self->spikeBallAnimator, true, 0);49RSDK.SetSpriteAnimation(-1, 0, &self->fireballAnimator, true, 0);5051self->updateRange.x = 0x800000;52self->updateRange.y = 0x800000;5354HeavyRider->spikeBallAngle = 0x80;55HeavyRider->spikeBallState = HEAVYRIDER_SPIKEBALL_SWINGING;56HeavyRider->spawnDelay = 16;57HeavyRider->spawnFireballs = false;58HeavyRider->startY = self->position.y;59HeavyRider->curAttack = HEAVYRIDER_ATK_RIDING_SCREENBOUNDS;60HeavyRider->wheelExtendState = HEAVYRIDER_WHEEL_NONE;61HeavyRider->wheelLength = 0;6263self->state = HeavyRider_State_SetupArena;64self->stateDraw = HeavyRider_Draw_Boss;65break;6667case HEAVYRIDER_PLANESWITCH:68RSDK.SetSpriteAnimation(PlaneSwitch->aniFrames, 0, &self->mainAnimator, true, 0);6970self->active = ACTIVE_BOUNDS;71self->updateRange.x = 0x200000;72self->updateRange.y = (self->size + 0x400) << 11;73self->visible = false;74self->drawGroup = Zone->objectDrawGroup[0];7576self->state = HeavyRider_State_PlaneSwitch;77self->stateDraw = HeavyRider_Draw_PlaneSwitch;78break;7980case HEAVYRIDER_FORCECHARGE_LEFT:81case HEAVYRIDER_FORCECHARGE_RIGHT:82case HEAVYRIDER_UNUSED1:83case HEAVYRIDER_UNUSED2:84RSDK.SetSpriteAnimation(PlaneSwitch->aniFrames, 0, &self->mainAnimator, true, ((self->type - 2) >> 1) + 4);8586self->active = ACTIVE_BOUNDS;87self->updateRange.x = 0x200000;88self->updateRange.y = 0x200000;89self->visible = false;90self->drawGroup = Zone->objectDrawGroup[0];9192self->state = HeavyRider_State_ChargeTrigger;93self->stateDraw = HeavyRider_Draw_Simple;94break;9596case HEAVYRIDER_PUFF:97RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 10, &self->mainAnimator, true, 0);9899self->active = ACTIVE_NORMAL;100self->updateRange.x = 0x100000;101self->updateRange.y = 0x100000;102self->visible = true;103self->drawGroup = Zone->objectDrawGroup[1] - 1;104105self->state = HeavyRider_State_Puff;106self->stateDraw = HeavyRider_Draw_Simple;107break;108109case HEAVYRIDER_FIREBALL:110RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 9, &self->mainAnimator, true, 0);111112self->active = ACTIVE_NORMAL;113self->updateRange.x = 0x200000;114self->updateRange.y = 0x200000;115self->visible = true;116self->drawGroup = Zone->objectDrawGroup[1];117118self->state = HeavyRider_State_Fireball;119self->stateDraw = HeavyRider_Draw_Simple;120break;121122case HEAVYRIDER_JIMMY:123RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 4, &self->mainAnimator, true, 0);124125self->drawGroup = Zone->objectDrawGroup[1];126self->active = ACTIVE_NORMAL;127self->updateRange.x = 0x1800000;128self->updateRange.y = 0x1800000;129self->visible = true;130self->drawGroup = Zone->objectDrawGroup[1];131132self->state = HeavyRider_StateJimmy_Idle;133self->stateDraw = HeavyRider_Draw_Simple;134break;135136default: break;137}138}139else {140destroyEntity(self);141}142}143}144145void HeavyRider_StageLoad(void)146{147HeavyRider->aniFrames = RSDK.LoadSpriteAnimation("LRZ3/HeavyRider.bin", SCOPE_STAGE);148149HeavyRider->hitboxRider.left = -16;150HeavyRider->hitboxRider.top = -25;151HeavyRider->hitboxRider.right = 16;152HeavyRider->hitboxRider.bottom = 14;153154HeavyRider->hitboxSpikeBall.left = -20;155HeavyRider->hitboxSpikeBall.top = -20;156HeavyRider->hitboxSpikeBall.right = 20;157HeavyRider->hitboxSpikeBall.bottom = 20;158159HeavyRider->outerBox.left = -5;160HeavyRider->outerBox.top = 0;161HeavyRider->outerBox.right = 5;162HeavyRider->outerBox.bottom = 48;163164HeavyRider->innerBox.left = -4;165HeavyRider->innerBox.top = 0;166HeavyRider->innerBox.right = 4;167HeavyRider->innerBox.bottom = 48;168169HeavyRider->hitboxRiderTrigger.left = -4;170HeavyRider->hitboxRiderTrigger.top = 46;171HeavyRider->hitboxRiderTrigger.right = 4;172HeavyRider->hitboxRiderTrigger.bottom = 48;173174HeavyRider->hitboxTrigger.left = -8;175HeavyRider->hitboxTrigger.top = -8;176HeavyRider->hitboxTrigger.right = 8;177HeavyRider->hitboxTrigger.bottom = 8;178179HeavyRider->hitboxJimmy.left = -10;180HeavyRider->hitboxJimmy.top = 14;181HeavyRider->hitboxJimmy.right = 22;182HeavyRider->hitboxJimmy.bottom = 46;183184HeavyRider->hitboxFireball.left = -2;185HeavyRider->hitboxFireball.top = 38;186HeavyRider->hitboxFireball.right = 14;187HeavyRider->hitboxFireball.bottom = 46;188189HeavyRider->health = 8;190HeavyRider->invincibilityTimer = 0;191192HeavyRider->sfxHit = RSDK.GetSfx("Stage/BossHit.wav");193HeavyRider->sfxExplosion = RSDK.GetSfx("Stage/Explosion2.wav");194HeavyRider->sfxCharge = RSDK.GetSfx("LRZ/RiderCharge.wav");195HeavyRider->sfxLaunch = RSDK.GetSfx("LRZ/RiderLaunch.wav");196HeavyRider->sfxSkid = RSDK.GetSfx("LRZ/RiderSkid.wav");197HeavyRider->sfxJump = RSDK.GetSfx("LRZ/RiderJump.wav");198HeavyRider->sfxCheer = RSDK.GetSfx("LRZ/RiderCheer.wav");199HeavyRider->sfxBumper = RSDK.GetSfx("Stage/Bumper3.wav");200}201202void HeavyRider_SpawnDebris(int32 frame, uint8 drawGroup, int32 x, int32 y)203{204EntityDebris *debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, x, y);205RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 7, &debris->animator, true, frame);206207debris->velocity.x = RSDK.Rand(-0x20000, 0x20000);208debris->velocity.y = RSDK.Rand(-0x20000, -0x10000);209debris->drawGroup = drawGroup;210debris->gravityStrength = 0x4800;211debris->updateRange.x = 0x400000;212debris->updateRange.y = 0x400000;213}214215void HeavyRider_CheckObjectCollisions(void)216{217RSDK_THIS(HeavyRider);218219if (HeavyRider->invincibilityTimer) {220HeavyRider->invincibilityTimer--;221}222else {223foreach_active(Player, player)224{225int32 playerID = RSDK.GetEntitySlot(player);226227if (HeavyRider->playerTimers[playerID])228HeavyRider->playerTimers[playerID]--;229230if (Player_CheckBadnikTouch(player, self, &HeavyRider->hitboxRider)) {231if (Player_CheckBossHit(player, self)) {232HeavyRider_Hit();233foreach_break;234}235}236else if (Player_CheckBadnikTouch(player, self, &HeavyRider->hitboxJimmy)) {237if (!HeavyRider->playerTimers[playerID] && Player_CheckBossHit(player, self)) {238RSDK.PlaySfx(HeavyRider->sfxBumper, false, 255);239240int32 angle = RSDK.ATan2(player->position.x - self->position.x - 0x60000, player->position.y - self->position.y - 0x1E0000);241player->velocity.x = 0x380 * RSDK.Cos256(angle);242243if (player->position.x >= self->position.x) {244if (player->position.x > self->position.x) {245if (self->velocity.x > 0)246player->velocity.x += self->velocity.x;247}248}249else {250if (self->velocity.x >= 0) {251if (player->position.x > self->position.x) {252if (self->velocity.x > 0)253player->velocity.x += self->velocity.x;254}255}256else {257player->velocity.x += self->velocity.x;258}259}260261player->velocity.y = 0x380 * RSDK.Sin256(angle);262if (player->velocity.y >= 0)263player->groundVel = player->velocity.x;264else265player->onGround = false;266267player->applyJumpCap = false;268HeavyRider->playerTimers[playerID] = 15;269}270}271else if ((uint32)(HeavyRider->spikeBallAngle & 0x7F) + 32 < 0x40) {272int32 storeX = self->position.x;273int32 storeY = self->position.y;274self->position.x = HeavyRider->spikeBallPos.x;275self->position.y = HeavyRider->spikeBallPos.y;276277if (Player_CheckCollisionTouch(player, self, &HeavyRider->hitboxSpikeBall)) {278#if MANIA_USE_PLUS279if (!Player_CheckMightyUnspin(player, 0x800, false, &player->uncurlTimer))280#endif281Player_Hurt(player, self);282}283284self->position.x = storeX;285self->position.y = storeY;286}287}288}289290if (HeavyRider->curAttack == HEAVYRIDER_ATK_RIDING_ARENABOUNDS || HeavyRider->curAttack == HEAVYRIDER_ATK_RIDING_USETRIGGERS) {291foreach_all(HeavyRider, rider)292{293if (rider->type == HEAVYRIDER_PLANESWITCH) {294if (abs(self->position.x - rider->position.x) < 0x100000 && abs(self->position.y - rider->position.y) < rider->size << 19) {295if (self->velocity.x >= 0)296self->collisionPlane = (rider->flags >> 3) & 1;297else298self->collisionPlane = (rider->flags >> 1) & 1;299}300}301else {302if (HeavyRider->curAttack == HEAVYRIDER_ATK_RIDING_USETRIGGERS && self->onGround) {303switch (rider->type) {304default: break;305306case HEAVYRIDER_FORCECHARGE_LEFT:307if (RSDK.CheckObjectCollisionTouchBox(rider, &HeavyRider->hitboxTrigger, self, &HeavyRider->hitboxRiderTrigger)) {308if (self->direction == FLIP_X) {309RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 2, &self->mainAnimator, true, 0);310RSDK.SetSpriteAnimation(-1, 0, &self->thrustAnimator, true, 0);311self->state = HeavyRider_State_Turning;312}313else if (self->state != HeavyRider_State_RampJump) {314self->timer = 38;315HeavyRider->chargeTimer = 0;316self->state = HeavyRider_State_RampJump;317}318}319break;320321case HEAVYRIDER_FORCECHARGE_RIGHT:322if (RSDK.CheckObjectCollisionTouchBox(rider, &HeavyRider->hitboxTrigger, self, &HeavyRider->hitboxRiderTrigger)) {323if (self->direction == FLIP_NONE) {324RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 2, &self->mainAnimator, true, 0);325RSDK.SetSpriteAnimation(-1, 0, &self->thrustAnimator, true, 0);326self->state = HeavyRider_State_Turning;327}328else if (self->state != HeavyRider_State_RampJump) {329self->timer = 38;330HeavyRider->chargeTimer = 0;331self->state = HeavyRider_State_RampJump;332}333}334break;335}336}337}338}339340foreach_all(PlaneSwitch, planeSwitch) { PlaneSwitch_CheckCollisions(planeSwitch, self, planeSwitch->flags, planeSwitch->size, false, 0, 0); }341}342}343344void HeavyRider_Hit(void)345{346RSDK_THIS(HeavyRider);347348if (HeavyRider->health)349HeavyRider->health--;350351if (!HeavyRider->health) {352RSDK.PlaySfx(HeavyRider->sfxExplosion, false, 255);353self->timer = 120;354355if (HeavyRider->spikeBallState == HEAVYRIDER_SPIKEBALL_SWINGING) {356int32 spawnX = 0;357if (self->direction) {358if (self->mainAnimator.animationID == 2 && self->mainAnimator.frameID)359spawnX = self->position.x + 0x160000;360else361spawnX = self->position.x - 0xE0000;362}363else {364if (self->mainAnimator.animationID == 2 && self->mainAnimator.frameID)365spawnX = self->position.x - 0x160000;366else367spawnX = self->position.x + 0xE0000;368}369370int32 angle = 0x400;371int32 cos = RSDK.Cos256(HeavyRider->spikeBallAngle);372for (int32 i = 0; i < 8; ++i) {373HeavyRider_SpawnDebris(1, Zone->objectDrawGroup[1], spawnX + angle * cos, self->position.y - 0x210000);374angle += 0x800;375}376377HeavyRider_SpawnDebris(2, Zone->objectDrawGroup[1], spawnX + angle * cos, self->position.y - 0x210000);378HeavyRider->spikeBallState = HEAVYRIDER_SPIKEBALL_NONE;379380RSDK_GET_ENTITY(SceneInfo->entitySlot + 1, Flamethrower)->interval = -1;381RSDK_GET_ENTITY(SceneInfo->entitySlot + 2, Flamethrower)->interval = -1;382383HeavyRider->spawnFireballs = false;384RSDK.SetSpriteAnimation(-1, 0, &self->fireballAnimator, true, 0);385}386else if (HeavyRider->spikeBallState == HEAVYRIDER_SPIKEBALL_THROWN) {387HeavyRider_SpawnDebris(2, Zone->objectDrawGroup[1], HeavyRider->spikeBallPos.x, HeavyRider->spikeBallPos.y);388HeavyRider->spikeBallState = HEAVYRIDER_SPIKEBALL_NONE;389}390391SceneInfo->timeEnabled = false;392Player_GiveScore(RSDK_GET_ENTITY(SLOT_PLAYER1, Player), 1000);393self->state = HeavyRider_State_Destroyed;394}395396RSDK.PlaySfx(HeavyRider->sfxHit, false, 255);397self->timer -= 60;398HeavyRider->invincibilityTimer = 30;399}400401void HeavyRider_Explode(void)402{403RSDK_THIS(HeavyRider);404405if (!(Zone->timer & 7)) {406RSDK.PlaySfx(HeavyRider->sfxExplosion, false, 255);407408if (!(Zone->timer & 0xF)) {409int32 x = self->position.x + (RSDK.Rand(-19, 20) << 16);410int32 y = self->position.y + (RSDK.Rand(-24, 25) << 16);411CREATE_ENTITY(Explosion, INT_TO_VOID((RSDK.Rand(0, 256) > 192) + EXPLOSION_BOSS), x, y)->drawGroup = Zone->objectDrawGroup[1] + 2;412}413}414}415416void HeavyRider_HandleTurn_ScreenEdges(void)417{418RSDK_THIS(HeavyRider);419420if (self->direction == FLIP_X) {421if (self->position.x < (ScreenInfo->position.x + 48) << 16) {422HeavyRider_DecideNextAttack();423424RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 2, &self->mainAnimator, true, 0);425RSDK.SetSpriteAnimation(-1, 0, &self->thrustAnimator, true, 0);426427self->state = HeavyRider_State_Turning;428}429}430else {431if (self->position.x > (ScreenInfo->position.x + ScreenInfo->size.x - 48) << 16) {432HeavyRider_DecideNextAttack();433434RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 2, &self->mainAnimator, true, 0);435RSDK.SetSpriteAnimation(-1, 0, &self->thrustAnimator, true, 0);436437self->state = HeavyRider_State_Turning;438}439}440}441442void HeavyRider_HandleTurn_ArenaEdges(void)443{444RSDK_THIS(HeavyRider);445446if (self->direction == FLIP_X) {447if (self->position.x < (Zone->cameraBoundsL[0] - 48) << 16) {448HeavyRider_DecideNextAttack();449450RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 2, &self->mainAnimator, true, 0);451RSDK.SetSpriteAnimation(-1, 0, &self->thrustAnimator, true, 0);452453self->state = HeavyRider_State_Turning;454}455}456else {457if (self->position.x > (Zone->cameraBoundsR[0] + 48) << 16) {458HeavyRider_DecideNextAttack();459460RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 2, &self->mainAnimator, true, 0);461RSDK.SetSpriteAnimation(-1, 0, &self->thrustAnimator, true, 0);462463self->state = HeavyRider_State_Turning;464}465}466}467468void HeavyRider_DecideNextAttack(void)469{470RSDK_THIS(HeavyRider);471472if (HeavyRider->curAttack != HEAVYRIDER_ATK_RIDING_USETRIGGERS) {473HeavyRider->spawnFireballs = 0;474RSDK.SetSpriteAnimation(-1, 0, &self->fireballAnimator, true, 0);475}476477int32 atkID = RSDK.Rand(0, 10);478switch (HeavyRider->curAttack) {479case HEAVYRIDER_ATK_RIDING_SCREENBOUNDS: {480int32 nextAttacks[] = {481HEAVYRIDER_ATK_RIDING_SCREENBOUNDS, HEAVYRIDER_ATK_RIDING_SCREENBOUNDS, HEAVYRIDER_ATK_RIDING_ARENABOUNDS,482HEAVYRIDER_ATK_RIDING_ARENABOUNDS, HEAVYRIDER_ATK_RIDING_ARENABOUNDS, HEAVYRIDER_ATK_RIDING_ARENABOUNDS,483HEAVYRIDER_ATK_RIDING_USETRIGGERS, HEAVYRIDER_ATK_RIDING_USETRIGGERS, HEAVYRIDER_ATK_RIDING_USETRIGGERS,484HEAVYRIDER_ATK_RIDING_USETRIGGERS,485};486487HeavyRider->curAttack = nextAttacks[atkID];488break;489}490491case HEAVYRIDER_ATK_RIDING_ARENABOUNDS: {492int32 nextAttacks[] = {493HEAVYRIDER_ATK_RIDING_SCREENBOUNDS, HEAVYRIDER_ATK_RIDING_SCREENBOUNDS, HEAVYRIDER_ATK_RIDING_ARENABOUNDS,494HEAVYRIDER_ATK_RIDING_USETRIGGERS, HEAVYRIDER_ATK_RIDING_USETRIGGERS, HEAVYRIDER_ATK_RIDING_USETRIGGERS,495HEAVYRIDER_ATK_PREPCHARGE, HEAVYRIDER_ATK_PREPCHARGE, HEAVYRIDER_ATK_PREPCHARGE,496HEAVYRIDER_ATK_PREPCHARGE,497};498499HeavyRider->curAttack = nextAttacks[atkID];500break;501}502503case HEAVYRIDER_ATK_RIDING_USETRIGGERS: {504int32 nextAttacks[] = {505HEAVYRIDER_ATK_RIDING_SCREENBOUNDS, HEAVYRIDER_ATK_RIDING_SCREENBOUNDS, HEAVYRIDER_ATK_RIDING_ARENABOUNDS,506HEAVYRIDER_ATK_RIDING_ARENABOUNDS, HEAVYRIDER_ATK_RIDING_ARENABOUNDS, HEAVYRIDER_ATK_RIDING_USETRIGGERS,507HEAVYRIDER_ATK_PREPCHARGE, HEAVYRIDER_ATK_PREPCHARGE, HEAVYRIDER_ATK_PREPCHARGE,508HEAVYRIDER_ATK_PREPCHARGE,509};510511HeavyRider->curAttack = nextAttacks[atkID];512513if (HeavyRider->curAttack != HEAVYRIDER_ATK_PREPCHARGE) {514HeavyRider->spawnFireballs = false;515RSDK.SetSpriteAnimation(-1, 0, &self->fireballAnimator, true, 0);516}517break;518}519520case HEAVYRIDER_ATK_PREPCHARGE:521case HEAVYRIDER_ATK_CHARGE: {522int32 nextAttack[] = {523HEAVYRIDER_ATK_RIDING_SCREENBOUNDS, HEAVYRIDER_ATK_RIDING_SCREENBOUNDS, HEAVYRIDER_ATK_RIDING_SCREENBOUNDS,524HEAVYRIDER_ATK_PREPCHARGE, HEAVYRIDER_ATK_PREPCHARGE, HEAVYRIDER_ATK_RIDING_ARENABOUNDS,525HEAVYRIDER_ATK_RIDING_ARENABOUNDS, HEAVYRIDER_ATK_RIDING_ARENABOUNDS, HEAVYRIDER_ATK_RIDING_USETRIGGERS,526HEAVYRIDER_ATK_RIDING_USETRIGGERS,527};528529HeavyRider->curAttack = nextAttack[atkID];530break;531}532533default: break;534}535}536537void HeavyRider_State_SetupArena(void)538{539RSDK_THIS(HeavyRider);540541if (++self->timer >= 2) {542self->timer = 0;543Zone->playerBoundActiveR[0] = true;544Zone->cameraBoundsR[0] = (self->position.x >> 16) + WIDE_SCR_XSIZE;545self->active = ACTIVE_NORMAL;546547foreach_all(BoundsMarker, marker) { destroyEntity(marker); }548self->state = HeavyRider_State_AwaitPlayer;549}550}551552void HeavyRider_State_AwaitPlayer(void)553{554RSDK_THIS(HeavyRider);555556Zone->playerBoundActiveL[0] = true;557Zone->cameraBoundsL[0] = ScreenInfo->position.x;558559EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);560if (player1->position.x > self->position.x - 0x500000) {561Zone->playerBoundActiveL[0] = true;562Zone->cameraBoundsL[0] = (self->position.x >> 16) - WIDE_SCR_XSIZE;563#if MANIA_USE_PLUS564HeavyRider->outro = CREATE_ENTITY(LRZ3Outro, NULL, self->position.x, self->position.y);565#endif566self->state = HeavyRider_State_SetupRider;567}568}569570void HeavyRider_State_SetupRider(void)571{572RSDK_THIS(HeavyRider);573574Zone->playerBoundActiveL[0] = true;575576#if MANIA_USE_PLUS577EntityLRZ3Outro *outro = HeavyRider->outro;578if (outro->state == LRZ3Outro_State_EnterLittlePlanet) {579#else580EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);581if (player1->position.x > self->position.x) {582#endif583584self->position.y -= 0x400000;585self->position.x = (Zone->cameraBoundsL[0] - 64) << 16;586self->onGround = false;587self->tileCollisions = TILECOLLISION_DOWN;588self->collisionPlane = 0;589self->collisionLayers = (1 << Zone->fgLayer[0]) | (1 << Zone->fgLayer[1]);590591Music_TransitionTrack(TRACK_HBHBOSS, 0.0125);592593self->visible = true;594self->state = HeavyRider_State_Moving;595self->velocity.x = 0;596self->timer = 0;597}598}599600void HeavyRider_State_Moving(void)601{602RSDK_THIS(HeavyRider);603604RSDK.ProcessAnimation(&self->mainAnimator);605RSDK.ProcessAnimation(&self->thrustAnimator);606RSDK.ProcessAnimation(&self->fireballAnimator);607608RSDK.ProcessObjectMovement(self, &HeavyRider->outerBox, &HeavyRider->innerBox);609610if (self->onGround) {611if (self->velocity.y <= 0x20000) {612self->velocity.y = 0;613}614else {615self->velocity.y = (self->velocity.y >> 1) - self->velocity.y;616if (self->velocity.y > 0) {617if (RSDK.Rand(0, 2) == 1) {618RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 2, &self->mainAnimator, true, 0);619RSDK.SetSpriteAnimation(-1, 0, &self->thrustAnimator, true, 0);620self->state = HeavyRider_State_Turning;621}622self->velocity.y = 0;623}624else {625self->onGround = false;626RSDK_GET_ENTITY(SceneInfo->entitySlot + 1, Flamethrower)->interval = -1;627RSDK_GET_ENTITY(SceneInfo->entitySlot + 2, Flamethrower)->interval = -1;628}629}630}631else {632self->velocity.y += 0x3800;633}634635if (HeavyRider->wheelExtendState == HEAVYRIDER_WHEEL_EXTENDING) {636if (HeavyRider->wheelLength < 0x100000)637HeavyRider->wheelLength += 0x30000;638639if (HeavyRider->wheelLength > 0x100000) {640HeavyRider->wheelLength = 0x100000;641HeavyRider->wheelExtendState = HEAVYRIDER_WHEEL_RETRACTING;642}643}644else if (HeavyRider->wheelExtendState == HEAVYRIDER_WHEEL_RETRACTING) {645if (HeavyRider->wheelLength > 0)646HeavyRider->wheelLength -= 0x30000;647648if (HeavyRider->wheelLength < 0) {649HeavyRider->wheelLength = 0;650HeavyRider->wheelExtendState = HEAVYRIDER_WHEEL_NONE;651RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 0, &self->mainAnimator, true, 0);652RSDK.SetSpriteAnimation(-1, 0, &self->wheelieAnimator, true, 0);653}654}655656EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);657if (self->position.y == HeavyRider->startY && HeavyRider->curAttack != HEAVYRIDER_ATK_CHARGE && player1->onGround) {658int32 dist = 0x7FFFFFFF;659if (self->velocity.x <= 0) {660if (player1->position.x < self->position.x) {661dist = self->position.x - player1->position.x;662663if (player1->velocity.x > 0)664dist -= 8 * player1->velocity.x;665}666}667else {668if (player1->position.x > self->position.x) {669dist = player1->position.x - self->position.x;670671if (player1->velocity.x < 0)672dist += 8 * player1->velocity.x;673}674}675676if (dist < 0x480000) {677RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 11, &self->mainAnimator, true, 0);678RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 11, &self->wheelieAnimator, true, 0);679680RSDK.PlaySfx(HeavyRider->sfxJump, false, 255);681self->onGround = false;682self->velocity.y = -0x58000;683684HeavyRider->wheelExtendState = HEAVYRIDER_WHEEL_EXTENDING;685HeavyRider->wheelLength = 0;686}687}688689if (self->direction) {690if (self->groundVel > -0x40000)691self->groundVel -= 0x4000;692}693else {694if (self->groundVel < 0x40000)695self->groundVel += 0x4000;696}697698switch (HeavyRider->curAttack) {699case HEAVYRIDER_ATK_RIDING_SCREENBOUNDS: HeavyRider_HandleTurn_ScreenEdges(); break;700701case HEAVYRIDER_ATK_RIDING_ARENABOUNDS:702case HEAVYRIDER_ATK_RIDING_USETRIGGERS:703case HEAVYRIDER_ATK_CHARGE: HeavyRider_HandleTurn_ArenaEdges(); break;704705case HEAVYRIDER_ATK_PREPCHARGE:706HeavyRider_HandleTurn_ArenaEdges();707708HeavyRider->curAttack = HEAVYRIDER_ATK_CHARGE;709HeavyRider->spikeBallState = HEAVYRIDER_SPIKEBALL_THROWN;710711RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 1, &self->mainAnimator, true, 2);712713self->timer = 41;714HeavyRider->chargeTimer = 0;715self->state = HeavyRider_State_Charging;716break;717718default: break;719}720721if (self->mainAnimator.animationID != 2) {722if (abs(self->groundVel) > 0x48000 || HeavyRider->spawnFireballs) {723RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 5, &self->thrustAnimator, false, 0);724725if (HeavyRider->spawnFireballs && self->onGround) {726if (!--HeavyRider->spawnDelay) {727HeavyRider->spawnDelay = 10;728CREATE_ENTITY(HeavyRider, INT_TO_VOID(HEAVYRIDER_FIREBALL), self->position.x, self->position.y);729}730}731}732else {733RSDK.SetSpriteAnimation(-1, 0, &self->thrustAnimator, true, 0);734735if (HeavyRider->spawnDelay > 16)736HeavyRider->spawnDelay = 16;737738if (!--HeavyRider->spawnDelay) {739HeavyRider->spawnDelay = 16;740EntityHeavyRider *child = CREATE_ENTITY(HeavyRider, INT_TO_VOID(HEAVYRIDER_PUFF), self->position.x, self->position.y + 0x1C0000);741if (self->direction == FLIP_X)742child->position.x += 0x110000;743else744child->position.x -= 0x110000;745}746}747}748749if (HeavyRider->spikeBallState == HEAVYRIDER_SPIKEBALL_SWINGING)750HeavyRider->spikeBallAngle += 6;751752if (HeavyRider->spikeBallState == HEAVYRIDER_SPIKEBALL_THROWN) {753HeavyRider->spikeBallAngle = 0;754HeavyRider->spikeBallPos.x = self->position.x;755HeavyRider->spikeBallPos.y = self->position.y;756757if (self->direction)758HeavyRider->spikeBallPos.x -= 0x200000;759else760HeavyRider->spikeBallPos.x += 0x200000;761762HeavyRider->spikeBallPos.y += 0xC0000;763}764765HeavyRider_CheckObjectCollisions();766}767768void HeavyRider_State_RampJump(void)769{770RSDK_THIS(HeavyRider);771772float chargeSpeeds[] = { 1.0, 1.1926451, 1.4150375, 1.6780719, 2.0 };773774HeavyRider_State_Moving();775776if (self->type != HEAVYRIDER_JIMMY && self->timer == 30) {777RSDK_GET_ENTITY(SceneInfo->entitySlot + 1, Flamethrower)->interval = 0;778RSDK_GET_ENTITY(SceneInfo->entitySlot + 2, Flamethrower)->interval = 0;779}780781if (--self->timer > 0) {782if (!(self->timer & 7)) {783int32 channel = RSDK.PlaySfx(HeavyRider->sfxCharge, false, 255);784RSDK.SetChannelAttributes(channel, 1.0, 0.0, chargeSpeeds[HeavyRider->chargeTimer]);785++HeavyRider->chargeTimer;786}787}788else {789RSDK.PlaySfx(HeavyRider->sfxLaunch, false, 255);790self->timer = 30;791self->groundVel += (self->groundVel >> 2) + (self->groundVel >> 1);792if (self->type == HEAVYRIDER_JIMMY)793self->state = HeavyRider_State_Moving;794else795self->state = HeavyRider_State_ChargeDash;796}797}798799void HeavyRider_State_Charging(void)800{801RSDK_THIS(HeavyRider);802803float chargeSpeeds[] = { 1.0, 1.1926451, 1.4150375, 1.6780719, 2.0 };804805HeavyRider_State_Moving();806807if (--self->timer > 0) {808if (!(self->timer & 7)) {809int32 channel = RSDK.PlaySfx(HeavyRider->sfxCharge, false, 255);810RSDK.SetChannelAttributes(channel, 1.0, 0.0, chargeSpeeds[HeavyRider->chargeTimer]);811++HeavyRider->chargeTimer;812}813}814else {815RSDK.PlaySfx(HeavyRider->sfxLaunch, false, 255);816self->timer = 30;817self->groundVel += (self->groundVel >> 2) + (self->groundVel >> 1);818self->state = HeavyRider_State_Moving;819}820}821822void HeavyRider_State_ChargeDash(void)823{824RSDK_THIS(HeavyRider);825826HeavyRider_State_Moving();827828if (--self->timer == 16) {829HeavyRider->spawnDelay = 10;830HeavyRider->spawnFireballs = true;831RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 8, &self->fireballAnimator, true, 0);832}833else if (self->timer <= 0) {834for (int32 i = 0; i < 0x60; ++i) {835int32 x = RSDK.Rand(-128, 129);836int32 y = 2 * RSDK.Rand(4, 16);837EntityDebris *debris = CREATE_ENTITY(Debris, NULL, (x << 16) + self->position.x, (ScreenInfo->position.y - y) << 16);838839debris->updateRange.x = 0x2000000;840debris->updateRange.y = 0x2000000;841debris->state = Debris_State_Fall;842debris->gravityStrength = 0x1800;843debris->velocity.x = RSDK.Rand(-2, 3) << 16;844debris->velocity.y = RSDK.Rand(-2, 2) << 16;845debris->drawFX = FX_FLIP;846debris->direction = i & 3;847debris->drawGroup = Zone->objectDrawGroup[1];848849int32 frame = RSDK.Rand(0, 4);850int32 anim = RSDK.Rand(12, 15);851RSDK.SetSpriteAnimation(HeavyRider->aniFrames, anim, &debris->animator, true, frame);852}853854RSDK.PlaySfx(HeavyRider->sfxCheer, false, 255);855self->state = HeavyRider_State_Moving;856}857}858859void HeavyRider_State_Turning(void)860{861RSDK_THIS(HeavyRider);862863RSDK.ProcessAnimation(&self->mainAnimator);864RSDK.ProcessAnimation(&self->fireballAnimator);865866RSDK.ProcessObjectMovement(self, &HeavyRider->outerBox, &HeavyRider->innerBox);867868if (self->onGround) {869if (self->velocity.y <= 0x20000) {870if (!(Zone->timer & 3))871RSDK.PlaySfx(HeavyRider->sfxSkid, false, 255);872873self->velocity.y = 0;874}875else {876self->velocity.y = (self->velocity.y >> 1) - self->velocity.y;877878if ((self->velocity.y >> 1) - self->velocity.y <= 0)879self->onGround = false;880else881self->velocity.y = 0;882}883}884else {885self->velocity.y += 0x3800;886}887888if (self->direction) {889if (self->groundVel > -0x40000)890self->groundVel -= 0x4000;891}892else {893if (self->groundVel < 0x40000)894self->groundVel += 0x4000;895}896897if (self->mainAnimator.frameID == self->mainAnimator.frameCount - 1) {898RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 0, &self->mainAnimator, true, 0);899self->direction ^= FLIP_X;900HeavyRider->spikeBallState = HEAVYRIDER_SPIKEBALL_SWINGING;901self->state = HeavyRider_State_Moving;902}903904HeavyRider->spikeBallAngle += 4;905906HeavyRider_CheckObjectCollisions();907}908909void HeavyRider_State_Destroyed(void)910{911RSDK_THIS(HeavyRider);912913RSDK.ProcessAnimation(&self->mainAnimator);914RSDK.ProcessAnimation(&self->thrustAnimator);915916HeavyRider_Explode();917918if (--self->timer <= 0) {919EntityHeavyRider *child = CREATE_ENTITY(HeavyRider, INT_TO_VOID(HEAVYRIDER_JIMMY), self->position.x, self->position.y);920child->direction = self->direction;921child->onGround = false;922child->tileCollisions = TILECOLLISION_DOWN;923child->collisionLayers = (1 << Zone->fgLayer[0]) | (1 << Zone->fgLayer[1]);924child->collisionPlane = 0;925self->velocity.y = -0x60000;926927if (self->direction == FLIP_NONE)928self->velocity.x = -0x20000;929else930self->velocity.x = 0x20000;931932RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 3, &self->mainAnimator, true, 0);933RSDK.SetSpriteAnimation(-1, 0, &self->thrustAnimator, true, 0);934935self->state = HeavyRider_State_Finish;936}937}938939void HeavyRider_State_Finish(void)940{941RSDK_THIS(HeavyRider);942943if (++self->timer < 45)944HeavyRider_Explode();945946RSDK.ProcessAnimation(&self->mainAnimator);947RSDK.ProcessAnimation(&self->thrustAnimator);948949self->position.x += self->velocity.x;950self->position.y += self->velocity.y;951self->velocity.y += 0x3800;952953if (self->velocity.y > 0)954self->drawGroup = Zone->objectDrawGroup[1];955956if (!RSDK.CheckOnScreen(self, &self->updateRange)) {957Music_TransitionTrack(TRACK_STAGE, 0.0125);958959self->position.x = (ScreenInfo->position.x + ScreenInfo->center.x) << 16;960self->position.y = (ScreenInfo->position.y - 48) << 16;961962EntityEggPrison *prison = CREATE_ENTITY(EggPrison, INT_TO_VOID(EGGPRISON_FLYING), self->position.x, self->position.y);963prison->isPermanent = true;964prison->drawGroup = Zone->objectDrawGroup[1];965966destroyEntity(self);967}968}969970void HeavyRider_Draw_Boss(void)971{972RSDK_THIS(HeavyRider);973974if (HeavyRider->wheelExtendState != HEAVYRIDER_WHEEL_NONE) {975Vector2 drawPos = self->position;976drawPos.y += 2 * HeavyRider->wheelLength;977self->wheelieAnimator.frameID = 3;978RSDK.DrawSprite(&self->wheelieAnimator, &drawPos, false);979980self->wheelieAnimator.frameID = 2;981RSDK.DrawSprite(&self->wheelieAnimator, &drawPos, false);982983drawPos.y -= HeavyRider->wheelLength;984self->wheelieAnimator.frameID = 1;985RSDK.DrawSprite(&self->wheelieAnimator, &drawPos, false);986}987988int32 drawX = 0;989if (self->direction) {990if (self->mainAnimator.animationID == 2 && self->mainAnimator.frameID)991drawX = self->position.x + 0x160000;992else993drawX = self->position.x - 0xE0000;994}995else if (self->mainAnimator.animationID == 2 && self->mainAnimator.frameID)996drawX = self->position.x - 0x160000;997else998drawX = self->position.x + 0xE0000;9991000int32 drawY = self->position.y - 0x210000;1001Vector2 drawPos;1002drawPos.x = drawX;1003drawPos.y = drawY;10041005if (HeavyRider->spikeBallState != HEAVYRIDER_SPIKEBALL_NONE) {1006if (HeavyRider->spikeBallState <= HEAVYRIDER_SPIKEBALL_UNUSED3) {1007if (HeavyRider->spikeBallAngle >= 0x80) {1008self->spikeBallAnimator.frameID = 2;1009drawPos.x = drawX + 0x4400 * RSDK.Cos256(HeavyRider->spikeBallAngle);1010drawPos.y = drawY + 0x880 * RSDK.Sin256(2 * HeavyRider->spikeBallAngle);1011self->drawFX |= FX_SCALE;1012self->scale.x = (RSDK.Sin256(HeavyRider->spikeBallAngle) >> 2) + 0x200;1013self->scale.y = (RSDK.Sin256(HeavyRider->spikeBallAngle) >> 2) + 0x200;1014RSDK.DrawSprite(&self->spikeBallAnimator, &drawPos, false);10151016self->drawFX &= ~FX_SCALE;1017HeavyRider->spikeBallPos = drawPos;10181019self->spikeBallAnimator.frameID = 1;1020int32 angle = 0x4400;1021for (int32 i = 0; i < 8; ++i) {1022angle -= 0x800;1023drawPos.x = drawX + angle * RSDK.Cos256(HeavyRider->spikeBallAngle);1024drawPos.y = drawY + (angle >> 3) * RSDK.Sin256(2 * HeavyRider->spikeBallAngle);1025RSDK.DrawSprite(&self->spikeBallAnimator, &drawPos, false);1026}1027}1028}1029else {1030if (HeavyRider->spikeBallState == HEAVYRIDER_SPIKEBALL_THROWN) {1031self->spikeBallAnimator.frameID = 2;1032RSDK.DrawSprite(&self->spikeBallAnimator, &HeavyRider->spikeBallPos, false);1033}1034}1035}10361037if (HeavyRider->invincibilityTimer & 1)1038RSDK.SetPaletteEntry(0, 128, 0xE0E0E0);10391040RSDK.DrawSprite(&self->mainAnimator, NULL, false);10411042RSDK.SetPaletteEntry(0, 128, 0x000000);10431044RSDK.DrawSprite(&self->thrustAnimator, NULL, false);10451046switch (HeavyRider->spikeBallState) {1047default:1048case HEAVYRIDER_SPIKEBALL_NONE:1049case HEAVYRIDER_SPIKEBALL_THROWN: RSDK.DrawSprite(&self->fireballAnimator, NULL, false); break;10501051case HEAVYRIDER_SPIKEBALL_SWINGING:1052case HEAVYRIDER_SPIKEBALL_UNUSED1:1053case HEAVYRIDER_SPIKEBALL_UNUSED2:1054case HEAVYRIDER_SPIKEBALL_UNUSED3:1055if (HeavyRider->spikeBallAngle < 0x80) {1056self->spikeBallAnimator.frameID = 1;1057int32 angle = 0x400;1058for (int32 i = 0; i < 8; ++i) {1059angle += 0x800;1060drawPos.x = drawX + angle * RSDK.Cos256(HeavyRider->spikeBallAngle);1061drawPos.y = drawY + (angle >> 3) * RSDK.Sin256(2 * HeavyRider->spikeBallAngle);1062RSDK.DrawSprite(&self->spikeBallAnimator, &drawPos, false);1063}10641065self->spikeBallAnimator.frameID = 2;1066drawPos.x = drawX + angle * RSDK.Cos256(HeavyRider->spikeBallAngle);1067drawPos.y = drawY + (angle >> 3) * RSDK.Sin256(2 * HeavyRider->spikeBallAngle);1068self->drawFX |= FX_SCALE;1069self->scale.x = (RSDK.Sin256(HeavyRider->spikeBallAngle) >> 2) + 0x200;1070self->scale.y = (RSDK.Sin256(HeavyRider->spikeBallAngle) >> 2) + 0x200;1071RSDK.DrawSprite(&self->spikeBallAnimator, &drawPos, false);10721073self->drawFX &= ~FX_SCALE;1074HeavyRider->spikeBallPos = drawPos;1075}10761077RSDK.DrawSprite(&self->fireballAnimator, NULL, false);1078break;10791080case HEAVYRIDER_SPIKEBALL_UNUSED4:1081case HEAVYRIDER_SPIKEBALL_UNUSED5:1082RSDK.DrawSprite(&self->spikeBallAnimator, &HeavyRider->spikeBallPos, false);1083RSDK.DrawSprite(&self->fireballAnimator, NULL, false);1084break;1085}1086}10871088void HeavyRider_State_PlaneSwitch(void)1089{1090RSDK_THIS(HeavyRider);10911092if (self->affectPlayer) {1093foreach_active(Player, player)1094{1095if (abs(player->position.x - self->position.x) < 0x100000 && abs(player->position.y - self->position.y) < self->size << 19) {1096if (player->velocity.x >= 0) {1097player->collisionPlane = (self->flags >> 3) & 1;10981099if (!(self->flags & 4)) {1100player->collisionLayers = 1 << Zone->fgLayer[0];1101Zone->collisionLayers = 1 << Zone->fgLayer[0];1102}1103else {1104player->collisionLayers = 1 << Zone->fgLayer[1];1105Zone->collisionLayers = 1 << Zone->fgLayer[1];1106}1107}1108else {1109player->collisionPlane = (self->flags >> 1) & 1;11101111if (!(self->flags & 1)) {1112player->collisionLayers = 1 << Zone->fgLayer[0];1113Zone->collisionLayers = 1 << Zone->fgLayer[0];1114}1115else {1116player->collisionLayers = 1 << Zone->fgLayer[1];1117Zone->collisionLayers = 1 << Zone->fgLayer[1];1118}1119}1120}1121}1122}11231124self->visible = DebugMode->debugActive;1125}11261127void HeavyRider_Draw_PlaneSwitch(void)1128{1129RSDK_THIS(HeavyRider);11301131Vector2 drawPos = self->position;1132drawPos.x -= 0x80000;1133drawPos.y -= self->size << 19;1134Zone_RotateOnPivot(&drawPos, &self->position, self->angle);11351136self->mainAnimator.frameID = self->flags & 3;1137for (int32 i = 0; i < self->size; ++i) {1138RSDK.DrawSprite(&self->mainAnimator, &drawPos, 0);1139drawPos.x += RSDK.Sin256(self->angle) << 12;1140drawPos.y += RSDK.Cos256(self->angle) << 12;1141}11421143drawPos.x = self->position.x + TO_FIXED(8);1144drawPos.y = self->position.y - (self->size << 19);1145Zone_RotateOnPivot(&drawPos, &self->position, self->angle);11461147self->mainAnimator.frameID = (self->flags >> 2) & 3;1148for (int32 i = 0; i < self->size; ++i) {1149RSDK.DrawSprite(&self->mainAnimator, &drawPos, 0);1150drawPos.x += RSDK.Sin256(self->angle) << 12;1151drawPos.y += RSDK.Cos256(self->angle) << 12;1152}1153}11541155void HeavyRider_State_ChargeTrigger(void)1156{1157RSDK_THIS(HeavyRider);11581159self->visible = DebugMode->debugActive;1160}11611162void HeavyRider_Draw_Simple(void)1163{1164RSDK_THIS(HeavyRider);11651166RSDK.DrawSprite(&self->mainAnimator, NULL, false);1167}11681169void HeavyRider_State_Fireball(void)1170{1171RSDK_THIS(HeavyRider);11721173RSDK.ProcessAnimation(&self->mainAnimator);11741175if (self->mainAnimator.frameID == self->mainAnimator.frameCount - 1) {1176destroyEntity(self);1177}1178else {1179foreach_active(Player, player)1180{1181if (Player_CheckCollisionTouch(player, self, &HeavyRider->hitboxFireball)) {1182Player_ElementHurt(player, self, SHIELD_FIRE);1183}1184}1185}1186}11871188void HeavyRider_State_Puff(void)1189{1190RSDK_THIS(HeavyRider);11911192RSDK.ProcessAnimation(&self->mainAnimator);11931194if (self->mainAnimator.frameID == self->mainAnimator.frameCount - 1)1195destroyEntity(self);1196}11971198void HeavyRider_StateJimmy_Idle(void)1199{1200RSDK_THIS(HeavyRider);12011202RSDK.ProcessAnimation(&self->mainAnimator);12031204if (++self->timer >= 45) {1205self->timer = 38;1206HeavyRider->chargeTimer = 0;1207self->state = HeavyRider_StateJimmy_RevUp;1208}1209}12101211void HeavyRider_StateJimmy_RevRelease(void)1212{1213RSDK_THIS(HeavyRider);12141215RSDK.ProcessAnimation(&self->mainAnimator);1216RSDK.ProcessAnimation(&self->thrustAnimator);12171218RSDK.ProcessObjectMovement(self, &HeavyRider->outerBox, &HeavyRider->innerBox);12191220if (self->onGround) {1221if (self->velocity.y <= 0x20000)1222self->velocity.y = 0;1223else1224self->velocity.y = (self->velocity.y >> 1) - self->velocity.y;1225}1226else {1227self->velocity.y += 0x3800;1228}12291230if (self->direction)1231self->groundVel -= 0x8000;1232else1233self->groundVel += 0x8000;12341235if (!RSDK.CheckOnScreen(self, &self->updateRange))1236destroyEntity(self);1237}12381239void HeavyRider_StateJimmy_RevUp(void)1240{1241RSDK_THIS(HeavyRider);12421243float chargeSpeeds[] = { 1.0, 1.1926451, 1.4150375, 1.6780719, 2.0 };12441245RSDK.ProcessAnimation(&self->mainAnimator);12461247if (--self->timer > 0) {1248if (!(self->timer & 7)) {1249int32 channel = RSDK.PlaySfx(HeavyRider->sfxCharge, false, 255);1250RSDK.SetChannelAttributes(channel, 1.0, 0.0, chargeSpeeds[HeavyRider->chargeTimer]);1251++HeavyRider->chargeTimer;1252}1253}1254else {1255RSDK.PlaySfx(HeavyRider->sfxLaunch, false, 255);1256self->timer = 30;1257self->state = HeavyRider_StateJimmy_RevRelease;12581259if (self->direction == FLIP_NONE)1260self->groundVel = 0x40000;1261else1262self->groundVel = -0x40000;1263}1264}12651266#if GAME_INCLUDE_EDITOR1267void HeavyRider_EditorDraw(void)1268{1269RSDK_THIS(HeavyRider);12701271switch (self->type) {1272case HEAVYRIDER_RIDER:1273RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 0, &self->mainAnimator, true, 0);1274RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 5, &self->thrustAnimator, true, 0);1275RSDK.SetSpriteAnimation(HeavyRider->aniFrames, 7, &self->spikeBallAnimator, true, 0);1276RSDK.SetSpriteAnimation(-1, 0, &self->fireballAnimator, true, 0);12771278self->updateRange.x = 0x800000;1279self->updateRange.y = 0x800000;12801281HeavyRider->spikeBallAngle = 0x80;1282HeavyRider->spikeBallState = HEAVYRIDER_SPIKEBALL_SWINGING;1283HeavyRider->spawnDelay = 16;1284HeavyRider->spawnFireballs = false;1285HeavyRider->startY = self->position.y;1286HeavyRider->curAttack = HEAVYRIDER_ATK_RIDING_SCREENBOUNDS;1287HeavyRider->wheelExtendState = HEAVYRIDER_WHEEL_NONE;1288HeavyRider->wheelLength = 0;12891290self->stateDraw = HeavyRider_Draw_Boss;1291break;12921293case HEAVYRIDER_PLANESWITCH:1294RSDK.SetSpriteAnimation(PlaneSwitch->aniFrames, 0, &self->mainAnimator, true, 0);12951296self->updateRange.x = 0x200000;1297self->updateRange.y = (self->size + 0x400) << 11;1298self->stateDraw = HeavyRider_Draw_PlaneSwitch;1299break;13001301case HEAVYRIDER_FORCECHARGE_LEFT:1302case HEAVYRIDER_FORCECHARGE_RIGHT:13031304RSDK.SetSpriteAnimation(PlaneSwitch->aniFrames, 0, &self->mainAnimator, true, ((self->type - 2) >> 1) + 4);13051306self->updateRange.x = 0x200000;1307self->updateRange.y = 0x200000;1308self->state = HeavyRider_State_ChargeTrigger;1309self->stateDraw = HeavyRider_Draw_Simple;1310break;13111312default: break;1313}13141315StateMachine_Run(self->stateDraw);13161317if (self->type == HEAVYRIDER_RIDER && showGizmos()) {1318RSDK_DRAWING_OVERLAY(true);1319DrawHelpers_DrawArenaBounds(-WIDE_SCR_XSIZE, -SCREEN_YSIZE, WIDE_SCR_XSIZE, SCREEN_YSIZE, 1 | 0 | 4 | 0, 0x00C0F0);1320RSDK_DRAWING_OVERLAY(false);1321}1322}13231324void HeavyRider_EditorLoad(void)1325{1326HeavyRider->aniFrames = RSDK.LoadSpriteAnimation("LRZ3/HeavyRider.bin", SCOPE_STAGE);13271328// I dont want clang format to do its magic here since I want a specific formatting so1329// clang-format off1330RSDK_ACTIVE_VAR(HeavyRider, flags);1331RSDK_ENUM_VAR("Plane R: A, Draw Group R: Low, Plane L: A, Draw Group L: Low ", PLANESWITCH_PLANEA_RIGHT | PLANESWITCH_LOWLAYER_RIGHT | PLANESWITCH_PLANEA_LEFT | PLANESWITCH_LOWLAYER_LEFT);1332RSDK_ENUM_VAR("Plane R: A, Draw Group R: Low, Plane L: A, Draw Group L: High", PLANESWITCH_PLANEA_RIGHT | PLANESWITCH_LOWLAYER_RIGHT | PLANESWITCH_PLANEA_LEFT | PLANESWITCH_HIGHLAYER_LEFT);1333RSDK_ENUM_VAR("Plane R: A, Draw Group R: Low, Plane L: B, Draw Group L: Low ", PLANESWITCH_PLANEA_RIGHT | PLANESWITCH_LOWLAYER_RIGHT | PLANESWITCH_PLANEB_LEFT | PLANESWITCH_LOWLAYER_LEFT);1334RSDK_ENUM_VAR("Plane R: A, Draw Group R: Low, Plane L: B, Draw Group L: High", PLANESWITCH_PLANEA_RIGHT | PLANESWITCH_LOWLAYER_RIGHT | PLANESWITCH_PLANEB_LEFT | PLANESWITCH_HIGHLAYER_LEFT);1335RSDK_ENUM_VAR("Plane R: A, Draw Group R: High, Plane L: A, Draw Group L: Low ", PLANESWITCH_PLANEA_RIGHT | PLANESWITCH_HIGHLAYER_RIGHT | PLANESWITCH_PLANEA_LEFT | PLANESWITCH_LOWLAYER_LEFT);1336RSDK_ENUM_VAR("Plane R: A, Draw Group R: High, Plane L: A, Draw Group L: High", PLANESWITCH_PLANEA_RIGHT | PLANESWITCH_HIGHLAYER_RIGHT | PLANESWITCH_PLANEA_LEFT | PLANESWITCH_HIGHLAYER_LEFT);1337RSDK_ENUM_VAR("Plane R: A, Draw Group R: High, Plane L: B, Draw Group L: Low ", PLANESWITCH_PLANEA_RIGHT | PLANESWITCH_HIGHLAYER_RIGHT | PLANESWITCH_PLANEB_LEFT | PLANESWITCH_LOWLAYER_LEFT);1338RSDK_ENUM_VAR("Plane R: A, Draw Group R: High, Plane L: B, Draw Group L: High", PLANESWITCH_PLANEA_RIGHT | PLANESWITCH_HIGHLAYER_RIGHT | PLANESWITCH_PLANEB_LEFT | PLANESWITCH_HIGHLAYER_LEFT);1339RSDK_ENUM_VAR("Plane R: B, Draw Group R: Low, Plane L: A, Draw Group L: Low ", PLANESWITCH_PLANEB_RIGHT | PLANESWITCH_LOWLAYER_RIGHT | PLANESWITCH_PLANEA_LEFT | PLANESWITCH_LOWLAYER_LEFT);1340RSDK_ENUM_VAR("Plane R: B, Draw Group R: Low, Plane L: A, Draw Group L: High", PLANESWITCH_PLANEB_RIGHT | PLANESWITCH_LOWLAYER_RIGHT | PLANESWITCH_PLANEA_LEFT | PLANESWITCH_HIGHLAYER_LEFT);1341RSDK_ENUM_VAR("Plane R: B, Draw Group R: Low, Plane L: B, Draw Group L: Low ", PLANESWITCH_PLANEB_RIGHT | PLANESWITCH_LOWLAYER_RIGHT | PLANESWITCH_PLANEB_LEFT | PLANESWITCH_LOWLAYER_LEFT);1342RSDK_ENUM_VAR("Plane R: B, Draw Group R: Low, Plane L: B, Draw Group L: High", PLANESWITCH_PLANEB_RIGHT | PLANESWITCH_LOWLAYER_RIGHT | PLANESWITCH_PLANEB_LEFT | PLANESWITCH_HIGHLAYER_LEFT);1343RSDK_ENUM_VAR("Plane R: B, Draw Group R: High, Plane L: A, Draw Group L: Low ", PLANESWITCH_PLANEB_RIGHT | PLANESWITCH_HIGHLAYER_RIGHT | PLANESWITCH_PLANEA_LEFT | PLANESWITCH_LOWLAYER_LEFT);1344RSDK_ENUM_VAR("Plane R: B, Draw Group R: High, Plane L: A, Draw Group L: High", PLANESWITCH_PLANEB_RIGHT | PLANESWITCH_HIGHLAYER_RIGHT | PLANESWITCH_PLANEA_LEFT | PLANESWITCH_HIGHLAYER_LEFT);1345RSDK_ENUM_VAR("Plane R: B, Draw Group R: High, Plane L: B, Draw Group L: Low ", PLANESWITCH_PLANEB_RIGHT | PLANESWITCH_HIGHLAYER_RIGHT | PLANESWITCH_PLANEB_LEFT | PLANESWITCH_LOWLAYER_LEFT);1346RSDK_ENUM_VAR("Plane R: B, Draw Group R: High, Plane L: B, Draw Group L: High", PLANESWITCH_PLANEB_RIGHT | PLANESWITCH_HIGHLAYER_RIGHT | PLANESWITCH_PLANEB_LEFT | PLANESWITCH_HIGHLAYER_LEFT);1347// clang-format on13481349RSDK_ACTIVE_VAR(HeavyRider, type);1350RSDK_ENUM_VAR("Rider", HEAVYRIDER_RIDER);1351RSDK_ENUM_VAR("PlaneSwitch", HEAVYRIDER_PLANESWITCH);1352RSDK_ENUM_VAR("Charge Trigger (Left)", HEAVYRIDER_FORCECHARGE_LEFT);1353RSDK_ENUM_VAR("Charge Trigger (Right)", HEAVYRIDER_FORCECHARGE_RIGHT);1354}1355#endif13561357void HeavyRider_Serialize(void)1358{1359RSDK_EDITABLE_VAR(HeavyRider, VAR_UINT8, type);1360RSDK_EDITABLE_VAR(HeavyRider, VAR_ENUM, flags);1361RSDK_EDITABLE_VAR(HeavyRider, VAR_ENUM, size);1362RSDK_EDITABLE_VAR(HeavyRider, VAR_BOOL, affectPlayer);1363}1364136513661367