Path: blob/master/SonicMania/Objects/SPZ/Letterboard.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Letterboard Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectLetterboard *Letterboard;1011void Letterboard_Update(void)12{13RSDK_THIS(Letterboard);1415StateMachine_Run(self->state);16}1718void Letterboard_LateUpdate(void) {}1920void Letterboard_StaticUpdate(void) {}2122void Letterboard_Draw(void)23{24RSDK_THIS(Letterboard);2526self->scale.x = abs(RSDK.Cos512(self->angle));27RSDK.DrawSprite(RSDK.Cos512(self->angle) >= 0 ? &self->animatorBack : &self->animatorFront, NULL, false);28}2930void Letterboard_Create(void *data)31{32RSDK_THIS(Letterboard);3334if (!SceneInfo->inEditor) {35RSDK.SetSpriteAnimation(Letterboard->aniFrames, 0, &self->animatorBack, true, 0);36RSDK.SetSpriteAnimation(Letterboard->aniFrames, 1, &self->animatorFront, true, 0);3738if (self->controller) {39self->state = Letterboard_State_Controller;40}41else if (self->letterID) {42self->state = Letterboard_State_CheckPlayerSpin;43self->animatorFront.frameID = self->letterID - 1;44}4546self->scale.x = 0x200;47self->scale.y = 0x200;48self->active = ACTIVE_BOUNDS;49self->updateRange.x = 0x400000;50self->updateRange.y = 0x400000;51self->visible = true;52self->drawGroup = Zone->objectDrawGroup[0];53}54}5556void Letterboard_StageLoad(void)57{58Letterboard->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/Letterboard.bin", SCOPE_STAGE);5960Letterboard->hitboxBoard.left = -12;61Letterboard->hitboxBoard.top = -12;62Letterboard->hitboxBoard.right = 12;63Letterboard->hitboxBoard.bottom = 12;6465Letterboard->sfxLetterTurn = RSDK.GetSfx("Stage/LetterTurn.wav");66Letterboard->sfxWin = RSDK.GetSfx("Stage/Win.wav");67}6869void Letterboard_State_Controller(void)70{71RSDK_THIS(Letterboard);7273self->active = ACTIVE_BOUNDS;7475bool32 revealedAll = true;76int32 slot = SceneInfo->entitySlot + 1;7778for (int32 i = 0; i < self->letterID; ++i) {79EntityLetterboard *letterboard = RSDK_GET_ENTITY(slot + i, Letterboard);80if (letterboard->state)81revealedAll = false;8283if (letterboard->state == Letterboard_State_Spun)84self->active = ACTIVE_NORMAL;85}8687if (revealedAll) {88RSDK.PlaySfx(Letterboard->sfxWin, false, 0xFF);8990self->active = ACTIVE_BOUNDS;91self->state = StateMachine_None;92if (globals->gameMode != MODE_COMPETITION)93Player_GiveScore(RSDK_GET_ENTITY(SLOT_PLAYER1, Player), 100 * self->letterID);94}95}9697void Letterboard_State_CheckPlayerSpin(void)98{99RSDK_THIS(Letterboard);100101foreach_active(Player, player)102{103self->spinSpeed = (abs(player->velocity.x) + abs(player->velocity.y)) >> 14;104if (self->spinSpeed > 0) {105if (Player_CheckCollisionTouch(player, self, &Letterboard->hitboxBoard)) {106self->drawFX = FX_SCALE;107self->state = Letterboard_State_Spun;108if (self->spinSpeed > 16)109self->spinSpeed = 16;110if (self->spinSpeed < 8)111self->spinSpeed = 8;112113self->timer = 2;114int32 slot = SceneInfo->entitySlot;115116EntityLetterboard *letterboard = self;117while (slot >= 0) {118letterboard = RSDK_GET_ENTITY(slot--, Letterboard);119if (letterboard->state == Letterboard_State_Controller)120break;121}122123letterboard->active = ACTIVE_NORMAL;124self->active = ACTIVE_NORMAL;125RSDK.PlaySfx(Letterboard->sfxLetterTurn, false, 255);126foreach_break;127}128}129}130}131132void Letterboard_State_Spun(void)133{134RSDK_THIS(Letterboard);135136int32 prevAngle = self->angle;137self->angle = (self->angle + self->spinSpeed) & 0x1FF;138if (self->angle >= 0x100 && prevAngle < 0x100 && --self->timer <= 0) {139self->active = ACTIVE_BOUNDS;140self->angle = 0x100;141self->state = StateMachine_None;142}143}144145#if GAME_INCLUDE_EDITOR146void Letterboard_EditorDraw(void)147{148RSDK_THIS(Letterboard);149150RSDK.SetSpriteAnimation(Letterboard->aniFrames, 0, &self->animatorBack, true, 0);151RSDK.SetSpriteAnimation(Letterboard->aniFrames, 1, &self->animatorFront, true, 0);152153if (!self->controller && self->letterID) {154self->animatorFront.frameID = self->letterID - 1;155RSDK.DrawSprite(&self->animatorFront, NULL, false);156}157else {158RSDK.DrawSprite(&self->animatorBack, NULL, false);159}160161if (self->controller && showGizmos()) {162RSDK_DRAWING_OVERLAY(true);163164int32 slot = SceneInfo->entitySlot + 1;165for (int32 i = 0; i < self->letterID; ++i) {166EntityLetterboard *letterboard = RSDK_GET_ENTITY(slot + i, Letterboard);167168if (letterboard) {169DrawHelpers_DrawArrow(self->position.x, self->position.y, letterboard->position.x, letterboard->position.y, 0xFFFF00, INK_NONE, 0xFF);170}171}172173RSDK_DRAWING_OVERLAY(false);174}175}176177void Letterboard_EditorLoad(void) { Letterboard->aniFrames = RSDK.LoadSpriteAnimation("SPZ2/Letterboard.bin", SCOPE_STAGE); }178#endif179180void Letterboard_Serialize(void)181{182RSDK_EDITABLE_VAR(Letterboard, VAR_BOOL, controller);183RSDK_EDITABLE_VAR(Letterboard, VAR_UINT8, letterID);184}185186187