Path: blob/master/SonicMania/Objects/AIZ/Bloominator.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Bloominator Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if MANIA_USE_PLUS10ObjectBloominator *Bloominator;1112void Bloominator_Update(void)13{14RSDK_THIS(Bloominator);15StateMachine_Run(self->state);16}1718void Bloominator_LateUpdate(void) {}1920void Bloominator_StaticUpdate(void) {}2122void Bloominator_Draw(void)23{24RSDK_THIS(Bloominator);25RSDK.DrawSprite(&self->animator, NULL, false);26}2728void Bloominator_Create(void *data)29{30RSDK_THIS(Bloominator);31self->visible = true;32self->drawFX |= FX_FLIP;33self->drawGroup = Zone->objectDrawGroup[0];34self->active = ACTIVE_BOUNDS;35self->updateRange.x = 0x800000;36self->updateRange.y = 0x800000;3738if (data) {39--self->drawGroup;40RSDK.SetSpriteAnimation(Bloominator->aniFrames, 2, &self->animator, true, 0);41self->state = Bloominator_State_Spikeball;42}43else {44RSDK.SetSpriteAnimation(Bloominator->aniFrames, 0, &self->animator, true, 0);45self->state = Bloominator_State_Init;46}47}4849void Bloominator_StageLoad(void)50{51if (RSDK.CheckSceneFolder("AIZ"))52Bloominator->aniFrames = RSDK.LoadSpriteAnimation("AIZ/Bloominator.bin", SCOPE_STAGE);5354Bloominator->hitboxBadnik.left = -12;55Bloominator->hitboxBadnik.top = -20;56Bloominator->hitboxBadnik.right = 12;57Bloominator->hitboxBadnik.bottom = 20;5859Bloominator->hitboxProjectile.left = -4;60Bloominator->hitboxProjectile.top = -4;61Bloominator->hitboxProjectile.right = 4;62Bloominator->hitboxProjectile.bottom = 4;6364Bloominator->sfxShot = RSDK.GetSfx("Stage/Shot.wav");6566DEBUGMODE_ADD_OBJ(Bloominator);67}6869void Bloominator_DebugDraw(void)70{71RSDK.SetSpriteAnimation(Bloominator->aniFrames, 0, &DebugMode->animator, true, 0);72RSDK.DrawSprite(&DebugMode->animator, NULL, false);73}7475void Bloominator_DebugSpawn(void)76{77RSDK_THIS(Bloominator);7879CREATE_ENTITY(Bloominator, NULL, self->position.x, self->position.y);80}8182void Bloominator_CheckPlayerCollisions(void)83{84RSDK_THIS(Bloominator);8586foreach_active(Player, player)87{88if (Player_CheckBadnikTouch(player, self, &Bloominator->hitboxBadnik))89Player_CheckBadnikBreak(player, self, true);90}91}9293void Bloominator_CheckOffScreen(void)94{95RSDK_THIS(Bloominator);9697if (!RSDK.CheckOnScreen(self, NULL))98Bloominator_Create(NULL);99}100101void Bloominator_State_Init(void)102{103RSDK_THIS(Bloominator);104105self->active = ACTIVE_NORMAL;106self->timer = 0;107108self->state = Bloominator_State_Idle;109Bloominator_State_Idle();110}111112void Bloominator_State_Idle(void)113{114RSDK_THIS(Bloominator);115116if (self->onScreen) {117if (++self->timer >= 60) {118self->timer = 0;119RSDK.SetSpriteAnimation(Bloominator->aniFrames, 1, &self->animator, true, 0);120self->state = Bloominator_State_Firing;121}122}123124RSDK.ProcessAnimation(&self->animator);125126Bloominator_CheckPlayerCollisions();127Bloominator_CheckOffScreen();128}129130void Bloominator_State_Firing(void)131{132RSDK_THIS(Bloominator);133EntityBloominator *spikeBall = NULL;134135switch (++self->timer) {136case 15:137spikeBall = CREATE_ENTITY(Bloominator, INT_TO_VOID(true), self->position.x - 0x10000, self->position.y - 0x160000);138spikeBall->velocity.x = -0x10000;139spikeBall->velocity.y = -0x50000;140RSDK.PlaySfx(Bloominator->sfxShot, false, 255);141break;142143case 45:144spikeBall = CREATE_ENTITY(Bloominator, INT_TO_VOID(true), self->position.x - 0x10000, self->position.y - 0x160000);145spikeBall->velocity.x = 0x10000;146spikeBall->velocity.y = -0x50000;147RSDK.PlaySfx(Bloominator->sfxShot, false, 255);148break;149150case 50:151self->timer = -60;152RSDK.SetSpriteAnimation(Bloominator->aniFrames, 0, &self->animator, true, 0);153self->state = Bloominator_State_Idle;154break;155}156157RSDK.ProcessAnimation(&self->animator);158159Bloominator_CheckPlayerCollisions();160Bloominator_CheckOffScreen();161}162163void Bloominator_State_Spikeball(void)164{165RSDK_THIS(Bloominator);166167if (RSDK.CheckOnScreen(self, NULL)) {168self->position.x += self->velocity.x;169self->position.y += self->velocity.y;170self->velocity.y += 0x3800;171172RSDK.ProcessAnimation(&self->animator);173174foreach_active(Player, player)175{176if (Player_CheckCollisionTouch(player, self, &Bloominator->hitboxProjectile)) {177Player_ProjectileHurt(player, self);178}179}180}181else {182destroyEntity(self);183}184}185186#if GAME_INCLUDE_EDITOR187void Bloominator_EditorDraw(void) { Bloominator_Draw(); }188189void Bloominator_EditorLoad(void) { Bloominator->aniFrames = RSDK.LoadSpriteAnimation("AIZ/Bloominator.bin", SCOPE_STAGE); }190#endif191192void Bloominator_Serialize(void) {}193#endif194195196