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