diff --git a/src/game_interpreter.cpp b/src/game_interpreter.cpp index 1779e5c7d6..5166370616 100644 --- a/src/game_interpreter.cpp +++ b/src/game_interpreter.cpp @@ -785,7 +785,7 @@ bool Game_Interpreter::ExecuteCommand(lcf::rpg::EventCommand const& com) { return CommandManiacControlStrings(com); case Cmd::Maniac_CallCommand: return CommandManiacCallCommand(com); - case Cmd::EasyRpg_SetInterpreterFlag: //Cmd::EasyRpg_SetInterpreterFlag + case Cmd::EasyRpg_SetInterpreterFlag: return CommandEasyRpgSetInterpreterFlag(com); default: return true; diff --git a/src/game_interpreter_map.cpp b/src/game_interpreter_map.cpp index 8cdaa8cdc0..37269f0b66 100644 --- a/src/game_interpreter_map.cpp +++ b/src/game_interpreter_map.cpp @@ -49,6 +49,7 @@ #include "scene_load.h" #include "scene_name.h" #include "scene_shop.h" +#include "scene_debug.h" #include "scene_gameover.h" #include "scene.h" #include "graphics.h" @@ -716,7 +717,7 @@ bool Game_Interpreter_Map::CommandPlayMovie(lcf::rpg::EventCommand const& com) { return true; } -bool Game_Interpreter_Map::CommandOpenSaveMenu(lcf::rpg::EventCommand const& /* com */) { // code 11910 +bool Game_Interpreter_Map::CommandOpenSaveMenu(lcf::rpg::EventCommand const& com) { // code 11910 if (Game_Message::IsMessageActive()) { return false; } @@ -725,8 +726,53 @@ bool Game_Interpreter_Map::CommandOpenSaveMenu(lcf::rpg::EventCommand const& /* auto& index = frame.current_command; Scene::instance->SetRequestedScene(std::make_shared()); - ++index; - return false; + + const int current_system_function = com.parameters[0]; + + // Handle save menu (default behavior) + if (!Player::IsPatchManiac() || current_system_function <= 0) { + Scene::instance->SetRequestedScene(std::make_shared()); + ++index; + return false; + } + + // Command "Call System Functions" + switch (current_system_function) { + case 1: // Load menu + return CommandOpenLoadMenu(com); + case 2: // Game menu + return CommandOpenMainMenu(com); + case 3: // Toggle fullscreen + // TODO Implement fullscreen mode once maniacs supports it + // const int fullscreen_mode = com.parameters[1]; // Broken in Maniac. + return CommandToggleFullscreen(com); + case 4: // Settings menu + return CommandOpenVideoOptions(com); + case 5: // Debug menu + // const int pause_while_debugging = com.parameters[1]; // unused in our ingame debug screen. + Scene::instance->SetRequestedScene(std::make_shared()); + ++index; + return false; + case 6: // License information menu + // TODO Implement license information menu + return true; + case 7: // Reset game + return CommandReturnToTitleScreen(com); + default: + if (Player::HasEasyRpgExtensions() && current_system_function >= 200 && current_system_function < 210) { + const int actor_index = ValueOrVariable(com.parameters[1], com.parameters[2]); + const bool is_db_actor = ValueOrVariable(com.parameters[3], com.parameters[4]); + + if (RequestMainMenuScene(current_system_function - 200, actor_index, is_db_actor)) { + ++index; + return false; + } + } else { + Output::Warning("CommandOpenSaveMenu: Unsupported scene {}", current_system_function); + } + } + + return true; } bool Game_Interpreter_Map::CommandOpenMainMenu(lcf::rpg::EventCommand const&) { // code 11950 diff --git a/src/platform/switch/ui.cpp b/src/platform/switch/ui.cpp index 1ef3f28bd0..957dba60d8 100644 --- a/src/platform/switch/ui.cpp +++ b/src/platform/switch/ui.cpp @@ -439,7 +439,7 @@ bool NxUi::ProcessEvents() { // do not handle touch when not displaying buttons or no touch happened if (is_docked || vcfg.touch_ui.IsLocked() || !vcfg.touch_ui.Get() || !hidGetTouchScreenStates(&touch, 1)) - return; + return true; for (int32_t i = 0; i < touch.count; ++i) { if (touch.touches[i].x < 160) {