Path: blob/master/SonicMania/Objects/SSZ/Kanabun.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Kanabun Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectKanabun *Kanabun;1011void Kanabun_Update(void)12{13RSDK_THIS(Kanabun);1415StateMachine_Run(self->state);16}1718void Kanabun_LateUpdate(void) {}1920void Kanabun_StaticUpdate(void) {}2122void Kanabun_Draw(void)23{24RSDK_THIS(Kanabun);2526RSDK.DrawSprite(&self->animator, NULL, false);27}2829void Kanabun_Create(void *data)30{31RSDK_THIS(Kanabun);3233if (!self->angleVel)34self->angleVel = 1;3536if (!self->hVel) {37self->hDist = 1;38self->bobDist = 2;39self->hVel = 0x4000;40self->angleVel = 2;41}4243self->drawFX = FX_FLIP | FX_ROTATE | FX_SCALE;4445if (!SceneInfo->inEditor) {46self->visible = true;47self->drawGroup = Zone->objectDrawGroup[0];48self->startPos = self->position;49self->startDir = self->direction;50self->active = ACTIVE_BOUNDS;51self->updateRange.x = 0x800000;52self->updateRange.y = 0x800000;53RSDK.SetSpriteAnimation(Kanabun->aniFrames, 0, &self->animator, true, 0);54self->state = Kanabun_State_Init;55}56}5758void Kanabun_StageLoad(void)59{60if (RSDK.CheckSceneFolder("SSZ1"))61Kanabun->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/Kanabun.bin", SCOPE_STAGE);62else if (RSDK.CheckSceneFolder("SSZ2"))63Kanabun->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/Kanabun.bin", SCOPE_STAGE);6465Kanabun->hitboxBadnik.left = -6;66Kanabun->hitboxBadnik.top = -6;67Kanabun->hitboxBadnik.right = 6;68Kanabun->hitboxBadnik.bottom = 6;6970DEBUGMODE_ADD_OBJ(Kanabun);71}7273void Kanabun_DebugSpawn(void)74{75RSDK_THIS(DebugMode);7677CREATE_ENTITY(Kanabun, NULL, self->position.x, self->position.y);78}7980void Kanabun_DebugDraw(void)81{82RSDK.SetSpriteAnimation(Kanabun->aniFrames, 0, &DebugMode->animator, true, 0);83RSDK.DrawSprite(&DebugMode->animator, NULL, false);84}8586void Kanabun_CheckPlayerCollisions(void)87{88RSDK_THIS(Kanabun);8990foreach_active(Player, player)91{92if (Player_CheckBadnikTouch(player, self, &Kanabun->hitboxBadnik))93Player_CheckBadnikBreak(player, self, true);94}95}9697void Kanabun_CheckOffScreen(void)98{99RSDK_THIS(Kanabun);100101if (!RSDK.CheckOnScreen(self, NULL) && !RSDK.CheckPosOnScreen(&self->startPos, &self->updateRange)) {102self->position = self->startPos;103self->direction = self->startDir;104Kanabun_Create(NULL);105}106}107108void Kanabun_HandleMovement(void)109{110RSDK_THIS(Kanabun);111112self->position.x += self->velocity.x;113self->position.y = ((self->bobDist * RSDK.Sin512(self->angle)) << 8) + self->startPos.y;114115self->angle += self->angleVel;116117self->scale.x = (abs(RSDK.Sin512(((self->angle >> 1) + 0x80) & 0x1FF)) >> 1) + 0x100;118self->scale.y = self->scale.x;119120if (((uint32)(self->angle - 0x80) & 0x1FF) >= 0x100)121self->drawGroup = Zone->objectDrawGroup[1];122else123self->drawGroup = Zone->objectDrawGroup[0];124}125126void Kanabun_State_Init(void)127{128RSDK_THIS(Kanabun);129130self->velocity.x = self->hVel;131if (self->direction == FLIP_NONE)132self->velocity.x = -self->velocity.x;133134self->active = ACTIVE_NORMAL;135136self->state = Kanabun_State_Moving;137Kanabun_State_Moving();138}139140void Kanabun_State_Moving(void)141{142RSDK_THIS(Kanabun);143144Kanabun_HandleMovement();145146if (self->position.y >= self->startPos.y) {147if (self->groundVel == 1)148self->groundVel = 0;149}150else {151if (!self->groundVel)152self->groundVel = 1;153}154155int32 offset = self->hVel * self->hDist * (0x100 / self->angleVel);156157if ((self->direction == FLIP_NONE && self->position.x <= (self->startPos.x - offset))158|| (self->direction == FLIP_X && self->position.x >= (self->startPos.x + offset))) {159RSDK.SetSpriteAnimation(Kanabun->aniFrames, 1, &self->animator, true, 0);160self->state = Kanabun_State_Turning;161}162163RSDK.ProcessAnimation(&self->animator);164165if (self->drawGroup == Zone->objectDrawGroup[1])166Kanabun_CheckPlayerCollisions();167168Kanabun_CheckOffScreen();169}170171void Kanabun_State_Turning(void)172{173RSDK_THIS(Kanabun);174175Kanabun_HandleMovement();176177RSDK.ProcessAnimation(&self->animator);178179if (self->animator.frameID == self->animator.frameCount - 1) {180RSDK.SetSpriteAnimation(Kanabun->aniFrames, 0, &self->animator, true, 0);181self->velocity.x = -self->velocity.x;182self->groundVel = 0;183self->direction ^= FLIP_X;184self->state = Kanabun_State_Moving;185}186else {187if (self->drawGroup == Zone->objectDrawGroup[1])188Kanabun_CheckPlayerCollisions();189190Kanabun_CheckOffScreen();191}192}193194#if GAME_INCLUDE_EDITOR195void Kanabun_EditorDraw(void)196{197RSDK_THIS(Kanabun);198199RSDK.SetSpriteAnimation(Kanabun->aniFrames, 0, &self->animator, false, 0);200self->scale.x = 0x200;201self->scale.y = 0x200;202203Kanabun_Draw();204}205206void Kanabun_EditorLoad(void)207{208if (RSDK.CheckSceneFolder("SSZ1"))209Kanabun->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/Kanabun.bin", SCOPE_STAGE);210else if (RSDK.CheckSceneFolder("SSZ2"))211Kanabun->aniFrames = RSDK.LoadSpriteAnimation("SSZ2/Kanabun.bin", SCOPE_STAGE);212213RSDK_ACTIVE_VAR(Kanabun, direction);214RSDK_ENUM_VAR("Left", FLIP_NONE);215RSDK_ENUM_VAR("Right", FLIP_X);216}217#endif218219void Kanabun_Serialize(void)220{221RSDK_EDITABLE_VAR(Kanabun, VAR_ENUM, hVel);222RSDK_EDITABLE_VAR(Kanabun, VAR_UINT8, hDist);223RSDK_EDITABLE_VAR(Kanabun, VAR_UINT8, bobDist);224RSDK_EDITABLE_VAR(Kanabun, VAR_UINT8, angleVel);225RSDK_EDITABLE_VAR(Kanabun, VAR_UINT8, direction);226}227228229