diff --git a/source/core/config/engine_config.hpp b/source/core/config/engine_config.hpp index 72ae20d..4ba9bec 100644 --- a/source/core/config/engine_config.hpp +++ b/source/core/config/engine_config.hpp @@ -12,7 +12,6 @@ #include -#include #include 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 init_defaults; // Restaura valors per defecte - std::function set_path; // Indica on guardar - std::function load; // Llegeix path → EngineConfig - std::function save; // Escriu EngineConfig → path - }; - } // namespace Config diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index cde1a13..39317b4 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -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 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 i comprovar-los + std::vector args(argv, argv + argc); executable_path_ = checkProgramArguments(args); // Inicialitzar sistema de rutes @@ -95,10 +94,10 @@ Director::Director(std::vector 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 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 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(initial_width, initial_height, cfg_->window.fullscreen, *cfg_, [this] { persistence_.save(); }); + sdl_ = std::make_unique(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 diff --git a/source/core/system/director.hpp b/source/core/system/director.hpp index 158eb26..de4b198 100644 --- a/source/core/system/director.hpp +++ b/source/core/system/director.hpp @@ -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 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 diff --git a/source/game/config_yaml.hpp b/source/game/config_yaml.hpp index 95322b3..79ae832 100644 --- a/source/game/config_yaml.hpp +++ b/source/game/config_yaml.hpp @@ -3,9 +3,9 @@ // // La configuració runtime viu en Config::EngineConfig (core/config/). // Aquest fitxer afegeix una capa de persistència YAML que llegeix i -// escriu aquesta struct a disc. La connexió amb el Director es fa via -// Config::ConfigPersistence (lambdes a `main.cpp`), mantenint `core/` -// agnòstic respecte d'aquesta capa. +// escriu aquesta struct a disc. El Director crida ConfigYaml::* directament +// (init / setConfigFile / loadFromFile / saveToFile): la separació +// core/game queda relaxada al Director, que és EL programa, no part del motor. #pragma once diff --git a/source/main.cpp b/source/main.cpp index 58a7458..2089766 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -1,33 +1,12 @@ // main.cpp - Punt d'entrada de l'aplicació // © 2026 JailDesigner // -// Aquí orquestrem la capa de persistència (YAML via game/ConfigYaml::*) i -// injectem el resultat al Director. El Director queda independent de -// game/config_yaml.hpp i pot operar només amb Config::EngineConfig. +// El Director és EL programa: posseeix la configuració, els subsistemes i +// el bucle. main.cpp només construeix el Director i delega. -#include -#include - -#include "core/config/engine_config.hpp" #include "core/system/director.hpp" -#include "game/config_yaml.hpp" auto main(int argc, char* argv[]) -> int { - // Convertir arguments a std::vector - std::vector args(argv, argv + argc); - - // Capa de persistència delegada: lambdes prim que enllacen el contracte - // de Config::ConfigPersistence amb la implementació YAML de ConfigYaml::*. - const Config::ConfigPersistence PERSISTENCE{ - .init_defaults = [] { ConfigYaml::init(); }, - .set_path = [](const std::string& path) { ConfigYaml::setConfigFile(path); }, - .load = [] { return ConfigYaml::loadFromFile(); }, - .save = [] { return ConfigYaml::saveToFile(); }, - }; - - // El Director rep la struct d'engine_config + la capa de persistència. - // No coneix ConfigYaml:: directament. - Director director(args, ConfigYaml::engine_config, PERSISTENCE); - + Director director(argc, argv); return director.run(); }