migrant input: ja carrega la configuració y asigna mandos correctament

This commit is contained in:
2025-08-04 12:16:03 +02:00
parent 050b6716bf
commit cd457d0db9
2 changed files with 94 additions and 25 deletions

View File

@@ -43,8 +43,6 @@ void init() {
// Opciones de control // Opciones de control
gamepads.init(); gamepads.init();
assignGamepadByName("", Player::Id::PLAYER1);
//assignGamepadByName("", Player::Id::PLAYER2);
setKeyboardToPlayer(Player::Id::PLAYER1); setKeyboardToPlayer(Player::Id::PLAYER1);
// Opciones de cambios pendientes // Opciones de cambios pendientes
@@ -55,47 +53,44 @@ void init() {
// Carga el fichero de configuración // Carga el fichero de configuración
auto loadFromFile() -> bool { auto loadFromFile() -> bool {
// Inicializa las opciones del programa // 1. Inicializa las opciones con valores por defecto.
init(); init();
// Indicador de éxito en la carga
bool success = true;
// Variables para manejar el fichero
std::ifstream file(settings.config_file); std::ifstream file(settings.config_file);
// Si el fichero se puede abrir // 2. Si el fichero existe, lo leemos para obtener los nombres de los mandos.
if (file.good()) { if (file.good()) {
// Procesa el fichero línea a línea // --- CASO: EL FICHERO EXISTE ---
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "\nReading file: %s", getFileName(settings.config_file).c_str()); SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "\nReading file: %s", getFileName(settings.config_file).c_str());
std::string line; std::string line;
while (std::getline(file, line)) { while (std::getline(file, line)) {
// Comprueba que la línea no sea un comentario
if (line.substr(0, 1) != "#") { if (line.substr(0, 1) != "#") {
// Encuentra la posición del carácter '='
int pos = line.find("="); int pos = line.find("=");
// Procesa las dos subcadenas
if (!set(line.substr(0, pos), line.substr(pos + 1, line.length()))) { if (!set(line.substr(0, pos), line.substr(pos + 1, line.length()))) {
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Unknown parameter: %s", line.substr(0, pos).c_str()); SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "Unknown parameter: %s", line.substr(0, pos).c_str());
success = false;
} }
} }
} }
file.close(); file.close();
} }
// El fichero no existe
else { // 3. Llamamos al asignador inteligente.
saveToFile(); // Crea el fichero con los valores por defecto gamepads.assignAndLinkGamepads();
// 4. Si el fichero no existía, lo creamos ahora con la configuración por defecto.
if (!file.good()) {
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Config file not found. Creating default settings.");
saveToFile();
} }
// Normaliza los valores // Normaliza valores como antes...
if (settings.language != Lang::Code::ENGLISH && if (settings.language != Lang::Code::ENGLISH &&
settings.language != Lang::Code::VALENCIAN && settings.language != Lang::Code::VALENCIAN &&
settings.language != Lang::Code::SPANISH) { settings.language != Lang::Code::SPANISH) {
settings.language = Lang::Code::ENGLISH; settings.language = Lang::Code::ENGLISH;
} }
return success; return true;
} }
// Guarda el fichero de configuración // Guarda el fichero de configuración
@@ -280,12 +275,11 @@ void checkPendingChanges() {
} }
// Buscar y asignar un mando disponible por nombre // Buscar y asignar un mando disponible por nombre
bool assignGamepadByName(const std::string& gamepad_name, Player::Id player_id) { bool assignGamepadByName(const std::string& gamepad_name_to_find, Player::Id player_id) {
auto available_gamepad = Input::get()->findAvailableGamepadByName(gamepad_name); auto found_gamepad = Input::get()->findAvailableGamepadByName(gamepad_name_to_find);
if (available_gamepad) { if (found_gamepad) {
const std::string& actual_gamepad_name = available_gamepad->name; return gamepads.assignGamepadToPlayer(player_id, found_gamepad, found_gamepad->name);
return gamepads.assignGamepadToPlayer(player_id, available_gamepad, actual_gamepad_name);
} }
return false; return false;
} }
@@ -300,4 +294,76 @@ std::string getGamepadInfo(Player::Id player_id) {
return "Invalid player"; return "Invalid player";
} }
} }
// Asigna los mandos físicos basándose en la configuración actual de nombres.
void GamepadManager::assignAndLinkGamepads() {
// 1. Obtenemos todos los mandos físicos que están conectados ahora mismo.
auto physical_gamepads = Input::get()->getGamepads();
// 2. Reiniciamos las asignaciones actuales y guardamos los nombres que teníamos en la config.
std::array<std::string, MAX_PLAYERS> desired_names;
for (size_t i = 0; i < MAX_PLAYERS; ++i) {
desired_names[i] = gamepads[i].name; // Guardamos el nombre deseado
gamepads[i].instance = nullptr; // Limpiamos la instancia
}
// 3. Vector para rastrear los mandos físicos que ya hemos asignado.
std::vector<std::shared_ptr<Input::Gamepad>> assigned_instances;
// --- PRIMERA PASADA: Buscar coincidencias exactas por nombre ---
// Recorremos la configuración de nuestros jugadores (P1, P2).
for (size_t i = 0; i < MAX_PLAYERS; ++i) {
const std::string& desired_name = desired_names[i];
if (desired_name.empty()) {
continue; // Si no se pide un nombre específico, pasamos a la siguiente fase.
}
// Buscamos un mando físico que coincida con el nombre deseado.
for (const auto& physical_gamepad : physical_gamepads) {
if (physical_gamepad->name == desired_name) {
// ¡Coincidencia! Ahora, comprobamos que no lo hayamos asignado ya.
bool already_assigned = false;
for (const auto& assigned : assigned_instances) {
if (assigned == physical_gamepad) {
already_assigned = true;
break;
}
}
if (!already_assigned) {
gamepads[i].instance = physical_gamepad; // Enlazamos la instancia
assigned_instances.push_back(physical_gamepad); // Lo marcamos como asignado
break; // Mando encontrado para este jugador, pasamos al siguiente.
}
}
}
}
// --- SEGUNDA PASADA: Asignar los mandos restantes a los jugadores sin mando ---
// Recorremos de nuevo la configuración de nuestros jugadores.
for (size_t i = 0; i < MAX_PLAYERS; ++i) {
if (gamepads[i].instance == nullptr) { // Si este jugador aún no tiene mando...
// ...buscamos un mando físico que todavía esté libre.
for (const auto& physical_gamepad : physical_gamepads) {
bool already_assigned = false;
for (const auto& assigned : assigned_instances) {
if (assigned == physical_gamepad) {
already_assigned = true;
break;
}
}
if (!already_assigned) {
gamepads[i].instance = physical_gamepad; // Se lo asignamos
// MUY IMPORTANTE: Actualizamos el nombre en la configuración.
// Si guardamos, ahora se guardará el nombre del mando real que se le asignó.
gamepads[i].name = physical_gamepad->name;
assigned_instances.push_back(physical_gamepad); // Lo marcamos como asignado
break; // Mando encontrado, pasamos al siguiente jugador.
}
}
}
}
}
} // namespace Options } // namespace Options

View File

@@ -202,6 +202,9 @@ class GamepadManager {
return false; return false;
} }
// Asigna los mandos físicos basándose en la configuración actual de nombres.
void assignAndLinkGamepads();
// Iteradores // Iteradores
auto begin() { return gamepads.begin(); } auto begin() { return gamepads.begin(); }
auto end() { return gamepads.end(); } auto end() { return gamepads.end(); }