fix(editor): preferDisk en Debug + reload de sala al entrar i sortir

This commit is contained in:
JailDesigner committed 2026-05-02 12:20:16 +02:00
1 parent 2a78c78e77
commit d13313503c
4 files changed
+106 -15

No files matched your search

+45 -6
View File
@@ -15,12 +15,18 @@ namespace Resource::Helper {
Pack g_pack;
bool g_pack_loaded = false;
bool g_fallback_enabled = true;
// Inverteix la prioritat (disc abans que pack). Activat en Debug
// per defecte; veure setPreferDisk al header.
bool g_prefer_disk = false;
auto readFromDisk(const std::string& filepath) -> std::vector<std::uint8_t> {
auto readFromDisk(const std::string& filepath, bool verbose = true) -> std::vector<std::uint8_t> {
const auto FULL = resolve(filepath);
std::ifstream file(FULL, std::ios::binary | std::ios::ate);
if (!file) {
std::cerr << "Resource::Helper: cannot open " << FULL << '\n';
// Silenciem si veníem de prefer_disk: aleshores caurem
// al pack i no és cap error real que el fitxer no estigui
// al disc.
if (verbose) { std::cerr << "Resource::Helper: cannot open " << FULL << '\n'; }
return {};
}
std::streamsize size = file.tellg();
@@ -37,6 +43,11 @@ namespace Resource::Helper {
auto initializeResourceSystem(const std::string& pack_file, bool enable_fallback) -> bool {
g_fallback_enabled = enable_fallback;
// En el flux Debug típic (fallback actiu, source tree disponible)
// preferim sempre disc: el desenvolupador edita YAML/GIF a `data/`
// i ho veu reflectit al següent reload sense re-packejar. En
// Release el fallback està desactivat i aquest flag és inert.
g_prefer_disk = enable_fallback;
g_pack_loaded = g_pack.loadPack(pack_file);
if (g_pack_loaded) {
@@ -76,17 +87,45 @@ namespace Resource::Helper {
}
auto loadFile(const std::string& filepath) -> std::vector<std::uint8_t> {
if (g_pack_loaded) {
// El pack està indexat relatiu a `data/` (la carpeta que
// s'empaqueta), però els callers passen "data/foo.yaml" amb
// prefix. Fem el strip ací perquè no hagin de tenir-ho en compte.
// Helper local: lookup al pack normalitzant la clau (els callers
// passen "data/foo.yaml" però l'índex del pack és relatiu a la
// carpeta `data/`).
const auto FROM_PACK = [&filepath]() -> std::vector<std::uint8_t> {
if (!g_pack_loaded) { return {}; }
constexpr std::string_view PREFIX = "data/";
std::string key = filepath;
if (key.starts_with(PREFIX)) { key.erase(0, PREFIX.size()); }
if (g_pack.hasResource(key)) { return g_pack.getResource(key); }
return {};
};
if (g_prefer_disk && g_fallback_enabled) {
// En Debug volem que el disc guanyi: així les edicions del
// editor in-game (i les manuals del repo) es vegen al pròxim
// reload sense rebuild del pack. Si el fitxer no és al disc,
// caiem al pack — útil per a recursos que només s'han
// empaquetat (cas estrany). El silenci a `readFromDisk` evita
// emplenar el log amb "cannot open" en aquest camí esperat.
auto bytes = readFromDisk(filepath, false);
if (!bytes.empty()) { return bytes; }
return FROM_PACK();
}
// Política original: pack primer; disc com a fallback si el
// recurs no està empaquetat (típic d'arrencada en Debug abans
// del primer pack).
auto packed = FROM_PACK();
if (!packed.empty()) { return packed; }
if (g_fallback_enabled) { return readFromDisk(filepath); }
return {};
}
void setPreferDisk(bool prefer) {
g_prefer_disk = prefer;
}
auto preferDisk() -> bool {
return g_prefer_disk;
}
} // namespace Resource::Helper
+11 -1
View File
@@ -32,7 +32,17 @@ namespace Resource::Helper {
// Carrega un recurs pel seu camí relatiu (p.ex. "fonts/hud.gif",
// "input/keys.yaml"). Prova primer el pack; si no hi és i el fallback
// està actiu, cau a disc (data root + ruta). Retorna vector buit si
// no el troba.
// no el troba. Si `preferDisk()` és true (Debug), inverteix la
// prioritat: prova disc abans del pack.
auto loadFile(const std::string& filepath) -> std::vector<std::uint8_t>;
// Inverteix la prioritat de `loadFile` (disc abans que pack). En Debug
// s'activa per defecte al `initializeResourceSystem` perquè cada
// canvi al YAML/GIF al source tree es vegi sense re-packejar — és el
// que necessita l'editor in-game per veure les seues edicions
// immediatament al recarregar la sala. En Release no té efecte
// (el fallback està desactivat).
void setPreferDisk(bool prefer);
[[nodiscard]] auto preferDisk() -> bool;
} // namespace Resource::Helper