Path: blob/master/SonicMania/Objects/Summary/Summary.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Summary Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if MANIA_USE_PLUS10ObjectSummary *Summary;1112void Summary_Update(void)13{14RSDK_THIS(Summary);1516StateMachine_Run(self->state);1718ScreenInfo->position.x = 0x100 - ScreenInfo->center.x;19}2021void Summary_LateUpdate(void) {}2223void Summary_StaticUpdate(void)24{25if (--Summary->bgAniDuration <= 0) {26++Summary->bgAniFrame;27Summary->bgAniFrame &= 3;28Summary->bgAniDuration = Summary->bgAniDurationTable[Summary->bgAniFrame];2930TileLayer *background = RSDK.GetTileLayer(0);31background->scrollPos = (background->scrollPos + 0x1000000) & 0x7FF0000;32}33}3435void Summary_Draw(void)36{37RSDK_THIS(Summary);3839StateMachine_Run(self->stateDraw);40}4142void Summary_Create(void *data)43{44RSDK_THIS(Summary);4546if (!SceneInfo->inEditor) {47self->active = ACTIVE_ALWAYS;48self->visible = true;49self->drawGroup = 12;50self->state = Summary_State_SetupText;51self->stateDraw = Summary_State_Draw;52self->timer = 640;53}54}5556void Summary_StageLoad(void)57{58RSDK.ResetEntitySlot(0, Summary->classID, NULL);5960UIPicture->aniFrames = RSDK.LoadSpriteAnimation("LSelect/Icons.bin", SCOPE_STAGE);61UIText->aniFrames = RSDK.LoadSpriteAnimation("LSelect/Text.bin", SCOPE_STAGE);62}6364void Summary_State_Draw(void)65{66RSDK_THIS(Summary);6768RSDK.FillScreen(0x000000, self->timer, self->timer - 128, self->timer - 256);69}7071void Summary_State_SetupText(void)72{73RSDK_THIS(Summary);7475self->unusedPtr = NULL;76self->gameModeLabel = NULL;77self->saveFileLabel = NULL;7879foreach_all(UIText, text)80{81switch (text->align) {82default:83case UITEXT_ALIGN_LEFT: break;8485case UITEXT_ALIGN_CENTER:86if (self->gameModeLabel)87self->saveFileLabel = text;88else89self->gameModeLabel = text;90break;9192case UITEXT_ALIGN_RIGHT:93if (text->data1 == 0xFF) {94self->totalTime = text;95}96else {97if (text->data0 > -1 && text->data0 < 32)98self->zoneLabels[text->data0] = text;99}100break;101}102}103104self->leaderCharacterID = HUD_CharacterIndexFromID(GET_CHARACTER_ID(1)) + 1;105self->sidekickCharacterID = HUD_CharacterIndexFromID(GET_CHARACTER_ID(2)) + 1;106107foreach_all(UIPicture, picture)108{109if (picture->listID == 3) {110if (picture->frameID == 1)111self->player2Icon = picture;112else113self->player1Icon = picture;114}115}116117self->player2Icon->animator.frameID = self->leaderCharacterID;118self->player1Icon->animator.frameID = self->sidekickCharacterID;119120Summary_LoadTimes();121self->state = Summary_State_FadeIn;122}123124void Summary_State_FadeIn(void)125{126RSDK_THIS(Summary);127128if (self->timer <= 0) {129self->timer = 0;130self->state = Summary_State_Wait;131self->stateDraw = StateMachine_None;132}133else {134self->timer -= 16;135}136}137138void Summary_State_Wait(void)139{140RSDK_THIS(Summary);141142if (ControllerInfo->keyStart.press || (API_GetConfirmButtonFlip() ? ControllerInfo->keyB.press : ControllerInfo->keyA.press)) {143RSDK.SetScene("Presentation", "Menu");144self->timer = 0;145self->state = Summary_State_FadeOut;146self->stateDraw = Summary_State_Draw;147Music_FadeOut(0.01);148}149else {150self->timer = 0;151}152}153154void Summary_State_FadeOut(void)155{156RSDK_THIS(Summary);157158if (self->timer >= 0x400)159RSDK.LoadScene();160else161self->timer += 0x10;162}163164void Summary_SetTextString(uint8 anim, EntityUIText *text, const char *str)165{166if (!UIWidgets || UIText->aniFrames)167RSDK.SetSpriteAnimation(UIText->aniFrames, anim, &text->animator, true, 0);168else169RSDK.SetSpriteAnimation(UIWidgets->uiFrames, anim, &text->animator, true, 0);170171RSDK.SetString(&text->text, str);172text->listID = anim;173174if (!UIWidgets || UIText->aniFrames)175RSDK.SetSpriteString(UIText->aniFrames, text->listID, &text->text);176else177RSDK.SetSpriteString(UIWidgets->uiFrames, text->listID, &text->text);178}179void Summary_GetPlayTime(char *buffer, int32 time)180{181if (!time) {182sprintf(buffer, "--'--\"--");183}184else {185int32 packedTime = 100 * time;186int32 hours = 0;187int32 minutes = 0;188int32 seconds = 0;189int32 milliseconds = 0;190191while (packedTime >= 6000) {192++seconds;193packedTime -= MIN(packedTime, 6025);194}195196if (seconds >= 60) {197minutes = (seconds - 60) / 60 + 1;198seconds -= 60 * minutes;199}200201milliseconds = (packedTime / 60) & 0xFF;202203if (minutes >= 60) {204hours = (minutes - 60) / 60 + 1;205minutes -= 60 * hours;206207sprintf(buffer, "%d:%02d'%02d\"%02d", hours, minutes, seconds, milliseconds);208}209else {210sprintf(buffer, "%02d'%02d\"%02d", minutes, seconds, milliseconds);211}212}213}214215void Summary_LoadTimes(void)216{217RSDK_THIS(Summary);218219if (globals->gameMode == MODE_ENCORE) {220if (Localization->language == LANGUAGE_JP || sku_region == REGION_JP)221Summary_SetTextString(1, self->gameModeLabel, "STORY MODE PLUS");222else223Summary_SetTextString(1, self->gameModeLabel, "ENCORE MODE");224}225else {226if (Localization->language == LANGUAGE_JP || sku_region == REGION_JP) {227Summary_SetTextString(1, self->gameModeLabel, "STORY MODE");228}229else {230Summary_SetTextString(1, self->gameModeLabel, "MANIA MODE");231}232}233234if (globals->saveSlotID == NO_SAVE_SLOT) {235Summary_SetTextString(0, self->saveFileLabel, "NO SAVE");236}237else {238char text[0x20];239sprintf_s(text, (int32)sizeof(text), "%s %d", "SAVE SLOT", globals->saveSlotID);240241Summary_SetTextString(0, self->saveFileLabel, text);242}243244SaveRAM *saveRAM = SaveGame_GetSaveRAM();245char playTime[0x100];246memset(playTime, 0, 0x100);247int32 totalTime = 0;248249for (int32 i = 0; i < 0x20; ++i) {250if (self->zoneLabels[i]) {251EntityUIText *text = self->zoneLabels[i];252253Summary_GetPlayTime(playTime, saveRAM->zoneTimes[text->data0]);254255int32 newTotal = saveRAM->zoneTimes[text->data0] + totalTime;256if (newTotal < totalTime)257newTotal = -1;258259totalTime = newTotal;260Summary_SetTextString(0, text, playTime);261}262}263264Summary_GetPlayTime(playTime, totalTime);265Summary_SetTextString(0, self->totalTime, playTime);266}267268#if GAME_INCLUDE_EDITOR269void Summary_EditorDraw(void) {}270271void Summary_EditorLoad(void)272{273if (UIPicture)274UIPicture->aniFrames = RSDK.LoadSpriteAnimation("LSelect/Icons.bin", SCOPE_STAGE);275276if (UIText)277UIText->aniFrames = RSDK.LoadSpriteAnimation("LSelect/Text.bin", SCOPE_STAGE);278}279#endif280281void Summary_Serialize(void) {}282#endif283284285