From 7cb5ef3445bb977eb2ed4936ad2e0cba415702c6 Mon Sep 17 00:00:00 2001 From: florianessl Date: Sun, 3 Mar 2024 16:29:21 +0100 Subject: [PATCH 01/11] Refactored translation menu into its own Scene (#2945) --- CMakeLists.txt | 2 + Makefile.am | 2 + src/scene.h | 1 + src/scene_language.cpp | 177 +++++++++++++++++++++++++++++++++++++++++ src/scene_language.h | 92 +++++++++++++++++++++ src/scene_map.cpp | 3 +- src/scene_title.cpp | 125 ++++------------------------- src/scene_title.h | 37 --------- 8 files changed, 293 insertions(+), 146 deletions(-) create mode 100644 src/scene_language.cpp create mode 100644 src/scene_language.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 87859f18f0..b540a7229a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -306,6 +306,8 @@ add_library(${PROJECT_NAME} OBJECT src/scene_import.h src/scene_item.cpp src/scene_item.h + src/scene_language.cpp + src/scene_language.h src/scene_load.cpp src/scene_load.h src/scene_logo.cpp diff --git a/Makefile.am b/Makefile.am index 02992d0f91..898137ccb1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -287,6 +287,8 @@ libeasyrpg_player_a_SOURCES = \ src/scene_gameover.h \ src/scene_item.cpp \ src/scene_item.h \ + src/scene_language.cpp \ + src/scene_language.h \ src/scene_load.cpp \ src/scene_load.h \ src/scene_logo.cpp \ diff --git a/src/scene.h b/src/scene.h index 4a393fcc30..b2c9458a88 100644 --- a/src/scene.h +++ b/src/scene.h @@ -59,6 +59,7 @@ class Scene { GameBrowser, Teleport, Settings, + Translation, SceneMax }; diff --git a/src/scene_language.cpp b/src/scene_language.cpp new file mode 100644 index 0000000000..93ff1c3dea --- /dev/null +++ b/src/scene_language.cpp @@ -0,0 +1,177 @@ +/* + * This file is part of EasyRPG Player. + * + * EasyRPG Player is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * EasyRPG Player is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with EasyRPG Player. If not, see . + */ +#include "scene_language.h" +#include "audio.h" +#include "bitmap.h" +#include "input.h" +#include "game_system.h" +#include "cache.h" +#include "input_buttons.h" +#include "input_source.h" +#include "keys.h" +#include "main_data.h" +#include "options.h" +#include "player.h" +#include "baseui.h" +#include "output.h" +#include "utils.h" +#include "scene_end.h" +#include "window_about.h" +#include "window_command_horizontal.h" +#include "window_help.h" +#include "window_input_settings.h" +#include "window_numberinput.h" +#include "window_selectable.h" +#include "window_settings.h" +#include + +#ifdef EMSCRIPTEN +# include +#endif + +Scene_Language::Scene_Language() { + Scene::type = Scene::Translation; +} + +void Scene_Language::CreateTitleGraphic() { + // Load Title Graphic + if (lcf::Data::system.title_name.empty()) { + return; + } + title = std::make_unique(); + FileRequestAsync* request = AsyncHandler::RequestFile("Title", lcf::Data::system.title_name); + request->SetGraphicFile(true); + request_id = request->Bind(&Scene_Language::OnTitleSpriteReady, this); + request->Start(); +} + + +void Scene_Language::CreateTranslationWindow() { + // Build a list of 'Default' and all known languages. + std::vector lang_names; + lang_names.push_back("Default"); + lang_dirs.push_back(""); + lang_helps.push_back("Play the game in its original language."); + + // Push menu entries with the display name, but also save the directory location and help text. + for (const Language& lg : Player::translation.GetLanguages()) { + lang_names.push_back(lg.lang_name); + lang_dirs.push_back(lg.lang_dir); + lang_helps.push_back(lg.lang_desc); + } + + // Allow overwriting text of the default language + const Language& def = Player::translation.GetDefaultLanguage(); + if (!def.lang_name.empty()) { + lang_names.front() = def.lang_name; + } + if (!def.lang_desc.empty()) { + lang_helps.front() = def.lang_desc; + } + + translate_window = std::make_unique(lang_names, -1, lang_names.size() > 9 ? 9 : lang_names.size()); + translate_window->UpdateHelpFn = [this](Window_Help& win, int index) { + if (index >= 0 && index < static_cast(lang_helps.size())) { + win.SetText(lang_helps[index]); + } + else { + win.SetText(""); + } + }; + translate_window->SetX(Player::screen_width / 2 - translate_window->GetWidth() / 2); + translate_window->SetY(Player::screen_height / 2 - translate_window->GetHeight() / 2); + + if (Player::IsRPG2k3E() && lcf::Data::battlecommands.transparency == lcf::rpg::BattleCommands::Transparency_transparent) { + translate_window->SetBackOpacity(160); + } + + translate_window->SetVisible(false); +} + +void Scene_Language::CreateHelpWindow() { + help_window.reset(new Window_Help(0, 0, Player::screen_width, 32)); + + if (Player::IsRPG2k3E() && lcf::Data::battlecommands.transparency == lcf::rpg::BattleCommands::Transparency_transparent) { + help_window->SetBackOpacity(160); + } + + help_window->SetVisible(false); + translate_window->SetHelpWindow(help_window.get()); +} + +void Scene_Language::Start() { + CreateTitleGraphic(); + CreateTranslationWindow(); + CreateHelpWindow(); + + translate_window->SetActive(true); + translate_window->SetVisible(true); + help_window->SetVisible(true); +} + + +void Scene_Language::vUpdate() { + translate_window->Update(); + help_window->Update(); + + + if (Input::IsTriggered(Input::DECISION)) { + int index = translate_window->GetIndex(); + ChangeLanguage(lang_dirs.at(index)); + } + else if (Input::IsTriggered(Input::CANCEL)) { + Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Cancel)); + + Scene::Pop(); + } + +} + +void Scene_Language::OnTitleSpriteReady(FileRequestResult* result) { + BitmapRef bitmapRef = Cache::Title(result->file); + + title->SetBitmap(bitmapRef); + + // If the title sprite doesn't fill the screen, center it to support custom resolutions + if (bitmapRef->GetWidth() < Player::screen_width) { + title->SetX(Player::menu_offset_x); + } + if (bitmapRef->GetHeight() < Player::screen_height) { + title->SetY(Player::menu_offset_y); + } +} + +void Scene_Language::ChangeLanguage(const std::string& lang_str) { + Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Decision)); + + // No-op? + if (lang_str == Player::translation.GetCurrentLanguage().lang_dir) { + Scene::Pop(); + return; + } + + // First change the language + Player::translation.SelectLanguage(lang_str); +} + +void Scene_Language::OnTranslationChanged() { + Start(); + + Scene::Pop(); + + Scene::OnTranslationChanged(); +} diff --git a/src/scene_language.h b/src/scene_language.h new file mode 100644 index 0000000000..68d760eafa --- /dev/null +++ b/src/scene_language.h @@ -0,0 +1,92 @@ +/* + * This file is part of EasyRPG Player. + * + * EasyRPG Player is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * EasyRPG Player is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with EasyRPG Player. If not, see . + */ + +#ifndef EP_SCENE_LANGUAGE_H +#define EP_SCENE_LANGUAGE_H + + // Headers +#include +#include "scene.h" +#include "window_command.h" +#include "window_command_horizontal.h" +#include "window_about.h" +#include "window_selectable.h" +#include "window_settings.h" +#include "window_input_settings.h" +#include "async_handler.h" +#include "sprite.h" +#include "game_config.h" + +/** + * Scene allowing configuration of system state. + */ +class Scene_Language : public Scene { + +public: + /** + * Constructor. + */ + Scene_Language(); + + void Start() override; + void vUpdate() override; + + void OnTranslationChanged() override; + +private: + + /** + * Creates the Window displaying available translations. + */ + void CreateTranslationWindow(); + + /** + * Creates the Help window and hides it + */ + void CreateHelpWindow(); + + /** + * Picks a new language based and switches to it. + * @param lang_str If the empty string, switches the game to 'No Translation'. Otherwise, switch to that translation by name. + */ + void ChangeLanguage(const std::string& lang_str); + + void CreateTitleGraphic(); + void OnTitleSpriteReady(FileRequestResult* result); + + + /** Displays all available translations (languages). */ + std::unique_ptr translate_window; + + /** Displays help text for a given language **/ + std::unique_ptr help_window; + + /** Contains directory names for each language; entry 0 is resverd for the default (no) translation */ + std::vector lang_dirs; + + /** Contains help strings for each language; entry 0 is resverd for the default (no) translation */ + std::vector lang_helps; + + std::unique_ptr title; + FileRequestBinding request_id; + int input_reset_counter = 0; + + Window_Settings::UiMode mode = Window_Settings::eNone; +}; + + +#endif diff --git a/src/scene_map.cpp b/src/scene_map.cpp index b5bd4d3351..a91a69f7c4 100644 --- a/src/scene_map.cpp +++ b/src/scene_map.cpp @@ -183,7 +183,8 @@ void Scene_Map::TransitionOut(SceneType next_scene) { if (next_scene != Scene::Battle && next_scene != Scene::Debug - && next_scene != Scene::Settings) { + && next_scene != Scene::Settings + && next_scene != Scene::Translation) { screen_erased_by_event = false; } diff --git a/src/scene_title.cpp b/src/scene_title.cpp index 4dc5280a58..e2a7156c5c 100644 --- a/src/scene_title.cpp +++ b/src/scene_title.cpp @@ -23,6 +23,7 @@ #include "options.h" #include "scene_settings.h" #include "scene_title.h" +#include "scene_language.h" #include "audio.h" #include "audio_secache.h" #include "cache.h" @@ -77,20 +78,8 @@ void Scene_Title::Start() { } CreateCommandWindow(); - CreateTranslationWindow(); - CreateHelpWindow(); } -void Scene_Title::CreateHelpWindow() { - help_window.reset(new Window_Help(0, 0, Player::screen_width, 32)); - - if (Player::IsRPG2k3E() && lcf::Data::battlecommands.transparency == lcf::rpg::BattleCommands::Transparency_transparent) { - help_window->SetBackOpacity(160); - } - - help_window->SetVisible(false); - translate_window->SetHelpWindow(help_window.get()); -} void Scene_Title::Continue(SceneType prev_scene) { Main_Data::game_system->ResetSystemGraphic(); @@ -130,7 +119,7 @@ void Scene_Title::TransitionIn(SceneType prev_scene) { } void Scene_Title::Suspend(Scene::SceneType scene_type) { - if (scene_type == Scene::Settings) { + if (scene_type == Scene::Settings || scene_type == Scene::Translation) { restart_title_cache = true; } @@ -152,31 +141,22 @@ void Scene_Title::vUpdate() { return; } - if (active_window == 0) { - command_window->Update(); - } else { - translate_window->Update(); - } + command_window->Update(); if (Input::IsTriggered(Input::DECISION)) { - if (active_window == 0) { - int index = command_window->GetIndex(); - if (index == indices.new_game) { // New Game - CommandNewGame(); - } else if (index == indices.continue_game) { // Load Game - CommandContinue(); - } else if (index == indices.import) { // Import (multi-part games) - CommandImport(); - } else if (index == indices.settings) { - CommandSettings(); - } else if (index == indices.translate) { // Choose a Translation (Language) - CommandTranslation(); - } else if (index == indices.exit) { // Exit Game - CommandShutdown(); - } - } else if (active_window == 1) { - int index = translate_window->GetIndex(); - ChangeLanguage(lang_dirs.at(index)); + int index = command_window->GetIndex(); + if (index == indices.new_game) { // New Game + CommandNewGame(); + } else if (index == indices.continue_game) { // Load Game + CommandContinue(); + } else if (index == indices.import) { // Import (multi-part games) + CommandImport(); + } else if (index == indices.settings) { + CommandSettings(); + } else if (index == indices.translate) { // Choose a Translation (Language) + CommandTranslation(); + } else if (index == indices.exit) { // Exit Game + CommandShutdown(); } } else if (Input::IsTriggered(Input::SHIFT)) { // For emscripten: Allow accessing the load scene for file upload with Shift @@ -184,12 +164,6 @@ void Scene_Title::vUpdate() { if (index == indices.continue_game) { CommandContinue(); } - } else if (Input::IsTriggered(Input::CANCEL)) { - if (active_window == 1) { - // Switch back - Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Cancel)); - HideTranslationWindow(); - } } } @@ -206,7 +180,6 @@ void Scene_Title::OnTranslationChanged() { Start(); command_window->SetIndex(indices.translate); - HideTranslationWindow(); Scene::OnTranslationChanged(); } @@ -285,46 +258,6 @@ void Scene_Title::CreateCommandWindow() { command_window->SetVisible(true); } -void Scene_Title::CreateTranslationWindow() { - // Build a list of 'Default' and all known languages. - std::vector lang_names; - lang_names.push_back("Default Language"); - lang_dirs.push_back(""); - lang_helps.push_back("Play the game in its original language."); - - // Push menu entries with the display name, but also save the directory location and help text. - for (const Language& lg : Player::translation.GetLanguages()) { - lang_names.push_back(lg.lang_name); - lang_dirs.push_back(lg.lang_dir); - lang_helps.push_back(lg.lang_desc); - } - - // Allow overwriting text of the default language - const Language& def = Player::translation.GetDefaultLanguage(); - if (!def.lang_name.empty()) { - lang_names.front() = def.lang_name; - } - if (!def.lang_desc.empty()) { - lang_helps.front() = def.lang_desc; - } - - translate_window = std::make_unique(lang_names, -1, lang_names.size() > 9 ? 9 : lang_names.size()); - translate_window->UpdateHelpFn = [this](Window_Help& win, int index) { - if (index >= 0 && index < static_cast(lang_helps.size())) { - win.SetText(lang_helps[index]); - } else { - win.SetText(""); - } - }; - RepositionWindow(*translate_window, Player::hide_title_flag); - - if (Player::IsRPG2k3E() && lcf::Data::battlecommands.transparency == lcf::rpg::BattleCommands::Transparency_transparent) { - translate_window->SetBackOpacity(160); - } - - translate_window->SetVisible(false); -} - void Scene_Title::PlayTitleMusic() { // Workaround Android problem: BGM doesn't start when game is started again Main_Data::game_system->BgmStop(); @@ -383,31 +316,7 @@ void Scene_Title::CommandSettings() { void Scene_Title::CommandTranslation() { Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Decision)); - // Switch windows - active_window = 1; - command_window->SetVisible(false); - translate_window->SetVisible(true); - help_window->SetVisible(true); -} - -void Scene_Title::ChangeLanguage(const std::string& lang_str) { - Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Decision)); - - // No-op? - if (lang_str == Player::translation.GetCurrentLanguage().lang_dir) { - HideTranslationWindow(); - return; - } - - // First change the language - Player::translation.SelectLanguage(lang_str); -} - -void Scene_Title::HideTranslationWindow() { - active_window = 0; - command_window->SetVisible(true); - translate_window->SetVisible(false); - help_window->SetVisible(false); + Scene::Push(std::make_unique()); } void Scene_Title::CommandShutdown() { diff --git a/src/scene_title.h b/src/scene_title.h index 1e9b721f57..6204d84f2d 100644 --- a/src/scene_title.h +++ b/src/scene_title.h @@ -54,16 +54,6 @@ class Scene_Title : public Scene { */ void CreateCommandWindow(); - /** - * Creates the Window displaying available translations. - */ - void CreateTranslationWindow(); - - /** - * Creates the Help window and hides it - */ - void CreateHelpWindow(); - /** * Plays the title music. */ @@ -139,39 +129,12 @@ class Scene_Title : public Scene { */ void RepositionWindow(Window_Command& window, bool center_vertical); - /** - * Picks a new language based and switches to it. - * @param lang_str If the empty string, switches the game to 'No Translation'. Otherwise, switch to that translation by name. - */ - void ChangeLanguage(const std::string& lang_str); - - void HideTranslationWindow(); - /** Displays the options of the title scene. */ std::unique_ptr command_window; - /** Displays all available translations (languages). */ - std::unique_ptr translate_window; - - /** Displays help text for a given language **/ - std::unique_ptr help_window; - - /** Contains directory names for each language; entry 0 is resverd for the default (no) translation */ - std::vector lang_dirs; - - /** Contains help strings for each language; entry 0 is resverd for the default (no) translation */ - std::vector lang_helps; - /** Background graphic. */ std::unique_ptr title; - /** - * Current active window - * 0 = command - * 1 = translate - */ - int active_window = 0; - /** * Offsets for each selection, in case "Import" or "Translate" is enabled. * Listed in the order they may appear; exit_index will always be last, From f0ad8b6f0257799a85efa0a133453c791d8ffe0c Mon Sep 17 00:00:00 2001 From: florianessl Date: Sun, 2 Feb 2025 15:07:23 +0100 Subject: [PATCH 02/11] Refactored initial push of "Scene_Title" & made it possible to access the translation Scene first, before the title is boot up --- src/scene.cpp | 21 +++++++++++++++++++++ src/scene.h | 14 ++++++++++++++ src/scene_gamebrowser.cpp | 6 +----- src/scene_language.cpp | 21 +++++++++++++++++---- src/scene_language.h | 1 + src/scene_logo.cpp | 7 ++----- 6 files changed, 56 insertions(+), 14 deletions(-) diff --git a/src/scene.cpp b/src/scene.cpp index cbc6c1d21a..d91aa94ec4 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -29,7 +29,9 @@ #include "game_interpreter.h" #include "game_system.h" #include "main_data.h" +#include "scene_language.h" #include "scene_settings.h" +#include "scene_title.h" #include "game_map.h" #ifndef NDEBUG @@ -265,6 +267,12 @@ void Scene::Push(std::shared_ptr const& new_scene, bool pop_stack_top) { DEBUG_VALIDATE("Push"); } +std::shared_ptr Scene::Peek() { + if (instances.size() == 1) + return nullptr; + return instances[instances.size() - 2]; +} + void Scene::Pop() { old_instances.push_back(instances.back()); instances.pop_back(); @@ -355,6 +363,19 @@ inline void Scene::DebugValidate(const char* caller) { } } +void Scene::PushTitleScene(bool pop_stack_top) { + auto title_scene = Scene::Find(Scene::Title); + if (title_scene) { + return; + } + + if (!Player::startup_language.empty()) { + Player::translation.SelectLanguage(Player::startup_language); + } + + Scene::Push(std::make_shared(), pop_stack_top); +} + bool Scene::ReturnToTitleScene() { if (Scene::instance && Scene::instance->type == Scene::Title) { return false; diff --git a/src/scene.h b/src/scene.h index b2c9458a88..169abb7d86 100644 --- a/src/scene.h +++ b/src/scene.h @@ -161,6 +161,14 @@ class Scene { */ static void Push(std::shared_ptr const& new_scene, bool pop_stack_top = false); + /** + * Finds the the scene previous to the current, top-most one and + * returns it without popping it from the stack. + * + * @return the scene found, or NULL if the current scene is already the top. + */ + static std::shared_ptr Peek(); + /** * Removes the scene that is on the top of the stack. */ @@ -248,6 +256,12 @@ class Scene { /** Decrement delay frames by 1 if we're waiting */ void UpdateDelayFrames(); + /** + * Pushes the title screen onto the stack to boot up the game. + * If there already is a title scene ín the stack, this function exits without doing anything. + */ + static void PushTitleScene(bool pop_stack_top = false); + /** * Pops the stack until the title screen and sets proper delay. * diff --git a/src/scene_gamebrowser.cpp b/src/scene_gamebrowser.cpp index 1e3447d5b4..477fc1fc42 100644 --- a/src/scene_gamebrowser.cpp +++ b/src/scene_gamebrowser.cpp @@ -28,7 +28,6 @@ #include "input.h" #include "player.h" #include "scene_logo.h" -#include "scene_title.h" #include "bitmap.h" #include "audio.h" #include "output.h" @@ -242,8 +241,5 @@ void Scene_GameBrowser::BootGame() { return; } - if (!Player::startup_language.empty()) { - Player::translation.SelectLanguage(Player::startup_language); - } - Scene::Push(std::make_shared()); + Scene::PushTitleScene(); } diff --git a/src/scene_language.cpp b/src/scene_language.cpp index 93ff1c3dea..3b2538357c 100644 --- a/src/scene_language.cpp +++ b/src/scene_language.cpp @@ -15,6 +15,7 @@ * along with EasyRPG Player. If not, see . */ #include "scene_language.h" +#include "scene_logo.h" #include "audio.h" #include "bitmap.h" #include "input.h" @@ -63,7 +64,7 @@ void Scene_Language::CreateTitleGraphic() { void Scene_Language::CreateTranslationWindow() { // Build a list of 'Default' and all known languages. std::vector lang_names; - lang_names.push_back("Default"); + lang_names.push_back("Default Language"); lang_dirs.push_back(""); lang_helps.push_back("Play the game in its original language."); @@ -136,9 +137,12 @@ void Scene_Language::vUpdate() { else if (Input::IsTriggered(Input::CANCEL)) { Main_Data::game_system->SePlay(Main_Data::game_system->GetSystemSE(Main_Data::game_system->SFX_Cancel)); + auto peek_scene = Scene::Peek(); + if (!peek_scene || peek_scene->type == SceneType::Null || peek_scene->type == SceneType::Logo) { + Transition::instance().InitErase(Transition::TransitionFadeOut, this); + } Scene::Pop(); } - } void Scene_Language::OnTitleSpriteReady(FileRequestResult* result) { @@ -160,7 +164,7 @@ void Scene_Language::ChangeLanguage(const std::string& lang_str) { // No-op? if (lang_str == Player::translation.GetCurrentLanguage().lang_dir) { - Scene::Pop(); + PopOrTitle(); return; } @@ -171,7 +175,16 @@ void Scene_Language::ChangeLanguage(const std::string& lang_str) { void Scene_Language::OnTranslationChanged() { Start(); - Scene::Pop(); + PopOrTitle(); Scene::OnTranslationChanged(); } + +void Scene_Language::PopOrTitle() { + auto peek_scene = Scene::Peek(); + if (!peek_scene || peek_scene->type == SceneType::Null || peek_scene->type == SceneType::Logo) { + Scene::Push(std::make_shared(), true); + } else { + Scene::Pop(); + } +} diff --git a/src/scene_language.h b/src/scene_language.h index 68d760eafa..800ac6b400 100644 --- a/src/scene_language.h +++ b/src/scene_language.h @@ -68,6 +68,7 @@ class Scene_Language : public Scene { void CreateTitleGraphic(); void OnTitleSpriteReady(FileRequestResult* result); + void PopOrTitle(); /** Displays all available translations (languages). */ std::unique_ptr translate_window; diff --git a/src/scene_logo.cpp b/src/scene_logo.cpp index e63cc454ca..11f0ef53e3 100644 --- a/src/scene_logo.cpp +++ b/src/scene_logo.cpp @@ -25,7 +25,6 @@ #include "input.h" #include "options.h" #include "player.h" -#include "scene_title.h" #include "scene_gamebrowser.h" #include "scene_settings.h" #include "output.h" @@ -102,10 +101,8 @@ void Scene_Logo::vUpdate() { } } - if (!Player::startup_language.empty()) { - Player::translation.SelectLanguage(Player::startup_language); - } - Scene::Push(std::make_shared(), true); + Scene::PushTitleScene(true); + if (Player::load_game_id > 0) { auto save = FileFinder::Save(); From 630870ea8604fbc76a270c32f9e0650ccbf34f45 Mon Sep 17 00:00:00 2001 From: florianessl Date: Sun, 2 Feb 2025 15:08:16 +0100 Subject: [PATCH 03/11] Game_Interpreter_Map::RequestMainMenuScene: Make it possible to access both the settings & language menu via this command (#2945) --- src/game_interpreter_map.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/game_interpreter_map.cpp b/src/game_interpreter_map.cpp index c0445e9402..49e316bdcd 100644 --- a/src/game_interpreter_map.cpp +++ b/src/game_interpreter_map.cpp @@ -51,6 +51,8 @@ #include "scene_shop.h" #include "scene_debug.h" #include "scene_gameover.h" +#include "scene_settings.h" +#include "scene_language.h" #include "scene.h" #include "graphics.h" #include "input.h" @@ -161,17 +163,14 @@ bool Game_Interpreter_Map::RequestMainMenuScene(int subscreen_id, int actor_inde Scene::instance->SetRequestedScene(std::make_shared()); return true; } - /* case 6: // Settings Scene::instance->SetRequestedScene(std::make_shared()); return true; case 7: // Language - Scene::instance->SetRequestedScene(std::make_shared()); - return true; - case 8: // Debug - Scene::instance->SetRequestedScene(std::make_shared()); + if (Player::translation.HasTranslations()) { + Scene::instance->SetRequestedScene(std::make_shared()); + } return true; - */ } Scene::instance->SetRequestedScene(std::make_shared()); From d066df19100a3b6f1a3a925048958930ec122531 Mon Sep 17 00:00:00 2001 From: florianessl Date: Sun, 2 Feb 2025 16:03:34 +0100 Subject: [PATCH 04/11] Window_Settings: Add 'Language' option & some refactoring --- src/scene_settings.cpp | 50 +++++++++++++++++++++++------------------- src/scene_settings.h | 2 ++ src/window_settings.h | 1 + 3 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/scene_settings.cpp b/src/scene_settings.cpp index bd5563f992..4cb132f7c6 100644 --- a/src/scene_settings.cpp +++ b/src/scene_settings.cpp @@ -29,6 +29,7 @@ #include "baseui.h" #include "output.h" #include "utils.h" +#include "scene_language.h" #include "scene_end.h" #include "window_about.h" #include "window_command_horizontal.h" @@ -60,19 +61,28 @@ void Scene_Settings::CreateTitleGraphic() { } void Scene_Settings::CreateMainWindow() { - std::vector options = { - "Video", - "Audio", - "Input", - "Engine", - "License", - "" - }; + root_options.clear(); + root_options.insert(root_options.end(), { + { Window_Settings::eVideo, "Video" }, + { Window_Settings::eAudio, "Audio" }, + { Window_Settings::eInput, "Input"}, + { Window_Settings::eEngine, "Engine"}, + { Window_Settings::eLicense,"License"}, + { Window_Settings::eSave, ""} + }); + + if (Player::translation.HasTranslations() && Scene::Peek()->type != SceneType::Title && Scene::Peek()->type != SceneType::Translation) { + root_options.insert(root_options.begin() + 3, { Window_Settings::eLanguage, "Language" }); + } if (Scene::Find(Scene::Title)) { - options.push_back(""); + root_options.insert(root_options.end(), { Window_Settings::eEnd, "" }); } + std::vector options; + options.reserve(root_options.size()); + std::for_each(root_options.begin(), root_options.end(), [&](std::pair v) { options.emplace_back(v.second); }); + main_window = std::make_unique(std::move(options)); main_window->SetHeight(176); main_window->SetY((Player::screen_height - main_window->GetHeight()) / 2); @@ -302,15 +312,6 @@ void Scene_Settings::OnTitleSpriteReady(FileRequestResult* result) { } void Scene_Settings::UpdateMain() { - const auto modes = Utils::MakeArray( - Window_Settings::eVideo, - Window_Settings::eAudio, - Window_Settings::eInput, - Window_Settings::eEngine, - Window_Settings::eLicense, - Window_Settings::eSave, - Window_Settings::eEnd - ); if (Input::IsTriggered(Input::DECISION)) { auto idx = main_window->GetIndex(); @@ -322,10 +323,15 @@ void Scene_Settings::UpdateMain() { return; } - if (modes[idx] == Window_Settings::eSave) { + auto mode = root_options[idx].first; + + if (mode == Window_Settings::eLanguage) { + Scene::Push(std::make_shared()); + return; + } if (mode == Window_Settings::eSave) { SaveConfig(); return; - } else if (modes[idx] == Window_Settings::eEnd) { + } else if (mode == Window_Settings::eEnd) { if (Scene::Find(Scene::GameBrowser)) { Scene::Push(std::make_unique(Scene::GameBrowser)); } else { @@ -334,8 +340,8 @@ void Scene_Settings::UpdateMain() { return; } - SetMode(modes[idx]); - options_window->Push(modes[idx]); + SetMode(mode); + options_window->Push(mode); } } diff --git a/src/scene_settings.h b/src/scene_settings.h index 6919f6cc96..d62b488daa 100644 --- a/src/scene_settings.h +++ b/src/scene_settings.h @@ -90,6 +90,8 @@ class Scene_Settings : public Scene { int input_reset_counter = 0; Window_Settings::UiMode mode = Window_Settings::eNone; + + std::vector> root_options; }; diff --git a/src/window_settings.h b/src/window_settings.h index 26fb1988e1..21d2d3a420 100644 --- a/src/window_settings.h +++ b/src/window_settings.h @@ -51,6 +51,7 @@ class Window_Settings : public Window_Selectable { eSave, eEnd, eAbout, + eLanguage, eLastMode }; From 85ff108b44958e09b4c1fde4c9dc58d7edcfb653 Mon Sep 17 00:00:00 2001 From: florianessl Date: Sun, 2 Feb 2025 16:25:48 +0100 Subject: [PATCH 05/11] Config: Add configuration options for displaying language scene on the title or prior to booting up the title (Community Thread No. 1277, #2945) --- src/game_config.cpp | 4 ++++ src/game_config.h | 14 ++++++++++++++ src/scene.cpp | 7 +++++++ src/scene_title.cpp | 2 +- src/window_settings.cpp | 4 ++-- 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/game_config.cpp b/src/game_config.cpp index 82bd6d8f92..1f70ff7213 100644 --- a/src/game_config.cpp +++ b/src/game_config.cpp @@ -525,6 +525,8 @@ void Game_Config::LoadFromStream(Filesystem_Stream::InputStream& is) { player.font1_size.FromIni(ini); player.font2.FromIni(ini); player.font2_size.FromIni(ini); + player.lang_select_on_start.FromIni(ini); + player.lang_select_in_title.FromIni(ini); } void Game_Config::WriteToStream(Filesystem_Stream::OutputStream& os) const { @@ -610,6 +612,8 @@ void Game_Config::WriteToStream(Filesystem_Stream::OutputStream& os) const { player.font1_size.ToIni(os); player.font2.ToIni(os); player.font2_size.ToIni(os); + player.lang_select_on_start.ToIni(os); + player.lang_select_in_title.ToIni(os); os << "\n"; } diff --git a/src/game_config.h b/src/game_config.h index 770bed5311..7a5aa0615a 100644 --- a/src/game_config.h +++ b/src/game_config.h @@ -58,6 +58,14 @@ namespace ConfigEnum { All }; + enum class StartupLangSelect { + Never, + /* Shows language screen when no saves are found */ + FirstStartup, + /* Always show the language screen before the title */ + Always + }; + enum class ShowFps { /** Do not show */ OFF, @@ -89,6 +97,12 @@ struct Game_ConfigPlayer { RangeConfigParam font1_size { "Font 1 Size", "", "Player", "Font1Size", 12, 6, 16}; PathConfigParam font2 { "Font 2", "The game chooses whether it wants font 1 or 2", "Player", "Font2", "" }; RangeConfigParam font2_size { "Font 2 Size", "", "Player", "Font2Size", 12, 6, 16}; + EnumConfigParam lang_select_on_start{ + "Startup Language Select", "Show the language select before starting the game", "Player", "StartupLangSelect", ConfigEnum::StartupLangSelect::FirstStartup , + Utils::MakeSvArray("Never", "FirstStartup", "Always"), + Utils::MakeSvArray("never", "firststartup", "always"), + Utils::MakeSvArray("Never show language menu on start", "Show language menu on first start (when no save files are found)", "Always show the language menu prior to the title screen") }; + BoolConfigParam lang_select_in_title{ "Show language menu on title screen", "Display language menu item on the title screen", "Player", "LanguageInTitle", true }; void Hide(); }; diff --git a/src/scene.cpp b/src/scene.cpp index d91aa94ec4..b5ea8ce4f3 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -24,6 +24,7 @@ #include "player.h" #include "output.h" #include "audio.h" +#include "filefinder.h" #include "transition.h" #include "game_actors.h" #include "game_interpreter.h" @@ -371,6 +372,12 @@ void Scene::PushTitleScene(bool pop_stack_top) { if (!Player::startup_language.empty()) { Player::translation.SelectLanguage(Player::startup_language); + } else if (Player::translation.HasTranslations()) { + if (Player::player_config.lang_select_on_start.Get() == ConfigEnum::StartupLangSelect::Always + || (!FileFinder::HasSavegame() && Player::player_config.lang_select_on_start.Get() == ConfigEnum::StartupLangSelect::FirstStartup)) { + Scene::Push(std::make_shared(), pop_stack_top); + return; + } } Scene::Push(std::make_shared(), pop_stack_top); diff --git a/src/scene_title.cpp b/src/scene_title.cpp index e2a7156c5c..43bb9b671d 100644 --- a/src/scene_title.cpp +++ b/src/scene_title.cpp @@ -233,7 +233,7 @@ void Scene_Title::CreateCommandWindow() { } // Set "Translate" based on metadata - if (Player::translation.HasTranslations()) { + if (Player::translation.HasTranslations() && Player::player_config.lang_select_in_title.Get()) { options.push_back(Player::meta->GetExVocabTranslateTitleText()); indices.translate = indices.exit; indices.exit++; diff --git a/src/window_settings.cpp b/src/window_settings.cpp index 82e20ee4ae..9a391e2203 100644 --- a/src/window_settings.cpp +++ b/src/window_settings.cpp @@ -425,8 +425,8 @@ void Window_Settings::RefreshEngine() { AddOption(cfg.show_startup_logos, [this, &cfg](){ cfg.show_startup_logos.Set(static_cast(GetCurrentOption().current_value)); }); AddOption(cfg.settings_autosave, [&cfg](){ cfg.settings_autosave.Toggle(); }); - AddOption(cfg.settings_in_title, [&cfg](){ cfg.settings_in_title.Toggle(); }); - AddOption(cfg.settings_in_menu, [&cfg](){ cfg.settings_in_menu.Toggle(); }); + AddOption(cfg.settings_in_title, [&cfg]() { cfg.settings_in_title.Toggle(); }); + AddOption(cfg.settings_in_menu, [&cfg]() { cfg.settings_in_menu.Toggle(); }); } void Window_Settings::RefreshEngineFont(bool mincho) { From 18e4d2f6f8d613c1fe121b64a12a5a2046006d87 Mon Sep 17 00:00:00 2001 From: florianessl Date: Mon, 3 Feb 2025 17:24:53 +0100 Subject: [PATCH 06/11] Fix: Both "Settings" & "Translation" Scene types were missing from scene_names array, Rename SceneType::Translation to SceneType::LanguageMenu --- src/scene.cpp | 5 ++++- src/scene.h | 2 +- src/scene_language.cpp | 2 +- src/scene_map.cpp | 2 +- src/scene_settings.cpp | 2 +- src/scene_title.cpp | 2 +- 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/scene.cpp b/src/scene.cpp index b5ea8ce4f3..bc95a3d3f4 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -67,7 +67,9 @@ const char Scene::scene_names[SceneMax][12] = "Logo", "Order", "GameBrowser", - "Teleport" + "Teleport", + "Settings", + "Language" }; enum PushPopOperation { @@ -98,6 +100,7 @@ lcf::rpg::SaveSystem::Scene Scene::rpgRtSceneFromSceneType(SceneType t) { case Order: case End: case Settings: + case LanguageMenu: return lcf::rpg::SaveSystem::Scene_menu; case File: case Save: diff --git a/src/scene.h b/src/scene.h index 169abb7d86..7806b12f71 100644 --- a/src/scene.h +++ b/src/scene.h @@ -59,7 +59,7 @@ class Scene { GameBrowser, Teleport, Settings, - Translation, + LanguageMenu, SceneMax }; diff --git a/src/scene_language.cpp b/src/scene_language.cpp index 3b2538357c..c57eb42d0c 100644 --- a/src/scene_language.cpp +++ b/src/scene_language.cpp @@ -45,7 +45,7 @@ #endif Scene_Language::Scene_Language() { - Scene::type = Scene::Translation; + Scene::type = Scene::LanguageMenu; } void Scene_Language::CreateTitleGraphic() { diff --git a/src/scene_map.cpp b/src/scene_map.cpp index a91a69f7c4..9c9037af8c 100644 --- a/src/scene_map.cpp +++ b/src/scene_map.cpp @@ -184,7 +184,7 @@ void Scene_Map::TransitionOut(SceneType next_scene) { if (next_scene != Scene::Battle && next_scene != Scene::Debug && next_scene != Scene::Settings - && next_scene != Scene::Translation) { + && next_scene != Scene::LanguageMenu) { screen_erased_by_event = false; } diff --git a/src/scene_settings.cpp b/src/scene_settings.cpp index 4cb132f7c6..ecd73dbb1b 100644 --- a/src/scene_settings.cpp +++ b/src/scene_settings.cpp @@ -71,7 +71,7 @@ void Scene_Settings::CreateMainWindow() { { Window_Settings::eSave, ""} }); - if (Player::translation.HasTranslations() && Scene::Peek()->type != SceneType::Title && Scene::Peek()->type != SceneType::Translation) { + if (Player::translation.HasTranslations() && Scene::Peek()->type != Scene::Title && Scene::Peek()->type != Scene::LanguageMenu) { root_options.insert(root_options.begin() + 3, { Window_Settings::eLanguage, "Language" }); } diff --git a/src/scene_title.cpp b/src/scene_title.cpp index 43bb9b671d..d43c8d9835 100644 --- a/src/scene_title.cpp +++ b/src/scene_title.cpp @@ -119,7 +119,7 @@ void Scene_Title::TransitionIn(SceneType prev_scene) { } void Scene_Title::Suspend(Scene::SceneType scene_type) { - if (scene_type == Scene::Settings || scene_type == Scene::Translation) { + if (scene_type == Scene::Settings || scene_type == Scene::LanguageMenu) { restart_title_cache = true; } From 8e09ff48e65b52bbe9086cd15b8962afa03dd087 Mon Sep 17 00:00:00 2001 From: florianessl Date: Mon, 3 Feb 2025 18:14:08 +0100 Subject: [PATCH 07/11] Translation: Implemented a new config option to be able to translate the game's title (#3097) --- src/player.cpp | 34 ++++++++++++++++++++++++---------- src/player.h | 8 ++++++++ src/scene_gamebrowser.cpp | 1 + src/translation.cpp | 8 ++++++++ src/translation.h | 1 + 5 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/player.cpp b/src/player.cpp index eedb575968..4902b1357e 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -122,6 +122,7 @@ namespace Player { std::string escape_symbol; uint32_t escape_char; std::string game_title; + std::string game_title_original; std::shared_ptr meta; FileExtGuesser::RPG2KFileExtRemap fileext_map; std::string startup_language; @@ -737,16 +738,7 @@ void Player::CreateGameObjects() { } } - std::stringstream title; - if (!game_title.empty()) { - Output::Debug("Loading game {}", game_title); - title << game_title << " - "; - Input::AddRecordingData(Input::RecordingData::GameTitle, game_title); - } else { - Output::Debug("Could not read game title."); - } - title << GAME_TITLE; - DisplayUi->SetTitle(title.str()); + UpdateTitle(game_title); if (no_rtp_warning_flag) { Output::Debug("Game does not need RTP (FullPackageFlag=1)"); @@ -852,6 +844,28 @@ void Player::CreateGameObjects() { } } +void Player::UpdateTitle(std::string new_game_title) { + if (!game_title.empty() && game_title != new_game_title) { + if (game_title_original == new_game_title) { + game_title_original = ""; + } else { + game_title_original = game_title; + } + game_title = new_game_title; + } + + std::stringstream title; + if (!game_title.empty()) { + Output::Debug("Loading game {}", game_title); + title << new_game_title << " - "; + Input::AddRecordingData(Input::RecordingData::GameTitle, game_title); + } else { + Output::Debug("Could not read game title."); + } + title << GAME_TITLE; + DisplayUi->SetTitle(title.str()); +} + bool Player::ChangeResolution(int width, int height) { if (!DisplayUi->ChangeDisplaySurfaceResolution(width, height)) { Output::Warning("Resolution change to {}x{} failed", width, height); diff --git a/src/player.h b/src/player.h index c8ab392c65..13575c7738 100644 --- a/src/player.h +++ b/src/player.h @@ -302,6 +302,11 @@ namespace Player { */ bool HasEasyRpgExtensions(); + /** + * Update the game title displayed in the Player's UI + */ + void UpdateTitle(std::string new_game_title); + /** * @return Running engine version. 2000 for RPG2k and 2003 for RPG2k3 */ @@ -395,6 +400,9 @@ namespace Player { /** Game title. */ extern std::string game_title; + /** Original game title, in case it was overriden by a translation. */ + extern std::string game_title_original; + /** Meta class containing additional external data for this game. */ extern std::shared_ptr meta; diff --git a/src/scene_gamebrowser.cpp b/src/scene_gamebrowser.cpp index 477fc1fc42..0299565395 100644 --- a/src/scene_gamebrowser.cpp +++ b/src/scene_gamebrowser.cpp @@ -58,6 +58,7 @@ void Scene_GameBrowser::Continue(SceneType /* prev_scene */) { Player::RestoreBaseResolution(); Player::game_title = ""; + Player::game_title_original = ""; Font::ResetDefault(); diff --git a/src/translation.cpp b/src/translation.cpp index 2c101b6f55..cd47f1a035 100644 --- a/src/translation.cpp +++ b/src/translation.cpp @@ -26,6 +26,7 @@ #include #include "lcf/rpg/mapinfo.h" +#include "baseui.h" #include "cache.h" #include "font.h" #include "main_data.h" @@ -116,6 +117,7 @@ void Translation::InitTranslations() item.lang_desc = ini.GetString("Language", "Description", ""); item.lang_code = ini.GetString("Language", "Code", ""); item.lang_term = ini.GetString("Language", "Term", "Language"); + item.game_title = ini.GetString("Language", "GameTitle", ""); item.use_builtin_font = Utils::LowerCase(ini.GetString("Language", "Font", "")) == "builtin"; if (item.lang_dir == "default") { @@ -222,6 +224,12 @@ void Translation::SelectLanguageAsync(FileRequestResult*, StringView lang_id) { RewriteCommonEventMessages(); } + if (!current_language.game_title.empty()) { + Player::UpdateTitle(current_language.game_title); + } else if (!Player::game_title_original.empty()) { + Player::UpdateTitle(Player::game_title_original); + } + // Reset the cache, so that all images load fresh. Cache::Clear(); diff --git a/src/translation.h b/src/translation.h index 70b88ba9d1..30ecaf6faa 100644 --- a/src/translation.h +++ b/src/translation.h @@ -151,6 +151,7 @@ struct Language { std::string lang_desc; // Helper text to show when the menu is highlighted std::string lang_code; // Language code used by font selection and input scene std::string lang_term; // Term to use for "Language" + std::string game_title; // Translated game title bool use_builtin_font = false; }; From 3350c4cfa3c801b61680be2e3bf69db2b99effc3 Mon Sep 17 00:00:00 2001 From: florianessl Date: Mon, 3 Feb 2025 18:39:04 +0100 Subject: [PATCH 08/11] Fix: Don't force the Player to exit when the Language is not found on "SelectLanguage" (#3213) --- src/translation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/translation.cpp b/src/translation.cpp index cd47f1a035..68968817c8 100644 --- a/src/translation.cpp +++ b/src/translation.cpp @@ -168,7 +168,7 @@ void Translation::SelectLanguage(StringView lang_id) if (!lang_id.empty()) { auto root = GetRootTree(); if (!root) { - Output::Error("Cannot load translation. 'Language' folder does not exist"); + Output::Warning("Cannot load translation. 'Language' folder does not exist"); return; } From 9579934186d42d2c802277aff4c359aae2bd69f9 Mon Sep 17 00:00:00 2001 From: florianessl Date: Thu, 13 Feb 2025 18:35:51 +0100 Subject: [PATCH 09/11] Scene_Language fix: remove dependency on async call to "OnTranslationChanged" --- src/scene_language.cpp | 6 ------ src/scene_language.h | 2 -- 2 files changed, 8 deletions(-) diff --git a/src/scene_language.cpp b/src/scene_language.cpp index c57eb42d0c..aef395a854 100644 --- a/src/scene_language.cpp +++ b/src/scene_language.cpp @@ -170,14 +170,8 @@ void Scene_Language::ChangeLanguage(const std::string& lang_str) { // First change the language Player::translation.SelectLanguage(lang_str); -} - -void Scene_Language::OnTranslationChanged() { - Start(); PopOrTitle(); - - Scene::OnTranslationChanged(); } void Scene_Language::PopOrTitle() { diff --git a/src/scene_language.h b/src/scene_language.h index 800ac6b400..fd53e4b124 100644 --- a/src/scene_language.h +++ b/src/scene_language.h @@ -45,8 +45,6 @@ class Scene_Language : public Scene { void Start() override; void vUpdate() override; - void OnTranslationChanged() override; - private: /** From fb6163393a635d16dc72f5abf97c8551c7dc0e11 Mon Sep 17 00:00:00 2001 From: florianessl Date: Thu, 13 Feb 2025 18:37:26 +0100 Subject: [PATCH 10/11] Config: Added the two new language-related settings to Window_Settings & redid the description strings --- src/game_config.h | 10 +++++----- src/window_settings.cpp | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/game_config.h b/src/game_config.h index 7a5aa0615a..1d7a3f91e6 100644 --- a/src/game_config.h +++ b/src/game_config.h @@ -97,11 +97,11 @@ struct Game_ConfigPlayer { RangeConfigParam font1_size { "Font 1 Size", "", "Player", "Font1Size", 12, 6, 16}; PathConfigParam font2 { "Font 2", "The game chooses whether it wants font 1 or 2", "Player", "Font2", "" }; RangeConfigParam font2_size { "Font 2 Size", "", "Player", "Font2Size", 12, 6, 16}; - EnumConfigParam lang_select_on_start{ - "Startup Language Select", "Show the language select before starting the game", "Player", "StartupLangSelect", ConfigEnum::StartupLangSelect::FirstStartup , - Utils::MakeSvArray("Never", "FirstStartup", "Always"), - Utils::MakeSvArray("never", "firststartup", "always"), - Utils::MakeSvArray("Never show language menu on start", "Show language menu on first start (when no save files are found)", "Always show the language menu prior to the title screen") }; + EnumConfigParam lang_select_on_start { + "Startup Language Menu", "Show language menu before booting up a game", "Player", "StartupLangSelect", ConfigEnum::StartupLangSelect::FirstStartup, + Utils::MakeSvArray("Never", "First Start", "Always"), + Utils::MakeSvArray("never", "FirstStartup", "always"), + Utils::MakeSvArray("Never show language menu on start", "Show on first start (when no save files are found)", "Always show language menu prior to the title screen") }; BoolConfigParam lang_select_in_title{ "Show language menu on title screen", "Display language menu item on the title screen", "Player", "LanguageInTitle", true }; void Hide(); diff --git a/src/window_settings.cpp b/src/window_settings.cpp index 9a391e2203..464c873c61 100644 --- a/src/window_settings.cpp +++ b/src/window_settings.cpp @@ -427,6 +427,8 @@ void Window_Settings::RefreshEngine() { AddOption(cfg.settings_autosave, [&cfg](){ cfg.settings_autosave.Toggle(); }); AddOption(cfg.settings_in_title, [&cfg]() { cfg.settings_in_title.Toggle(); }); AddOption(cfg.settings_in_menu, [&cfg]() { cfg.settings_in_menu.Toggle(); }); + AddOption(cfg.lang_select_on_start, [this, &cfg]() { cfg.lang_select_on_start.Set(static_cast(GetCurrentOption().current_value)); }); + AddOption(cfg.lang_select_in_title, [&cfg](){ cfg.lang_select_in_title.Toggle(); }); } void Window_Settings::RefreshEngineFont(bool mincho) { From 413c9bdfe6a4fb3d92a89ef07f0263bd1f422f25 Mon Sep 17 00:00:00 2001 From: florianessl Date: Sat, 15 Feb 2025 13:04:48 +0100 Subject: [PATCH 11/11] Scene_Language: Revert back to default behavior for "RepositionWindow" --- src/scene_language.cpp | 3 +-- src/scene_title.h | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/scene_language.cpp b/src/scene_language.cpp index aef395a854..edbfcfb398 100644 --- a/src/scene_language.cpp +++ b/src/scene_language.cpp @@ -93,8 +93,7 @@ void Scene_Language::CreateTranslationWindow() { win.SetText(""); } }; - translate_window->SetX(Player::screen_width / 2 - translate_window->GetWidth() / 2); - translate_window->SetY(Player::screen_height / 2 - translate_window->GetHeight() / 2); + Scene_Title::RepositionWindow(*translate_window, Player::hide_title_flag); if (Player::IsRPG2k3E() && lcf::Data::battlecommands.transparency == lcf::rpg::BattleCommands::Transparency_transparent) { translate_window->SetBackOpacity(160); diff --git a/src/scene_title.h b/src/scene_title.h index 6204d84f2d..3d77ca9253 100644 --- a/src/scene_title.h +++ b/src/scene_title.h @@ -119,15 +119,15 @@ class Scene_Title : public Scene { */ void OnGameStart(); -private: - void OnTitleSpriteReady(FileRequestResult* result); - /** * Moves a window (typically the New/Continue/Quit menu) to the middle or bottom-center of the screen. * @param window The window to resposition. * @param center_vertical If true, the menu will be centered vertically. Otherwise, it will be at the bottom of the screen. */ - void RepositionWindow(Window_Command& window, bool center_vertical); + static void RepositionWindow(Window_Command& window, bool center_vertical); + +private: + void OnTitleSpriteReady(FileRequestResult* result); /** Displays the options of the title scene. */ std::unique_ptr command_window;