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;