correccions en la detecció de mandos

This commit is contained in:
2026-04-14 17:09:09 +02:00
parent 1a2298963d
commit c694781f38
8 changed files with 121 additions and 36 deletions

View File

@@ -763,18 +763,30 @@ namespace Options {
}
// Asigna los mandos físicos basándose en la configuración actual.
//
// Tres pases en orden decreciente de prioridad:
// 1) Match por path exacto: resuelve el caso arcade (dos sticks idénticos
// enchufados siempre a los mismos puertos USB).
// 2) Match por nombre cuando el path no coincidió: recoloca un mando
// conocido que se ha reenchufado a otro puerto (ej. DualSense). En ese
// caso se refresca el path guardado al nuevo.
// 3) Reparto en orden de los mandos físicos sobrantes a los slots que
// sigan libres.
void GamepadManager::assignAndLinkGamepads() {
auto physical_gamepads = Input::get()->getGamepads();
std::array<std::string, MAX_PLAYERS> desired_paths;
std::array<std::string, MAX_PLAYERS> desired_names;
for (size_t i = 0; i < MAX_PLAYERS; ++i) {
desired_paths[i] = gamepads_[i].path;
desired_names[i] = gamepads_[i].name;
gamepads_[i].instance = nullptr;
}
std::vector<std::shared_ptr<Input::Gamepad>> assigned_instances;
assignGamepadsByPath(desired_paths, physical_gamepads, assigned_instances);
assignGamepadsByName(desired_names, physical_gamepads, assigned_instances);
assignRemainingGamepads(physical_gamepads, assigned_instances);
clearUnassignedGamepadSlots();
}
@@ -802,7 +814,37 @@ namespace Options {
}
}
// --- SEGUNDA PASADA: Asigna los mandos físicos restantes a los jugadores libres ---
// --- SEGUNDA PASADA: Match por nombre para slots cuyo path guardado no casó ---
// Si un slot tiene nombre guardado pero el path no ha coincidido (mando reenchufado
// a otro puerto, o path del sistema cambiado), lo enlazamos por nombre y
// refrescamos el path guardado al del dispositivo físico actual.
void GamepadManager::assignGamepadsByName(
const std::array<std::string, MAX_PLAYERS>& desired_names,
const std::vector<std::shared_ptr<Input::Gamepad>>& physical_gamepads, // NOLINT(readability-named-parameter)
std::vector<std::shared_ptr<Input::Gamepad>>& assigned_instances) {
for (size_t i = 0; i < MAX_PLAYERS; ++i) {
if (gamepads_[i].instance != nullptr) {
continue;
}
const std::string& desired_name = desired_names[i];
if (desired_name.empty()) {
continue;
}
for (const auto& physical_gamepad : physical_gamepads) {
if (physical_gamepad->name == desired_name && !isGamepadAssigned(physical_gamepad, assigned_instances)) {
gamepads_[i].instance = physical_gamepad;
gamepads_[i].name = physical_gamepad->name;
gamepads_[i].path = physical_gamepad->path;
assigned_instances.push_back(physical_gamepad);
break;
}
}
}
}
// --- TERCERA PASADA: Asigna los mandos físicos restantes a los jugadores libres ---
void GamepadManager::assignRemainingGamepads(
const std::vector<std::shared_ptr<Input::Gamepad>>& physical_gamepads, // NOLINT(readability-named-parameter)
std::vector<std::shared_ptr<Input::Gamepad>>& assigned_instances) {
@@ -824,7 +866,7 @@ namespace Options {
}
}
// --- TERCERA PASADA: Limpia la información "fantasma" de los slots no asignados ---
// --- LIMPIEZA FINAL: Limpia la información "fantasma" de los slots no asignados ---
void GamepadManager::clearUnassignedGamepadSlots() {
for (auto& gamepad_config : gamepads_) {
if (gamepad_config.instance == nullptr) {

View File

@@ -293,6 +293,10 @@ namespace Options {
const std::array<std::string, MAX_PLAYERS>& desired_paths,
const std::vector<std::shared_ptr<Input::Gamepad>>& physical_gamepads, // NOLINT(readability-avoid-const-params-in-decls)
std::vector<std::shared_ptr<Input::Gamepad>>& assigned_instances);
void assignGamepadsByName(
const std::array<std::string, MAX_PLAYERS>& desired_names,
const std::vector<std::shared_ptr<Input::Gamepad>>& physical_gamepads, // NOLINT(readability-avoid-const-params-in-decls)
std::vector<std::shared_ptr<Input::Gamepad>>& assigned_instances);
void assignRemainingGamepads(
const std::vector<std::shared_ptr<Input::Gamepad>>& physical_gamepads, // NOLINT(readability-avoid-const-params-in-decls)
std::vector<std::shared_ptr<Input::Gamepad>>& assigned_instances);