refactor(#28): Input rep Config::PlayerBindings per paràmetre

Pas 3/N del hallazgo #28.

Input deixa d'incloure game/options.hpp. Els antics applyPlayerXFromOptions
es renombren a applyPlayerXBindings(const Config::PlayerBindings&) i
reben els bindings per paràmetre en lloc de llegir-los del global
Options::*. El Director hi passa Options::player1/2 als call-sites.

Esborrats applyKeyboardBindingsFromOptions i applyGamepadBindingsFromOptions
que no eren cridats per ningú (dead code aprofitat).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-20 19:30:55 +02:00
parent 2f0b148380
commit d118218662
3 changed files with 144 additions and 175 deletions
+24 -54
View File
@@ -8,8 +8,6 @@
#include <unordered_map> // Para unordered_map, _Node_iterator, operator==, _Node_iterator_base, _Node_const_iterator
#include <utility> // Para move
#include "game/options.hpp" // Para Options::controls
// Singleton
Input* Input::instance = nullptr;
@@ -51,34 +49,6 @@ void Input::bindKey(Action action, SDL_Scancode code) {
keyboard_.bindings[action].scancode = code;
}
// Aplica las teclas configuradas desde Options
void Input::applyKeyboardBindingsFromOptions() {
bindKey(Action::LEFT, Options::keyboard_controls.key_left);
bindKey(Action::RIGHT, Options::keyboard_controls.key_right);
bindKey(Action::THRUST, Options::keyboard_controls.key_thrust);
}
// Aplica configuración de botones del gamepad desde Options al primer gamepad conectado
void Input::applyGamepadBindingsFromOptions() {
// Si no hay gamepads conectados, no hay nada que hacer
if (gamepads_.empty()) {
return;
}
// Obtener el primer gamepad conectado
const auto& gamepad = gamepads_[0];
// Aplicar bindings desde Options
// Los valores pueden ser:
// - 0-20+: Botones SDL_GamepadButton (DPAD, face buttons, shoulders)
// - 100: L2 trigger
// - 101: R2 trigger
// - 200+: Ejes del stick analógico
gamepad->bindings[Action::LEFT].button = Options::gamepad_controls.button_left;
gamepad->bindings[Action::RIGHT].button = Options::gamepad_controls.button_right;
gamepad->bindings[Action::THRUST].button = Options::gamepad_controls.button_thrust;
}
// Asigna inputs a botones del mando
void Input::bindGameControllerButton(const std::shared_ptr<Gamepad>& gamepad, Action action, SDL_GamepadButton button) {
if (gamepad != nullptr) {
@@ -494,22 +464,22 @@ auto Input::findAvailableGamepadByName(const std::string& gamepad_name) -> std::
// ========== MÉTODOS ESPECÍFICOS POR JUGADOR (ORNI) ==========
// Aplica configuración de controles del player 1
void Input::applyPlayer1BindingsFromOptions() {
void Input::applyPlayer1Bindings(const Config::PlayerBindings& bindings) {
// 1. Aplicar bindings de teclado (NO usar bindKey, llenar mapa específico)
player1_keyboard_bindings_[Action::LEFT].scancode = Options::player1.keyboard.key_left;
player1_keyboard_bindings_[Action::RIGHT].scancode = Options::player1.keyboard.key_right;
player1_keyboard_bindings_[Action::THRUST].scancode = Options::player1.keyboard.key_thrust;
player1_keyboard_bindings_[Action::SHOOT].scancode = Options::player1.keyboard.key_shoot;
player1_keyboard_bindings_[Action::START].scancode = Options::player1.keyboard.key_start;
player1_keyboard_bindings_[Action::LEFT].scancode = bindings.keyboard.key_left;
player1_keyboard_bindings_[Action::RIGHT].scancode = bindings.keyboard.key_right;
player1_keyboard_bindings_[Action::THRUST].scancode = bindings.keyboard.key_thrust;
player1_keyboard_bindings_[Action::SHOOT].scancode = bindings.keyboard.key_shoot;
player1_keyboard_bindings_[Action::START].scancode = bindings.keyboard.key_start;
// 2. Encontrar gamepad por nombre (o usar primer gamepad como fallback)
std::shared_ptr<Gamepad> gamepad = nullptr;
if (Options::player1.gamepad_name.empty()) {
if (bindings.gamepad_name.empty()) {
// Fallback: usar primer gamepad disponible
gamepad = (!gamepads_.empty()) ? gamepads_[0] : nullptr;
} else {
// Buscar por nombre
gamepad = findAvailableGamepadByName(Options::player1.gamepad_name);
gamepad = findAvailableGamepadByName(bindings.gamepad_name);
}
if (!gamepad) {
@@ -518,32 +488,32 @@ void Input::applyPlayer1BindingsFromOptions() {
}
// 3. Aplicar bindings de gamepad
gamepad->bindings[Action::LEFT].button = Options::player1.gamepad.button_left;
gamepad->bindings[Action::RIGHT].button = Options::player1.gamepad.button_right;
gamepad->bindings[Action::THRUST].button = Options::player1.gamepad.button_thrust;
gamepad->bindings[Action::SHOOT].button = Options::player1.gamepad.button_shoot;
gamepad->bindings[Action::LEFT].button = bindings.gamepad.button_left;
gamepad->bindings[Action::RIGHT].button = bindings.gamepad.button_right;
gamepad->bindings[Action::THRUST].button = bindings.gamepad.button_thrust;
gamepad->bindings[Action::SHOOT].button = bindings.gamepad.button_shoot;
// 4. Cachear referencia
player1_gamepad_ = gamepad;
}
// Aplica configuración de controles del player 2
void Input::applyPlayer2BindingsFromOptions() {
void Input::applyPlayer2Bindings(const Config::PlayerBindings& bindings) {
// 1. Aplicar bindings de teclado (mapa específico de P2, no sobrescribe P1)
player2_keyboard_bindings_[Action::LEFT].scancode = Options::player2.keyboard.key_left;
player2_keyboard_bindings_[Action::RIGHT].scancode = Options::player2.keyboard.key_right;
player2_keyboard_bindings_[Action::THRUST].scancode = Options::player2.keyboard.key_thrust;
player2_keyboard_bindings_[Action::SHOOT].scancode = Options::player2.keyboard.key_shoot;
player2_keyboard_bindings_[Action::START].scancode = Options::player2.keyboard.key_start;
player2_keyboard_bindings_[Action::LEFT].scancode = bindings.keyboard.key_left;
player2_keyboard_bindings_[Action::RIGHT].scancode = bindings.keyboard.key_right;
player2_keyboard_bindings_[Action::THRUST].scancode = bindings.keyboard.key_thrust;
player2_keyboard_bindings_[Action::SHOOT].scancode = bindings.keyboard.key_shoot;
player2_keyboard_bindings_[Action::START].scancode = bindings.keyboard.key_start;
// 2. Encontrar gamepad por nombre (o usar segundo gamepad como fallback)
std::shared_ptr<Gamepad> gamepad = nullptr;
if (Options::player2.gamepad_name.empty()) {
if (bindings.gamepad_name.empty()) {
// Fallback: usar segundo gamepad disponible
gamepad = (gamepads_.size() > 1) ? gamepads_[1] : nullptr;
} else {
// Buscar por nombre
gamepad = findAvailableGamepadByName(Options::player2.gamepad_name);
gamepad = findAvailableGamepadByName(bindings.gamepad_name);
}
if (!gamepad) {
@@ -552,10 +522,10 @@ void Input::applyPlayer2BindingsFromOptions() {
}
// 3. Aplicar bindings de gamepad
gamepad->bindings[Action::LEFT].button = Options::player2.gamepad.button_left;
gamepad->bindings[Action::RIGHT].button = Options::player2.gamepad.button_right;
gamepad->bindings[Action::THRUST].button = Options::player2.gamepad.button_thrust;
gamepad->bindings[Action::SHOOT].button = Options::player2.gamepad.button_shoot;
gamepad->bindings[Action::LEFT].button = bindings.gamepad.button_left;
gamepad->bindings[Action::RIGHT].button = bindings.gamepad.button_right;
gamepad->bindings[Action::THRUST].button = bindings.gamepad.button_thrust;
gamepad->bindings[Action::SHOOT].button = bindings.gamepad.button_shoot;
// 4. Cachear referencia
player2_gamepad_ = gamepad;