Path: blob/master/SonicMania/Objects/AIZ/Rhinobot.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Rhinobot Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if MANIA_USE_PLUS10ObjectRhinobot *Rhinobot;1112void Rhinobot_Update(void)13{14RSDK_THIS(Rhinobot);15StateMachine_Run(self->state);16}1718void Rhinobot_LateUpdate(void) {}1920void Rhinobot_StaticUpdate(void) {}2122void Rhinobot_Draw(void)23{24RSDK_THIS(Rhinobot);25if (self->drawDust) {26Vector2 drawPos;27drawPos.x = self->position.x;28drawPos.y = self->position.y;29if (self->state == Rhinobot_State_Moving) {30if (!self->moveDir)31drawPos.x -= 0xD0000;32else33drawPos.x += 0xD0000;34}35RSDK.DrawSprite(&self->dustAnimator, &drawPos, false);36}37RSDK.DrawSprite(&self->bodyAnimator, NULL, false);38}3940void Rhinobot_Create(void *data)41{42RSDK_THIS(Rhinobot);43self->visible = true;44self->drawFX |= FX_FLIP;45self->drawGroup = Zone->objectDrawGroup[0];46self->startPos = self->position;47self->startDir = self->direction;48self->active = ACTIVE_BOUNDS;49self->updateRange.x = 0x800000;50self->updateRange.y = 0x800000;51RSDK.SetSpriteAnimation(Rhinobot->aniFrames, 0, &self->bodyAnimator, true, 0);52RSDK.SetSpriteAnimation(Rhinobot->aniFrames, 2, &self->dustAnimator, true, 0);53self->state = Rhinobot_State_Init;54}5556void Rhinobot_StageLoad(void)57{58if (RSDK.CheckSceneFolder("AIZ"))59Rhinobot->aniFrames = RSDK.LoadSpriteAnimation("AIZ/Rhinobot.bin", SCOPE_STAGE);6061Rhinobot->hitboxBadnik.left = -14;62Rhinobot->hitboxBadnik.top = -9;63Rhinobot->hitboxBadnik.right = 23;64Rhinobot->hitboxBadnik.bottom = 15;6566Rhinobot->sfxHuff = RSDK.GetSfx("Stage/Huff.wav");6768DEBUGMODE_ADD_OBJ(Rhinobot);69}7071void Rhinobot_DebugSpawn(void)72{73RSDK_THIS(DebugMode);7475CREATE_ENTITY(Rhinobot, NULL, self->position.x, self->position.y);76}7778void Rhinobot_DebugDraw(void)79{80RSDK.SetSpriteAnimation(Rhinobot->aniFrames, 0, &DebugMode->animator, true, 0);81RSDK.DrawSprite(&DebugMode->animator, NULL, false);82}8384bool32 Rhinobot_CheckTileCollisions(void)85{86RSDK_THIS(Rhinobot);8788if (self->moveDir) {89if (!RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0x40000, 0xF0000, 8)) {90if (RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_LWALL, 0, 0x100000, 0, false))91return false;92if (RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, 0xF0000, 8))93return false;94self->state = Rhinobot_State_Fall;95}96}97else if (!RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, -0x40000, 0xF0000, 8)) {98if (RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_RWALL, 0, -0x100000, 0, false))99return false;100if (RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, 0xF0000, 8))101return false;102self->state = Rhinobot_State_Fall;103}104105return true;106}107108void Rhinobot_CheckPlayerCollisions(void)109{110RSDK_THIS(Rhinobot);111112foreach_active(Player, player)113{114if (Player_CheckBadnikTouch(player, self, &Rhinobot->hitboxBadnik))115Player_CheckBadnikBreak(player, self, true);116}117}118119void Rhinobot_CheckOffScreen(void)120{121RSDK_THIS(Rhinobot);122123if (!RSDK.CheckOnScreen(self, NULL) && !RSDK.CheckPosOnScreen(&self->startPos, &self->updateRange)) {124self->position = self->startPos;125self->direction = self->startDir;126Rhinobot_Create(NULL);127}128}129130void Rhinobot_Delay_Charge(void)131{132RSDK_THIS(Rhinobot);133134self->drawDust = false;135if (!self->moveDir)136self->velocity.x = -0x40000;137else138self->velocity.x = 0x40000;139140self->state = Rhinobot_State_Skidding;141self->stateDelay = Rhinobot_Delay_Skidding;142}143144void Rhinobot_Delay_Skidding(void)145{146RSDK_THIS(Rhinobot);147148RSDK.SetSpriteAnimation(Rhinobot->aniFrames, 1, &self->bodyAnimator, true, 0);149self->skidDir ^= FLIP_X;150self->acceleration = -self->acceleration;151self->topSpeed = -self->topSpeed;152self->stateDelay = Rhinobot_Delay_SkidFinish;153}154155void Rhinobot_Delay_SkidFinish(void)156{157RSDK_THIS(Rhinobot);158159self->moveDir ^= FLIP_X;160self->direction ^= FLIP_X;161self->drawDust = false;162RSDK.SetSpriteAnimation(Rhinobot->aniFrames, 0, &self->bodyAnimator, true, 0);163self->stateDelay = Rhinobot_Delay_Skidding;164}165166void Rhinobot_State_Init(void)167{168RSDK_THIS(Rhinobot);169170self->active = ACTIVE_NORMAL;171self->stateDelay = Rhinobot_Delay_Skidding;172self->moveDir = self->startDir;173self->skidDir = self->startDir;174175if (self->direction == FLIP_NONE) {176self->acceleration = -0x1000;177self->topSpeed = -0x30000;178}179else {180self->acceleration = 0x1000;181self->topSpeed = 0x30000;182}183184self->state = Rhinobot_State_Moving;185Rhinobot_State_Moving();186}187188void Rhinobot_State_Moving(void)189{190RSDK_THIS(Rhinobot);191192EntityPlayer *player = Player_GetNearestPlayer();193194bool32 isRevingUp = false;195if (abs(player->position.y - self->position.y) <= 0x200000) {196if (abs(player->position.x - self->position.x) <= 0x600000) {197if (self->skidDir == self->moveDir && (player->position.x > self->position.x) == self->skidDir) {198self->state = Rhinobot_State_Idle;199self->velocity.x = 0;200self->timer = 32;201self->stateDelay = Rhinobot_Delay_Charge;202self->drawDust = true;203if (self->onScreen)204RSDK.PlaySfx(Rhinobot->sfxHuff, false, 255);205isRevingUp = true;206}207}208}209210if (!isRevingUp) {211if (Rhinobot_CheckTileCollisions()) {212if (self->state == Rhinobot_State_Moving) {213self->velocity.x += self->acceleration;214self->position.x += self->velocity.x;215216if (!self->velocity.x || (self->skidDir && self->velocity.x >= self->topSpeed)217|| (!self->skidDir && self->velocity.x <= self->topSpeed)) {218#if RETRO_USE_MOD_LOADER219StateMachine_Run(self->stateDelay);220#else221self->stateDelay();222#endif223}224}225}226else {227self->velocity.x = 0;228self->skidDir = self->moveDir ^ FLIP_X;229self->moveDir ^= FLIP_X;230self->direction ^= FLIP_X;231self->drawDust = false;232RSDK.SetSpriteAnimation(Rhinobot->aniFrames, 0, &self->bodyAnimator, true, 0);233self->stateDelay = Rhinobot_Delay_Skidding;234}235236if (((self->moveDir && !self->skidDir && self->velocity.x < 0x28000) || (!self->moveDir && self->skidDir && self->velocity.x > -0x28000))237&& !self->drawDust) {238self->drawDust = true;239if (self->onScreen)240RSDK.PlaySfx(Rhinobot->sfxHuff, false, 0xFF);241}242}243244RSDK.ProcessAnimation(&self->bodyAnimator);245RSDK.ProcessAnimation(&self->dustAnimator);246247Rhinobot_CheckPlayerCollisions();248Rhinobot_CheckOffScreen();249}250251void Rhinobot_State_Skidding(void)252{253RSDK_THIS(Rhinobot);254255self->position.x += self->velocity.x;256257if (!Rhinobot_CheckTileCollisions()) {258self->velocity.x = 0;259self->skidDir = self->moveDir ^ FLIP_X;260self->moveDir ^= FLIP_X;261self->direction ^= FLIP_X;262self->drawDust = false;263RSDK.SetSpriteAnimation(Rhinobot->aniFrames, 0, &self->bodyAnimator, true, 0);264self->stateDelay = Rhinobot_Delay_Skidding;265self->state = Rhinobot_State_Moving;266}267268RSDK.ProcessAnimation(&self->bodyAnimator);269RSDK.ProcessAnimation(&self->dustAnimator);270271Rhinobot_CheckPlayerCollisions();272Rhinobot_CheckOffScreen();273}274275void Rhinobot_State_Idle(void)276{277RSDK_THIS(Rhinobot);278279RSDK.ProcessAnimation(&self->dustAnimator);280281if (--self->timer <= 0) {282#if RETRO_USE_MOD_LOADER283StateMachine_Run(self->stateDelay);284#else285self->stateDelay();286#endif287}288289Rhinobot_CheckPlayerCollisions();290Rhinobot_CheckOffScreen();291}292293void Rhinobot_State_Fall(void)294{295RSDK_THIS(Rhinobot);296297RSDK.ProcessAnimation(&self->dustAnimator);298299self->position.x += self->velocity.x;300self->position.y += self->velocity.y;301self->velocity.y += 0x3800;302303if (RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, 0x100000, 8)) {304self->velocity.y = 0;305RSDK.SetSpriteAnimation(Rhinobot->aniFrames, 0, &self->bodyAnimator, true, 0);306self->drawDust = true;307if (self->onScreen)308RSDK.PlaySfx(Rhinobot->sfxHuff, false, 255);309self->state = Rhinobot_State_Moving;310Rhinobot_State_Moving();311}312else {313Rhinobot_CheckPlayerCollisions();314Rhinobot_CheckOffScreen();315}316}317318#if GAME_INCLUDE_EDITOR319void Rhinobot_EditorDraw(void) { Rhinobot_Draw(); }320321void Rhinobot_EditorLoad(void) { Rhinobot->aniFrames = RSDK.LoadSpriteAnimation("AIZ/Rhinobot.bin", SCOPE_STAGE); }322#endif323324void Rhinobot_Serialize(void) {}325#endif326327328