options_menu: reboot on language change

This commit is contained in:
Hyper 2024-12-08 03:46:01 +00:00
parent 1713a8c0ec
commit f327eb8357
7 changed files with 53 additions and 14 deletions

View file

@ -5,11 +5,14 @@
#include <patches/audio_patches.h> #include <patches/audio_patches.h>
#include <os/process.h> #include <os/process.h>
void App::Exit(std::vector<std::string> restartArgs) void App::Restart(std::vector<std::string> restartArgs)
{ {
if (restartArgs.size())
os::process::StartProcess(os::process::GetExecutablePath(), restartArgs, os::process::GetWorkingDirectory()); os::process::StartProcess(os::process::GetExecutablePath(), restartArgs, os::process::GetWorkingDirectory());
Exit();
}
void App::Exit()
{
#if _WIN32 #if _WIN32
ExitProcess(0); ExitProcess(0);
#endif #endif
@ -21,6 +24,7 @@ PPC_FUNC(sub_824EB490)
{ {
App::s_isInit = true; App::s_isInit = true;
App::s_isMissingDLC = !Installer::checkAllDLC(GetGamePath()); App::s_isMissingDLC = !Installer::checkAllDLC(GetGamePath());
App::s_language = Config::Language;
__imp__sub_824EB490(ctx, base); __imp__sub_824EB490(ctx, base);
} }

View file

@ -1,12 +1,17 @@
#pragma once #pragma once
#include <user/config_detail.h>
class App class App
{ {
public: public:
inline static bool s_isInit; inline static bool s_isInit;
inline static bool s_isMissingDLC; inline static bool s_isMissingDLC;
inline static ELanguage s_language;
inline static double s_deltaTime; inline static double s_deltaTime;
static void Exit(std::vector<std::string> restartArgs = {}); static void Restart(std::vector<std::string> restartArgs = {});
static void Exit();
}; };

View file

@ -66,6 +66,12 @@ inline static std::unordered_map<std::string, std::unordered_map<ELanguage, std:
{ ELanguage::English, "This option is not supported by your operating system." } { ELanguage::English, "This option is not supported by your operating system." }
} }
}, },
{
"Options_Message_Restart",
{
{ ELanguage::English, "The game will now restart." }
}
},
{ {
"Achievements_Name", "Achievements_Name",
{ {

View file

@ -1,6 +1,7 @@
#include <cpu/guest_code.h> #include <cpu/guest_code.h>
#include <api/SWA.h> #include <api/SWA.h>
#include <locale/locale.h> #include <locale/locale.h>
#include <ui/button_guide.h>
#include <ui/fader.h> #include <ui/fader.h>
#include <ui/message_window.h> #include <ui/message_window.h>
#include <ui/options_menu.h> #include <ui/options_menu.h>
@ -31,7 +32,7 @@ static bool ProcessInstallMessage()
switch (g_installMessageResult) switch (g_installMessageResult)
{ {
case 0: case 0:
Fader::FadeOut(1, []() { App::Exit({ "--install-dlc" }); }); Fader::FadeOut(1, []() { App::Restart({ "--install-dlc" }); });
g_installMessageFaderBegun = true; g_installMessageFaderBegun = true;
break; break;
@ -58,7 +59,14 @@ PPC_FUNC(sub_825882B8)
if (!OptionsMenu::s_isVisible && isOptionsIndex) if (!OptionsMenu::s_isVisible && isOptionsIndex)
{ {
if (isAccepted) if (OptionsMenu::s_isRestartRequired)
{
static int result = -1;
if (MessageWindow::Open(Localise("Options_Message_Restart"), &result) == MSG_CLOSED)
Fader::FadeOut(1, []() { App::Restart(); });
}
else if (isAccepted)
{ {
Game_PlaySound("sys_worldmap_window"); Game_PlaySound("sys_worldmap_window");
Game_PlaySound("sys_worldmap_decide"); Game_PlaySound("sys_worldmap_decide");
@ -71,7 +79,7 @@ PPC_FUNC(sub_825882B8)
g_installMessageOpen = true; g_installMessageOpen = true;
} }
if (!OptionsMenu::s_isVisible && !ProcessInstallMessage()) if (!OptionsMenu::s_isVisible && !OptionsMenu::s_isRestartRequired && !ProcessInstallMessage())
__imp__sub_825882B8(ctx, base); __imp__sub_825882B8(ctx, base);
if (isOptionsIndex) if (isOptionsIndex)

View file

@ -2,6 +2,7 @@
#include "imgui_utils.h" #include "imgui_utils.h"
#include <user/config.h> #include <user/config.h>
static bool g_isFading;
static bool g_isFadeIn; static bool g_isFadeIn;
static float g_startTime; static float g_startTime;
@ -21,8 +22,13 @@ void Fader::Draw()
if (time >= g_duration) if (time >= g_duration)
{ {
if (g_endCallback && time >= g_duration + g_endCallbackDelay) if (time >= g_duration + g_endCallbackDelay)
{
if (g_endCallback)
g_endCallback(); g_endCallback();
g_isFading = false;
}
} }
else else
{ {
@ -36,9 +42,14 @@ void Fader::Draw()
ImGui::GetForegroundDrawList()->AddRectFilled({ 0, 0 }, ImGui::GetIO().DisplaySize, colour); ImGui::GetForegroundDrawList()->AddRectFilled({ 0, 0 }, ImGui::GetIO().DisplaySize, colour);
} }
static void DoFade(float duration, std::function<void()> endCallback, float endCallbackDelay) static void DoFade(bool isFadeIn, float duration, std::function<void()> endCallback, float endCallbackDelay)
{ {
if (g_isFading)
return;
Fader::s_isVisible = true; Fader::s_isVisible = true;
g_isFading = true;
g_isFadeIn = isFadeIn;
g_startTime = ImGui::GetTime(); g_startTime = ImGui::GetTime();
g_duration = duration; g_duration = duration;
g_endCallback = endCallback; g_endCallback = endCallback;
@ -52,12 +63,10 @@ void Fader::SetFadeColour(ImU32 colour)
void Fader::FadeIn(float duration, std::function<void()> endCallback, float endCallbackDelay) void Fader::FadeIn(float duration, std::function<void()> endCallback, float endCallbackDelay)
{ {
g_isFadeIn = true; DoFade(true, duration, endCallback, endCallbackDelay);
DoFade(duration, endCallback, endCallbackDelay);
} }
void Fader::FadeOut(float duration, std::function<void()> endCallback, float endCallbackDelay) void Fader::FadeOut(float duration, std::function<void()> endCallback, float endCallbackDelay)
{ {
g_isFadeIn = false; DoFade(false, duration, endCallback, endCallbackDelay);
DoFade(duration, endCallback, endCallbackDelay);
} }

View file

@ -11,6 +11,7 @@
#include <kernel/memory.h> #include <kernel/memory.h>
#include <locale/locale.h> #include <locale/locale.h>
#include <ui/button_guide.h> #include <ui/button_guide.h>
#include <app.h>
#include <patches/audio_patches.h> #include <patches/audio_patches.h>
@ -66,6 +67,7 @@ static std::string* g_inaccessibleReason;
static bool g_isEnterKeyBuffered = false; static bool g_isEnterKeyBuffered = false;
static bool g_canReset = false; static bool g_canReset = false;
static bool g_isLanguageOptionChanged = false;
static double g_appearTime = 0.0; static double g_appearTime = 0.0;
@ -475,6 +477,7 @@ static void DrawConfigOption(int32_t rowIndex, float yOffset, ConfigDef<T>* conf
{ {
g_leftWasHeld = false; g_leftWasHeld = false;
g_rightWasHeld = false; g_rightWasHeld = false;
// remember value // remember value
s_oldValue = config->Value; s_oldValue = config->Value;
@ -493,6 +496,7 @@ static void DrawConfigOption(int32_t rowIndex, float yOffset, ConfigDef<T>* conf
{ {
// released lock, restore old value // released lock, restore old value
config->Value = s_oldValue; config->Value = s_oldValue;
g_lockedOnOption = false; g_lockedOnOption = false;
Game_PlaySound("sys_worldmap_cansel"); Game_PlaySound("sys_worldmap_cansel");
@ -1012,6 +1016,8 @@ void OptionsMenu::Draw()
DrawScanlineBars(); DrawScanlineBars();
DrawSettingsPanel(); DrawSettingsPanel();
DrawInfoPanel(); DrawInfoPanel();
s_isRestartRequired = Config::Language != App::s_language;
} }
void OptionsMenu::Open(bool isPause, SWA::EMenuType pauseMenuType) void OptionsMenu::Open(bool isPause, SWA::EMenuType pauseMenuType)

View file

@ -7,6 +7,7 @@ class OptionsMenu
public: public:
inline static bool s_isVisible = false; inline static bool s_isVisible = false;
inline static bool s_isPause = false; inline static bool s_isPause = false;
inline static bool s_isRestartRequired = false;
inline static SWA::EMenuType s_pauseMenuType; inline static SWA::EMenuType s_pauseMenuType;