Path: blob/master/SonicMania/Objects/OOZ/Octus.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Octus Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectOctus *Octus;1011void Octus_Update(void)12{13RSDK_THIS(Octus);1415StateMachine_Run(self->state);16}1718void Octus_LateUpdate(void) {}1920void Octus_StaticUpdate(void) {}2122void Octus_Draw(void)23{24RSDK_THIS(Octus);2526RSDK.DrawSprite(&self->animator, NULL, false);27}2829void Octus_Create(void *data)30{31RSDK_THIS(Octus);3233self->visible = true;34self->drawGroup = Zone->objectDrawGroup[0];35self->drawFX |= FX_FLIP;36self->startPos = self->position;37self->startDir = self->direction;38self->timer = 128;39self->unused1 = 0;40self->unused2 = 0;4142if (data) {43self->inkEffect = INK_ADD;44self->alpha = 0xC0;45self->active = ACTIVE_NORMAL;46self->updateRange.x = 0x200000;47self->updateRange.y = 0x200000;48RSDK.SetSpriteAnimation(Octus->aniFrames, 3, &self->animator, true, 0);49self->state = Octus_State_Shot;50}51else {52self->active = ACTIVE_BOUNDS;53self->updateRange.x = 0x800000;54self->updateRange.y = 0x800000;55RSDK.SetSpriteAnimation(Octus->aniFrames, 0, &self->animator, true, 0);56self->state = Octus_State_Init;57self->alpha = 0xC0;58}59}6061void Octus_StageLoad(void)62{63if (RSDK.CheckSceneFolder("OOZ1") || RSDK.CheckSceneFolder("OOZ2"))64Octus->aniFrames = RSDK.LoadSpriteAnimation("OOZ/Octus.bin", SCOPE_STAGE);6566Octus->hitboxBadnik.left = -16;67Octus->hitboxBadnik.top = -12;68Octus->hitboxBadnik.right = 16;69Octus->hitboxBadnik.bottom = 12;7071Octus->hitboxRange.left = -128;72Octus->hitboxRange.top = -512;73Octus->hitboxRange.right = 128;74Octus->hitboxRange.bottom = 512;7576Octus->hitboxProjectile.left = -4;77Octus->hitboxProjectile.top = -4;78Octus->hitboxProjectile.right = 4;79Octus->hitboxProjectile.bottom = 4;8081Octus->sfxShot = RSDK.GetSfx("Stage/Shot.wav");8283DEBUGMODE_ADD_OBJ(Octus);84}8586void Octus_DebugSpawn(void)87{88RSDK_THIS(Octus);8990EntityOctus *octus = CREATE_ENTITY(Octus, NULL, self->position.x, self->position.y);91octus->direction = self->direction;92octus->startDir = self->direction;93}9495void Octus_DebugDraw(void)96{97RSDK.SetSpriteAnimation(Octus->aniFrames, 0, &DebugMode->animator, true, 0);98RSDK.DrawSprite(&DebugMode->animator, NULL, false);99}100101void Octus_CheckPlayerCollisions(void)102{103RSDK_THIS(Octus);104105foreach_active(Player, player)106{107if (Player_CheckBadnikTouch(player, self, &Octus->hitboxBadnik))108Player_CheckBadnikBreak(player, self, true);109}110}111112void Octus_CheckOffScreen(void)113{114RSDK_THIS(Octus);115116if (!RSDK.CheckOnScreen(self, NULL) && !RSDK.CheckPosOnScreen(&self->startPos, &self->updateRange)) {117self->position = self->startPos;118self->direction = self->startDir;119Octus_Create(NULL);120}121}122123void Octus_State_Init(void)124{125RSDK_THIS(Octus);126127self->active = ACTIVE_NORMAL;128129self->state = Octus_State_CheckPlayerInRange;130Octus_State_CheckPlayerInRange();131}132133void Octus_State_CheckPlayerInRange(void)134{135RSDK_THIS(Octus);136137RSDK.ProcessAnimation(&self->animator);138139foreach_active(Player, player)140{141if (Player_CheckCollisionTouch(player, self, &Octus->hitboxRange)) {142self->timer = 32;143RSDK.SetSpriteAnimation(Octus->aniFrames, 1, &self->animator, true, 0);144self->state = Octus_State_JumpDelay;145foreach_break;146}147}148149Octus_CheckPlayerCollisions();150Octus_CheckOffScreen();151}152153void Octus_State_JumpDelay(void)154{155RSDK_THIS(Octus);156157RSDK.ProcessAnimation(&self->animator);158159if (--self->timer <= 0) {160self->velocity.y = -0x20000;161self->state = Octus_State_Jump;162}163164Octus_CheckPlayerCollisions();165Octus_CheckOffScreen();166}167168void Octus_State_Jump(void)169{170RSDK_THIS(Octus);171172RSDK.ProcessAnimation(&self->animator);173174self->position.y += self->velocity.y;175self->velocity.y += 0x1000;176177if (self->velocity.y >= 0) {178self->timer = 60;179RSDK.SetSpriteAnimation(Octus->aniFrames, 2, &self->animator, true, 0);180self->state = Octus_State_Shoot;181}182183Octus_CheckPlayerCollisions();184Octus_CheckOffScreen();185}186187void Octus_State_Shoot(void)188{189RSDK_THIS(Octus);190191RSDK.ProcessAnimation(&self->animator);192193if (--self->timer == 51) {194EntityOctus *shot = CREATE_ENTITY(Octus, INT_TO_VOID(true), self->position.x, self->position.y);195if (self->direction) {196shot->position.x += 0xE0000;197shot->velocity.x = 0x20000;198}199else {200shot->position.x -= 0xE0000;201shot->velocity.x = -0x20000;202}203204RSDK.PlaySfx(Octus->sfxShot, false, 255);205}206else if (self->timer <= 0) {207self->state = Octus_State_Fall;208}209210Octus_CheckPlayerCollisions();211Octus_CheckOffScreen();212}213214void Octus_State_Fall(void)215{216RSDK_THIS(Octus);217218RSDK.ProcessAnimation(&self->animator);219220self->position.y += self->velocity.y;221self->velocity.y += 0x1000;222223if (RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, 0xD0000, 1)) {224self->velocity.y = 0;225RSDK.SetSpriteAnimation(Octus->aniFrames, 0, &self->animator, true, 0);226self->state = Octus_State_CheckPlayerInRange;227}228229Octus_CheckPlayerCollisions();230Octus_CheckOffScreen();231}232233void Octus_State_Shot(void)234{235RSDK_THIS(Octus);236237self->position.x += self->velocity.x;238self->position.y += self->velocity.y;239240if (RSDK.CheckOnScreen(self, NULL)) {241RSDK.ProcessAnimation(&self->animator);242foreach_active(Player, player)243{244if (Player_CheckCollisionTouch(player, self, &Octus->hitboxProjectile))245Player_ProjectileHurt(player, self);246}247}248else {249destroyEntity(self);250}251}252253#if GAME_INCLUDE_EDITOR254void Octus_EditorDraw(void) { Octus_Draw(); }255256void Octus_EditorLoad(void)257{258Octus->aniFrames = RSDK.LoadSpriteAnimation("OOZ/Octus.bin", SCOPE_STAGE);259260RSDK_ACTIVE_VAR(Octus, direction);261RSDK_ENUM_VAR("Left", FLIP_NONE);262RSDK_ENUM_VAR("Right", FLIP_X);263}264#endif265266void Octus_Serialize(void) { RSDK_EDITABLE_VAR(Octus, VAR_UINT8, direction); }267268269