fix(input): dedup de mandos, auto-assign per ordre i cycles sense col·lisió

This commit is contained in:
JailDesigner committed 2026-04-24 18:06:24 +02:00
1 parent e5b8d7731b
commit 996ff0053e
4 files changed
+111 -20

No files matched your search

+31 -4
View File
@@ -179,10 +179,24 @@ namespace {
// Aplica les assignacions persistides al GamepadManager. Cridat
// després de `loadFromFile` perquè l'ordre és: GamepadManager::init
// (obre tots els mandos físics) → Options::loadFromFile (llig YAML)
// → aquesta funció (casa mandos↔jugadors).
// → aquesta funció (casa mandos↔jugadors) → auto-assign per ordre
// els slots que hagen quedat buits (equivalent al patró de
// `coffee_crisis_arcade_edition`).
void applyControlsToGamepadManager() {
GamepadManager::get().assignToPlayer(0, g_controls.gamepad_p1.name, g_controls.gamepad_p1.path);
GamepadManager::get().assignToPlayer(1, g_controls.gamepad_p2.name, g_controls.gamepad_p2.path);
auto& gm = GamepadManager::get();
gm.assignToPlayer(0, g_controls.gamepad_p1.name, g_controls.gamepad_p1.path);
gm.assignToPlayer(1, g_controls.gamepad_p2.name, g_controls.gamepad_p2.path);
const auto AUTO = gm.autoAssignFreeSlots();
if (AUTO.empty()) { return; }
// Sincronitzem Options amb el que el manager ha vinculat per
// ordre, per persistir-ho al config.yaml. No cridem els setters
// individuals perquè cada un dispararia un saveToFile; preferim
// fer un sol save al final.
for (const auto& a : AUTO) {
auto& slot = (a.player_id == 0) ? g_controls.gamepad_p1 : g_controls.gamepad_p2;
slot.name = a.name;
slot.path = a.path;
}
}
void parseAudio(const fkyaml::node& yaml) {
@@ -557,7 +571,11 @@ namespace Options {
const std::string CONTENT = readFileOrEmpty(g_config_file_path);
if (CONTENT.empty()) {
// Primera execució: creem el fitxer amb els valors per defecte.
// Primera execució: fem l'auto-assign inicial dels mandos
// (per a que P1 obtingui el primer mando connectat sense que
// l'usuari haja de passar pel menú) i després escrivim el
// fitxer amb els valors resultants.
applyControlsToGamepadManager();
return saveToFile();
}
@@ -584,7 +602,16 @@ namespace Options {
parseVideo(yaml);
parseAudio(yaml);
parseControls(yaml);
// Captura les assignacions inicials per detectar si
// l'auto-assign (dins d'`applyControls...`) les ha tocat i
// cal reescriure el fitxer amb els valors nous.
const auto BEFORE_P1 = g_controls.gamepad_p1;
const auto BEFORE_P2 = g_controls.gamepad_p2;
applyControlsToGamepadManager();
const bool CHANGED =
(BEFORE_P1.name != g_controls.gamepad_p1.name || BEFORE_P1.path != g_controls.gamepad_p1.path ||
BEFORE_P2.name != g_controls.gamepad_p2.name || BEFORE_P2.path != g_controls.gamepad_p2.path);
if (CHANGED) { saveToFile(); }
return true;
} catch (const std::exception& e) {
std::cout << "Options: error parsejant config.yaml: " << e.what() << '\n';