Path: blob/master/SonicMania/Objects/Global/DialogRunner.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: DialogRunner Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if MANIA_USE_PLUS10ObjectDialogRunner *DialogRunner;1112void DialogRunner_Update(void)13{14RSDK_THIS(DialogRunner);15StateMachine_Run(self->state);16}1718void DialogRunner_LateUpdate(void) {}1920void DialogRunner_StaticUpdate(void) {}2122void DialogRunner_Draw(void) {}2324void DialogRunner_Create(void *data)25{26RSDK_THIS(DialogRunner);27self->active = ACTIVE_ALWAYS;28self->visible = false;29self->state = (Type_StateMachine)data;30self->timer = 0;31self->useGenericText = false;32}3334void DialogRunner_StageLoad(void)35{36DialogRunner->authForbidden = false;37DialogRunner->signedOut = false;38DialogRunner->unused2 = 0;39DialogRunner->unused1 = 0;40DialogRunner->isAutoSaving = false;4142if (!globals->hasPlusInitial) {43globals->lastHasPlus = API.CheckDLC(DLC_PLUS);44globals->hasPlusInitial = true;45}46DialogRunner->activeCallback = NULL;4748SaveGame_LoadSaveData();49TimeAttackData->loaded = false;50TimeAttackData->uuid = 0;51TimeAttackData->rowID = -1;52TimeAttackData->personalRank = 0;53TimeAttackData->leaderboardRank = 0;54TimeAttackData->isMigratingData = false;5556Options->changed = false;57if (sku_platform && sku_platform != PLATFORM_DEV) {58OptionsRAM *options = Options_GetOptionsRAM();59options->vSync = false;60options->windowed = false;61options->windowBorder = false;62options->tripleBuffering = false;63}64else {65Options_Reload();66}67}6869void DialogRunner_HandleCallback(void)70{71RSDK_THIS(DialogRunner);7273if (self->timer <= 0) {74LogHelpers_Print("Callback: %x", self->callback);75StateMachine_Run(self->callback);76destroyEntity(self);77}78else {79self->timer--;80}81}8283void DialogRunner_NotifyAutoSave_CB(void)84{85DialogRunner->isAutoSaving = false;86globals->notifiedAutosave = true;87UIWaitSpinner_FinishWait();88}8990void DialogRunner_NotifyAutoSave(void)91{92RSDK_THIS(DialogRunner);9394String string;95INIT_STRING(string);96if (DialogRunner->isAutoSaving) {97if (!UIDialog->activeDialog) {98Localization_GetString(&string, STR_AUTOSAVENOTIF);99EntityUIDialog *dialog = UIDialog_CreateDialogOk(&string, DialogRunner_NotifyAutoSave_CB, true);100dialog->useAltColor = true;101}102}103else {104DialogRunner->activeCallback = NULL;105destroyEntity(self);106}107}108109void DialogRunner_SetNoSaveDisabled(void)110{111API.SetSaveStatusForbidden();112API.SetNoSave(false);113}114115void DialogRunner_SetNoSaveEnabled(void)116{117API.SetSaveStatusError();118API.SetNoSave(true);119}120121void DialogRunner_PromptSavePreference_CB(void)122{123RSDK_THIS(DialogRunner);124125String string;126INIT_STRING(string);127if (API.GetSaveStatus() == STATUS_CONTINUE) {128if (!UIDialog->activeDialog) {129int32 stringID = STR_SAVELOADFAIL;130switch (self->status) {131case STATUS_ERROR:132stringID = STR_NOXBOXPROFILE;133if (sku_platform != PLATFORM_XB1)134stringID = STR_SAVELOADFAIL;135break;136case STATUS_CORRUPT: stringID = STR_CORRUPTSAVE; break;137case STATUS_NOSPACE: stringID = (sku_platform == PLATFORM_XB1) + STR_NOSAVESPACE; break;138}139Localization_GetString(&string, stringID);140EntityUIDialog *dialog = UIDialog_CreateDialogYesNo(&string, DialogRunner_SetNoSaveEnabled, DialogRunner_SetNoSaveDisabled, true, true);141dialog->useAltColor = true;142}143}144else {145DialogRunner->activeCallback = NULL;146destroyEntity(self);147}148}149void DialogRunner_CheckUserAuth_CB()150{151RSDK_THIS(DialogRunner);152153if (self->timer) {154if (DialogRunner->signedOut) {155if (!UIDialog->activeDialog) {156if (Zone && Zone_GetZoneID() != ZONE_INVALID) {157RSDK.SetScene("Presentation", "Title Screen");158Zone_StartFadeOut(10, 0x000000);159}160else if (MenuSetup) {161ManiaModeMenu_StartReturnToTitle();162}163else if (UFO_Setup) {164UFO_Setup->resetToTitle = true;165foreach_all(UFO_Setup, setup)166{167setup->fadeColor = 0;168setup->state = UFO_Setup_State_FinishFadeout;169setup->active = ACTIVE_ALWAYS;170setup->visible = true;171}172}173else if (FXFade) {174RSDK.SetScene("Presentation", "Title Screen");175EntityFXFade *fxFade = CREATE_ENTITY(FXFade, NULL, self->position.x, self->position.y);176fxFade->active = ACTIVE_ALWAYS;177fxFade->timer = 0;178fxFade->speedIn = 16;179fxFade->speedOut = 16;180fxFade->state = FXFade_State_FadeOut;181fxFade->drawGroup = DRAWGROUP_COUNT - 1;182fxFade->isPermanent = true;183fxFade->oneWay = true;184fxFade->transitionScene = true;185}186187DialogRunner->activeCallback = NULL;188destroyEntity(self);189}190}191else if (!UIDialog->activeDialog) {192String string;193int32 id = STR_SIGNOUTDETECTED;194if (self->useGenericText)195id = STR_RETRURNINGTOTITLE;196Localization_GetString(&string, id);197EntityUIDialog *dialog = UIDialog_CreateDialogOk(&string, DialogRunner_CheckUserAuth_OK, true);198dialog->useAltColor = true;199}200}201else {202EntityUIDialog *dialog = UIDialog->activeDialog;203if (dialog) {204UIDialog_CloseOnSel_HandleSelection(dialog, StateMachine_None);205}206else {207if (UIControl) {208if (UIControl_GetUIControl())209UIControl_SetInactiveMenu(UIControl_GetUIControl());210}211212RSDK.SetEngineState(ENGINESTATE_FROZEN);213Music_Stop();214self->timer = 1;215}216}217}218void DialogRunner_ManageNotifs(void)219{220RSDK_THIS(DialogRunner);221222if (GameProgress_CountUnreadNotifs()) {223String string;224INIT_STRING(string);225if (!UIDialog->activeDialog) {226int32 str = GameProgress_GetNotifStringID(GameProgress_GetNextNotif());227Localization_GetString(&string, str);228EntityUIDialog *dialog = UIDialog_CreateDialogOk(&string, DialogRunner_GetNextNotif, true);229dialog->playEventSfx = true;230dialog->useAltColor = true;231}232}233else {234DialogRunner->activeCallback = NULL;235UIWaitSpinner_StartWait();236GameProgress_TrackGameProgress(DialogRunner_TrackGameProgressCB);237destroyEntity(self);238}239}240void DialogRunner_TrackGameProgressCB(bool32 success) { UIWaitSpinner_FinishWait(); }241void DialogRunner_GetNextNotif(void)242{243if (SceneInfo->inEditor || API.GetNoSave() || globals->saveLoaded != STATUS_OK) {244LogHelpers_Print("WARNING GameProgress Attempted to save before loading SaveGame file");245return;246}247else {248ProgressRAM *progress = GameProgress_GetProgressRAM();249int32 id = GameProgress_GetNextNotif();250if (id >= 0)251progress->unreadNotifs[id] = true;252}253}254bool32 DialogRunner_CheckUnreadNotifs(void)255{256if (!GameProgress_CountUnreadNotifs())257return false;258259if (!DialogRunner->activeCallback)260DialogRunner->activeCallback = CREATE_ENTITY(DialogRunner, DialogRunner_ManageNotifs, 0, 0);261262return true;263}264bool32 DialogRunner_NotifyAutosave(void)265{266if (globals->notifiedAutosave) {267if (!DialogRunner->isAutoSaving && !DialogRunner->activeCallback)268return false;269}270else if (!DialogRunner->isAutoSaving || !DialogRunner->activeCallback) {271UIWaitSpinner_StartWait();272DialogRunner->isAutoSaving = true;273globals->notifiedAutosave = false;274LogHelpers_Print("DUMMY NotifyAutosave()");275EntityDialogRunner *dialogRunner = CREATE_ENTITY(DialogRunner, DialogRunner_NotifyAutoSave, 0, 0);276dialogRunner->active = ACTIVE_ALWAYS;277DialogRunner->activeCallback = dialogRunner;278}279280return true;281}282void DialogRunner_GetUserAuthStatus(void)283{284if (API.GetUserAuthStatus() == STATUS_FORBIDDEN) {285if (DialogRunner->authForbidden)286return;287288EntityDialogRunner *dialogRunner = CREATE_ENTITY(DialogRunner, DialogRunner_CheckUserAuth_CB, 0, 0);289dialogRunner->active = ACTIVE_ALWAYS;290DialogRunner->activeCallback = dialogRunner;291DialogRunner->authForbidden = true;292}293294if (API.CheckDLC(DLC_PLUS) != (bool32)globals->lastHasPlus && !DialogRunner->authForbidden) {295EntityDialogRunner *dialogRunner = CREATE_ENTITY(DialogRunner, DialogRunner_CheckUserAuth_CB, 0, 0);296dialogRunner->active = ACTIVE_ALWAYS;297dialogRunner->useGenericText = true;298DialogRunner->activeCallback = dialogRunner;299DialogRunner->authForbidden = true;300globals->lastHasPlus = API.CheckDLC(DLC_PLUS);301}302}303void DialogRunner_PromptSavePreference(int32 id)304{305if (API.GetNoSave()) {306LogHelpers_Print("PromptSavePreference() returning due to noSave");307return;308}309310LogHelpers_Print("PromptSavePreference()");311312if (API.GetSaveStatus() == STATUS_CONTINUE)313LogHelpers_Print("WARNING PromptSavePreference() when prompt already in progress.");314315API.ClearSaveStatus();316317EntityDialogRunner *dialogRunner = CREATE_ENTITY(DialogRunner, DialogRunner_PromptSavePreference_CB, 0, 0);318dialogRunner->status = id;319DialogRunner->activeCallback = dialogRunner;320}321void DialogRunner_CheckUserAuth_OK(void) { DialogRunner->signedOut = true; }322323#if GAME_INCLUDE_EDITOR324void DialogRunner_EditorDraw(void) {}325326void DialogRunner_EditorLoad(void) {}327#endif328329void DialogRunner_Serialize(void) {}330#endif331332333