Path: blob/master/SonicMania/Objects/CPZ/Staircase.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Staircase Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectStaircase *Staircase;1011void Staircase_Update(void)12{13RSDK_THIS(Staircase);1415StateMachine_Run(self->state);16}1718void Staircase_LateUpdate(void) {}1920void Staircase_StaticUpdate(void) {}2122void Staircase_Draw(void)23{24RSDK_THIS(Staircase);2526StateMachine_Run(self->stateDraw);27}2829void Staircase_Create(void *data)30{31RSDK_THIS(Staircase);3233self->visible = true;34self->drawGroup = Zone->objectDrawGroup[0];35self->active = ACTIVE_BOUNDS;36self->updateRange.x = 0x1000000;37self->updateRange.y = 0x1000000;3839// Why is a static value being initialized in Create?40Staircase->blockHitbox.top = -16;41Staircase->blockHitbox.left = -16;42Staircase->blockHitbox.bottom = 16;43Staircase->blockHitbox.right = 16;4445int32 add = self->direction ? -0x200000 : 0x200000;4647for (int32 i = 0; i < STAIRCASE_STAIR_COUNT; ++i) {48self->blockPos[i].x = self->position.x + i * add;49self->blockPos[i].y = self->position.y;50}5152RSDK.SetSpriteAnimation(Staircase->aniFrames, 0, &self->animator, true, 0);5354self->state = Staircase_State_Idle;55self->stateDraw = Staircase_Draw_Blocks;56}5758void Staircase_StageLoad(void)59{60if (RSDK.CheckSceneFolder("CPZ")) {61Staircase->aniFrames = RSDK.LoadSpriteAnimation("CPZ/Staircase.bin", SCOPE_STAGE);6263// What a name tbh64Staircase->sfxBlockStop = RSDK.GetSfx("CPZ/CPZ2HitBlocksStop.wav");65Soundboard_LoadSfx("CPZ/CPZ2HitBlocks.wav", true, Staircase_SfxCheck_HitBlocks, StateMachine_None);66}67}6869bool32 Staircase_SfxCheck_HitBlocks(void)70{71foreach_active(Staircase, entity)72{73if (entity->stateDraw == Staircase_Draw_Shake)74return true;75}7677return false;78}7980void Staircase_State_Idle(void)81{82RSDK_THIS(Staircase);8384Vector2 posStore = self->position;85foreach_active(Player, player)86{87for (int32 i = 0; i < STAIRCASE_STAIR_COUNT; i++) {88self->position = self->blockPos[i];89int32 side = Player_CheckCollisionBox(player, self, &Staircase->blockHitbox);90if (side == C_BOTTOM) {91// bumpable would prolly be used here :D92self->active = ACTIVE_NORMAL;93self->timer = 59;94self->state = Staircase_State_Wait;95self->stateDraw = Staircase_Draw_Shake;96if (player->onGround)97player->deathType = PLAYER_DEATH_DIE_USESFX;98}99else if (side == C_TOP) {100self->active = ACTIVE_NORMAL;101self->timer = 32;102self->state = Staircase_State_Wait;103}104}105}106107self->position = posStore;108}109110void Staircase_State_Wait(void)111{112RSDK_THIS(Staircase);113114Vector2 posStore = self->position;115foreach_active(Player, player)116{117for (int32 i = 0; i < STAIRCASE_STAIR_COUNT; i++) {118self->position = self->blockPos[i];119Player_CheckCollisionBox(player, self, &Staircase->blockHitbox);120}121}122self->position = posStore;123124if (--self->timer < 0) {125self->timer = 128;126if (!RSDK.IsSfxPlaying(Staircase->sfxBlockStop))127RSDK.PlaySfx(Staircase->sfxBlockStop, false, 255);128self->state = Staircase_State_MoveBlocks;129self->stateDraw = Staircase_Draw_Blocks;130}131132if (!RSDK.CheckOnScreen(self, &self->updateRange))133Staircase_Create(NULL);134}135136void Staircase_State_MoveBlocks(void)137{138RSDK_THIS(Staircase);139140int32 add = self->type ? -0x4000 : 0x4000;141Vector2 posStore = self->position;142foreach_active(Player, player)143{144for (int32 i = 0; i < STAIRCASE_STAIR_COUNT; i++) {145self->position = self->blockPos[i];146if (Player_CheckCollisionBox(player, self, &Staircase->blockHitbox) == C_TOP)147player->position.y += add * (i + 1);148}149}150self->position = posStore;151152for (int32 i = 0; i < STAIRCASE_STAIR_COUNT; ++i) self->blockPos[i].y += (i + 1) * add;153154if (--self->timer <= 0)155self->state = Staircase_State_MovedBlocks;156157if (!RSDK.CheckOnScreen(self, &self->updateRange))158Staircase_Create(NULL);159}160161void Staircase_State_MovedBlocks(void)162{163RSDK_THIS(Staircase);164165Vector2 posStore = self->position;166foreach_active(Player, player)167{168for (int32 i = 0; i < STAIRCASE_STAIR_COUNT; i++) {169self->position = self->blockPos[i];170if (Player_CheckCollisionBox(player, self, &Staircase->blockHitbox) == C_BOTTOM && player->onGround)171player->deathType = PLAYER_DEATH_DIE_USESFX;172}173}174self->position = posStore;175176if (!RSDK.CheckOnScreen(self, &self->updateRange))177Staircase_Create(NULL);178}179180void Staircase_Draw_Blocks(void)181{182RSDK_THIS(Staircase);183184for (int32 i = 0; i < STAIRCASE_STAIR_COUNT; i++) {185RSDK.DrawSprite(&self->animator, &self->blockPos[i], false);186}187}188189void Staircase_Draw_Shake(void)190{191RSDK_THIS(Staircase);192193for (int32 i = 0; i < STAIRCASE_STAIR_COUNT; i++) {194Vector2 drawPos = self->blockPos[i];195drawPos.y += ((self->timer - i * STAIRCASE_STAIR_COUNT) << 14) & 0x10000;196RSDK.DrawSprite(&self->animator, &drawPos, false);197}198}199200#if GAME_INCLUDE_EDITOR201void Staircase_EditorDraw(void)202{203RSDK_THIS(Staircase);204205int32 addX = self->direction ? -0x200000 : 0x200000;206207for (int32 i = 0; i < STAIRCASE_STAIR_COUNT; ++i) {208self->blockPos[i].x = self->position.x + i * addX;209self->blockPos[i].y = self->position.y;210}211212Staircase_Draw_Blocks();213214if (showGizmos()) {215RSDK_DRAWING_OVERLAY(true);216217self->inkEffect = INK_BLEND;218219int32 addY = self->type ? -0x200000 : 0x200000;220for (int32 i = 0; i < STAIRCASE_STAIR_COUNT; ++i) self->blockPos[i].y += (i + 1) * addY;221222Staircase_Draw_Blocks();223224self->inkEffect = INK_NONE;225226RSDK_DRAWING_OVERLAY(false);227}228}229230void Staircase_EditorLoad(void)231{232Staircase->aniFrames = RSDK.LoadSpriteAnimation("CPZ/Staircase.bin", SCOPE_STAGE);233234RSDK_ACTIVE_VAR(Staircase, direction);235RSDK_ENUM_VAR("Right", FLIP_NONE);236RSDK_ENUM_VAR("Left", FLIP_X);237238RSDK_ACTIVE_VAR(Staircase, type);239RSDK_ENUM_VAR("Down", STAIRCASE_DOWN);240RSDK_ENUM_VAR("Up", STAIRCASE_UP);241}242#endif243244void Staircase_Serialize(void)245{246RSDK_EDITABLE_VAR(Staircase, VAR_UINT8, direction);247RSDK_EDITABLE_VAR(Staircase, VAR_UINT8, type);248// fun fact: why is this never used249RSDK_EDITABLE_VAR(Staircase, VAR_BOOL, bumpable);250}251252