Path: blob/master/SonicMania/Objects/GHZ/Crabmeat.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Crabmeat Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectCrabmeat *Crabmeat;1011void Crabmeat_Update(void)12{13RSDK_THIS(Crabmeat);14StateMachine_Run(self->state);15}1617void Crabmeat_LateUpdate(void) {}1819void Crabmeat_StaticUpdate(void) {}2021void Crabmeat_Draw(void)22{23RSDK_THIS(Crabmeat);24RSDK.DrawSprite(&self->animator, NULL, false);25}2627void Crabmeat_Create(void *data)28{29RSDK_THIS(Crabmeat);3031self->visible = true;32self->drawGroup = Zone->objectDrawGroup[0];3334if (data) {35self->inkEffect = INK_ADD;36self->alpha = 0xC0;37self->active = ACTIVE_NORMAL;38self->updateRange.x = 0x400000;39self->updateRange.y = 0x400000;40RSDK.SetSpriteAnimation(Crabmeat->aniFrames, 3, &self->animator, true, 0);41self->state = Crabmeat_State_Projectile;42}43else {44self->drawFX |= FX_FLIP;45self->startPos.x = self->position.x;46self->startPos.y = self->position.y;47self->startDir = self->direction;48self->active = ACTIVE_BOUNDS;49self->updateRange.x = 0x800000;50self->updateRange.y = 0x800000;51RSDK.SetSpriteAnimation(Crabmeat->aniFrames, 0, &self->animator, true, 0);52self->state = Crabmeat_State_Init;53}54}5556void Crabmeat_StageLoad(void)57{58if (RSDK.CheckSceneFolder("GHZ"))59Crabmeat->aniFrames = RSDK.LoadSpriteAnimation("GHZ/Crabmeat.bin", SCOPE_STAGE);6061Crabmeat->hitboxBadnik.left = -14;62Crabmeat->hitboxBadnik.top = -14;63Crabmeat->hitboxBadnik.right = 14;64Crabmeat->hitboxBadnik.bottom = 14;6566Crabmeat->hitboxProjectile.left = -6;67Crabmeat->hitboxProjectile.top = -6;68Crabmeat->hitboxProjectile.right = 6;69Crabmeat->hitboxProjectile.bottom = 6;7071DEBUGMODE_ADD_OBJ(Crabmeat);72}7374void Crabmeat_DebugDraw(void)75{76RSDK.SetSpriteAnimation(Crabmeat->aniFrames, 0, &DebugMode->animator, true, 0);77RSDK.DrawSprite(&DebugMode->animator, NULL, false);78}79void Crabmeat_DebugSpawn(void)80{81RSDK_THIS(DebugMode);8283CREATE_ENTITY(Crabmeat, NULL, self->position.x, self->position.y);84}8586void Crabmeat_CheckOffScreen(void)87{88RSDK_THIS(Crabmeat);8990if (self->tileCollisions != TILECOLLISION_NONE && !RSDK.CheckOnScreen(self, NULL)91&& !RSDK.CheckPosOnScreen(&self->startPos, &self->updateRange)) {92self->position.x = self->startPos.x;93self->position.y = self->startPos.y;94self->direction = self->startDir;95self->timer = 0;96Crabmeat_Create(NULL);97}98}99100void Crabmeat_CheckPlayerCollisions(void)101{102RSDK_THIS(Crabmeat);103104foreach_active(Player, player)105{106if (Player_CheckBadnikTouch(player, self, &Crabmeat->hitboxBadnik))107Player_CheckBadnikBreak(player, self, true);108}109}110111void Crabmeat_State_Init(void)112{113RSDK_THIS(Crabmeat);114115self->active = ACTIVE_NORMAL;116self->velocity.x = -0x8000;117RSDK.SetSpriteAnimation(Crabmeat->aniFrames, 1, &self->animator, true, 0);118self->state = Crabmeat_State_Moving;119Crabmeat_State_Moving();120}121122void Crabmeat_State_Moving(void)123{124RSDK_THIS(Crabmeat);125126self->position.x += self->velocity.x;127128if (self->timer >= 128129|| (!RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0xE0000 * (self->velocity.x > 0 ? 1 : -1), 0xF0000, 8))) {130self->timer = 0;131if (self->shootState == 0)132RSDK.SetSpriteAnimation(Crabmeat->aniFrames, 0, &self->animator, true, 0);133else134RSDK.SetSpriteAnimation(Crabmeat->aniFrames, 2, &self->animator, true, 0);135self->state = Crabmeat_State_Shoot;136}137else {138self->timer++;139}140141RSDK.ProcessAnimation(&self->animator);142143Crabmeat_CheckPlayerCollisions();144Crabmeat_CheckOffScreen();145}146147void Crabmeat_State_Shoot(void)148{149RSDK_THIS(Crabmeat);150151if (++self->timer >= 60) {152switch (self->shootState) {153default:154case 2:155if (self->animator.frameID != self->animator.frameCount - 1)156break;157158case 0:159self->shootState = 1;160RSDK.SetSpriteAnimation(Crabmeat->aniFrames, 1, &self->animator, true, 0);161self->direction ^= FLIP_X;162self->velocity.x = -self->velocity.x;163self->timer = 0;164self->state = Crabmeat_State_Moving;165break;166167case 1:168self->shootState = 2;169170EntityCrabmeat *projectile = CREATE_ENTITY(Crabmeat, INT_TO_VOID(true), self->position.x - 0x100000, self->position.y);171projectile->velocity.x = -0x10000;172projectile->velocity.y = -0x40000;173174projectile = CREATE_ENTITY(Crabmeat, INT_TO_VOID(true), self->position.x + 0x100000, self->position.y);175projectile->velocity.x = 0x10000;176projectile->velocity.y = -0x40000;177break;178}179}180181RSDK.ProcessAnimation(&self->animator);182Crabmeat_CheckPlayerCollisions();183Crabmeat_CheckOffScreen();184}185186void Crabmeat_State_Projectile(void)187{188RSDK_THIS(Crabmeat);189190self->position.x += self->velocity.x;191self->position.y += self->velocity.y;192self->velocity.y += 0x3800;193194if (!RSDK.CheckOnScreen(self, NULL)) {195destroyEntity(self);196}197else {198RSDK.ProcessAnimation(&self->animator);199200foreach_active(Player, player)201{202if (Player_CheckCollisionTouch(player, self, &Crabmeat->hitboxProjectile))203Player_ProjectileHurt(player, self);204}205}206}207208#if GAME_INCLUDE_EDITOR209void Crabmeat_EditorDraw(void) { Crabmeat_Draw(); }210211void Crabmeat_EditorLoad(void) { Crabmeat->aniFrames = RSDK.LoadSpriteAnimation("GHZ/Crabmeat.bin", SCOPE_STAGE); }212#endif213214void Crabmeat_Serialize(void) {}215216217