Path: blob/master/SonicMania/Objects/HPZ/Batbot.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Batbot Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectBatbot *Batbot = NULL;1011void Batbot_Update(void)12{13RSDK_THIS(Batbot);14RSDK.ProcessAnimation(&self->bodyAnimator);15if (self->bodyAnimator.animationID == 1)16self->direction = self->swoopDir ^ Batbot->directionTable[self->bodyAnimator.frameID];1718StateMachine_Run(self->state);1920Batbot_CheckPlayerCollisions();21if (self->state != Batbot_State_Init) {22if (!RSDK.CheckOnScreen(self, NULL) && !RSDK.CheckPosOnScreen(&self->startPos, &self->updateRange)) {23self->direction = self->startDir;24self->position = self->startPos;25Batbot_Create(NULL);26}27}28}2930void Batbot_LateUpdate(void) {}3132void Batbot_StaticUpdate(void) {}3334void Batbot_Draw(void)35{36RSDK_THIS(Batbot);37RSDK.DrawSprite(&self->bodyAnimator, NULL, false);38if (self->showJet)39RSDK.DrawSprite(&self->jetAnimator, NULL, false);40}4142void Batbot_Create(void *data)43{44RSDK_THIS(Batbot);45self->visible = true;46self->drawGroup = Zone->objectDrawGroup[0];47self->startPos = self->position;48self->startDir = self->direction;49self->drawFX = FX_FLIP;50self->active = ACTIVE_BOUNDS;51self->updateRange.x = 0x800000;52self->updateRange.y = 0x800000;53self->state = Batbot_State_Init;54}5556void Batbot_StageLoad(void)57{58if (RSDK.CheckSceneFolder("HPZ"))59Batbot->aniFrames = RSDK.LoadSpriteAnimation("HPZ/Batbot.bin", SCOPE_STAGE);6061Batbot->hitboxBadnik.left = -16;62Batbot->hitboxBadnik.top = -12;63Batbot->hitboxBadnik.right = 16;64Batbot->hitboxBadnik.bottom = 12;6566Batbot->hitboxSpinCheck.left = -96;67Batbot->hitboxSpinCheck.top = -64;68Batbot->hitboxSpinCheck.right = 96;69Batbot->hitboxSpinCheck.bottom = 128;7071Batbot->hitboxAttack.left = -80;72Batbot->hitboxAttack.top = -64;73Batbot->hitboxAttack.right = 80;74Batbot->hitboxAttack.bottom = 96;7576Batbot->hitboxPlayer.left = 0;77Batbot->hitboxPlayer.top = 0;78Batbot->hitboxPlayer.right = 0;79Batbot->hitboxPlayer.bottom = 0;8081Batbot->directionTable[0] = FLIP_NONE;82Batbot->directionTable[1] = FLIP_NONE;83Batbot->directionTable[2] = FLIP_NONE;84Batbot->directionTable[3] = FLIP_X;85Batbot->directionTable[4] = FLIP_X;8687DEBUGMODE_ADD_OBJ(Batbot);88}8990void Batbot_DebugSpawn(void)91{92RSDK_THIS(DebugMode);9394EntityBatbot *batBot = CREATE_ENTITY(Batbot, NULL, self->position.x, self->position.y);95batBot->direction = self->direction;96batBot->startDir = self->direction;97}9899void Batbot_DebugDraw(void)100{101RSDK.SetSpriteAnimation(Batbot->aniFrames, 0, &DebugMode->animator, true, 3);102RSDK.DrawSprite(&DebugMode->animator, NULL, false);103}104105void Batbot_CheckPlayerCollisions(void)106{107RSDK_THIS(Batbot);108foreach_active(Player, player)109{110if (Player_CheckBadnikTouch(player, self, &Batbot->hitboxBadnik))111Player_CheckBadnikBreak(player, self, true);112}113}114115void Batbot_State_Init(void)116{117RSDK_THIS(Batbot);118self->timer = 0;119self->unused3 = 0;120self->originY = self->position.y;121self->active = ACTIVE_NORMAL;122self->showJet = true;123RSDK.SetSpriteAnimation(Batbot->aniFrames, 3, &self->jetAnimator, true, 0);124RSDK.SetSpriteAnimation(Batbot->aniFrames, 0, &self->bodyAnimator, true, 0);125self->state = Batbot_State_Idle;126Batbot_State_Idle();127}128129void Batbot_State_Idle(void)130{131RSDK_THIS(Batbot);132133self->arcAngle = (self->arcAngle + 8) & 0x1FF;134self->position.y = (RSDK.Sin512(self->arcAngle) << 9) + self->originY;135bool32 spin = false;136137foreach_active(Player, player)138{139if (RSDK.CheckObjectCollisionTouchBox(player, &Batbot->hitboxPlayer, self, &Batbot->hitboxSpinCheck)) {140RSDK.SetSpriteAnimation(Batbot->aniFrames, 1, &self->bodyAnimator, false, 0);141spin = true;142}143144if (RSDK.CheckObjectCollisionTouchBox(player, &Batbot->hitboxPlayer, self, &Batbot->hitboxAttack)) {145self->playerPtr = player;146self->state = Batbot_State_Attack;147}148}149150if (!spin)151RSDK.SetSpriteAnimation(Batbot->aniFrames, 0, &self->bodyAnimator, false, 0);152}153154void Batbot_State_Attack(void)155{156RSDK_THIS(Batbot);157158if (self->arcAngle) {159self->arcAngle = (self->arcAngle + 8) & 0x1FF;160self->position.y = (RSDK.Sin512(self->arcAngle) << 9) + self->originY;161}162163if (++self->timer == 20) {164self->timer = 0;165self->landPos = self->position;166if (self->playerPtr->position.x > self->position.x) {167self->landPos.x += 0x500000;168self->swoopAngle = 0x100;169self->swoopDir = FLIP_X;170self->state = Batbot_State_SwoopRight;171}172else {173self->landPos.x -= 0x500000;174self->swoopAngle = 0x000;175self->swoopDir = FLIP_NONE;176self->state = Batbot_State_SwoopLeft;177}178self->showJet = false;179RSDK.SetSpriteAnimation(Batbot->aniFrames, 2, &self->bodyAnimator, true, 0);180}181}182183void Batbot_State_SwoopLeft(void)184{185RSDK_THIS(Batbot);186self->swoopAngle += 4;187self->position.x = self->landPos.x + 0x2800 * RSDK.Cos512(self->swoopAngle);188self->position.y = self->landPos.y + 0x2800 * RSDK.Sin512(self->swoopAngle);189if (self->swoopAngle == 0x100) {190self->showJet = true;191RSDK.SetSpriteAnimation(Batbot->aniFrames, 0, &self->bodyAnimator, true, 0);192self->state = Batbot_State_Idle;193}194}195196void Batbot_State_SwoopRight(void)197{198RSDK_THIS(Batbot);199self->swoopAngle -= 4;200self->position.x = self->landPos.x + 0x2800 * RSDK.Cos512(self->swoopAngle);201self->position.y = self->landPos.y + 0x2800 * RSDK.Sin512(self->swoopAngle);202if (self->swoopAngle == 0x000) {203self->showJet = true;204RSDK.SetSpriteAnimation(Batbot->aniFrames, 0, &self->bodyAnimator, true, 0);205self->state = Batbot_State_Idle;206}207}208209#if GAME_INCLUDE_EDITOR210void Batbot_EditorDraw(void)211{212RSDK_THIS(Batbot);213214RSDK.SetSpriteAnimation(Batbot->aniFrames, 3, &self->jetAnimator, true, 0);215RSDK.SetSpriteAnimation(Batbot->aniFrames, 0, &self->bodyAnimator, true, 0);216217Batbot_Draw();218}219220void Batbot_EditorLoad(void)221{222Batbot->aniFrames = RSDK.LoadSpriteAnimation("HPZ/Batbot.bin", SCOPE_STAGE);223224RSDK_ACTIVE_VAR(Batbot, direction);225RSDK_ENUM_VAR("No Flip", FLIP_NONE);226RSDK_ENUM_VAR("Flip X", FLIP_X);227}228#endif229230void Batbot_Serialize(void) { RSDK_EDITABLE_VAR(Batbot, VAR_UINT8, direction); }231232233