From e25ccd02fd40abc763028c323d7a3041fb6ebbc9 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 8 May 2026 13:29:04 +0200 Subject: [PATCH] =?UTF-8?q?feat(menu):=20submen=C3=BA=20"Jugabilitat"=20al?= =?UTF-8?q?=20men=C3=BA=20de=20servei=20amb=20tres=20toggles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nou apartat al ServiceMenu (entre Controls i Sistema) amb tres toggles ON/OFF connectats a GameplayConfig: látec travessa sarcs, foc amic, col·lisió entre jugadors. Cada canvi crida save() immediatament, així l'estat persisteix entre sessions sense necessitat de "aplicar". Locales ca/en: claus `tweaks` + tres `menu.items.*` corresponents. --- data/locale/ca.yaml | 5 +++++ data/locale/en.yaml | 5 +++++ source/game/ui/service_menu.cpp | 39 +++++++++++++++++++++++++++++++++ source/game/ui/service_menu.hpp | 1 + 4 files changed, 50 insertions(+) diff --git a/data/locale/ca.yaml b/data/locale/ca.yaml index d7965ae..ca17f35 100644 --- a/data/locale/ca.yaml +++ b/data/locale/ca.yaml @@ -62,6 +62,7 @@ menu: controls: "Controls" keyboard: "Teclat" gamepad: "Comandament" + tweaks: "Jugabilitat" system: "Sistema" labels: player_1: "Jugador 1" @@ -73,6 +74,7 @@ menu: controls_submenu: "Controls" keyboard_submenu: "Teclat" gamepad_submenu: "Comandament" + tweaks_submenu: "Jugabilitat" system_submenu: "Sistema" move_up: "Amunt" move_down: "Avall" @@ -101,6 +103,9 @@ menu: music_volume: "Volum música" sounds: "Sons" sounds_volume: "Volum sons" + whip_pierces_walls: "Látec travessa sarcs" + friendly_fire: "Foc amic" + players_collide: "Col·lisió entre jugadors" restart: "Reiniciar" exit_game: "Eixir del joc" values: diff --git a/data/locale/en.yaml b/data/locale/en.yaml index f2af055..32fc53a 100644 --- a/data/locale/en.yaml +++ b/data/locale/en.yaml @@ -61,6 +61,7 @@ menu: controls: "Controls" keyboard: "Keyboard" gamepad: "Gamepad" + tweaks: "Gameplay" system: "System" labels: player_1: "Player 1" @@ -72,6 +73,7 @@ menu: controls_submenu: "Controls" keyboard_submenu: "Keyboard" gamepad_submenu: "Gamepad" + tweaks_submenu: "Gameplay" system_submenu: "System" move_up: "Up" move_down: "Down" @@ -100,6 +102,9 @@ menu: music_volume: "Music volume" sounds: "Sounds" sounds_volume: "Sound volume" + whip_pierces_walls: "Whip pierces sarcs" + friendly_fire: "Friendly fire" + players_collide: "Player collision" restart: "Restart" exit_game: "Exit game" values: diff --git a/source/game/ui/service_menu.cpp b/source/game/ui/service_menu.cpp index f459fbb..80d9376 100644 --- a/source/game/ui/service_menu.cpp +++ b/source/game/ui/service_menu.cpp @@ -17,6 +17,7 @@ #include "core/rendering/text.hpp" #include "core/system/event_buffer.hpp" #include "core/ui/ui_config.hpp" +#include "game/gameplay_config.hpp" #include "game/options.hpp" #include "game/options_apply.hpp" #include "utils/defaults.hpp" @@ -692,6 +693,8 @@ auto ServiceMenu::buildRoot() -> Page { []() { ServiceMenu::get().pushPage(buildAudio()); })); page.items.push_back(makeSubmenu("menu.items.controls_submenu", []() { ServiceMenu::get().pushPage(buildControls()); })); + page.items.push_back(makeSubmenu("menu.items.tweaks_submenu", + []() { ServiceMenu::get().pushPage(buildTweaks()); })); page.items.push_back(makeSubmenu("menu.items.system_submenu", []() { ServiceMenu::get().pushPage(buildSystem()); })); return page; @@ -1155,6 +1158,42 @@ void ServiceMenu::startDefineButtons(SDL_Gamepad* pad, const std::string& name, define_buttons_.enable(pad, name, path); } +auto ServiceMenu::buildTweaks() -> Page { + // Submenú "Tweaks" — flags de jugabilitat persistits a `gameplay.yaml` + // dins la carpeta de sistema. Cada toggle muta `GameplayConfig` i + // n'invoca `save()` immediatament: l'usuari veu el canvi reflectit al + // joc sense esperar a un "aplicar" i, si tanca el joc, torna en el + // mateix estat. Tres toggles ON/OFF, sense estat addicional. + Page page; + page.title_key = "menu.titles.tweaks"; + + page.items.push_back(makeToggle( + "menu.items.whip_pierces_walls", + []() { return GameplayConfig::get().whipDamagePiercesWalls(); }, + [](bool v) { + GameplayConfig::get().setWhipDamagePiercesWalls(v); + GameplayConfig::get().save(); + })); + + page.items.push_back(makeToggle( + "menu.items.friendly_fire", + []() { return GameplayConfig::get().friendlyFire(); }, + [](bool v) { + GameplayConfig::get().setFriendlyFire(v); + GameplayConfig::get().save(); + })); + + page.items.push_back(makeToggle( + "menu.items.players_collide", + []() { return GameplayConfig::get().playersCollide(); }, + [](bool v) { + GameplayConfig::get().setPlayersCollide(v); + GameplayConfig::get().save(); + })); + + return page; +} + auto ServiceMenu::buildSystem() -> Page { Page page; page.title_key = "menu.titles.system"; diff --git a/source/game/ui/service_menu.hpp b/source/game/ui/service_menu.hpp index 4496a2c..76d94d9 100644 --- a/source/game/ui/service_menu.hpp +++ b/source/game/ui/service_menu.hpp @@ -253,6 +253,7 @@ class ServiceMenu { [[nodiscard]] static auto buildKeyboardControls() -> Page; [[nodiscard]] static auto buildGamepadControls() -> Page; [[nodiscard]] static auto buildSystem() -> Page; + [[nodiscard]] static auto buildTweaks() -> Page; // Helpers privats d'items de vídeo: aïllen la lògica de // `shader_type` i `preset` fora de `buildVideo` perquè no exploti la