skins: SkinManager + hot-swap (F7), classic/nes a data/skins/

This commit is contained in:
2026-05-17 19:54:07 +02:00
parent a40931c7ca
commit ebfcad6f22
125 changed files with 962 additions and 76 deletions
+40
View File
@@ -8,6 +8,8 @@
#include "core/rendering/texture.h"
#include "core/resources/asset.h"
#include "core/resources/resource_helper.h"
#include "core/resources/skin_manager.hpp"
#include "game/options.hpp"
#include "game/ui/menu.h"
// Nota: Asset::get() e Input::get() se consultan en preloadAll y al construir
@@ -263,3 +265,41 @@ auto Resource::getMenu(const std::string &name) -> Menu * {
}
return it->second;
}
void Resource::reloadForSkin(const std::string &skin_id) {
if (SkinManager::get() == nullptr || !SkinManager::get()->exists(skin_id)) {
return;
}
SkinManager::get()->setCurrent(skin_id);
Asset::get()->onSkinChanged();
// Recarrega cada textura cachejada des del nou path mantenint pointer
// identity perquè els Sprites no s'invaliden.
for (auto &[bname, tex] : textures_) {
const std::string NEW_PATH = Asset::get()->get(bname);
if (!NEW_PATH.empty()) {
tex->reLoadFromPath(NEW_PATH);
}
}
// Re-parseja els fitxers .ani de la nova skin.
for (auto &[bname, lines] : animation_lines_) {
const std::string NEW_PATH = Asset::get()->get(bname);
if (NEW_PATH.empty()) { continue; }
auto bytes = ResourceHelper::loadFile(NEW_PATH);
if (bytes.empty()) { continue; }
std::string content(reinterpret_cast<const char *>(bytes.data()), bytes.size());
std::stringstream ss(content);
std::vector<std::string> new_lines;
std::string line;
while (std::getline(ss, line)) {
if (!line.empty() && line.back() == '\r') { line.pop_back(); }
new_lines.push_back(line);
}
lines = std::move(new_lines);
}
Options::settings.skin = skin_id;
Options::saveToFile();
}