Path: blob/master/SonicMania/Objects/LRZ/Iwamodoki.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Iwamodoki Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectIwamodoki *Iwamodoki;1011void Iwamodoki_Update(void)12{13RSDK_THIS(Iwamodoki);1415if (LRZConvItem && self->lrzConvPhys) {16self->preMovePos.x = self->position.x;17self->preMovePos.y = self->position.y;18self->moveOffset = LRZConvItem_HandleLRZConvPhys(self);19}20else {21self->preMovePos.x = self->position.x;22self->preMovePos.y = self->position.y;23self->moveOffset.x = 0;24self->moveOffset.y = 0;25}2627self->postMovePos.x = self->position.x;28self->postMovePos.y = self->position.y;2930StateMachine_Run(self->state);31}3233void Iwamodoki_LateUpdate(void) {}3435void Iwamodoki_StaticUpdate(void) {}3637void Iwamodoki_Draw(void)38{39RSDK_THIS(Iwamodoki);4041RSDK.DrawSprite(&self->animator, NULL, false);42}4344void Iwamodoki_Create(void *data)45{46RSDK_THIS(Iwamodoki);4748self->drawFX |= FX_FLIP;49self->startPos = self->position;50self->startDir = self->direction;51self->visible = true;52self->active = ACTIVE_BOUNDS;53self->updateRange.x = 0x800000;54self->updateRange.y = 0x800000;55self->drawGroup = Zone->objectDrawGroup[0];5657if (data) {58self->active = ACTIVE_NORMAL;59RSDK.SetSpriteAnimation(Iwamodoki->aniFrames, VOID_TO_INT(data) + 2, &self->animator, true, 0);60self->state = Iwamodoki_State_Debris;61}62else {63RSDK.SetSpriteAnimation(Iwamodoki->aniFrames, 0, &self->animator, true, 0);64self->state = Iwamodoki_State_Init;65}66}6768void Iwamodoki_StageLoad(void)69{70if (RSDK.CheckSceneFolder("LRZ1"))71Iwamodoki->aniFrames = RSDK.LoadSpriteAnimation("LRZ1/Iwamodoki.bin", SCOPE_STAGE);72else if (RSDK.CheckSceneFolder("LRZ2") || RSDK.CheckSceneFolder("LRZ3"))73Iwamodoki->aniFrames = RSDK.LoadSpriteAnimation("LRZ2/Iwamodoki.bin", SCOPE_STAGE);7475Iwamodoki->hitboxBadnik.left = -12;76Iwamodoki->hitboxBadnik.top = -11;77Iwamodoki->hitboxBadnik.right = 12;78Iwamodoki->hitboxBadnik.bottom = 11;7980Iwamodoki->hitboxRange.left = -64;81Iwamodoki->hitboxRange.top = -64;82Iwamodoki->hitboxRange.right = 64;83Iwamodoki->hitboxRange.bottom = 64;8485Iwamodoki->hitboxProjectile.left = -4;86Iwamodoki->hitboxProjectile.top = -4;87Iwamodoki->hitboxProjectile.right = 4;88Iwamodoki->hitboxProjectile.bottom = 4;8990DEBUGMODE_ADD_OBJ(Iwamodoki);91}9293void Iwamodoki_DebugSpawn(void)94{95RSDK_THIS(DebugMode);9697CREATE_ENTITY(Iwamodoki, NULL, self->position.x, self->position.y);98}99100void Iwamodoki_DebugDraw(void)101{102RSDK.SetSpriteAnimation(Iwamodoki->aniFrames, 2, &DebugMode->animator, true, 0);103RSDK.DrawSprite(&DebugMode->animator, NULL, false);104}105106void Iwamodoki_HandlePlayerCollisions(void)107{108RSDK_THIS(Iwamodoki);109110self->position.x = self->preMovePos.x;111self->position.y = self->preMovePos.y;112113foreach_active(Player, player)114{115if (Player_CheckCollisionBox(player, self, &Iwamodoki->hitboxBadnik) == C_TOP) {116player->position.x += self->moveOffset.x;117player->position.y += self->moveOffset.y;118}119}120121self->position.x = self->postMovePos.x;122self->position.y = self->postMovePos.y;123}124125void Iwamodoki_CheckOffScreen(void)126{127RSDK_THIS(Iwamodoki);128129if (!RSDK.CheckOnScreen(self, NULL) && !RSDK.CheckPosOnScreen(&self->startPos, &self->updateRange)) {130self->position = self->startPos;131self->direction = self->startDir;132Iwamodoki_Create(NULL);133}134}135136void Iwamodoki_State_Init(void)137{138RSDK_THIS(Iwamodoki);139140self->active = ACTIVE_NORMAL;141self->velocity.x = -0x10000;142143self->state = Iwamodoki_State_AwaitPlayer;144Iwamodoki_State_AwaitPlayer();145}146147void Iwamodoki_State_AwaitPlayer(void)148{149RSDK_THIS(Iwamodoki);150151foreach_active(Player, player)152{153if (Player_CheckCollisionTouch(player, self, &Iwamodoki->hitboxRange)) {154self->state = Iwamodoki_State_Appear;155}156}157158Iwamodoki_HandlePlayerCollisions();159Iwamodoki_CheckOffScreen();160}161162void Iwamodoki_State_Appear(void)163{164RSDK_THIS(Iwamodoki);165166RSDK.ProcessAnimation(&self->animator);167168if (self->animator.frameID == 6) {169RSDK.SetSpriteAnimation(Iwamodoki->aniFrames, 1, &self->animator, true, 0);170self->chargeCount = 15;171self->timer = 15;172self->state = Iwamodoki_State_Charging;173}174175Iwamodoki_HandlePlayerCollisions();176Iwamodoki_CheckOffScreen();177}178179void Iwamodoki_State_Charging(void)180{181RSDK_THIS(Iwamodoki);182183RSDK.ProcessAnimation(&self->animator);184185if (!--self->timer) {186if (!--self->chargeCount) {187// Explode Anim188self->timer = 32;189RSDK.SetSpriteAnimation(Iwamodoki->aniFrames, 2, &self->animator, true, 0);190self->state = Iwamodoki_State_Explode;191}192else {193// Charging Anim194RSDK.SetSpriteAnimation(Iwamodoki->aniFrames, 1, &self->animator, true, 0);195self->timer = self->chargeCount;196}197}198199Iwamodoki_HandlePlayerCollisions();200Iwamodoki_CheckOffScreen();201}202203void Iwamodoki_State_Explode(void)204{205RSDK_THIS(Iwamodoki);206207RSDK.ProcessAnimation(&self->animator);208209if (!--self->timer) {210CREATE_ENTITY(Explosion, INT_TO_VOID(EXPLOSION_ENEMY), self->position.x, self->position.y)->drawGroup = Zone->objectDrawGroup[1];211212if (self->onScreen == 1)213RSDK.PlaySfx(Explosion->sfxDestroy, false, 255);214215EntityIwamodoki *debris = CREATE_ENTITY(Iwamodoki, INT_TO_VOID(1), self->position.x, self->position.y);216debris->velocity.x = -0x20000;217debris->velocity.y = -0x40000;218219debris = CREATE_ENTITY(Iwamodoki, INT_TO_VOID(1), self->position.x, self->position.y);220debris->velocity.x = 0x20000;221debris->velocity.y = -0x40000;222223debris = CREATE_ENTITY(Iwamodoki, INT_TO_VOID(2), self->position.x, self->position.y);224debris->velocity.x = -0x40000;225debris->velocity.y = -0x20000;226227debris = CREATE_ENTITY(Iwamodoki, INT_TO_VOID(2), self->position.x, self->position.y);228debris->velocity.x = 0x40000;229debris->velocity.y = -0x20000;230231destroyEntity(self);232}233else {234Iwamodoki_HandlePlayerCollisions();235Iwamodoki_CheckOffScreen();236}237}238239void Iwamodoki_State_Debris(void)240{241RSDK_THIS(Iwamodoki);242243RSDK.ProcessAnimation(&self->animator);244245self->position.x += self->velocity.x;246self->position.y += self->velocity.y;247self->velocity.y += 0x3800;248249foreach_active(Player, player)250{251if (Player_CheckCollisionTouch(player, self, &Iwamodoki->hitboxProjectile)) {252Player_ProjectileHurt(player, self);253}254}255256if (!RSDK.CheckOnScreen(self, NULL))257destroyEntity(self);258}259260#if GAME_INCLUDE_EDITOR261void Iwamodoki_EditorDraw(void) { Iwamodoki_Draw(); }262263void Iwamodoki_EditorLoad(void)264{265if (RSDK.CheckSceneFolder("LRZ1"))266Iwamodoki->aniFrames = RSDK.LoadSpriteAnimation("LRZ1/Iwamodoki.bin", SCOPE_STAGE);267else if (RSDK.CheckSceneFolder("LRZ2") || RSDK.CheckSceneFolder("LRZ3"))268Iwamodoki->aniFrames = RSDK.LoadSpriteAnimation("LRZ2/Iwamodoki.bin", SCOPE_STAGE);269270RSDK_ACTIVE_VAR(Iwamodoki, direction);271RSDK_ENUM_VAR("No Flip", FLIP_NONE);272RSDK_ENUM_VAR("Flip X", FLIP_X);273RSDK_ENUM_VAR("Flip Y", FLIP_Y);274RSDK_ENUM_VAR("Flip XY", FLIP_XY);275}276#endif277278void Iwamodoki_Serialize(void)279{280RSDK_EDITABLE_VAR(Iwamodoki, VAR_UINT8, direction);281RSDK_EDITABLE_VAR(Iwamodoki, VAR_BOOL, lrzConvPhys);282}283284285