Path: blob/master/SonicMania/Objects/Menu/OptionsMenu.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: OptionsMenu Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if MANIA_USE_PLUS10ObjectOptionsMenu *OptionsMenu;1112void OptionsMenu_Update(void) {}1314void OptionsMenu_LateUpdate(void) {}1516void OptionsMenu_StaticUpdate(void) {}1718void OptionsMenu_Draw(void) {}1920void OptionsMenu_Create(void *data) {}2122void OptionsMenu_StageLoad(void) {}2324void OptionsMenu_Initialize(void)25{26LogHelpers_Print("ManiaModeMenu_Initialize()");2728String tag;29INIT_STRING(tag);3031foreach_all(UIControl, control)32{33RSDK.SetString(&tag, "Options");34if (RSDK.CompareStrings(&tag, &control->tag, false))35OptionsMenu->optionsControl = control;3637RSDK.SetString(&tag, "Language");38if (RSDK.CompareStrings(&tag, &control->tag, false))39OptionsMenu->languageControl = control;4041RSDK.SetString(&tag, "Language Old");42if (RSDK.CompareStrings(&tag, &control->tag, false))43OptionsMenu->languageControl_Legacy = control;4445RSDK.SetString(&tag, "Video");46if (RSDK.CompareStrings(&tag, &control->tag, false))47OptionsMenu->videoControl = control;4849RSDK.SetString(&tag, "Video WIN");50if (RSDK.CompareStrings(&tag, &control->tag, false))51OptionsMenu->videoControl_Windows = control;5253RSDK.SetString(&tag, "Sound");54if (RSDK.CompareStrings(&tag, &control->tag, false))55OptionsMenu->soundControl = control;5657RSDK.SetString(&tag, "Controls WIN");58if (RSDK.CompareStrings(&tag, &control->tag, false))59OptionsMenu->controlsControl_Windows = control;6061RSDK.SetString(&tag, "Controls KB");62if (RSDK.CompareStrings(&tag, &control->tag, false))63OptionsMenu->controlsControl_KB = control;6465RSDK.SetString(&tag, "Controls PS4");66if (RSDK.CompareStrings(&tag, &control->tag, false))67OptionsMenu->controlsControl_PS4 = control;6869RSDK.SetString(&tag, "Controls XB1");70if (RSDK.CompareStrings(&tag, &control->tag, false))71OptionsMenu->controlsControl_XB1 = control;7273RSDK.SetString(&tag, "Controls NX");74if (RSDK.CompareStrings(&tag, &control->tag, false))75OptionsMenu->controlsControl_NX = control;7677RSDK.SetString(&tag, "Controls NX Grip");78if (RSDK.CompareStrings(&tag, &control->tag, false))79OptionsMenu->controlsControl_NXGrip = control;8081RSDK.SetString(&tag, "Controls NX Joycon");82if (RSDK.CompareStrings(&tag, &control->tag, false))83OptionsMenu->controlsControl_NXJoycon = control;8485RSDK.SetString(&tag, "Controls NX Pro");86if (RSDK.CompareStrings(&tag, &control->tag, false))87OptionsMenu->controlsControl_NXPro = control;8889RSDK.SetString(&tag, "Data Options");90if (RSDK.CompareStrings(&tag, &control->tag, false))91OptionsMenu->dataOptionsControl = control;92}9394foreach_all(UIButtonPrompt, prompt)95{96EntityUIControl *controller = OptionsMenu->optionsControl;9798if (UIControl_ContainsPos(controller, &prompt->position) && prompt->buttonID == 3)99OptionsMenu->helpPrompt = prompt;100}101102foreach_all(UIDiorama, diorama)103{104EntityUIControl *controller = OptionsMenu->videoControl;105106if (UIControl_ContainsPos(controller, &diorama->position)) {107OptionsMenu->diorama = diorama;108diorama->parent = OptionsMenu->videoControl;109}110}111112foreach_all(UIInfoLabel, label)113{114EntityUIControl *controller = OptionsMenu->dataOptionsControl;115116if (UIControl_ContainsPos(controller, &label->position))117OptionsMenu->selectDataToEraseLabel = label;118}119}120121void OptionsMenu_HandleUnlocks(void)122{123EntityUIControl *control = OptionsMenu->dataOptionsControl;124125// Time Attack Data Button126control->buttons[5] = control->buttons[4];127control->buttonCount = 6;128129if (!API.CheckDLC(DLC_PLUS)) {130EntityUIButton *replaysButton = control->buttons[2];131replaysButton->invisible = true;132replaysButton->visible = false;133134EntityUIButton *allGameDataButton = control->buttons[3];135control->buttons[2] = allGameDataButton;136allGameDataButton->position.x = control->buttons[4]->position.x;137allGameDataButton->size.x = control->buttons[4]->size.x;138}139}140141void OptionsMenu_SetupActions(void)142{143EntityUIControl *optionsControl = OptionsMenu->optionsControl;144EntityUIControl *languageControl = OptionsMenu->languageControl;145EntityUIControl *languageControl_Legacy = OptionsMenu->languageControl_Legacy;146EntityUIControl *videoControl = OptionsMenu->videoControl;147EntityUIControl *controlsControl_Win = OptionsMenu->controlsControl_Windows;148EntityUIControl *videoControl_Win = OptionsMenu->videoControl_Windows;149EntityUIControl *soundControl = OptionsMenu->soundControl;150EntityUIControl *dataControl = OptionsMenu->dataOptionsControl;151152String string;153INIT_STRING(string);154155foreach_all(UIButton, button)156{157if (UIControl_ContainsPos(controlsControl_Win, &button->position))158button->actionCB = OptionsMenu_KeyboardIDButton_Win_ActionCB;159160if (UIControl_ContainsPos(optionsControl, &button->position) && button->listID == 3) {161162switch (button->frameID) {163case 0: button->actionCB = OptionsMenu_VideoMenuButton_ActionCB; break;164case 1: button->actionCB = OptionsMenu_SoundMenuButton_ActionCB; break;165166case 2:167button->actionCB = OptionsMenu_ControlsMenuButton_ActionCB;168if (sku_platform == PLATFORM_DEV || sku_platform == PLATFORM_PC)169button->transition = false;170break;171172case 3: button->actionCB = OptionsMenu_LanguageMenuButton_ActionCB; break;173case 4: button->actionCB = OptionsMenu_DataOptionsMenuButton_ActionCB; break;174}175}176177if (UIControl_ContainsPos(languageControl, &button->position))178button->actionCB = OptionsMenu_LanguageButton_ActionCB;179180if (UIControl_ContainsPos(languageControl_Legacy, &button->position))181button->actionCB = OptionsMenu_LanguageButton_ActionCB;182183if (UIControl_ContainsPos(videoControl, &button->position) && button->listID == 3 && button->frameID == 0)184button->choiceChangeCB = OptionsMenu_ShaderButton_ActionCB;185186if (UIControl_ContainsPos(controlsControl_Win, &button->position) && button->listID == 17 && button->frameID == 1)187button->actionCB = OptionsMenu_SetDefaultMappings;188189if (UIControl_ContainsPos(videoControl_Win, &button->position) && button->listID == 17) {190switch (button->frameID) {191case 2: button->choiceChangeCB = OptionsMenu_ShaderButton_ActionCB; break;192case 7: button->choiceChangeCB = OptionsMenu_WindowScaleButton_ActionCB; break;193case 13: button->choiceChangeCB = OptionsMenu_BorderlessButton_ActionCB; break;194case 14: button->choiceChangeCB = OptionsMenu_FullScreenButton_ActionCB; break;195case 15: button->choiceChangeCB = OptionsMenu_VSyncButton_ActionCB; break;196case 16: button->choiceChangeCB = OptionsMenu_TripleBufferButton_ActionCB; break;197}198}199200if (UIControl_ContainsPos(dataControl, &button->position) && button->listID == 18) {201switch (button->frameID) {202case 0: button->actionCB = OptionsMenu_EraseSaveGameButton_ActionCB; break;203case 1: button->actionCB = OptionsMenu_EraseMedallionsButton_ActionCB; break;204case 2: button->actionCB = OptionsMenu_EraseTimeAttackButton_ActionCB; break;205case 3: button->actionCB = OptionsMenu_EraseReplaysButton_ActionCB; break;206case 4: button->actionCB = OptionsMenu_EraseAllButton_ActionCB; break;207}208}209}210211foreach_all(UISlider, slider)212{213if (UIControl_ContainsPos(soundControl, &slider->position) && slider->listID == 5)214slider->sliderChangedCB = OptionsMenu_UISlider_ChangedCB;215}216217optionsControl->menuSetupCB = OptionsMenu_MenuSetupCB;218219EntityUIInfoLabel *label = OptionsMenu->selectDataToEraseLabel;220Localization_GetString(&string, STR_SELECTDATATOERASE);221UIInfoLabel_SetString(label, &string);222223videoControl_Win->menuUpdateCB = OptionsMenu_VideoControl_Win_MenuUpdateCB;224videoControl_Win->yPressCB = OptionsMenu_VideoControl_Win_YPressCB;225videoControl_Win->backPressCB = OptionsMenu_VideoControl_Win_BackPressCB;226227if (sku_platform == PLATFORM_SWITCH || sku_platform == PLATFORM_DEV) {228optionsControl->yPressCB = OptionsMenu_ShowManual;229}230else {231EntityUIButtonPrompt *prompt = OptionsMenu->helpPrompt;232prompt->visible = false;233}234}235236void OptionsMenu_HandleMenuReturn(void)237{238EntityUIControl *languageControl = OptionsMenu->languageControl;239EntityUIControl *languageControl_old = OptionsMenu->languageControl_Legacy;240EntityUIControl *videoControl = OptionsMenu->videoControl;241EntityUIControl *soundControl = OptionsMenu->soundControl;242243if (sku_platform == PLATFORM_PC || sku_platform == PLATFORM_DEV)244OptionsMenu_InitVideoOptionsMenu();245246EntityUIButton *button = videoControl->buttons[0];247UIButton_SetChoiceSelection(button, RSDK.GetVideoSetting(VIDEOSETTING_SHADERID));248249EntityUISlider *musSlider = (EntityUISlider *)soundControl->buttons[0];250musSlider->sliderPos = RSDK.GetVideoSetting(VIDEOSETTING_STREAM_VOL);251252EntityUISlider *sfxSlider = (EntityUISlider *)soundControl->buttons[1];253sfxSlider->sliderPos = RSDK.GetVideoSetting(VIDEOSETTING_SFX_VOL);254255languageControl->startingID = Localization->language;256languageControl->buttonID = Localization->language;257258languageControl_old->startingID = Localization->language;259languageControl_old->buttonID = Localization->language;260}261void OptionsMenu_InitVideoOptionsMenu(void)262{263if (sku_platform == PLATFORM_PC || sku_platform == PLATFORM_DEV) {264EntityUIControl *videoControl_Win = OptionsMenu->videoControl_Windows;265OptionsRAM *optionsRAM = Options_GetOptionsRAM();266267Options_GetWinSize();268269int32 options[7];270271options[0] = RSDK.GetVideoSetting(VIDEOSETTING_SHADERID); // filter272options[1] = optionsRAM->windowSize; // window size273options[2] = RSDK.GetVideoSetting(VIDEOSETTING_BORDERED); // bordered274275// fullscreen276options[3] = 0;277if (!RSDK.GetVideoSetting(VIDEOSETTING_WINDOWED) || optionsRAM->windowSize == 4)278options[3] = 1;279280options[4] = 0; // fullscreen res281options[5] = RSDK.GetVideoSetting(VIDEOSETTING_VSYNC); // vsync282options[6] = RSDK.GetVideoSetting(VIDEOSETTING_TRIPLEBUFFERED); // triple buffered283284for (int32 i = 0; i < videoControl_Win->buttonCount; ++i) {285EntityUIButton *button = videoControl_Win->buttons[i];286287if (i == 4) {288EntityUIResPicker *resPicker = (EntityUIResPicker *)UIButton_GetChoicePtr(button, button->selection);289UIResPicker_GetDisplayInfo(resPicker);290}291else if (i == 1) {292EntityUIWinSize *winSize = (EntityUIWinSize *)UIButton_GetChoicePtr(button, button->selection);293winSize->selection = RSDK.GetVideoSetting(VIDEOSETTING_WINDOW_HEIGHT) / SCREEN_YSIZE;294}295else if (button->selection != options[i]) {296UIButton_SetChoiceSelection(button, options[i]);297}298}299}300}301302void OptionsMenu_VideoControl_Win_MenuUpdateCB(void) { OptionsMenu_InitVideoOptionsMenu(); }303304void OptionsMenu_VideoControl_Win_YPressCB(void)305{306String message;307INIT_STRING(message);308309if (RSDK.GetVideoSetting(VIDEOSETTING_CHANGED)) {310RSDK.UpdateWindow();311312Localization_GetString(&message, STR_VIDEOCHANGESAPPLIED);313EntityUIDialog *dialog =314UIDialog_CreateDialogYesNo(&message, OptionsMenu_ApplyChangesDlg_Win_YesCB, OptionsMenu_ApplyChangesDlg_Win_NoCB, true, true);315if (dialog)316dialog->closeDelay = 15 * 60; // 15 seconds at 60 FPS317}318}319void OptionsMenu_DlgRunnerCB_RevertVideoChanges(void)320{321String message;322INIT_STRING(message);323324RSDK.UpdateWindow();325326Localization_GetString(&message, STR_VIDEOCHANGESAPPLIED);327// This is bugged! Using `OptionsMenu_ApplyChangesDlg_BackPress_NoCB` causes the settings to be reverted instead of saved!328// This should have called a modified version of `OptionsMenu_ApplyChangesDlg_Win_YesCB` which also transitions to the previous menu!329EntityUIDialog *dialog = UIDialog_CreateDialogYesNo(&message, OptionsMenu_ApplyChangesDlg_BackPress_NoCB, OptionsMenu_ApplyChangesDlg_NoCB, true, true);330if (dialog)331dialog->closeDelay = 15 * 60; // 15 seconds at 60 FPS332}333334bool32 OptionsMenu_VideoControl_Win_BackPressCB(void)335{336String message;337INIT_STRING(message);338339if (RSDK.GetVideoSetting(VIDEOSETTING_CHANGED)) {340Localization_GetString(&message, STR_APPLYCHANGEDSETTINGS);341EntityUIDialog *dialog =342UIDialog_CreateDialogYesNo(&message, OptionsMenu_ApplyChangesDlg_BackPress_YesCB, OptionsMenu_ApplyChangesDlg_BackPress_NoCB, true, true);343if (dialog)344return true;345}346else {347UITransition_StartTransition(UIControl_ReturnToParentMenu, 0);348}349350return false;351}352353void OptionsMenu_ApplyChangesDlg_BackPress_YesCB(void)354{355EntityDialogRunner *dialogRunner = CREATE_ENTITY(DialogRunner, DialogRunner_HandleCallback, 0, 0);356357dialogRunner->callback = OptionsMenu_DlgRunnerCB_RevertVideoChanges;358dialogRunner->timer = 0;359dialogRunner->isPermanent = true;360}361362void OptionsMenu_ApplyChangesDlg_Win_NoCB(void)363{364RSDK.SetVideoSetting(VIDEOSETTING_RELOAD, false);365RSDK.UpdateWindow();366367OptionsMenu_InitVideoOptionsMenu();368369RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, false);370}371372void OptionsMenu_ApplyChangesDlg_NoCB(void)373{374RSDK.SetVideoSetting(VIDEOSETTING_RELOAD, false);375RSDK.UpdateWindow();376377OptionsMenu_InitVideoOptionsMenu();378379RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, false);380UITransition_StartTransition(UIControl_ReturnToParentMenu, 0);381}382383void OptionsMenu_ApplyChangesDlg_Win_YesCB(void)384{385RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, false);386RSDK.SetVideoSetting(VIDEOSETTING_WRITE, true);387RSDK.SetVideoSetting(VIDEOSETTING_STORE, false);388}389390void OptionsMenu_ApplyChangesDlg_BackPress_NoCB(void)391{392RSDK.SetVideoSetting(VIDEOSETTING_RELOAD, false);393394OptionsMenu_InitVideoOptionsMenu();395396RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, false);397UITransition_StartTransition(UIControl_ReturnToParentMenu, 0);398}399400void OptionsMenu_VideoMenuButton_ActionCB(void)401{402if (sku_platform == PLATFORM_PC || sku_platform == PLATFORM_DEV) {403RSDK.SetVideoSetting(VIDEOSETTING_STORE, false);404#if MANIA_USE_EGS405API.ShowLimitedVideoOptions(8);406#endif407UIControl_MatchMenuTag("Video WIN");408}409else {410UIControl_MatchMenuTag("Video");411}412}413void OptionsMenu_SoundMenuButton_ActionCB(void) { UIControl_MatchMenuTag("Sound"); }414void OptionsMenu_LanguageMenuButton_ActionCB(void) { UIControl_MatchMenuTag("Language"); }415void OptionsMenu_DataOptionsMenuButton_ActionCB(void) { UIControl_MatchMenuTag("Data Options"); }416void OptionsMenu_ControlsMenuButton_DefaultKB_ActionCB(void) { UIControl_MatchMenuTag("Controls WIN"); }417void OptionsMenu_ControlsMenuButton_Default_ActionCB(void) { UIControl_MatchMenuTag("Controls XB1"); }418419void OptionsMenu_ControlsMenuButton_ActionCB(void)420{421int32 id = API_GetFilteredInputDeviceID(true, false, 5);422int32 gamepadType = API_GetInputDeviceType(id);423424String message;425INIT_STRING(message);426427switch ((gamepadType >> 8) & 0xFF) {428default:429case DEVICE_TYPE_CONTROLLER:430switch (gamepadType & 0xFF) {431case DEVICE_XBOX: UITransition_SetNewTag("Controls XB1"); break;432case DEVICE_PS4: UITransition_SetNewTag("Controls PS4"); break;433case DEVICE_SATURN: UITransition_SetNewTag("Controls WIN"); break;434case DEVICE_SWITCH_HANDHELD: UITransition_SetNewTag("Controls NX"); break;435case DEVICE_SWITCH_JOY_GRIP: UITransition_SetNewTag("Controls NX Grip"); break;436case DEVICE_SWITCH_JOY_L:437case DEVICE_SWITCH_JOY_R: UITransition_SetNewTag("Controls NX Joycon"); break;438case DEVICE_SWITCH_PRO: UITransition_SetNewTag("Controls NX Pro"); break;439default: UITransition_StartTransition(OptionsMenu_ControlsMenuButton_Default_ActionCB, 0); break;440}441break;442443case DEVICE_TYPE_KEYBOARD: UITransition_StartTransition(OptionsMenu_ControlsMenuButton_DefaultKB_ActionCB, 0); break;444445case DEVICE_TYPE_STEAMOVERLAY:446if (!API.IsOverlayEnabled(id)) {447Localization_GetString(&message, STR_STEAMOVERLAYUNAVAILABLE);448UIDialog_CreateDialogOk(&message, StateMachine_None, true);449}450break;451}452}453454void OptionsMenu_SetDefaultMappings(void)455{456ControllerInfo[CONT_P1].keyUp.keyMap = KEYMAP_UP;457ControllerInfo[CONT_P1].keyDown.keyMap = KEYMAP_DOWN;458ControllerInfo[CONT_P1].keyLeft.keyMap = KEYMAP_LEFT;459ControllerInfo[CONT_P1].keyRight.keyMap = KEYMAP_RIGHT;460ControllerInfo[CONT_P1].keyA.keyMap = KEYMAP_A;461ControllerInfo[CONT_P1].keyB.keyMap = KEYMAP_S;462ControllerInfo[CONT_P1].keyC.keyMap = KEYMAP_NO_MAPPING;463ControllerInfo[CONT_P1].keyX.keyMap = KEYMAP_Q;464ControllerInfo[CONT_P1].keyY.keyMap = KEYMAP_W;465ControllerInfo[CONT_P1].keyZ.keyMap = KEYMAP_NO_MAPPING;466ControllerInfo[CONT_P1].keyStart.keyMap = KEYMAP_RETURN;467ControllerInfo[CONT_P1].keySelect.keyMap = KEYMAP_TAB;468469ControllerInfo[CONT_P2].keyUp.keyMap = KEYMAP_NUMPAD8;470ControllerInfo[CONT_P2].keyDown.keyMap = KEYMAP_NUMPAD5;471ControllerInfo[CONT_P2].keyLeft.keyMap = KEYMAP_NUMPAD4;472ControllerInfo[CONT_P2].keyRight.keyMap = KEYMAP_NUMPAD6;473ControllerInfo[CONT_P2].keyA.keyMap = KEYMAP_J;474ControllerInfo[CONT_P2].keyB.keyMap = KEYMAP_K;475ControllerInfo[CONT_P2].keyC.keyMap = KEYMAP_NO_MAPPING;476ControllerInfo[CONT_P2].keyX.keyMap = KEYMAP_U;477ControllerInfo[CONT_P2].keyY.keyMap = KEYMAP_I;478ControllerInfo[CONT_P2].keyZ.keyMap = KEYMAP_NO_MAPPING;479ControllerInfo[CONT_P2].keyStart.keyMap = KEYMAP_OEM_4;480ControllerInfo[CONT_P2].keySelect.keyMap = KEYMAP_OEM_6;481482RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, true);483}484485void OptionsMenu_SetupKBControlsMenu(int32 playerID)486{487EntityUIControl *control = OptionsMenu->controlsControl_KB;488489foreach_all(UISubHeading, subHeading)490{491if (UIControl_ContainsPos(control, &subHeading->position)) {492subHeading->frameID = 19 + playerID;493foreach_break;494}495}496497for (int32 b = 0; b < control->buttonCount; ++b) {498EntityUIKeyBinder *binder = (EntityUIKeyBinder *)control->buttons[b];499500if (binder->classID == UIKeyBinder->classID)501binder->inputID = playerID;502}503}504505void OptionsMenu_KeyboardIDButton_Win_ActionCB(void)506{507RSDK_THIS(UIButton);508509EntityUIControl *control = OptionsMenu->controlsControl_Windows;510511for (int32 i = 0; i < control->buttonCount; ++i) {512if (self == control->buttons[i]) {513OptionsMenu_SetupKBControlsMenu(i);514UIControl_MatchMenuTag("Controls KB");515}516}517}518519void OptionsMenu_MenuSetupCB(void)520{521if (Options->changed) {522UIWaitSpinner_StartWait();523Options_SaveFile(OptionsMenu_SaveOptionsCB_Load);524}525526EntityUIControl *control = OptionsMenu->optionsControl;527528EntityUIButton *eraseDataButton = control->buttons[4];529if (eraseDataButton)530eraseDataButton->disabled = API_GetNoSave();531}532533void OptionsMenu_SaveOptionsCB_Load(bool32 success) { UIWaitSpinner_FinishWait(); }534535void OptionsMenu_TransitionCB_ReloadScene(void)536{537globals->suppressAutoMusic = true;538539RSDK.ForceHardReset(true);540RSDK.LoadScene();541}542543void OptionsMenu_SaveOptionsCB_Action(bool32 success)544{545EntityMenuParam *param = MenuParam_GetParam();546547UIWaitSpinner_FinishWait();548549EntityUIControl *control = OptionsMenu->languageControl;550control->startingID = control->buttonID;551552TimeAttackData_Clear();553554strcpy(param->menuTag, "Options");555MenuSetup_StartTransition(OptionsMenu_TransitionCB_ReloadScene, 32);556}557558void OptionsMenu_LanguageButton_ActionCB(void)559{560RSDK_THIS(UIButton);561562EntityUIControl *control = (EntityUIControl *)self->parent;563564Options_SetLanguage(control->buttonID);565Localization->language = control->buttonID;566control->selectionDisabled = true;567568UIWaitSpinner_StartWait();569570Options_SaveFile(OptionsMenu_SaveOptionsCB_Action);571}572573void OptionsMenu_ShaderButton_ActionCB(void)574{575RSDK_THIS(UIButton);576577OptionsRAM *options = Options_GetOptionsRAM();578579options->screenShader = self->selection;580options->overrideShader = true;581582RSDK.SetVideoSetting(VIDEOSETTING_SHADERID, self->selection);583RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, false);584585Options->changed = true;586}587588void OptionsMenu_WindowScaleButton_ActionCB(void)589{590RSDK_THIS(UIButton);591592OptionsRAM *options = Options_GetOptionsRAM();593if (self->selection != 4) {594RSDK.SetVideoSetting(VIDEOSETTING_WINDOW_WIDTH, WIDE_SCR_XSIZE * (self->selection + 1));595RSDK.SetVideoSetting(VIDEOSETTING_WINDOW_HEIGHT, SCREEN_YSIZE * (self->selection + 1));596597options->windowSize = self->selection;598Options->changed = true;599}600}601602void OptionsMenu_BorderlessButton_ActionCB(void)603{604RSDK_THIS(UIButton);605606OptionsRAM *options = Options_GetOptionsRAM();607608options->windowBorder = self->selection;609RSDK.SetVideoSetting(VIDEOSETTING_BORDERED, self->selection);610611Options->changed = true;612}613614void OptionsMenu_FullScreenButton_ActionCB(void)615{616RSDK_THIS(UIButton);617618OptionsRAM *options = Options_GetOptionsRAM();619620options->windowed = self->selection ^ 1;621RSDK.SetVideoSetting(VIDEOSETTING_WINDOWED, self->selection ^ 1);622623Options->changed = true;624}625626void OptionsMenu_VSyncButton_ActionCB(void)627{628RSDK_THIS(UIButton);629630OptionsRAM *options = Options_GetOptionsRAM();631632options->vSync = self->selection;633RSDK.SetVideoSetting(VIDEOSETTING_VSYNC, self->selection);634635Options->changed = true;636}637638void OptionsMenu_TripleBufferButton_ActionCB(void)639{640RSDK_THIS(UIButton);641642OptionsRAM *options = Options_GetOptionsRAM();643644options->tripleBuffering = self->selection;645RSDK.SetVideoSetting(VIDEOSETTING_TRIPLEBUFFERED, self->selection);646647Options->changed = true;648}649650void OptionsMenu_UISlider_ChangedCB(void)651{652RSDK_THIS(UISlider);653654OptionsRAM *options = Options_GetOptionsRAM();655656// Bug Details (?):657// what the hell is up with this???????658// it'd only ever be 0 or 1 why are 0xF1, 0xF2, 0xF4, 0xF5 & 0xFC options?????659// this is a CB for the slider why are the boolean values here???660661bool32 value = self->frameID != 1;662switch (value) {663case 0xF1:664options->windowed = self->sliderPos;665RSDK.SetVideoSetting(VIDEOSETTING_WINDOWED, options->windowed);666break;667668case 0xF2:669options->windowBorder = self->sliderPos;670RSDK.SetVideoSetting(VIDEOSETTING_BORDERED, options->windowBorder);671break;672673case 0xF4:674options->vSync = self->sliderPos;675RSDK.SetVideoSetting(VIDEOSETTING_VSYNC, options->vSync);676break;677678case 0xF5:679options->tripleBuffering = self->sliderPos;680RSDK.SetVideoSetting(VIDEOSETTING_TRIPLEBUFFERED, options->tripleBuffering);681break;682case 0xFC:683options->screenShader = self->sliderPos;684options->overrideShader = true;685686RSDK.SetVideoSetting(VIDEOSETTING_SHADERID, options->screenShader);687RSDK.SetVideoSetting(VIDEOSETTING_CHANGED, false);688break;689690case 0:691options->volMusic = self->sliderPos;692options->overrideMusicVol = true;693RSDK.SetVideoSetting(VIDEOSETTING_STREAM_VOL, options->volMusic);694break;695696case 1:697options->volSfx = self->sliderPos;698options->overrideSfxVol = true;699RSDK.SetVideoSetting(VIDEOSETTING_SFX_VOL, options->volSfx);700break;701702default: break;703}704705Options->changed = true;706}707708void OptionsMenu_ShowManual(void)709{710RSDK.PlaySfx(UIWidgets->sfxAccept, false, 0xFF);711API_LaunchManual();712}713714void OptionsMenu_EraseSaveDataCB(bool32 success)715{716String message;717EntityUIControl *control = OptionsMenu->dataOptionsControl;718719UIWaitSpinner_FinishWait();720if (success) {721ManiaModeMenu_StartReturnToTitle();722}723else {724control->selectionDisabled = false;725RSDK.InitString(&message, "ERROR ERASING DATA.", 0);726UIDialog_CreateDialogOk(&message, StateMachine_None, true);727}728}729730void OptionsMenu_AreYouSureDlg_YesCB_EraseSaveGame(void)731{732// Bug Details(?):733// sizeof(globals->noSaveSlot) and sizeof(saveData) is 4096 (sizeof(int32) * 0x400)734// but the memset size is only 1024 (sizeof(uint8) * 0x400)735// so only about 1/4th of the save slot is cleared, though nothin uses the extra space so it's not a big deal736737// Mania Mode Slots738for (int32 i = 0; i < 8; ++i) {739int32 *saveRAM = SaveGame_GetDataPtr(i, false);740memset(saveRAM, 0, 0x400);741}742743// Encore Slots744for (int32 i = 0; i < 3; ++i) {745int32 *saveRAM = SaveGame_GetDataPtr(i, true);746memset(saveRAM, 0, 0x400);747}748749memset(globals->noSaveSlot, 0, 0x400);750globals->continues = 0;751752SaveGame_SaveFile(OptionsMenu_EraseSaveDataCB);753}754755void OptionsMenu_AreYouSureDlg_YesCB_EraseAllData(void)756{757// Mania Mode Slots758for (int32 i = 0; i < 8; ++i) {759int32 *saveRAM = SaveGame_GetDataPtr(i, false);760memset(saveRAM, 0, 0x400);761}762763// Encore Slots764for (int32 i = 0; i < 3; ++i) {765int32 *saveRAM = SaveGame_GetDataPtr(i, true);766memset(saveRAM, 0, 0x400);767}768769memset(globals->noSaveSlot, 0, 0x400);770globals->continues = 0;771772GameProgress_ClearProgress();773774API.RemoveAllDBRows(globals->taTableID);775776SaveGame_SaveFile(OptionsMenu_EraseSaveDataCB);777}778779void OptionsMenu_EraseSaveGameButton_ActionCB(void)780{781String message;782INIT_STRING(message);783784Localization_GetString(&message, STR_AREYOUSURESAVE);785UIDialog_CreateDialogYesNo(&message, OptionsMenu_AreYouSureDlg_YesCB_EraseSaveGame, StateMachine_None, true, true);786}787788void OptionsMenu_AreYouSureDlg_YesCB_EraseMedallions(void)789{790EntityUIControl *control = OptionsMenu->dataOptionsControl;791control->selectionDisabled = true;792793GameProgress_ClearBSSSave();794SaveGame_SaveFile(OptionsMenu_EraseSaveDataCB);795}796797void OptionsMenu_EraseMedallionsButton_ActionCB(void)798{799String message;800INIT_STRING(message);801802Localization_GetString(&message, STR_AREYOUSURESAVE);803UIDialog_CreateDialogYesNo(&message, OptionsMenu_AreYouSureDlg_YesCB_EraseMedallions, StateMachine_None, true, true);804}805806void OptionsMenu_AreYouSureDlg_YesCB_EraseTimeAttack(void)807{808EntityUIControl *control = OptionsMenu->dataOptionsControl;809control->selectionDisabled = true;810811UIWaitSpinner_StartWait();812API.RemoveAllDBRows(globals->taTableID);813814TimeAttackData_SaveDB(OptionsMenu_EraseSaveDataCB);815LogHelpers_Print("TimeAttack table ID = %d, status = %d", globals->taTableID, globals->taTableLoaded);816}817818void OptionsMenu_EraseTimeAttackButton_ActionCB(void)819{820String message;821INIT_STRING(message);822823Localization_GetString(&message, STR_AREYOUSURESAVE);824UIDialog_CreateDialogYesNo(&message, OptionsMenu_AreYouSureDlg_YesCB_EraseTimeAttack, StateMachine_None, true, true);825}826827void OptionsMenu_AreYouSureDlg_YesCB_EraseReplays(void)828{829EntityUIControl *control = OptionsMenu->dataOptionsControl;830831if (!control->selectionDisabled) {832control->selectionDisabled = true;833UIWaitSpinner_StartWait();834}835836API.SetupUserDBRowSorting(globals->replayTableID);837API.SetupUserDBRowSorting(globals->taTableID);838839if (API.GetSortedUserDBRowCount(globals->replayTableID) <= 0) {840ReplayDB_SaveDB(OptionsMenu_EraseReplaysCB);841}842else {843int32 row = API.GetSortedUserDBRowID(globals->replayTableID, 0);844ReplayDB_DeleteReplay(row, OptionsMenu_EraseReplaysCB, true);845}846}847848void OptionsMenu_EraseReplaysCB(bool32 success) { TimeAttackData_SaveDB(OptionsMenu_EraseSaveDataCB); }849850void OptionsMenu_EraseReplaysButton_ActionCB(void)851{852String message;853INIT_STRING(message);854855if (API.CheckDLC(DLC_PLUS)) {856Localization_GetString(&message, STR_AREYOUSURESAVE);857UIDialog_CreateDialogYesNo(&message, OptionsMenu_AreYouSureDlg_YesCB_EraseReplays, StateMachine_None, true, true);858}859else {860Localization_GetString(&message, STR_ENCOREREQUIRED);861UIDialog_CreateDialogOk(&message, StateMachine_None, true);862}863}864865void OptionsMenu_EraseAllButton_ActionCB(void)866{867String message;868INIT_STRING(message);869870Localization_GetString(&message, STR_AREYOUSURESAVE);871UIDialog_CreateDialogYesNo(&message, OptionsMenu_AreYouSureDlg_YesCB_EraseAllData, StateMachine_None, true, true);872}873874#if GAME_INCLUDE_EDITOR875void OptionsMenu_EditorDraw(void) {}876877void OptionsMenu_EditorLoad(void) {}878#endif879880void OptionsMenu_Serialize(void) {}881#endif882883884