feat(menu): submenú "Jugabilitat" al menú de servei amb tres toggles

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.
This commit is contained in:
JailDesigner committed 2026-05-08 13:29:04 +02:00
1 parent 3635cebf25
commit e25ccd02fd
4 files changed
+50

No files matched your search

+5
View File
@@ -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:
+5
View File
@@ -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:
+39
View File
@@ -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";
+1
View File
@@ -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