Path: blob/master/SonicMania/Objects/HPZ/Stegway.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Stegway Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectStegway *Stegway = NULL;1011void Stegway_Update(void)12{13RSDK_THIS(Stegway);14RSDK.ProcessAnimation(&self->mainAnimator);15RSDK.ProcessAnimation(&self->wheelAnimator);16if (self->showJet)17RSDK.ProcessAnimation(&self->jetAnimator);1819StateMachine_Run(self->state);2021Stegway_HandlePlayerInteractions();22if (self->state != Stegway_State_Init)23Stegway_CheckOffScreen();24}2526void Stegway_LateUpdate(void) {}2728void Stegway_StaticUpdate(void) {}2930void Stegway_Draw(void)31{32RSDK_THIS(Stegway);33RSDK.DrawSprite(&self->mainAnimator, NULL, false);34RSDK.DrawSprite(&self->wheelAnimator, NULL, false);35if (self->showJet)36RSDK.DrawSprite(&self->jetAnimator, NULL, false);37}3839void Stegway_Create(void *data)40{41RSDK_THIS(Stegway);42self->visible = true;43self->drawGroup = Zone->objectDrawGroup[0];44self->startPos = self->position;45self->startDir = self->direction;46self->drawFX = FX_FLIP;47self->active = ACTIVE_BOUNDS;48self->updateRange.x = 0x800000;49self->updateRange.y = 0x800000;50self->state = Stegway_State_Init;51}5253void Stegway_StageLoad(void)54{55if (RSDK.CheckSceneFolder("HPZ"))56Stegway->aniFrames = RSDK.LoadSpriteAnimation("HPZ/Stegway.bin", SCOPE_STAGE);5758Stegway->hitboxBadnik.left = -20;59Stegway->hitboxBadnik.top = -14;60Stegway->hitboxBadnik.right = 20;61Stegway->hitboxBadnik.bottom = 14;6263Stegway->hitboxRange.left = -96;64Stegway->hitboxRange.top = -32;65Stegway->hitboxRange.right = 0;66Stegway->hitboxRange.bottom = 14;6768Stegway->sfxRev = RSDK.GetSfx("Stage/Rev.wav");69Stegway->sfxRelease = RSDK.GetSfx("Global/Release.wav");7071DEBUGMODE_ADD_OBJ(Stegway);72}7374void Stegway_DebugSpawn(void)75{76RSDK_THIS(DebugMode);7778EntityStegway *stegway = CREATE_ENTITY(Stegway, NULL, self->position.x, self->position.y);79stegway->direction = self->direction;80stegway->startDir = self->direction;81}8283void Stegway_DebugDraw(void)84{85RSDK.SetSpriteAnimation(Stegway->aniFrames, 0, &DebugMode->animator, true, 0);86RSDK.DrawSprite(&DebugMode->animator, NULL, false);87}8889void Stegway_CheckOffScreen(void)90{91RSDK_THIS(Stegway);9293if (!RSDK.CheckOnScreen(self, NULL) && !RSDK.CheckPosOnScreen(&self->startPos, &self->updateRange)) {94self->direction = self->startDir;95self->position = self->startPos;96Stegway_Create(NULL);97}98}99100void Stegway_HandlePlayerInteractions(void)101{102RSDK_THIS(Stegway);103foreach_active(Player, player)104{105if (Player_CheckBadnikTouch(player, self, &Stegway->hitboxBadnik))106Player_CheckBadnikBreak(player, self, true);107}108}109110void Stegway_SetupAnims(char type, bool32 force)111{112RSDK_THIS(Stegway);113switch (type) {114case 0:115if (force || self->mainAnimator.animationID)116RSDK.SetSpriteAnimation(Stegway->aniFrames, 0, &self->mainAnimator, true, 0);117self->mainAnimator.speed = 1;118self->wheelAnimator.speed = 6;119break;120121case 1:122if (force || self->mainAnimator.animationID != 1)123RSDK.SetSpriteAnimation(Stegway->aniFrames, 1, &self->mainAnimator, true, 0);124self->wheelAnimator.speed = 16;125break;126127case 2:128if (force || self->mainAnimator.animationID)129RSDK.SetSpriteAnimation(Stegway->aniFrames, 0, &self->mainAnimator, true, 0);130if (self->mainAnimator.frameID == 2)131self->mainAnimator.frameID = 1;132self->mainAnimator.speed = 0;133self->wheelAnimator.speed = 24;134break;135136case 3:137if (force || self->mainAnimator.animationID)138RSDK.SetSpriteAnimation(Stegway->aniFrames, 0, &self->mainAnimator, true, 0);139if (self->mainAnimator.frameID == 2)140self->mainAnimator.frameID = 1;141self->mainAnimator.speed = 0;142self->wheelAnimator.speed = 0;143break;144default: break;145}146}147148void Stegway_State_Init(void)149{150RSDK_THIS(Stegway);151152self->active = ACTIVE_NORMAL;153if (self->direction == FLIP_NONE)154self->velocity.x = -0x4000;155else156self->velocity.x = 0x4000;157RSDK.SetSpriteAnimation(Stegway->aniFrames, 2, &self->wheelAnimator, true, 0);158RSDK.SetSpriteAnimation(Stegway->aniFrames, 3, &self->jetAnimator, true, 0);159Stegway_SetupAnims(0, true);160self->state = Stegway_State_Moving;161Stegway_State_Moving();162}163164void Stegway_State_Moving(void)165{166RSDK_THIS(Stegway);167168self->position.x += self->velocity.x;169170foreach_active(Player, player)171{172if (Player_CheckCollisionTouch(player, self, &Stegway->hitboxRange)) {173self->state = Stegway_State_RevUp;174Stegway_SetupAnims(3, false);175}176}177178bool32 collided = false;179if (self->direction)180collided = RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0xC0000, 0x100000, 8);181else182collided = RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, -0xC0000, 0x100000, 8);183184if (!collided) {185self->state = Stegway_State_Turn;186Stegway_SetupAnims(3, false);187self->showJet = false;188self->noFloor = false;189}190Stegway_CheckOffScreen();191}192193void Stegway_State_Turn(void)194{195RSDK_THIS(Stegway);196197if (self->timer >= 29) {198self->timer = 0;199self->state = Stegway_State_Moving;200Stegway_SetupAnims(0, false);201202self->direction ^= FLIP_X;203if (self->direction == FLIP_NONE)204self->velocity.x = -0x4000;205else206self->velocity.x = 0x4000;207}208else {209self->timer++;210}211}212213void Stegway_State_RevUp(void)214{215RSDK_THIS(Stegway);216if (++self->timer == 8) {217self->timer = 0;218self->state = Stegway_State_RevRelease;219Stegway_SetupAnims(2, false);220RSDK.PlaySfx(Stegway->sfxRev, false, 255);221}222}223224void Stegway_State_RevRelease(void)225{226RSDK_THIS(Stegway);227if (++self->timer == 32) {228self->timer = 0;229self->state = Stegway_State_Dash;230EntityDust *dust =231CREATE_ENTITY(Dust, self, self->position.x - 0xA0000 * (2 * (self->direction != FLIP_NONE) - 1), self->position.y + 0x100000);232RSDK.SetSpriteAnimation(Dust->aniFrames, 2, &dust->animator, true, 0);233dust->state = Dust_State_DustPuff;234dust->direction = FLIP_X - self->direction;235dust->drawGroup = self->drawGroup;236Stegway_SetupAnims(1, false);237self->showJet = true;238self->velocity.x *= 12;239RSDK.PlaySfx(Stegway->sfxRelease, false, 255);240}241}242243void Stegway_State_Dash(void)244{245RSDK_THIS(Stegway);246247self->position.x += self->velocity.x;248int32 dir = 2 * (self->direction != FLIP_NONE) - 1;249250if (!self->noFloor) {251int32 storeX = self->position.x;252int32 storeY = self->position.y;253if (!RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, dir << 22, 0x100000, 8))254self->noFloor = true;255self->position.x = storeX;256self->position.y = storeY;257}258259bool32 collided = RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0xC0000 * dir, 0x100000, 8);260261if (self->noFloor) {262if (self->velocity.x * dir >= 0x4000) {263self->velocity.x -= 0xA00 * dir;264if (dir * self->velocity.x < 0x4000) {265self->velocity.x = dir << 14;266self->state = Stegway_State_Moving;267Stegway_SetupAnims(0, false);268self->mainAnimator.frameID = 0;269self->showJet = false;270self->noFloor = false;271}272}273}274275if (!collided) {276self->state = Stegway_State_Turn;277Stegway_SetupAnims(3, false);278self->showJet = false;279self->noFloor = false;280}281}282283#if GAME_INCLUDE_EDITOR284void Stegway_EditorDraw(void)285{286RSDK_THIS(Stegway);287RSDK.SetSpriteAnimation(Stegway->aniFrames, 2, &self->wheelAnimator, true, 0);288RSDK.SetSpriteAnimation(Stegway->aniFrames, 3, &self->jetAnimator, true, 0);289Stegway_SetupAnims(0, true);290291Stegway_Draw();292}293294void Stegway_EditorLoad(void)295{296Stegway->aniFrames = RSDK.LoadSpriteAnimation("HPZ/Stegway.bin", SCOPE_STAGE);297298RSDK_ACTIVE_VAR(Stegway, direction);299RSDK_ENUM_VAR("No Flip", FLIP_NONE);300RSDK_ENUM_VAR("Flip X", FLIP_X);301}302#endif303304void Stegway_Serialize(void) { RSDK_EDITABLE_VAR(Stegway, VAR_UINT8, direction); }305306307