Varios arreglos a tot lo de definir botons dins del service menu i lo de triar mando
This commit is contained in:
@@ -296,22 +296,28 @@ auto getGamepadInfo(Player::Id player_id) -> std::string {
|
||||
|
||||
// Asigna los mandos físicos basándose en la configuración actual.
|
||||
void GamepadManager::assignAndLinkGamepads() {
|
||||
// 1. Obtenemos todos los mandos físicos que están conectados ahora mismo.
|
||||
// 1. Obtenemos los mandos físicos conectados.
|
||||
auto physical_gamepads = Input::get()->getGamepads();
|
||||
|
||||
// 2. Reiniciamos las asignaciones actuales y guardamos los datos deseados de la config.
|
||||
// 2. Reiniciamos las asignaciones actuales.
|
||||
std::array<std::string, MAX_PLAYERS> desired_paths;
|
||||
for (size_t i = 0; i < MAX_PLAYERS; ++i) {
|
||||
desired_paths[i] = gamepads_[i].path;
|
||||
gamepads_[i].instance = nullptr;
|
||||
}
|
||||
|
||||
// 3. Vector para rastrear los mandos físicos que ya hemos asignado.
|
||||
// 3. Vector para rastrear los mandos ya asignados.
|
||||
std::vector<std::shared_ptr<Input::Gamepad>> assigned_instances;
|
||||
|
||||
// --- Ejecutamos las pasadas de asignación ---
|
||||
// --- Ejecutamos las pasadas de asignación y limpieza ---
|
||||
// Pasada 1: Intenta asignar por la ruta guardada.
|
||||
assignGamepadsByPath(desired_paths, physical_gamepads, assigned_instances);
|
||||
|
||||
// Pasada 2: Asigna los mandos restantes a los jugadores libres.
|
||||
assignRemainingGamepads(physical_gamepads, assigned_instances);
|
||||
|
||||
// Pasada 3: Limpia los datos de los slots que se quedaron sin mando.
|
||||
clearUnassignedGamepadSlots();
|
||||
}
|
||||
|
||||
// --- PRIMERA PASADA: Intenta asignar mandos basándose en la ruta guardada ---
|
||||
@@ -322,15 +328,20 @@ void GamepadManager::assignGamepadsByPath(
|
||||
for (size_t i = 0; i < MAX_PLAYERS; ++i) {
|
||||
const std::string& desired_path = desired_paths[i];
|
||||
if (desired_path.empty()) {
|
||||
continue; // No hay ruta guardada para este slot.
|
||||
continue; // No hay ruta guardada para este slot.
|
||||
}
|
||||
|
||||
// Buscamos un mando físico que coincida con la ruta y no esté ya asignado.
|
||||
for (const auto& physical_gamepad : physical_gamepads) {
|
||||
if (physical_gamepad->path == desired_path && !isGamepadAssigned(physical_gamepad, assigned_instances)) {
|
||||
|
||||
// Asignamos y actualizamos TODOS los datos.
|
||||
gamepads_[i].instance = physical_gamepad;
|
||||
gamepads_[i].name = physical_gamepad->name; // <--- LA LÍNEA QUE FALTABA
|
||||
// No es necesario actualizar la path aquí porque ya coincide.
|
||||
|
||||
assigned_instances.push_back(physical_gamepad);
|
||||
break; // Mando encontrado para este jugador, pasamos al siguiente.
|
||||
break; // Mando encontrado para este jugador, pasamos al siguiente.
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -361,6 +372,21 @@ void GamepadManager::assignRemainingGamepads(
|
||||
}
|
||||
}
|
||||
|
||||
// --- TERCERA PASADA: Limpia la información "fantasma" de los slots no asignados ---
|
||||
void GamepadManager::clearUnassignedGamepadSlots() {
|
||||
// Recorremos los slots de jugador una última vez.
|
||||
for (auto& gamepad_config : gamepads_) {
|
||||
// Si un slot no tiene una instancia física enlazada (instance == nullptr),
|
||||
// significa que no hay un mando para él.
|
||||
if (gamepad_config.instance == nullptr) {
|
||||
// Limpiamos sus datos de configuración para no mostrar información
|
||||
// de un mando que ya no está conectado.
|
||||
gamepad_config.name = "";
|
||||
gamepad_config.path = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Función auxiliar para comprobar si un mando físico ya está en la lista de asignados.
|
||||
// Devuelve 'true' si ya ha sido asignado, 'false' en caso contrario.
|
||||
auto GamepadManager::isGamepadAssigned(
|
||||
|
||||
Reference in New Issue
Block a user