Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Global/DialogRunner.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: DialogRunner Object
4
// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges
5
// Decompiled by: Rubberduckycooly & RMGRich
6
// ---------------------------------------------------------------------
7
8
#include "Game.h"
9
10
#if MANIA_USE_PLUS
11
ObjectDialogRunner *DialogRunner;
12
13
void DialogRunner_Update(void)
14
{
15
RSDK_THIS(DialogRunner);
16
StateMachine_Run(self->state);
17
}
18
19
void DialogRunner_LateUpdate(void) {}
20
21
void DialogRunner_StaticUpdate(void) {}
22
23
void DialogRunner_Draw(void) {}
24
25
void DialogRunner_Create(void *data)
26
{
27
RSDK_THIS(DialogRunner);
28
self->active = ACTIVE_ALWAYS;
29
self->visible = false;
30
self->state = (Type_StateMachine)data;
31
self->timer = 0;
32
self->useGenericText = false;
33
}
34
35
void DialogRunner_StageLoad(void)
36
{
37
DialogRunner->authForbidden = false;
38
DialogRunner->signedOut = false;
39
DialogRunner->unused2 = 0;
40
DialogRunner->unused1 = 0;
41
DialogRunner->isAutoSaving = false;
42
43
if (!globals->hasPlusInitial) {
44
globals->lastHasPlus = API.CheckDLC(DLC_PLUS);
45
globals->hasPlusInitial = true;
46
}
47
DialogRunner->activeCallback = NULL;
48
49
SaveGame_LoadSaveData();
50
TimeAttackData->loaded = false;
51
TimeAttackData->uuid = 0;
52
TimeAttackData->rowID = -1;
53
TimeAttackData->personalRank = 0;
54
TimeAttackData->leaderboardRank = 0;
55
TimeAttackData->isMigratingData = false;
56
57
Options->changed = false;
58
if (sku_platform && sku_platform != PLATFORM_DEV) {
59
OptionsRAM *options = Options_GetOptionsRAM();
60
options->vSync = false;
61
options->windowed = false;
62
options->windowBorder = false;
63
options->tripleBuffering = false;
64
}
65
else {
66
Options_Reload();
67
}
68
}
69
70
void DialogRunner_HandleCallback(void)
71
{
72
RSDK_THIS(DialogRunner);
73
74
if (self->timer <= 0) {
75
LogHelpers_Print("Callback: %x", self->callback);
76
StateMachine_Run(self->callback);
77
destroyEntity(self);
78
}
79
else {
80
self->timer--;
81
}
82
}
83
84
void DialogRunner_NotifyAutoSave_CB(void)
85
{
86
DialogRunner->isAutoSaving = false;
87
globals->notifiedAutosave = true;
88
UIWaitSpinner_FinishWait();
89
}
90
91
void DialogRunner_NotifyAutoSave(void)
92
{
93
RSDK_THIS(DialogRunner);
94
95
String string;
96
INIT_STRING(string);
97
if (DialogRunner->isAutoSaving) {
98
if (!UIDialog->activeDialog) {
99
Localization_GetString(&string, STR_AUTOSAVENOTIF);
100
EntityUIDialog *dialog = UIDialog_CreateDialogOk(&string, DialogRunner_NotifyAutoSave_CB, true);
101
dialog->useAltColor = true;
102
}
103
}
104
else {
105
DialogRunner->activeCallback = NULL;
106
destroyEntity(self);
107
}
108
}
109
110
void DialogRunner_SetNoSaveDisabled(void)
111
{
112
API.SetSaveStatusForbidden();
113
API.SetNoSave(false);
114
}
115
116
void DialogRunner_SetNoSaveEnabled(void)
117
{
118
API.SetSaveStatusError();
119
API.SetNoSave(true);
120
}
121
122
void DialogRunner_PromptSavePreference_CB(void)
123
{
124
RSDK_THIS(DialogRunner);
125
126
String string;
127
INIT_STRING(string);
128
if (API.GetSaveStatus() == STATUS_CONTINUE) {
129
if (!UIDialog->activeDialog) {
130
int32 stringID = STR_SAVELOADFAIL;
131
switch (self->status) {
132
case STATUS_ERROR:
133
stringID = STR_NOXBOXPROFILE;
134
if (sku_platform != PLATFORM_XB1)
135
stringID = STR_SAVELOADFAIL;
136
break;
137
case STATUS_CORRUPT: stringID = STR_CORRUPTSAVE; break;
138
case STATUS_NOSPACE: stringID = (sku_platform == PLATFORM_XB1) + STR_NOSAVESPACE; break;
139
}
140
Localization_GetString(&string, stringID);
141
EntityUIDialog *dialog = UIDialog_CreateDialogYesNo(&string, DialogRunner_SetNoSaveEnabled, DialogRunner_SetNoSaveDisabled, true, true);
142
dialog->useAltColor = true;
143
}
144
}
145
else {
146
DialogRunner->activeCallback = NULL;
147
destroyEntity(self);
148
}
149
}
150
void DialogRunner_CheckUserAuth_CB()
151
{
152
RSDK_THIS(DialogRunner);
153
154
if (self->timer) {
155
if (DialogRunner->signedOut) {
156
if (!UIDialog->activeDialog) {
157
if (Zone && Zone_GetZoneID() != ZONE_INVALID) {
158
RSDK.SetScene("Presentation", "Title Screen");
159
Zone_StartFadeOut(10, 0x000000);
160
}
161
else if (MenuSetup) {
162
ManiaModeMenu_StartReturnToTitle();
163
}
164
else if (UFO_Setup) {
165
UFO_Setup->resetToTitle = true;
166
foreach_all(UFO_Setup, setup)
167
{
168
setup->fadeColor = 0;
169
setup->state = UFO_Setup_State_FinishFadeout;
170
setup->active = ACTIVE_ALWAYS;
171
setup->visible = true;
172
}
173
}
174
else if (FXFade) {
175
RSDK.SetScene("Presentation", "Title Screen");
176
EntityFXFade *fxFade = CREATE_ENTITY(FXFade, NULL, self->position.x, self->position.y);
177
fxFade->active = ACTIVE_ALWAYS;
178
fxFade->timer = 0;
179
fxFade->speedIn = 16;
180
fxFade->speedOut = 16;
181
fxFade->state = FXFade_State_FadeOut;
182
fxFade->drawGroup = DRAWGROUP_COUNT - 1;
183
fxFade->isPermanent = true;
184
fxFade->oneWay = true;
185
fxFade->transitionScene = true;
186
}
187
188
DialogRunner->activeCallback = NULL;
189
destroyEntity(self);
190
}
191
}
192
else if (!UIDialog->activeDialog) {
193
String string;
194
int32 id = STR_SIGNOUTDETECTED;
195
if (self->useGenericText)
196
id = STR_RETRURNINGTOTITLE;
197
Localization_GetString(&string, id);
198
EntityUIDialog *dialog = UIDialog_CreateDialogOk(&string, DialogRunner_CheckUserAuth_OK, true);
199
dialog->useAltColor = true;
200
}
201
}
202
else {
203
EntityUIDialog *dialog = UIDialog->activeDialog;
204
if (dialog) {
205
UIDialog_CloseOnSel_HandleSelection(dialog, StateMachine_None);
206
}
207
else {
208
if (UIControl) {
209
if (UIControl_GetUIControl())
210
UIControl_SetInactiveMenu(UIControl_GetUIControl());
211
}
212
213
RSDK.SetEngineState(ENGINESTATE_FROZEN);
214
Music_Stop();
215
self->timer = 1;
216
}
217
}
218
}
219
void DialogRunner_ManageNotifs(void)
220
{
221
RSDK_THIS(DialogRunner);
222
223
if (GameProgress_CountUnreadNotifs()) {
224
String string;
225
INIT_STRING(string);
226
if (!UIDialog->activeDialog) {
227
int32 str = GameProgress_GetNotifStringID(GameProgress_GetNextNotif());
228
Localization_GetString(&string, str);
229
EntityUIDialog *dialog = UIDialog_CreateDialogOk(&string, DialogRunner_GetNextNotif, true);
230
dialog->playEventSfx = true;
231
dialog->useAltColor = true;
232
}
233
}
234
else {
235
DialogRunner->activeCallback = NULL;
236
UIWaitSpinner_StartWait();
237
GameProgress_TrackGameProgress(DialogRunner_TrackGameProgressCB);
238
destroyEntity(self);
239
}
240
}
241
void DialogRunner_TrackGameProgressCB(bool32 success) { UIWaitSpinner_FinishWait(); }
242
void DialogRunner_GetNextNotif(void)
243
{
244
if (SceneInfo->inEditor || API.GetNoSave() || globals->saveLoaded != STATUS_OK) {
245
LogHelpers_Print("WARNING GameProgress Attempted to save before loading SaveGame file");
246
return;
247
}
248
else {
249
ProgressRAM *progress = GameProgress_GetProgressRAM();
250
int32 id = GameProgress_GetNextNotif();
251
if (id >= 0)
252
progress->unreadNotifs[id] = true;
253
}
254
}
255
bool32 DialogRunner_CheckUnreadNotifs(void)
256
{
257
if (!GameProgress_CountUnreadNotifs())
258
return false;
259
260
if (!DialogRunner->activeCallback)
261
DialogRunner->activeCallback = CREATE_ENTITY(DialogRunner, DialogRunner_ManageNotifs, 0, 0);
262
263
return true;
264
}
265
bool32 DialogRunner_NotifyAutosave(void)
266
{
267
if (globals->notifiedAutosave) {
268
if (!DialogRunner->isAutoSaving && !DialogRunner->activeCallback)
269
return false;
270
}
271
else if (!DialogRunner->isAutoSaving || !DialogRunner->activeCallback) {
272
UIWaitSpinner_StartWait();
273
DialogRunner->isAutoSaving = true;
274
globals->notifiedAutosave = false;
275
LogHelpers_Print("DUMMY NotifyAutosave()");
276
EntityDialogRunner *dialogRunner = CREATE_ENTITY(DialogRunner, DialogRunner_NotifyAutoSave, 0, 0);
277
dialogRunner->active = ACTIVE_ALWAYS;
278
DialogRunner->activeCallback = dialogRunner;
279
}
280
281
return true;
282
}
283
void DialogRunner_GetUserAuthStatus(void)
284
{
285
if (API.GetUserAuthStatus() == STATUS_FORBIDDEN) {
286
if (DialogRunner->authForbidden)
287
return;
288
289
EntityDialogRunner *dialogRunner = CREATE_ENTITY(DialogRunner, DialogRunner_CheckUserAuth_CB, 0, 0);
290
dialogRunner->active = ACTIVE_ALWAYS;
291
DialogRunner->activeCallback = dialogRunner;
292
DialogRunner->authForbidden = true;
293
}
294
295
if (API.CheckDLC(DLC_PLUS) != (bool32)globals->lastHasPlus && !DialogRunner->authForbidden) {
296
EntityDialogRunner *dialogRunner = CREATE_ENTITY(DialogRunner, DialogRunner_CheckUserAuth_CB, 0, 0);
297
dialogRunner->active = ACTIVE_ALWAYS;
298
dialogRunner->useGenericText = true;
299
DialogRunner->activeCallback = dialogRunner;
300
DialogRunner->authForbidden = true;
301
globals->lastHasPlus = API.CheckDLC(DLC_PLUS);
302
}
303
}
304
void DialogRunner_PromptSavePreference(int32 id)
305
{
306
if (API.GetNoSave()) {
307
LogHelpers_Print("PromptSavePreference() returning due to noSave");
308
return;
309
}
310
311
LogHelpers_Print("PromptSavePreference()");
312
313
if (API.GetSaveStatus() == STATUS_CONTINUE)
314
LogHelpers_Print("WARNING PromptSavePreference() when prompt already in progress.");
315
316
API.ClearSaveStatus();
317
318
EntityDialogRunner *dialogRunner = CREATE_ENTITY(DialogRunner, DialogRunner_PromptSavePreference_CB, 0, 0);
319
dialogRunner->status = id;
320
DialogRunner->activeCallback = dialogRunner;
321
}
322
void DialogRunner_CheckUserAuth_OK(void) { DialogRunner->signedOut = true; }
323
324
#if GAME_INCLUDE_EDITOR
325
void DialogRunner_EditorDraw(void) {}
326
327
void DialogRunner_EditorLoad(void) {}
328
#endif
329
330
void DialogRunner_Serialize(void) {}
331
#endif
332
333