feat(input): assignació mando↔jugador persistida a config.yaml

This commit is contained in:
JailDesigner committed 2026-04-24 15:13:44 +02:00
1 parent 4e9d5df872
commit a725b76684
5 files changed
+226 -13

No files matched your search

+46 -1
View File
@@ -9,6 +9,7 @@
#include <string_view>
#include <utility>
#include "core/input/gamepad_manager.hpp"
#include "external/fkyaml_node.hpp"
#include "utils/defines.hpp"
@@ -26,6 +27,7 @@ namespace {
Options::Window g_window{};
Options::Video g_video{};
Options::Audio g_audio{};
Options::Controls g_controls{};
std::vector<Options::PostFXPreset> g_postfx_presets{};
std::vector<Options::CrtPiPreset> g_crtpi_presets{};
@@ -160,6 +162,29 @@ namespace {
readField(node, "volume", g_audio.sound.volume);
}
void parseGamepadAssignment(const fkyaml::node& parent, const char* key, Options::GamepadAssignment& dst) {
if (!parent.contains(key)) { return; }
const auto& node = parent[key];
readField(node, "name", dst.name);
readField(node, "path", dst.path);
}
void parseControls(const fkyaml::node& yaml) {
if (!yaml.contains("controls")) { return; }
const auto& node = yaml["controls"];
parseGamepadAssignment(node, "gamepad_p1", g_controls.gamepad_p1);
parseGamepadAssignment(node, "gamepad_p2", g_controls.gamepad_p2);
}
// 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).
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);
}
void parseAudio(const fkyaml::node& yaml) {
if (!yaml.contains("audio")) { return; }
const auto& node = yaml["audio"];
@@ -442,6 +467,7 @@ namespace Options {
auto window() -> const Window& { return g_window; }
auto video() -> const Video& { return g_video; }
auto audio() -> const Audio& { return g_audio; }
auto controls() -> const Controls& { return g_controls; }
auto locale() -> const std::string& { return g_locale; }
auto configVersion() -> const std::string& { return g_config_version; }
auto postfxPresets() -> const std::vector<PostFXPreset>& { return g_postfx_presets; }
@@ -513,6 +539,15 @@ namespace Options {
saveToFile();
}
void setGamepadAssignment(int player_id, const std::string& name, const std::string& path) {
if (player_id < 0 || player_id > 1) { return; }
auto& slot = (player_id == 0) ? g_controls.gamepad_p1 : g_controls.gamepad_p2;
slot.name = name;
slot.path = path;
GamepadManager::get().assignToPlayer(player_id, name, path);
saveToFile();
}
void setConfigFile(const std::string& path) {
g_config_file_path = path;
}
@@ -548,6 +583,8 @@ namespace Options {
parseWindow(yaml);
parseVideo(yaml);
parseAudio(yaml);
parseControls(yaml);
applyControlsToGamepadManager();
return true;
} catch (const std::exception& e) {
std::cout << "Options: error parsejant config.yaml: " << e.what() << '\n';
@@ -594,7 +631,15 @@ namespace Options {
out << " volume: " << g_audio.music.volume << "\n";
out << " sound:\n";
out << " enabled: " << (g_audio.sound.enabled ? "true" : "false") << "\n";
out << " volume: " << g_audio.sound.volume << "\n";
out << " volume: " << g_audio.sound.volume << "\n\n";
out << "controls:\n";
out << " gamepad_p1:\n";
out << " name: \"" << g_controls.gamepad_p1.name << "\"\n";
out << " path: \"" << g_controls.gamepad_p1.path << "\"\n";
out << " gamepad_p2:\n";
out << " name: \"" << g_controls.gamepad_p2.name << "\"\n";
out << " path: \"" << g_controls.gamepad_p2.path << "\"\n";
return writeFile(g_config_file_path, out.str());
}