From bc5a6abf53e2c0b7a6b5debc4906cc38ec48bd46 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 14 May 2026 10:29:34 +0200 Subject: [PATCH] =?UTF-8?q?feat(menu):=20teclat=20amb=20submen=C3=BA=20per?= =?UTF-8?q?=20jugador?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/game/ui/service_menu.cpp | 42 ++++++++++++++++++++------------- source/game/ui/service_menu.hpp | 1 + 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/source/game/ui/service_menu.cpp b/source/game/ui/service_menu.cpp index ffbf6e8..aa7cd56 100644 --- a/source/game/ui/service_menu.cpp +++ b/source/game/ui/service_menu.cpp @@ -946,29 +946,37 @@ auto ServiceMenu::makeKeyboardItem(const std::string& label_key, int player_id, } auto ServiceMenu::buildKeyboardControls() -> Page { + // Hub amb una pàgina per jugador. Trenquem la pàgina única antiga + // perquè 12 keybinds + 2 labels feien la llista massa alta per al + // canvas. El títol de cada subpàgina (`menu.labels.player_N`) ja + // identifica el jugador, així que dins la subpàgina no posem la + // label "Jugador X" — seria redundant. Page page; page.title_key = "menu.titles.keyboard"; + page.items.push_back(makeSubmenu("menu.labels.player_1", + []() { ServiceMenu::get().pushPage(buildKeyboardControlsForPlayer(0)); })); + page.items.push_back(makeSubmenu("menu.labels.player_2", + []() { ServiceMenu::get().pushPage(buildKeyboardControlsForPlayer(1)); })); + return page; +} + +auto ServiceMenu::buildKeyboardControlsForPlayer(int player_id) -> Page { + Page page; + // Reutilitzem la clau `labels.player_N` també com a títol de la + // pàgina perquè ja conté el text correcte ("Jugador 1"/"Jugador 2"); + // així evitem duplicar strings al locale. + page.title_key = (player_id == 0) ? "menu.labels.player_1" : "menu.labels.player_2"; using KA = Options::KeyboardAction; const auto AS_U8 = [](KA k) { return static_cast(k); }; - // Bloc del jugador 1. Ordre: moviment → atacar → saltar. - page.items.push_back(makeLabel(Locale::get().text("menu.labels.player_1"))); - page.items.push_back(makeKeyboardItem("menu.items.move_up", 0, AS_U8(KA::UP))); - page.items.push_back(makeKeyboardItem("menu.items.move_down", 0, AS_U8(KA::DOWN))); - page.items.push_back(makeKeyboardItem("menu.items.move_left", 0, AS_U8(KA::LEFT))); - page.items.push_back(makeKeyboardItem("menu.items.move_right", 0, AS_U8(KA::RIGHT))); - page.items.push_back(makeKeyboardItem("menu.items.attack", 0, AS_U8(KA::ATTACK))); - page.items.push_back(makeKeyboardItem("menu.items.jump", 0, AS_U8(KA::JUMP))); - - // Bloc del jugador 2. - page.items.push_back(makeLabel(Locale::get().text("menu.labels.player_2"))); - page.items.push_back(makeKeyboardItem("menu.items.move_up", 1, AS_U8(KA::UP))); - page.items.push_back(makeKeyboardItem("menu.items.move_down", 1, AS_U8(KA::DOWN))); - page.items.push_back(makeKeyboardItem("menu.items.move_left", 1, AS_U8(KA::LEFT))); - page.items.push_back(makeKeyboardItem("menu.items.move_right", 1, AS_U8(KA::RIGHT))); - page.items.push_back(makeKeyboardItem("menu.items.attack", 1, AS_U8(KA::ATTACK))); - page.items.push_back(makeKeyboardItem("menu.items.jump", 1, AS_U8(KA::JUMP))); + // Ordre: moviment → atacar → saltar. + page.items.push_back(makeKeyboardItem("menu.items.move_up", player_id, AS_U8(KA::UP))); + page.items.push_back(makeKeyboardItem("menu.items.move_down", player_id, AS_U8(KA::DOWN))); + page.items.push_back(makeKeyboardItem("menu.items.move_left", player_id, AS_U8(KA::LEFT))); + page.items.push_back(makeKeyboardItem("menu.items.move_right", player_id, AS_U8(KA::RIGHT))); + page.items.push_back(makeKeyboardItem("menu.items.attack", player_id, AS_U8(KA::ATTACK))); + page.items.push_back(makeKeyboardItem("menu.items.jump", player_id, AS_U8(KA::JUMP))); return page; } diff --git a/source/game/ui/service_menu.hpp b/source/game/ui/service_menu.hpp index 76d94d9..6be6118 100644 --- a/source/game/ui/service_menu.hpp +++ b/source/game/ui/service_menu.hpp @@ -251,6 +251,7 @@ class ServiceMenu { [[nodiscard]] static auto buildAudio() -> Page; [[nodiscard]] static auto buildControls() -> Page; [[nodiscard]] static auto buildKeyboardControls() -> Page; + [[nodiscard]] static auto buildKeyboardControlsForPlayer(int player_id) -> Page; [[nodiscard]] static auto buildGamepadControls() -> Page; [[nodiscard]] static auto buildSystem() -> Page; [[nodiscard]] static auto buildTweaks() -> Page;