Path: blob/master/SonicMania/Objects/FBZ/FBZMissile.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: FBZMissile Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectFBZMissile *FBZMissile;1011void FBZMissile_Update(void)12{13RSDK_THIS(FBZMissile);1415StateMachine_Run(self->state);16}1718void FBZMissile_LateUpdate(void) {}1920void FBZMissile_StaticUpdate(void) {}2122void FBZMissile_Draw(void)23{24RSDK_THIS(FBZMissile);2526StateMachine_Run(self->stateDraw);2728RSDK.DrawSprite(&self->animator, NULL, false);29}3031void FBZMissile_Create(void *data)32{33RSDK_THIS(FBZMissile);3435if (self->type != FBZMISSILE_HULL && !self->interval)36self->interval = -16;3738self->drawFX = FX_FLIP;39if (!SceneInfo->inEditor) {40self->active = ACTIVE_BOUNDS;41self->visible = true;42self->drawGroup = Zone->objectDrawGroup[0];43self->updateRange.x = 0x800000;44self->updateRange.y = 0x800000;45if (data)46self->type = VOID_TO_INT(data);4748switch (self->type) {49case FBZMISSILE_LAUNCHER_V:50RSDK.SetSpriteAnimation(FBZMissile->aniFrames, 0, &self->animator, true, 0);51self->direction *= FLIP_Y;52self->drawGroup = Zone->objectDrawGroup[1];53self->state = FBZMissile_StateLauncherV_Delay;54break;5556case FBZMISSILE_LAUNCHER_H:57RSDK.SetSpriteAnimation(FBZMissile->aniFrames, 1, &self->animator, true, 0);58self->state = FBZMissile_StateLauncherH_Fire;59break;6061case FBZMISSILE_HULL:62RSDK.SetSpriteAnimation(FBZMissile->aniFrames, 3, &self->animator, true, 0);63self->drawGroup = Zone->objectDrawGroup[1];64self->timer = self->interval;65self->state = FBZMissile_State_Hull;66break;6768case FBZMISSILE_VERTICAL:69RSDK.SetSpriteAnimation(FBZMissile->aniFrames, 2, &self->animator, true, 0);70self->state = FBZMissile_StateVertical_Rise;71break;7273case FBZMISSILE_HORIZONTAL:74RSDK.SetSpriteAnimation(FBZMissile->aniFrames, 1, &self->animator, true, 0);75self->state = FBZMissile_StateHorizontal_Move;76break;7778default: break;79}80}81}8283void FBZMissile_StageLoad(void)84{85FBZMissile->aniFrames = RSDK.LoadSpriteAnimation("FBZ/Missile.bin", SCOPE_STAGE);8687FBZMissile->hitboxMissileH.left = -16;88FBZMissile->hitboxMissileH.top = -3;89FBZMissile->hitboxMissileH.right = 16;90FBZMissile->hitboxMissileH.bottom = 3;9192FBZMissile->hitboxMissileV.left = -5;93FBZMissile->hitboxMissileV.top = -8;94FBZMissile->hitboxMissileV.right = 5;95FBZMissile->hitboxMissileV.bottom = 8;9697FBZMissile->hitboxHull.left = -32;98FBZMissile->hitboxHull.top = -8;99FBZMissile->hitboxHull.right = 32;100FBZMissile->hitboxHull.bottom = 8;101102FBZMissile->sfxPush = RSDK.GetSfx("Stage/Push.wav");103FBZMissile->sfxPush2 = RSDK.GetSfx("Stage/Push.wav");104FBZMissile->sfxExplosion = RSDK.GetSfx("Stage/Explosion2.wav");105}106107void FBZMissile_StateLauncherV_Delay(void)108{109RSDK_THIS(FBZMissile);110111if (!((Zone->timer + self->intervalOffset) % self->interval)) {112self->timer = 42;113self->state = FBZMissile_StateLauncherV_Launch;114}115116if (!(Zone->timer & 1)) {117if (self->animator.frameID > 0)118self->animator.frameID--;119}120}121122void FBZMissile_StateLauncherV_Launch(void)123{124RSDK_THIS(FBZMissile);125126if (!(self->timer & 1)) {127if (self->animator.frameID < 3)128self->animator.frameID++;129}130131switch (--self->timer) {132case 1: self->state = FBZMissile_StateLauncherV_Delay; break;133134case 9:135case 25:136case 41: {137RSDK.PlaySfx(FBZMissile->sfxPush, false, 255);138EntityFBZMissile *missile = CREATE_ENTITY(FBZMissile, INT_TO_VOID(FBZMISSILE_VERTICAL), self->position.x, self->position.y);139missile->isPermanent = true;140missile->velocity.y = -0x60000;141missile->drawGroup = self->drawGroup - 1;142missile->velocity.x = FBZMissile->velocities[FBZMissile->velocityID++];143FBZMissile->velocityID &= 7;144break;145}146147default: break;148}149}150151void FBZMissile_StateLauncherH_Fire(void)152{153RSDK_THIS(FBZMissile);154155if (!((Zone->timer + self->intervalOffset) % self->interval)) {156RSDK.PlaySfx(FBZMissile->sfxPush2, false, 255);157158EntityFBZMissile *missile = CREATE_ENTITY(FBZMissile, INT_TO_VOID(FBZMISSILE_HORIZONTAL), self->position.x, self->position.y);159missile->drawGroup = self->drawGroup;160missile->direction = self->direction;161if (self->direction) {162missile->velocity.x = 0x40000;163self->position.x -= 500000;164}165else {166missile->velocity.x = -0x40000;167self->position.x += 500000;168}169170self->timer = 62;171self->state = FBZMissile_StateLauncherH_Prepare;172}173}174175void FBZMissile_StateLauncherH_Prepare(void)176{177RSDK_THIS(FBZMissile);178179if (--self->timer > 0) {180if (self->direction)181self->position.x += 0x2000;182else183self->position.x -= 0x2000;184}185else {186self->state = FBZMissile_StateLauncherH_Fire;187}188}189190void FBZMissile_StateVertical_Rise(void)191{192RSDK_THIS(FBZMissile);193194self->position.y += self->velocity.y;195self->velocity.y += 0x1800;196197if (self->velocity.y >= 0) {198self->drawGroup = Zone->objectDrawGroup[0];199self->state = FBZMissile_StateVertical_Fall;200}201202if (self->velocity.y > -0x1D000)203self->position.x += self->velocity.x;204205if (!RSDK.CheckOnScreen(self, NULL))206destroyEntity(self);207}208209void FBZMissile_StateVertical_Fall(void)210{211RSDK_THIS(FBZMissile);212213self->position.y += self->velocity.y;214self->velocity.y += 0x1000;215216if (!self->timer) {217if (self->animator.frameID < 5)218self->animator.frameID++;219}220221self->timer = (self->timer - 1) & 1;222if (self->velocity.y < 0x1D000)223self->position.x += self->velocity.x;224225if (RSDK.CheckOnScreen(self, NULL)) {226foreach_active(Player, player)227{228if (Player_CheckCollisionTouch(player, self, &FBZMissile->hitboxMissileV)) {229#if MANIA_USE_PLUS230if (!Player_CheckMightyUnspin(player, 0x300, 2, &player->uncurlTimer))231#endif232Player_Hurt(player, self);233234CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_BOSSPUFF), self->position.x, self->position.y + 0x30000)->drawGroup =235Zone->objectDrawGroup[1];236RSDK.PlaySfx(FBZMissile->sfxExplosion, false, 255);237destroyEntity(self);238239foreach_break;240}241}242243if (RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, 0xC0000, false)) {244CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_BOSSPUFF), self->position.x, self->position.y + 0x30000)->drawGroup =245Zone->objectDrawGroup[1];246RSDK.PlaySfx(FBZMissile->sfxExplosion, false, 255);247destroyEntity(self);248}249else {250foreach_active(FBZMissile, missile)251{252if (missile->type == FBZMISSILE_HULL253&& RSDK.CheckObjectCollisionTouchBox(missile, &FBZMissile->hitboxHull, self, &FBZMissile->hitboxMissileV)) {254if (--missile->timer <= 0) {255destroyEntity(missile);256RSDK.PlaySfx(Player->sfxRelease, false, 255);257}258259CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_BOSSPUFF), self->position.x, self->position.y + 0x30000)->drawGroup =260Zone->objectDrawGroup[1];261RSDK.PlaySfx(FBZMissile->sfxExplosion, false, 255);262destroyEntity(self);263}264}265}266}267else {268destroyEntity(self);269}270}271272void FBZMissile_StateHorizontal_Move(void)273{274RSDK_THIS(FBZMissile);275276self->position.x += self->velocity.x;277278if (RSDK.CheckOnScreen(self, NULL)) {279RSDK.ProcessAnimation(&self->animator);280281foreach_active(Player, player)282{283if (Player_CheckCollisionTouch(player, self, &FBZMissile->hitboxMissileH)) {284#if MANIA_USE_PLUS285if (!Player_CheckMightyUnspin(player, 0x300, 2, &player->uncurlTimer))286#endif287Player_Hurt(player, self);288}289}290}291else {292destroyEntity(self);293}294}295296void FBZMissile_State_Hull(void)297{298RSDK_THIS(FBZMissile);299300self->position.x += self->velocity.x;301RSDK.ProcessAnimation(&self->animator);302303#if MANIA_USE_PLUS304foreach_active(Player, player)305{306int32 velY = player->velocity.y;307if (Player_CheckCollisionBox(player, self, &FBZMissile->hitboxHull) && player->state == Player_State_MightyHammerDrop && !player->sidekick) {308RSDK.PlaySfx(FBZMissile->sfxExplosion, false, 255);309RSDK.PlaySfx(Player->sfxRelease, false, 255);310311player->velocity.y = velY - 0x10000;312player->onGround = false;313314destroyEntity(self);315foreach_break;316}317}318#endif319}320321#if GAME_INCLUDE_EDITOR322void FBZMissile_EditorDraw(void)323{324RSDK_THIS(FBZMissile);325326int32 dir = self->direction;327switch (self->type) {328case FBZMISSILE_LAUNCHER_V:329RSDK.SetSpriteAnimation(FBZMissile->aniFrames, 0, &self->animator, true, 0);330self->direction *= FLIP_Y;331self->drawGroup = Zone->objectDrawGroup[1];332break;333334case FBZMISSILE_LAUNCHER_H: RSDK.SetSpriteAnimation(FBZMissile->aniFrames, 1, &self->animator, true, 0); break;335336case FBZMISSILE_HULL:337RSDK.SetSpriteAnimation(FBZMissile->aniFrames, 3, &self->animator, true, 0);338self->drawGroup = Zone->objectDrawGroup[1];339break;340341default: break;342}343344FBZMissile_Draw();345346self->direction = dir;347}348349void FBZMissile_EditorLoad(void)350{351FBZMissile->aniFrames = RSDK.LoadSpriteAnimation("FBZ/Missile.bin", SCOPE_STAGE);352353RSDK_ACTIVE_VAR(FBZMissile, type);354RSDK_ENUM_VAR("Launcher (Vertical)", FBZMISSILE_LAUNCHER_V);355RSDK_ENUM_VAR("Launcher (Horizontal)", FBZMISSILE_LAUNCHER_H);356RSDK_ENUM_VAR("Hull", FBZMISSILE_HULL);357358RSDK_ACTIVE_VAR(FBZMissile, direction);359RSDK_ENUM_VAR("Up/Left", FLIP_NONE);360RSDK_ENUM_VAR("Down/Right", FLIP_X);361}362#endif363364void FBZMissile_Serialize(void)365{366RSDK_EDITABLE_VAR(FBZMissile, VAR_ENUM, type);367RSDK_EDITABLE_VAR(FBZMissile, VAR_UINT8, interval);368RSDK_EDITABLE_VAR(FBZMissile, VAR_UINT8, intervalOffset);369RSDK_EDITABLE_VAR(FBZMissile, VAR_UINT8, direction);370}371372373