fix(servicemenu): el menu flota i no pausa la demo ni congela el contador del títol

This commit is contained in:
2026-05-30 09:44:28 +02:00
parent fc8233ef57
commit dd91b07a14
3 changed files with 29 additions and 14 deletions
+16 -8
View File
@@ -269,10 +269,16 @@ void GameScene::handleEvent(const SDL_Event& event) {
}
void GameScene::update(float delta_time) {
// Pausa global: mentre el menu de servei esta obert, congelem la lògica
// de joc. El draw() segueix executant-se per a mantenir l'escena visible
// sota el menu.
if (const auto* menu = System::ServiceMenu::get(); menu != nullptr && menu->isOpen()) {
// El menu de servei "flota" sobre l'escena: l'input se'n va cap a ell, mai
// "a baix". En partida normal pausem la lògica de joc mentre està obert (el
// draw() segueix executant-se per a mantindre l'escena visible sota el menu).
// En DEMO (attract) NO pausem: la demo ha de seguir viva sota el menu; només
// evitem que l'input la trenque (flag MENU_OPEN cap a stepDemo). Amb l'overlay
// de redefinir controls actiu el menu segueix "open", així que aquest únic
// check ja cobreix tots dos casos.
const auto* menu = System::ServiceMenu::get();
const bool MENU_OPEN = (menu != nullptr) && menu->isOpen();
if (MENU_OPEN && match_config_.mode != GameConfig::Mode::DEMO) {
return;
}
@@ -282,7 +288,7 @@ void GameScene::update(float delta_time) {
if (match_config_.mode == GameConfig::Mode::DEMO) {
// Mode demo (attract): salida por input/timeout/muerte + control del pilot.
if (stepDemo(delta_time)) {
if (stepDemo(delta_time, MENU_OPEN)) {
return;
}
} else if (game_over_state_ == GameOverState::NONE) {
@@ -376,11 +382,13 @@ void GameScene::updateShipsControl(float delta_time) {
}
}
auto GameScene::stepDemo(float delta_time) -> bool {
auto GameScene::stepDemo(float delta_time, bool input_blocked) -> bool {
curtain_.update(delta_time); // cortinilla que destapa la demo
// Qualsevol input trenca la demo i torna al títol (música intacta).
if (Input::get()->checkAnyPlayerAction(DEMO_EXIT_ACTIONS)) {
// Qualsevol input trenca la demo i torna al títol (música intacta), pero NO
// mentre el menu de servei estiga obert: en eixe cas l'input va al menu i no
// arriba "a baix", així que la demo ha de seguir corrent sota seu.
if (!input_blocked && Input::get()->checkAnyPlayerAction(DEMO_EXIT_ACTIONS)) {
context_.setNextScene(SceneType::TITLE, Option::JUMP_TO_TITLE_MAIN);
return true;
}