refactor(director): migra la persistència ConfigYaml al Director

main.cpp queda només amb 'Director director(argc, argv); return director.run()'.
El Director crida ConfigYaml::* directament; l'struct ConfigPersistence
desapareix de engine_config.hpp. La separació core/game es relaxa al
Director, que és EL programa, no part del motor.
This commit is contained in:
2026-05-22 12:41:05 +02:00
parent 120b8ada38
commit 6b8f6a267d
5 changed files with 23 additions and 59 deletions
-11
View File
@@ -12,7 +12,6 @@
#include <SDL3/SDL.h>
#include <functional>
#include <string>
namespace Config {
@@ -67,14 +66,4 @@ namespace Config {
bool console{false};
};
// Capa de persistència delegada cap a l'EngineConfig. Permet al Director
// orquestrar init/load/save sense conèixer cap esquema concret (YAML,
// SQLite, ...) ni la capa que el conté (`game/config_yaml.cpp`).
struct ConfigPersistence {
std::function<void()> init_defaults; // Restaura valors per defecte
std::function<void(const std::string& path)> set_path; // Indica on guardar
std::function<bool()> load; // Llegeix path → EngineConfig
std::function<bool()> save; // Escriu EngineConfig → path
};
} // namespace Config
+12 -13
View File
@@ -21,6 +21,7 @@
#include "core/system/notifier.hpp"
#include "core/utils/path_utils.hpp"
#include "debug_overlay.hpp"
#include "game/config_yaml.hpp"
#include "game/scenes/game_scene.hpp"
#include "game/scenes/logo_scene.hpp"
#include "game/scenes/title_scene.hpp"
@@ -39,17 +40,15 @@ using SceneManager::SceneContext;
using SceneType = SceneContext::SceneType;
// Constructor
Director::Director(std::vector<std::string> const& args,
Config::EngineConfig& cfg,
Config::ConfigPersistence persistence)
: cfg_(&cfg),
persistence_(std::move(persistence)) {
Director::Director(int argc, char* argv[])
: cfg_(&ConfigYaml::engine_config) {
std::cout << "Orni Attack - Inici\n";
// Inicialitzar opciones con valors per defecte
persistence_.init_defaults();
ConfigYaml::init();
// Comprovar arguments del programa
// Convertir arguments a std::vector<std::string> i comprovar-los
std::vector<std::string> args(argv, argv + argc);
executable_path_ = checkProgramArguments(args);
// Inicialitzar sistema de rutes
@@ -95,10 +94,10 @@ Director::Director(std::vector<std::string> const& args,
createSystemFolder(std::string("jailgames/") + Project::NAME);
// Establir ruta del file de configuración
persistence_.set_path(system_folder_ + "/config.yaml");
ConfigYaml::setConfigFile(system_folder_ + "/config.yaml");
// Carregar o crear configuración
persistence_.load();
ConfigYaml::loadFromFile();
// Inicialitzar sistema de input
Input::init("data/gamecontrollerdb.txt");
@@ -120,7 +119,7 @@ Director::Director(std::vector<std::string> const& args,
Director::~Director() {
// Guardar opciones
persistence_.save();
ConfigYaml::saveToFile();
// Destruir subsistemes en ordre invers a la construcció. Crític: el
// renderer i la finestra (dins de sdl_) han de morir abans de cridar
@@ -153,8 +152,8 @@ auto Director::checkProgramArguments(std::vector<std::string> const& args)
cfg_->console = true;
std::cout << "Mode consola activat\n";
} else if (argument == "--reset-config") {
persistence_.init_defaults();
persistence_.save();
ConfigYaml::init();
ConfigYaml::saveToFile();
std::cout << "Configuración restablida als valors per defecte\n";
}
}
@@ -236,7 +235,7 @@ auto Director::run() -> int {
// Crear gestor SDL amb la engine_config + callback de persistència
// per a quan toggleVSync (F4) muti vsync. Mantenim sdl_manager agnòstic.
sdl_ = std::make_unique<SDLManager>(initial_width, initial_height, cfg_->window.fullscreen, *cfg_, [this] { persistence_.save(); });
sdl_ = std::make_unique<SDLManager>(initial_width, initial_height, cfg_->window.fullscreen, *cfg_, [] { ConfigYaml::saveToFile(); });
// CRÍTIC: Forçar ocultació del cursor DESPRÉS de toda la inicialización SDL
// Això evita que SDL mostre el cursor automàticament durante la creació de la finestra
+5 -8
View File
@@ -17,12 +17,10 @@ namespace System {
class Director {
public:
// `cfg` ha de viure tant com el Director (típicament owned per main).
// `persistence` encapsula init/load/save delegats a la capa concreta
// (game/ConfigYaml::*).
Director(std::vector<std::string> const& args,
Config::EngineConfig& cfg,
Config::ConfigPersistence persistence);
// El Director és el programa: posseeix la configuració (via ConfigYaml)
// i orquestra tots els subsistemes. main.cpp és pur tràmit que el
// construeix i delega cap a SDL.
Director(int argc, char* argv[]);
~Director();
// Bucle principal del juego.
@@ -41,8 +39,7 @@ class Director {
private:
std::string executable_path_;
std::string system_folder_;
Config::EngineConfig* cfg_;
Config::ConfigPersistence persistence_;
Config::EngineConfig* cfg_{nullptr};
// Subsistemes que viuen tant com el Director (abans eren locals de run()).
// Preparació per a la migració a SDL_MAIN_USE_CALLBACKS: amb les 4