Path: blob/master/SonicMania/Objects/BSS/BSS_Message.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: BSS_Message Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectBSS_Message *BSS_Message;1011void BSS_Message_Update(void)12{13RSDK_THIS(BSS_Message);1415StateMachine_Run(self->state);16}1718void BSS_Message_LateUpdate(void) {}1920void BSS_Message_StaticUpdate(void) {}2122void BSS_Message_Draw(void)23{24RSDK_THIS(BSS_Message);25Vector2 drawPos;2627drawPos.x = (ScreenInfo->center.x - self->messageFinishTimer) << 16;28drawPos.y = TO_FIXED(104);29RSDK.DrawSprite(&self->leftAnimator, &drawPos, true);3031drawPos.x = (ScreenInfo->center.x + self->messageFinishTimer) << 16;32RSDK.DrawSprite(&self->rightAnimator, &drawPos, true);3334if (self->fadeEnabled)35RSDK.FillScreen(self->color, self->timer, self->timer - 128, self->timer - 256);36}3738void BSS_Message_Create(void *data)39{40RSDK_THIS(BSS_Message);4142if (!SceneInfo->inEditor) {43self->active = ACTIVE_NORMAL;44self->visible = true;45self->drawGroup = 15;4647switch (VOID_TO_INT(data)) {48case BSS_MESSAGE_GETSPHERES:49self->fadeEnabled = true;50self->color = 0xF0F0F0;51self->timer = 512;52self->state = BSS_Message_State_GetBS;5354RSDK.SetSpriteAnimation(BSS_Message->aniFrames, 2, &self->leftAnimator, true, 0);55RSDK.SetSpriteAnimation(BSS_Message->aniFrames, 2, &self->rightAnimator, true, 1);56break;57case BSS_MESSAGE_PERFECT:58self->messageFinishTimer = 320;59self->state = BSS_Message_State_Perfect;6061RSDK.SetSpriteAnimation(BSS_Message->aniFrames, 3, &self->leftAnimator, true, 0);62RSDK.SetSpriteAnimation(BSS_Message->aniFrames, 3, &self->rightAnimator, true, 1);63break;64case BSS_MESSAGE_FINISHED:65self->fadeEnabled = true;66self->color = 0x000000;67self->state = BSS_Message_State_Finished;68break;69}70}71}7273void BSS_Message_StageLoad(void)74{75BSS_Message->aniFrames = RSDK.LoadSpriteAnimation("SpecialBS/HUD.bin", SCOPE_STAGE);7677RSDK.ResetEntitySlot(SLOT_BSS_MESSAGE, BSS_Message->classID, INT_TO_VOID(BSS_MESSAGE_GETSPHERES));78}7980void BSS_Message_State_GetBS(void)81{82RSDK_THIS(BSS_Message);8384if (self->timer == 512) {85Music_SetMusicTrack("BlueSpheresSPD.ogg", TRACK_STAGE, 5309957);86Music_PlayTrack(TRACK_STAGE);87}8889if (self->timer <= 0) {90self->timer = 0;91self->fadeEnabled = false;92self->state = BSS_Message_State_GetBSWait;93}94else {95self->timer -= 16;96}97}9899void BSS_Message_State_GetBSWait(void)100{101RSDK_THIS(BSS_Message);102103EntityBSS_Setup *setup = RSDK_GET_ENTITY(SLOT_BSS_SETUP, BSS_Setup);104EntityBSS_Player *player = RSDK_GET_ENTITY(SLOT_PLAYER1, BSS_Player);105106if (!setup->speedupLevel) {107if (player->up) {108setup->speedupLevel = 16;109setup->globeSpeed = 16;110setup->globeSpeedInc = 2;111112if (player->onGround)113RSDK.SetSpriteAnimation(player->aniFrames, 1, &player->animator, false, 0);114115self->state = BSS_Message_State_WaitPerfect;116}117118if (!setup->globeTimer && setup->state == BSS_Setup_State_GlobeMoveZ) {119if (player->left)120setup->state = BSS_Setup_State_GlobeTurnLeft;121122if (player->right)123setup->state = BSS_Setup_State_GlobeTurnRight;124}125}126127if (++self->timer >= 180) {128self->timer = 0;129130setup->speedupLevel = 16;131setup->globeSpeed = 16;132setup->globeSpeedInc = 2;133134if (player->onGround)135RSDK.SetSpriteAnimation(player->aniFrames, 1, &player->animator, false, 0);136137self->state = BSS_Message_State_MsgFinished;138}139}140141void BSS_Message_State_Finished(void)142{143RSDK_THIS(BSS_Message);144145if (self->timer >= 768)146self->state = BSS_Message_State_SaveGameProgress;147else148self->timer += 8;149}150151void BSS_Message_State_Perfect(void)152{153RSDK_THIS(BSS_Message);154155self->messageFinishTimer -= 16;156if (self->messageFinishTimer <= 0)157self->state = BSS_Message_State_WaitPerfect;158}159160void BSS_Message_State_WaitPerfect(void)161{162RSDK_THIS(BSS_Message);163164if (++self->timer >= 180) {165self->timer = 0;166self->state = BSS_Message_State_MsgFinished;167}168}169170void BSS_Message_State_MsgFinished(void)171{172RSDK_THIS(BSS_Message);173174self->messageFinishTimer += 16;175if (self->messageFinishTimer > 320)176destroyEntity(self);177}178179#if MANIA_USE_PLUS180void BSS_Message_TrackProgressCB(bool32 success)181{182RSDK_THIS(BSS_Message);183184self->saveInProgress = false;185UIWaitSpinner_FinishWait();186}187#else188void BSS_Message_TrackProgressCB(void)189{190RSDK_THIS(BSS_Message);191192self->saveInProgress = false;193UIWaitSpinner_FinishWait();194}195#endif196197void BSS_Message_State_SaveGameProgress(void)198{199RSDK_THIS(BSS_Message);200201if (self->color) {202self->color -= 0x80808;203}204else {205EntityMenuParam *param = MenuParam_GetParam();206207if (param->bssSelection == BSS_SELECTION_EXTRAS) {208RSDK.SetScene("Presentation", "Menu");209RSDK.LoadScene();210}211else if (globals->gameMode < MODE_TIMEATTACK) {212if (globals->saveSlotID == NO_SAVE_SLOT) {213BSS_Message_State_LoadPrevScene();214}215else {216self->state = BSS_Message_State_LoadPrevScene;217self->saveInProgress = true;218219UIWaitSpinner_StartWait();220GameProgress_TrackGameProgress(BSS_Message_TrackProgressCB);221}222}223}224}225226void BSS_Message_State_LoadPrevScene(void)227{228RSDK_THIS(BSS_Message);229230if (!self->saveInProgress) {231globals->blueSpheresInit = true;232GameProgress_ShuffleBSSID();233234SaveRAM *saveRAM = SaveGame_GetSaveRAM();235#if MANIA_USE_PLUS236if (globals->gameMode == MODE_ENCORE)237RSDK.SetScene("Encore Mode", "");238else239#endif240RSDK.SetScene("Mania Mode", "");241242SceneInfo->listPos = saveRAM->storedStageID;243RSDK.LoadScene();244self->state = StateMachine_None;245}246}247248#if GAME_INCLUDE_EDITOR249void BSS_Message_EditorDraw(void) {}250251void BSS_Message_EditorLoad(void) {}252#endif253254void BSS_Message_Serialize(void) {}255256257