migrant input: commit abans que gemini destroçe algo

This commit is contained in:
2025-08-04 11:37:46 +02:00
parent 90c080f3e3
commit 050b6716bf
10 changed files with 245 additions and 99 deletions

View File

@@ -19,13 +19,13 @@
namespace Options {
// --- Variables globales ---
Window window; // Opciones de la ventana
Settings settings; // Opciones del juego
Video video; // Opciones de vídeo
Audio audio; // Opciones de audio
std::vector<std::shared_ptr<Gamepad>> gamepads; // Opciones de mando para cada jugador
Keyboard keyboard; // Opciones para el teclado
PendingChanges pending_changes; // Opciones que se aplican al cerrar
Window window; // Opciones de la ventana
Settings settings; // Opciones del juego
Video video; // Opciones de vídeo
Audio audio; // Opciones de audio
GamepadManager gamepads; // Opciones de mando para cada jugador
Keyboard keyboard; // Opciones para el teclado
PendingChanges pending_changes; // Opciones que se aplican al cerrar
// Declaraciones
auto set(const std::string& var, const std::string& value) -> bool;
@@ -42,9 +42,9 @@ void init() {
Difficulty::init();
// Opciones de control
gamepads.clear();
gamepads.emplace_back(std::make_shared<Gamepad>(Player::Id::PLAYER1));
gamepads.emplace_back(std::make_shared<Gamepad>(Player::Id::PLAYER2));
gamepads.init();
assignGamepadByName("", Player::Id::PLAYER1);
//assignGamepadByName("", Player::Id::PLAYER2);
setKeyboardToPlayer(Player::Id::PLAYER1);
// Opciones de cambios pendientes
@@ -153,16 +153,7 @@ auto saveToFile() -> bool {
// Opciones de mandos
file << "\n\n## CONTROLLERS\n";
// int controller_index = 0;
// for (const auto& controller : gamepads) {
// file << "\n";
// file << "controller." << controller_index << ".name=" << controller->name << "\n";
// file << "controller." << controller_index << ".player=" << controller->player_id << "\n";
//
// // Incrementa el índice
// ++controller_index;
// }
gamepads.saveToFile(file);
// Cierra el fichero
file.close();
@@ -172,20 +163,21 @@ auto saveToFile() -> bool {
// Función auxiliar para analizar la configuración del mando y reducir duplicación
void parseAndSetController(const std::string& var, const std::string& value) {
// Lógica básica de análisis (puede hacerse más robusta)
// size_t first_dot = var.find('.');
// size_t second_dot = var.find('.', first_dot + 1);
//
// int controller_index = std::stoi(var.substr(first_dot + 1, second_dot - first_dot - 1));
// std::string setting_key = var.substr(second_dot + 1);
//
// auto& controller = gamepads.at(controller_index);
//
// if (setting_key == "name") {
// controller.name = value;
// } else if (setting_key == "player") {
// controller.player_id = std::clamp(std::stoi(value), 1, 2);
// }
size_t first_dot = var.find('.');
size_t second_dot = var.find('.', first_dot + 1);
if (first_dot == std::string::npos || second_dot == std::string::npos) {
return; // Formato inválido
}
try {
int controller_index = std::stoi(var.substr(first_dot + 1, second_dot - first_dot - 1));
std::string setting_key = var.substr(second_dot + 1);
gamepads.setControllerProperty(controller_index, setting_key, value);
} catch (const std::exception&) {
// Error en parsing
}
}
auto set(const std::string& var, const std::string& value) -> bool {
@@ -265,7 +257,7 @@ void swapKeyboard() {
// Intercambia los jugadores asignados a los dos primeros mandos
void swapControllers() {
std::swap(gamepads.at(0)->player_id, gamepads.at(1)->player_id);
gamepads.swapPlayers();
}
// Averigua quien está usando el teclado
@@ -286,4 +278,26 @@ void checkPendingChanges() {
pending_changes.has_pending_changes = settings.language != pending_changes.new_language ||
settings.difficulty != pending_changes.new_difficulty;
}
// Buscar y asignar un mando disponible por nombre
bool assignGamepadByName(const std::string& gamepad_name, Player::Id player_id) {
auto available_gamepad = Input::get()->findAvailableGamepadByName(gamepad_name);
if (available_gamepad) {
const std::string& actual_gamepad_name = available_gamepad->name;
return gamepads.assignGamepadToPlayer(player_id, available_gamepad, actual_gamepad_name);
}
return false;
}
// Obtener información de un gamepad específico
std::string getGamepadInfo(Player::Id player_id) {
try {
const auto& gamepad = gamepads.getGamepad(player_id);
return "Player " + std::to_string(static_cast<int>(player_id)) +
": " + (gamepad.name.empty() ? "No gamepad" : gamepad.name);
} catch (const std::exception&) {
return "Invalid player";
}
}
} // namespace Options