#pragma once #include #include // Gestor de skins. Una "skin" és un set complet de gràfics (PNGs + .ani) // emmagatzemat sota `data/skins//gfx/`. El SkinManager: // // * descobreix les skins disponibles escanejant `data/skins/*/skin.yaml`, // * recorda quina skin està activa (`current_id_`), // * composa els paths perquè Asset/Resource sàpiguen on llegir. // // L'arrencada típica és: Director crida `init(executable_path, asset_prefix)` // (escaneja manifests) i acte seguit `setCurrent(Options::settings.skin)`. // Després registra els assets via `Asset::addSkinAware("balloon1.png", ...)` // que utilitza internament `gfxPath()` del SkinManager. // // Per al canvi en calent, Resource crida `setCurrent(new_id)`, després // `Asset::onSkinChanged()` per a actualitzar paths registrats, i recarrega // cada Texture via `reLoadFromPath`. class SkinManager { public: struct SkinInfo { std::string id; // Carpeta dins data/skins/ (ex: "classic") std::string display_name; // Etiqueta visible a la UI (ex: "Classic") std::string gfx_dir; // Subcarpeta amb els gfx (default: "gfx") }; // executable_path: acabat amb '/' (típicament SDL_GetBasePath()). // asset_prefix: prefix relatiu per a paths registrats a Asset // (ex: "" en Linux/Win, "/../Resources" dins el bundle de macOS). static void init(const std::string &executable_path, const std::string &asset_prefix); static void destroy(); static auto get() -> SkinManager *; void scan(); [[nodiscard]] auto available() const -> const std::vector & { return skins_; } [[nodiscard]] auto current() const -> const std::string & { return current_id_; } [[nodiscard]] auto currentDisplayName() const -> std::string; [[nodiscard]] auto displayNameOf(const std::string &id) const -> std::string; [[nodiscard]] auto exists(const std::string &id) const -> bool; void setCurrent(const std::string &id); // Compon el path relatiu d'un gràfic dins la skin activa, amb el format // que Asset::add espera (relatiu amb prefix de plataforma): // "/data/skins///" [[nodiscard]] auto gfxPath(const std::string &basename) const -> std::string; // Cíclic. Si només hi ha una skin, retorna la mateixa. [[nodiscard]] auto nextSkinId() const -> std::string; [[nodiscard]] auto prevSkinId() const -> std::string; private: SkinManager(std::string executable_path, std::string asset_prefix); [[nodiscard]] auto gfxDirOf(const std::string &id) const -> std::string; std::string executable_path_; // Acabat amb '/' (per a scan filesystem) std::string asset_prefix_; // PREFIX per a paths registrats std::vector skins_; std::string current_id_{"classic"}; static SkinManager *instance; };