fix(input): dedup de mandos, auto-assign per ordre i cycles sense col·lisió
This commit is contained in:
1 parent
e5b8d7731b
commit
996ff0053e
4 files changed
+111
-20
No files matched your search
+31
-4
@@ -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';
|
||||
|
||||
Reference in new issue
Block a user