diff --git a/source/core/system/service_menu.cpp b/source/core/system/service_menu.cpp index 2dc6f25..45c63f8 100644 --- a/source/core/system/service_menu.cpp +++ b/source/core/system/service_menu.cpp @@ -523,16 +523,16 @@ namespace System { }; } - auto makeDefineItem(const char* label_key, DefineInputs::Mode mode, DefineInputs::Player pl, ServiceMenu* menu) -> ServiceMenu::Item { + auto makeDefineItem(const char* label_key, DefineInputs::Mode mode, DefineInputs::Player pl) -> ServiceMenu::Item { return ServiceMenu::Item{ .kind = ServiceMenu::Kind::ACTION, .label_key = label_key, .label_text = {}, .selectable = true, - .on_activate = [mode, pl, menu] { - if (startDefine(mode, pl) && menu != nullptr && menu->isOpen()) { - menu->toggle(); - } }, + // El menu de servei NO es tanca: queda obert per sota de + // l'overlay i absorbira qualsevol event que arribi un cop + // l'overlay s'haja auto-cancel·lat. + .on_activate = [mode, pl] { startDefine(mode, pl); }, .get_value_text = {}, .on_change = {}, }; @@ -548,20 +548,16 @@ namespace System { makeCyclePadItem("service_menu.controls_pad_p2", 1), makeDefineItem("service_menu.controls_define_keyboard_p1", DefineInputs::Mode::KEYBOARD, - DefineInputs::Player::P1, - this), + DefineInputs::Player::P1), makeDefineItem("service_menu.controls_define_keyboard_p2", DefineInputs::Mode::KEYBOARD, - DefineInputs::Player::P2, - this), + DefineInputs::Player::P2), makeDefineItem("service_menu.controls_define_gamepad_p1", DefineInputs::Mode::GAMEPAD, - DefineInputs::Player::P1, - this), + DefineInputs::Player::P1), makeDefineItem("service_menu.controls_define_gamepad_p2", DefineInputs::Mode::GAMEPAD, - DefineInputs::Player::P2, - this), + DefineInputs::Player::P2), }; return page; } diff --git a/source/core/system/service_menu.hpp b/source/core/system/service_menu.hpp index c1c9fe9..0fa1538 100644 --- a/source/core/system/service_menu.hpp +++ b/source/core/system/service_menu.hpp @@ -98,7 +98,7 @@ namespace System { [[nodiscard]] static auto buildAudioPage() -> Page; [[nodiscard]] auto buildOptionsPage() const -> Page; [[nodiscard]] auto buildSystemPage() -> Page; - [[nodiscard]] auto buildControlsPage() -> Page; + [[nodiscard]] static auto buildControlsPage() -> Page; // Pagina de confirmacio "ESTAS SEGUR? NO/SI". on_yes s'executa si // l'usuari selecciona SI; el cursor per defecte apunta a NO. void pushConfirmPage(const std::string& title_key, std::function on_yes); diff --git a/source/game/scenes/title_scene.cpp b/source/game/scenes/title_scene.cpp index 6e57169..238c1bf 100644 --- a/source/game/scenes/title_scene.cpp +++ b/source/game/scenes/title_scene.cpp @@ -18,6 +18,7 @@ #include "core/math/easing.hpp" #include "core/rendering/shape_renderer.hpp" #include "core/system/scene_context.hpp" +#include "core/system/service_menu.hpp" #include "project.h" using SceneManager::SceneContext; @@ -294,6 +295,13 @@ auto TitleScene::isFinished() const -> bool { } void TitleScene::update(float delta_time) { + // Pausa global: mentre el menu de servei esta obert (i, per tant, el + // sub-overlay de rebind tambe, si esta actiu), congelem la logica de la + // pantalla de titol per no consumir un START fantasma quan l'overlay + // s'auto-tanca i les tecles encara s'estan pulsant. + if (const auto* menu = System::ServiceMenu::get(); menu != nullptr && menu->isOpen()) { + return; + } if (starfield_) { starfield_->update(delta_time); }