Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rubberduckycooly
GitHub Repository: rubberduckycooly/Sonic-Mania-Decompilation
Path: blob/master/SonicMania/Objects/Menu/OptionsMenu.c
338 views
1
// ---------------------------------------------------------------------
2
// RSDK Project: Sonic Mania
3
// Object Description: OptionsMenu 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
ObjectOptionsMenu *OptionsMenu;
12
13
void OptionsMenu_Update(void) {}
14
15
void OptionsMenu_LateUpdate(void) {}
16
17
void OptionsMenu_StaticUpdate(void) {}
18
19
void OptionsMenu_Draw(void) {}
20
21
void OptionsMenu_Create(void *data) {}
22
23
void OptionsMenu_StageLoad(void) {}
24
25
void OptionsMenu_Initialize(void)
26
{
27
LogHelpers_Print("ManiaModeMenu_Initialize()");
28
29
String tag;
30
INIT_STRING(tag);
31
32
foreach_all(UIControl, control)
33
{
34
RSDK.SetString(&tag, "Options");
35
if (RSDK.CompareStrings(&tag, &control->tag, false))
36
OptionsMenu->optionsControl = control;
37
38
RSDK.SetString(&tag, "Language");
39
if (RSDK.CompareStrings(&tag, &control->tag, false))
40
OptionsMenu->languageControl = control;
41
42
RSDK.SetString(&tag, "Language Old");
43
if (RSDK.CompareStrings(&tag, &control->tag, false))
44
OptionsMenu->languageControl_Legacy = control;
45
46
RSDK.SetString(&tag, "Video");
47
if (RSDK.CompareStrings(&tag, &control->tag, false))
48
OptionsMenu->videoControl = control;
49
50
RSDK.SetString(&tag, "Video WIN");
51
if (RSDK.CompareStrings(&tag, &control->tag, false))
52
OptionsMenu->videoControl_Windows = control;
53
54
RSDK.SetString(&tag, "Sound");
55
if (RSDK.CompareStrings(&tag, &control->tag, false))
56
OptionsMenu->soundControl = control;
57
58
RSDK.SetString(&tag, "Controls WIN");
59
if (RSDK.CompareStrings(&tag, &control->tag, false))
60
OptionsMenu->controlsControl_Windows = control;
61
62
RSDK.SetString(&tag, "Controls KB");
63
if (RSDK.CompareStrings(&tag, &control->tag, false))
64
OptionsMenu->controlsControl_KB = control;
65
66
RSDK.SetString(&tag, "Controls PS4");
67
if (RSDK.CompareStrings(&tag, &control->tag, false))
68
OptionsMenu->controlsControl_PS4 = control;
69
70
RSDK.SetString(&tag, "Controls XB1");
71
if (RSDK.CompareStrings(&tag, &control->tag, false))
72
OptionsMenu->controlsControl_XB1 = control;
73
74
RSDK.SetString(&tag, "Controls NX");
75
if (RSDK.CompareStrings(&tag, &control->tag, false))
76
OptionsMenu->controlsControl_NX = control;
77
78
RSDK.SetString(&tag, "Controls NX Grip");
79
if (RSDK.CompareStrings(&tag, &control->tag, false))
80
OptionsMenu->controlsControl_NXGrip = control;
81
82
RSDK.SetString(&tag, "Controls NX Joycon");
83
if (RSDK.CompareStrings(&tag, &control->tag, false))
84
OptionsMenu->controlsControl_NXJoycon = control;
85
86
RSDK.SetString(&tag, "Controls NX Pro");
87
if (RSDK.CompareStrings(&tag, &control->tag, false))
88
OptionsMenu->controlsControl_NXPro = control;
89
90
RSDK.SetString(&tag, "Data Options");
91
if (RSDK.CompareStrings(&tag, &control->tag, false))
92
OptionsMenu->dataOptionsControl = control;
93
}
94
95
foreach_all(UIButtonPrompt, prompt)
96
{
97
EntityUIControl *controller = OptionsMenu->optionsControl;
98
99
if (UIControl_ContainsPos(controller, &prompt->position) && prompt->buttonID == 3)
100
OptionsMenu->helpPrompt = prompt;
101
}
102
103
foreach_all(UIDiorama, diorama)
104
{
105
EntityUIControl *controller = OptionsMenu->videoControl;
106
107
if (UIControl_ContainsPos(controller, &diorama->position)) {
108
OptionsMenu->diorama = diorama;
109
diorama->parent = OptionsMenu->videoControl;
110
}
111
}
112
113
foreach_all(UIInfoLabel, label)
114
{
115
EntityUIControl *controller = OptionsMenu->dataOptionsControl;
116
117
if (UIControl_ContainsPos(controller, &label->position))
118
OptionsMenu->selectDataToEraseLabel = label;
119
}
120
}
121
122
void OptionsMenu_HandleUnlocks(void)
123
{
124
EntityUIControl *control = OptionsMenu->dataOptionsControl;
125
126
// Time Attack Data Button
127
control->buttons[5] = control->buttons[4];
128
control->buttonCount = 6;
129
130
if (!API.CheckDLC(DLC_PLUS)) {
131
EntityUIButton *replaysButton = control->buttons[2];
132
replaysButton->invisible = true;
133
replaysButton->visible = false;
134
135
EntityUIButton *allGameDataButton = control->buttons[3];
136
control->buttons[2] = allGameDataButton;
137
allGameDataButton->position.x = control->buttons[4]->position.x;
138
allGameDataButton->size.x = control->buttons[4]->size.x;
139
}
140
}
141
142
void OptionsMenu_SetupActions(void)
143
{
144
EntityUIControl *optionsControl = OptionsMenu->optionsControl;
145
EntityUIControl *languageControl = OptionsMenu->languageControl;
146
EntityUIControl *languageControl_Legacy = OptionsMenu->languageControl_Legacy;
147
EntityUIControl *videoControl = OptionsMenu->videoControl;
148
EntityUIControl *controlsControl_Win = OptionsMenu->controlsControl_Windows;
149
EntityUIControl *videoControl_Win = OptionsMenu->videoControl_Windows;
150
EntityUIControl *soundControl = OptionsMenu->soundControl;
151
EntityUIControl *dataControl = OptionsMenu->dataOptionsControl;
152
153
String string;
154
INIT_STRING(string);
155
156
foreach_all(UIButton, button)
157
{
158
if (UIControl_ContainsPos(controlsControl_Win, &button->position))
159
button->actionCB = OptionsMenu_KeyboardIDButton_Win_ActionCB;
160
161
if (UIControl_ContainsPos(optionsControl, &button->position) && button->listID == 3) {
162
163
switch (button->frameID) {
164
case 0: button->actionCB = OptionsMenu_VideoMenuButton_ActionCB; break;
165
case 1: button->actionCB = OptionsMenu_SoundMenuButton_ActionCB; break;
166
167
case 2:
168
button->actionCB = OptionsMenu_ControlsMenuButton_ActionCB;
169
if (sku_platform == PLATFORM_DEV || sku_platform == PLATFORM_PC)
170
button->transition = false;
171
break;
172
173
case 3: button->actionCB = OptionsMenu_LanguageMenuButton_ActionCB; break;
174
case 4: button->actionCB = OptionsMenu_DataOptionsMenuButton_ActionCB; break;
175
}
176
}
177
178
if (UIControl_ContainsPos(languageControl, &button->position))
179
button->actionCB = OptionsMenu_LanguageButton_ActionCB;
180
181
if (UIControl_ContainsPos(languageControl_Legacy, &button->position))
182
button->actionCB = OptionsMenu_LanguageButton_ActionCB;
183
184
if (UIControl_ContainsPos(videoControl, &button->position) && button->listID == 3 && button->frameID == 0)
185
button->choiceChangeCB = OptionsMenu_ShaderButton_ActionCB;
186
187
if (UIControl_ContainsPos(controlsControl_Win, &button->position) && button->listID == 17 && button->frameID == 1)
188
button->actionCB = OptionsMenu_SetDefaultMappings;
189
190
if (UIControl_ContainsPos(videoControl_Win, &button->position) && button->listID == 17) {
191
switch (button->frameID) {
192
case 2: button->choiceChangeCB = OptionsMenu_ShaderButton_ActionCB; break;
193
case 7: button->choiceChangeCB = OptionsMenu_WindowScaleButton_ActionCB; break;
194
case 13: button->choiceChangeCB = OptionsMenu_BorderlessButton_ActionCB; break;
195
case 14: button->choiceChangeCB = OptionsMenu_FullScreenButton_ActionCB; break;
196
case 15: button->choiceChangeCB = OptionsMenu_VSyncButton_ActionCB; break;
197
case 16: button->choiceChangeCB = OptionsMenu_TripleBufferButton_ActionCB; break;
198
}
199
}
200
201
if (UIControl_ContainsPos(dataControl, &button->position) && button->listID == 18) {
202
switch (button->frameID) {
203
case 0: button->actionCB = OptionsMenu_EraseSaveGameButton_ActionCB; break;
204
case 1: button->actionCB = OptionsMenu_EraseMedallionsButton_ActionCB; break;
205
case 2: button->actionCB = OptionsMenu_EraseTimeAttackButton_ActionCB; break;
206
case 3: button->actionCB = OptionsMenu_EraseReplaysButton_ActionCB; break;
207
case 4: button->actionCB = OptionsMenu_EraseAllButton_ActionCB; break;
208
}
209
}
210
}
211
212
foreach_all(UISlider, slider)
213
{
214
if (UIControl_ContainsPos(soundControl, &slider->position) && slider->listID == 5)
215
slider->sliderChangedCB = OptionsMenu_UISlider_ChangedCB;
216
}
217
218
optionsControl->menuSetupCB = OptionsMenu_MenuSetupCB;
219
220
EntityUIInfoLabel *label = OptionsMenu->selectDataToEraseLabel;
221
Localization_GetString(&string, STR_SELECTDATATOERASE);
222
UIInfoLabel_SetString(label, &string);
223
224
videoControl_Win->menuUpdateCB = OptionsMenu_VideoControl_Win_MenuUpdateCB;
225
videoControl_Win->yPressCB = OptionsMenu_VideoControl_Win_YPressCB;
226
videoControl_Win->backPressCB = OptionsMenu_VideoControl_Win_BackPressCB;
227
228
if (sku_platform == PLATFORM_SWITCH || sku_platform == PLATFORM_DEV) {
229
optionsControl->yPressCB = OptionsMenu_ShowManual;
230
}
231
else {
232
EntityUIButtonPrompt *prompt = OptionsMenu->helpPrompt;
233
prompt->visible = false;
234
}
235
}
236
237
void OptionsMenu_HandleMenuReturn(void)
238
{
239
EntityUIControl *languageControl = OptionsMenu->languageControl;
240
EntityUIControl *languageControl_old = OptionsMenu->languageControl_Legacy;
241
EntityUIControl *videoControl = OptionsMenu->videoControl;
242
EntityUIControl *soundControl = OptionsMenu->soundControl;
243
244
if (sku_platform == PLATFORM_PC || sku_platform == PLATFORM_DEV)
245
OptionsMenu_InitVideoOptionsMenu();
246
247
EntityUIButton *button = videoControl->buttons[0];
248
UIButton_SetChoiceSelection(button, RSDK.GetVideoSetting(VIDEOSETTING_SHADERID));
249
250
EntityUISlider *musSlider = (EntityUISlider *)soundControl->buttons[0];
251
musSlider->sliderPos = RSDK.GetVideoSetting(VIDEOSETTING_STREAM_VOL);
252
253
EntityUISlider *sfxSlider = (EntityUISlider *)soundControl->buttons[1];
254
sfxSlider->sliderPos = RSDK.GetVideoSetting(VIDEOSETTING_SFX_VOL);
255
256
languageControl->startingID = Localization->language;
257
languageControl->buttonID = Localization->language;
258
259
languageControl_old->startingID = Localization->language;
260
languageControl_old->buttonID = Localization->language;
261
}
262
void OptionsMenu_InitVideoOptionsMenu(void)
263
{
264
if (sku_platform == PLATFORM_PC || sku_platform == PLATFORM_DEV) {
265
EntityUIControl *videoControl_Win = OptionsMenu->videoControl_Windows;
266
OptionsRAM *optionsRAM = Options_GetOptionsRAM();
267
268
Options_GetWinSize();
269
270
int32 options[7];
271
272
options[0] = RSDK.GetVideoSetting(VIDEOSETTING_SHADERID); // filter
273
options[1] = optionsRAM->windowSize; // window size
274
options[2] = RSDK.GetVideoSetting(VIDEOSETTING_BORDERED); // bordered
275
276
// fullscreen
277
options[3] = 0;
278
if (!RSDK.GetVideoSetting(VIDEOSETTING_WINDOWED) || optionsRAM->windowSize == 4)
279
options[3] = 1;
280
281
options[4] = 0; // fullscreen res
282
options[5] = RSDK.GetVideoSetting(VIDEOSETTING_VSYNC); // vsync
283
options[6] = RSDK.GetVideoSetting(VIDEOSETTING_TRIPLEBUFFERED); // triple buffered
284
285
for (int32 i = 0; i < videoControl_Win->buttonCount; ++i) {
286
EntityUIButton *button = videoControl_Win->buttons[i];
287
288
if (i == 4) {
289
EntityUIResPicker *resPicker = (EntityUIResPicker *)UIButton_GetChoicePtr(button, button->selection);
290
UIResPicker_GetDisplayInfo(resPicker);
291
}
292
else if (i == 1) {
293
EntityUIWinSize *winSize = (EntityUIWinSize *)UIButton_GetChoicePtr(button, button->selection);
294
winSize->selection = RSDK.GetVideoSetting(VIDEOSETTING_WINDOW_HEIGHT) / SCREEN_YSIZE;
295
}
296
else if (button->selection != options[i]) {
297
UIButton_SetChoiceSelection(button, options[i]);
298
}
299
}
300
}
301
}
302
303
void OptionsMenu_VideoControl_Win_MenuUpdateCB(void) { OptionsMenu_InitVideoOptionsMenu(); }
304
305
void OptionsMenu_VideoControl_Win_YPressCB(void)
306
{
307
String message;
308
INIT_STRING(message);
309
310
if (RSDK.GetVideoSetting(VIDEOSETTING_CHANGED)) {
311
RSDK.UpdateWindow();
312
313
Localization_GetString(&message, STR_VIDEOCHANGESAPPLIED);
314
EntityUIDialog *dialog =
315
UIDialog_CreateDialogYesNo(&message, OptionsMenu_ApplyChangesDlg_Win_YesCB, OptionsMenu_ApplyChangesDlg_Win_NoCB, true, true);
316
if (dialog)
317
dialog->closeDelay = 15 * 60; // 15 seconds at 60 FPS
318
}
319
}
320
void OptionsMenu_DlgRunnerCB_RevertVideoChanges(void)
321
{
322
String message;
323
INIT_STRING(message);
324
325
RSDK.UpdateWindow();
326
327
Localization_GetString(&message, STR_VIDEOCHANGESAPPLIED);
328
// This is bugged! Using `OptionsMenu_ApplyChangesDlg_BackPress_NoCB` causes the settings to be reverted instead of saved!
329
// This should have called a modified version of `OptionsMenu_ApplyChangesDlg_Win_YesCB` which also transitions to the previous menu!
330
EntityUIDialog *dialog = UIDialog_CreateDialogYesNo(&message, OptionsMenu_ApplyChangesDlg_BackPress_NoCB, OptionsMenu_ApplyChangesDlg_NoCB, true, true);
331
if (dialog)
332
dialog->closeDelay = 15 * 60; // 15 seconds at 60 FPS
333
}
334
335
bool32 OptionsMenu_VideoControl_Win_BackPressCB(void)
336
{
337
String message;
338
INIT_STRING(message);
339
340
if (RSDK.GetVideoSetting(VIDEOSETTING_CHANGED)) {
341
Localization_GetString(&message, STR_APPLYCHANGEDSETTINGS);
342
EntityUIDialog *dialog =
343
UIDialog_CreateDialogYesNo(&message, OptionsMenu_ApplyChangesDlg_BackPress_YesCB, OptionsMenu_ApplyChangesDlg_BackPress_NoCB, true, true);
344
if (dialog)
345
return true;
346
}
347
else {
348
UITransition_StartTransition(UIControl_ReturnToParentMenu, 0);
349
}
350
351
return false;
352
}
353
354
void OptionsMenu_ApplyChangesDlg_BackPress_YesCB(void)
355
{
356
EntityDialogRunner *dialogRunner = CREATE_ENTITY(DialogRunner, DialogRunner_HandleCallback, 0, 0);
357
358
dialogRunner->callback = OptionsMenu_DlgRunnerCB_RevertVideoChanges;
359
dialogRunner->timer = 0;
360
dialogRunner->isPermanent = true;
361
}
362
363
void OptionsMenu_ApplyChangesDlg_Win_NoCB(void)
364
{
365
RSDK.SetVideoSetting(VIDEOSETTING_RELOAD, false);
366
RSDK.UpdateWindow();
367
368
OptionsMenu_InitVideoOptionsMenu();
369
370
RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, false);
371
}
372
373
void OptionsMenu_ApplyChangesDlg_NoCB(void)
374
{
375
RSDK.SetVideoSetting(VIDEOSETTING_RELOAD, false);
376
RSDK.UpdateWindow();
377
378
OptionsMenu_InitVideoOptionsMenu();
379
380
RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, false);
381
UITransition_StartTransition(UIControl_ReturnToParentMenu, 0);
382
}
383
384
void OptionsMenu_ApplyChangesDlg_Win_YesCB(void)
385
{
386
RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, false);
387
RSDK.SetVideoSetting(VIDEOSETTING_WRITE, true);
388
RSDK.SetVideoSetting(VIDEOSETTING_STORE, false);
389
}
390
391
void OptionsMenu_ApplyChangesDlg_BackPress_NoCB(void)
392
{
393
RSDK.SetVideoSetting(VIDEOSETTING_RELOAD, false);
394
395
OptionsMenu_InitVideoOptionsMenu();
396
397
RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, false);
398
UITransition_StartTransition(UIControl_ReturnToParentMenu, 0);
399
}
400
401
void OptionsMenu_VideoMenuButton_ActionCB(void)
402
{
403
if (sku_platform == PLATFORM_PC || sku_platform == PLATFORM_DEV) {
404
RSDK.SetVideoSetting(VIDEOSETTING_STORE, false);
405
#if MANIA_USE_EGS
406
API.ShowLimitedVideoOptions(8);
407
#endif
408
UIControl_MatchMenuTag("Video WIN");
409
}
410
else {
411
UIControl_MatchMenuTag("Video");
412
}
413
}
414
void OptionsMenu_SoundMenuButton_ActionCB(void) { UIControl_MatchMenuTag("Sound"); }
415
void OptionsMenu_LanguageMenuButton_ActionCB(void) { UIControl_MatchMenuTag("Language"); }
416
void OptionsMenu_DataOptionsMenuButton_ActionCB(void) { UIControl_MatchMenuTag("Data Options"); }
417
void OptionsMenu_ControlsMenuButton_DefaultKB_ActionCB(void) { UIControl_MatchMenuTag("Controls WIN"); }
418
void OptionsMenu_ControlsMenuButton_Default_ActionCB(void) { UIControl_MatchMenuTag("Controls XB1"); }
419
420
void OptionsMenu_ControlsMenuButton_ActionCB(void)
421
{
422
int32 id = API_GetFilteredInputDeviceID(true, false, 5);
423
int32 gamepadType = API_GetInputDeviceType(id);
424
425
String message;
426
INIT_STRING(message);
427
428
switch ((gamepadType >> 8) & 0xFF) {
429
default:
430
case DEVICE_TYPE_CONTROLLER:
431
switch (gamepadType & 0xFF) {
432
case DEVICE_XBOX: UITransition_SetNewTag("Controls XB1"); break;
433
case DEVICE_PS4: UITransition_SetNewTag("Controls PS4"); break;
434
case DEVICE_SATURN: UITransition_SetNewTag("Controls WIN"); break;
435
case DEVICE_SWITCH_HANDHELD: UITransition_SetNewTag("Controls NX"); break;
436
case DEVICE_SWITCH_JOY_GRIP: UITransition_SetNewTag("Controls NX Grip"); break;
437
case DEVICE_SWITCH_JOY_L:
438
case DEVICE_SWITCH_JOY_R: UITransition_SetNewTag("Controls NX Joycon"); break;
439
case DEVICE_SWITCH_PRO: UITransition_SetNewTag("Controls NX Pro"); break;
440
default: UITransition_StartTransition(OptionsMenu_ControlsMenuButton_Default_ActionCB, 0); break;
441
}
442
break;
443
444
case DEVICE_TYPE_KEYBOARD: UITransition_StartTransition(OptionsMenu_ControlsMenuButton_DefaultKB_ActionCB, 0); break;
445
446
case DEVICE_TYPE_STEAMOVERLAY:
447
if (!API.IsOverlayEnabled(id)) {
448
Localization_GetString(&message, STR_STEAMOVERLAYUNAVAILABLE);
449
UIDialog_CreateDialogOk(&message, StateMachine_None, true);
450
}
451
break;
452
}
453
}
454
455
void OptionsMenu_SetDefaultMappings(void)
456
{
457
ControllerInfo[CONT_P1].keyUp.keyMap = KEYMAP_UP;
458
ControllerInfo[CONT_P1].keyDown.keyMap = KEYMAP_DOWN;
459
ControllerInfo[CONT_P1].keyLeft.keyMap = KEYMAP_LEFT;
460
ControllerInfo[CONT_P1].keyRight.keyMap = KEYMAP_RIGHT;
461
ControllerInfo[CONT_P1].keyA.keyMap = KEYMAP_A;
462
ControllerInfo[CONT_P1].keyB.keyMap = KEYMAP_S;
463
ControllerInfo[CONT_P1].keyC.keyMap = KEYMAP_NO_MAPPING;
464
ControllerInfo[CONT_P1].keyX.keyMap = KEYMAP_Q;
465
ControllerInfo[CONT_P1].keyY.keyMap = KEYMAP_W;
466
ControllerInfo[CONT_P1].keyZ.keyMap = KEYMAP_NO_MAPPING;
467
ControllerInfo[CONT_P1].keyStart.keyMap = KEYMAP_RETURN;
468
ControllerInfo[CONT_P1].keySelect.keyMap = KEYMAP_TAB;
469
470
ControllerInfo[CONT_P2].keyUp.keyMap = KEYMAP_NUMPAD8;
471
ControllerInfo[CONT_P2].keyDown.keyMap = KEYMAP_NUMPAD5;
472
ControllerInfo[CONT_P2].keyLeft.keyMap = KEYMAP_NUMPAD4;
473
ControllerInfo[CONT_P2].keyRight.keyMap = KEYMAP_NUMPAD6;
474
ControllerInfo[CONT_P2].keyA.keyMap = KEYMAP_J;
475
ControllerInfo[CONT_P2].keyB.keyMap = KEYMAP_K;
476
ControllerInfo[CONT_P2].keyC.keyMap = KEYMAP_NO_MAPPING;
477
ControllerInfo[CONT_P2].keyX.keyMap = KEYMAP_U;
478
ControllerInfo[CONT_P2].keyY.keyMap = KEYMAP_I;
479
ControllerInfo[CONT_P2].keyZ.keyMap = KEYMAP_NO_MAPPING;
480
ControllerInfo[CONT_P2].keyStart.keyMap = KEYMAP_OEM_4;
481
ControllerInfo[CONT_P2].keySelect.keyMap = KEYMAP_OEM_6;
482
483
RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, true);
484
}
485
486
void OptionsMenu_SetupKBControlsMenu(int32 playerID)
487
{
488
EntityUIControl *control = OptionsMenu->controlsControl_KB;
489
490
foreach_all(UISubHeading, subHeading)
491
{
492
if (UIControl_ContainsPos(control, &subHeading->position)) {
493
subHeading->frameID = 19 + playerID;
494
foreach_break;
495
}
496
}
497
498
for (int32 b = 0; b < control->buttonCount; ++b) {
499
EntityUIKeyBinder *binder = (EntityUIKeyBinder *)control->buttons[b];
500
501
if (binder->classID == UIKeyBinder->classID)
502
binder->inputID = playerID;
503
}
504
}
505
506
void OptionsMenu_KeyboardIDButton_Win_ActionCB(void)
507
{
508
RSDK_THIS(UIButton);
509
510
EntityUIControl *control = OptionsMenu->controlsControl_Windows;
511
512
for (int32 i = 0; i < control->buttonCount; ++i) {
513
if (self == control->buttons[i]) {
514
OptionsMenu_SetupKBControlsMenu(i);
515
UIControl_MatchMenuTag("Controls KB");
516
}
517
}
518
}
519
520
void OptionsMenu_MenuSetupCB(void)
521
{
522
if (Options->changed) {
523
UIWaitSpinner_StartWait();
524
Options_SaveFile(OptionsMenu_SaveOptionsCB_Load);
525
}
526
527
EntityUIControl *control = OptionsMenu->optionsControl;
528
529
EntityUIButton *eraseDataButton = control->buttons[4];
530
if (eraseDataButton)
531
eraseDataButton->disabled = API_GetNoSave();
532
}
533
534
void OptionsMenu_SaveOptionsCB_Load(bool32 success) { UIWaitSpinner_FinishWait(); }
535
536
void OptionsMenu_TransitionCB_ReloadScene(void)
537
{
538
globals->suppressAutoMusic = true;
539
540
RSDK.ForceHardReset(true);
541
RSDK.LoadScene();
542
}
543
544
void OptionsMenu_SaveOptionsCB_Action(bool32 success)
545
{
546
EntityMenuParam *param = MenuParam_GetParam();
547
548
UIWaitSpinner_FinishWait();
549
550
EntityUIControl *control = OptionsMenu->languageControl;
551
control->startingID = control->buttonID;
552
553
TimeAttackData_Clear();
554
555
strcpy(param->menuTag, "Options");
556
MenuSetup_StartTransition(OptionsMenu_TransitionCB_ReloadScene, 32);
557
}
558
559
void OptionsMenu_LanguageButton_ActionCB(void)
560
{
561
RSDK_THIS(UIButton);
562
563
EntityUIControl *control = (EntityUIControl *)self->parent;
564
565
Options_SetLanguage(control->buttonID);
566
Localization->language = control->buttonID;
567
control->selectionDisabled = true;
568
569
UIWaitSpinner_StartWait();
570
571
Options_SaveFile(OptionsMenu_SaveOptionsCB_Action);
572
}
573
574
void OptionsMenu_ShaderButton_ActionCB(void)
575
{
576
RSDK_THIS(UIButton);
577
578
OptionsRAM *options = Options_GetOptionsRAM();
579
580
options->screenShader = self->selection;
581
options->overrideShader = true;
582
583
RSDK.SetVideoSetting(VIDEOSETTING_SHADERID, self->selection);
584
RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, false);
585
586
Options->changed = true;
587
}
588
589
void OptionsMenu_WindowScaleButton_ActionCB(void)
590
{
591
RSDK_THIS(UIButton);
592
593
OptionsRAM *options = Options_GetOptionsRAM();
594
if (self->selection != 4) {
595
RSDK.SetVideoSetting(VIDEOSETTING_WINDOW_WIDTH, WIDE_SCR_XSIZE * (self->selection + 1));
596
RSDK.SetVideoSetting(VIDEOSETTING_WINDOW_HEIGHT, SCREEN_YSIZE * (self->selection + 1));
597
598
options->windowSize = self->selection;
599
Options->changed = true;
600
}
601
}
602
603
void OptionsMenu_BorderlessButton_ActionCB(void)
604
{
605
RSDK_THIS(UIButton);
606
607
OptionsRAM *options = Options_GetOptionsRAM();
608
609
options->windowBorder = self->selection;
610
RSDK.SetVideoSetting(VIDEOSETTING_BORDERED, self->selection);
611
612
Options->changed = true;
613
}
614
615
void OptionsMenu_FullScreenButton_ActionCB(void)
616
{
617
RSDK_THIS(UIButton);
618
619
OptionsRAM *options = Options_GetOptionsRAM();
620
621
options->windowed = self->selection ^ 1;
622
RSDK.SetVideoSetting(VIDEOSETTING_WINDOWED, self->selection ^ 1);
623
624
Options->changed = true;
625
}
626
627
void OptionsMenu_VSyncButton_ActionCB(void)
628
{
629
RSDK_THIS(UIButton);
630
631
OptionsRAM *options = Options_GetOptionsRAM();
632
633
options->vSync = self->selection;
634
RSDK.SetVideoSetting(VIDEOSETTING_VSYNC, self->selection);
635
636
Options->changed = true;
637
}
638
639
void OptionsMenu_TripleBufferButton_ActionCB(void)
640
{
641
RSDK_THIS(UIButton);
642
643
OptionsRAM *options = Options_GetOptionsRAM();
644
645
options->tripleBuffering = self->selection;
646
RSDK.SetVideoSetting(VIDEOSETTING_TRIPLEBUFFERED, self->selection);
647
648
Options->changed = true;
649
}
650
651
void OptionsMenu_UISlider_ChangedCB(void)
652
{
653
RSDK_THIS(UISlider);
654
655
OptionsRAM *options = Options_GetOptionsRAM();
656
657
// Bug Details (?):
658
// what the hell is up with this???????
659
// it'd only ever be 0 or 1 why are 0xF1, 0xF2, 0xF4, 0xF5 & 0xFC options?????
660
// this is a CB for the slider why are the boolean values here???
661
662
bool32 value = self->frameID != 1;
663
switch (value) {
664
case 0xF1:
665
options->windowed = self->sliderPos;
666
RSDK.SetVideoSetting(VIDEOSETTING_WINDOWED, options->windowed);
667
break;
668
669
case 0xF2:
670
options->windowBorder = self->sliderPos;
671
RSDK.SetVideoSetting(VIDEOSETTING_BORDERED, options->windowBorder);
672
break;
673
674
case 0xF4:
675
options->vSync = self->sliderPos;
676
RSDK.SetVideoSetting(VIDEOSETTING_VSYNC, options->vSync);
677
break;
678
679
case 0xF5:
680
options->tripleBuffering = self->sliderPos;
681
RSDK.SetVideoSetting(VIDEOSETTING_TRIPLEBUFFERED, options->tripleBuffering);
682
break;
683
case 0xFC:
684
options->screenShader = self->sliderPos;
685
options->overrideShader = true;
686
687
RSDK.SetVideoSetting(VIDEOSETTING_SHADERID, options->screenShader);
688
RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, false);
689
break;
690
691
case 0:
692
options->volMusic = self->sliderPos;
693
options->overrideMusicVol = true;
694
RSDK.SetVideoSetting(VIDEOSETTING_STREAM_VOL, options->volMusic);
695
break;
696
697
case 1:
698
options->volSfx = self->sliderPos;
699
options->overrideSfxVol = true;
700
RSDK.SetVideoSetting(VIDEOSETTING_SFX_VOL, options->volSfx);
701
break;
702
703
default: break;
704
}
705
706
Options->changed = true;
707
}
708
709
void OptionsMenu_ShowManual(void)
710
{
711
RSDK.PlaySfx(UIWidgets->sfxAccept, false, 0xFF);
712
API_LaunchManual();
713
}
714
715
void OptionsMenu_EraseSaveDataCB(bool32 success)
716
{
717
String message;
718
EntityUIControl *control = OptionsMenu->dataOptionsControl;
719
720
UIWaitSpinner_FinishWait();
721
if (success) {
722
ManiaModeMenu_StartReturnToTitle();
723
}
724
else {
725
control->selectionDisabled = false;
726
RSDK.InitString(&message, "ERROR ERASING DATA.", 0);
727
UIDialog_CreateDialogOk(&message, StateMachine_None, true);
728
}
729
}
730
731
void OptionsMenu_AreYouSureDlg_YesCB_EraseSaveGame(void)
732
{
733
// Bug Details(?):
734
// sizeof(globals->noSaveSlot) and sizeof(saveData) is 4096 (sizeof(int32) * 0x400)
735
// but the memset size is only 1024 (sizeof(uint8) * 0x400)
736
// so only about 1/4th of the save slot is cleared, though nothin uses the extra space so it's not a big deal
737
738
// Mania Mode Slots
739
for (int32 i = 0; i < 8; ++i) {
740
int32 *saveRAM = SaveGame_GetDataPtr(i, false);
741
memset(saveRAM, 0, 0x400);
742
}
743
744
// Encore Slots
745
for (int32 i = 0; i < 3; ++i) {
746
int32 *saveRAM = SaveGame_GetDataPtr(i, true);
747
memset(saveRAM, 0, 0x400);
748
}
749
750
memset(globals->noSaveSlot, 0, 0x400);
751
globals->continues = 0;
752
753
SaveGame_SaveFile(OptionsMenu_EraseSaveDataCB);
754
}
755
756
void OptionsMenu_AreYouSureDlg_YesCB_EraseAllData(void)
757
{
758
// Mania Mode Slots
759
for (int32 i = 0; i < 8; ++i) {
760
int32 *saveRAM = SaveGame_GetDataPtr(i, false);
761
memset(saveRAM, 0, 0x400);
762
}
763
764
// Encore Slots
765
for (int32 i = 0; i < 3; ++i) {
766
int32 *saveRAM = SaveGame_GetDataPtr(i, true);
767
memset(saveRAM, 0, 0x400);
768
}
769
770
memset(globals->noSaveSlot, 0, 0x400);
771
globals->continues = 0;
772
773
GameProgress_ClearProgress();
774
775
API.RemoveAllDBRows(globals->taTableID);
776
777
SaveGame_SaveFile(OptionsMenu_EraseSaveDataCB);
778
}
779
780
void OptionsMenu_EraseSaveGameButton_ActionCB(void)
781
{
782
String message;
783
INIT_STRING(message);
784
785
Localization_GetString(&message, STR_AREYOUSURESAVE);
786
UIDialog_CreateDialogYesNo(&message, OptionsMenu_AreYouSureDlg_YesCB_EraseSaveGame, StateMachine_None, true, true);
787
}
788
789
void OptionsMenu_AreYouSureDlg_YesCB_EraseMedallions(void)
790
{
791
EntityUIControl *control = OptionsMenu->dataOptionsControl;
792
control->selectionDisabled = true;
793
794
GameProgress_ClearBSSSave();
795
SaveGame_SaveFile(OptionsMenu_EraseSaveDataCB);
796
}
797
798
void OptionsMenu_EraseMedallionsButton_ActionCB(void)
799
{
800
String message;
801
INIT_STRING(message);
802
803
Localization_GetString(&message, STR_AREYOUSURESAVE);
804
UIDialog_CreateDialogYesNo(&message, OptionsMenu_AreYouSureDlg_YesCB_EraseMedallions, StateMachine_None, true, true);
805
}
806
807
void OptionsMenu_AreYouSureDlg_YesCB_EraseTimeAttack(void)
808
{
809
EntityUIControl *control = OptionsMenu->dataOptionsControl;
810
control->selectionDisabled = true;
811
812
UIWaitSpinner_StartWait();
813
API.RemoveAllDBRows(globals->taTableID);
814
815
TimeAttackData_SaveDB(OptionsMenu_EraseSaveDataCB);
816
LogHelpers_Print("TimeAttack table ID = %d, status = %d", globals->taTableID, globals->taTableLoaded);
817
}
818
819
void OptionsMenu_EraseTimeAttackButton_ActionCB(void)
820
{
821
String message;
822
INIT_STRING(message);
823
824
Localization_GetString(&message, STR_AREYOUSURESAVE);
825
UIDialog_CreateDialogYesNo(&message, OptionsMenu_AreYouSureDlg_YesCB_EraseTimeAttack, StateMachine_None, true, true);
826
}
827
828
void OptionsMenu_AreYouSureDlg_YesCB_EraseReplays(void)
829
{
830
EntityUIControl *control = OptionsMenu->dataOptionsControl;
831
832
if (!control->selectionDisabled) {
833
control->selectionDisabled = true;
834
UIWaitSpinner_StartWait();
835
}
836
837
API.SetupUserDBRowSorting(globals->replayTableID);
838
API.SetupUserDBRowSorting(globals->taTableID);
839
840
if (API.GetSortedUserDBRowCount(globals->replayTableID) <= 0) {
841
ReplayDB_SaveDB(OptionsMenu_EraseReplaysCB);
842
}
843
else {
844
int32 row = API.GetSortedUserDBRowID(globals->replayTableID, 0);
845
ReplayDB_DeleteReplay(row, OptionsMenu_EraseReplaysCB, true);
846
}
847
}
848
849
void OptionsMenu_EraseReplaysCB(bool32 success) { TimeAttackData_SaveDB(OptionsMenu_EraseSaveDataCB); }
850
851
void OptionsMenu_EraseReplaysButton_ActionCB(void)
852
{
853
String message;
854
INIT_STRING(message);
855
856
if (API.CheckDLC(DLC_PLUS)) {
857
Localization_GetString(&message, STR_AREYOUSURESAVE);
858
UIDialog_CreateDialogYesNo(&message, OptionsMenu_AreYouSureDlg_YesCB_EraseReplays, StateMachine_None, true, true);
859
}
860
else {
861
Localization_GetString(&message, STR_ENCOREREQUIRED);
862
UIDialog_CreateDialogOk(&message, StateMachine_None, true);
863
}
864
}
865
866
void OptionsMenu_EraseAllButton_ActionCB(void)
867
{
868
String message;
869
INIT_STRING(message);
870
871
Localization_GetString(&message, STR_AREYOUSURESAVE);
872
UIDialog_CreateDialogYesNo(&message, OptionsMenu_AreYouSureDlg_YesCB_EraseAllData, StateMachine_None, true, true);
873
}
874
875
#if GAME_INCLUDE_EDITOR
876
void OptionsMenu_EditorDraw(void) {}
877
878
void OptionsMenu_EditorLoad(void) {}
879
#endif
880
881
void OptionsMenu_Serialize(void) {}
882
#endif
883
884