correccions en la detecció de mandos
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user