Files
aee-arcade/source/core/resources/resource_cache.cpp
T
JailDesignerandClaude Opus 4.7 6e99fd0a8b refactor(log): migra core/resources i core/system a Log::
- resource_pack.cpp i resource_cache.cpp: tots els std::cerr passen a
  Log::error.
- director.cpp: std::cout/cerr/fprintf → Log::info / error / critical
  segons severitat.
- printWithDots (utils.cpp): ara és un wrapper sobre Log::info que
  manté l'amplada total (~50 chars) reproduint l'alineació de punts.
  Els callers pasen el tag sense " : " (ja l'afegeix el logger).
- pack_resources: afegit log.cpp i SDL3 al target perquè
  resource_pack.cpp ara depèn de Log::.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 09:10:03 +02:00

126 lines
5.1 KiB
C++

#include "core/resources/resource_cache.hpp"
#include <algorithm>
#include <stdexcept>
#include "core/audio/jail_audio.hpp"
#include "core/resources/palette_loader.hpp"
#include "core/resources/resource_helper.hpp"
#include "utils/log.hpp"
#include "utils/utils.hpp"
// Deleters dels recursos d'àudio: necessiten veure el tipus complet de
// Ja::Music / Ja::Sound (definits a jail_audio.hpp), per això van ací.
void MusicDeleter::operator()(Ja::Music* music) const noexcept {
if (music != nullptr) { Ja::deleteMusic(music); }
}
void SoundDeleter::operator()(Ja::Sound* sound) const noexcept {
if (sound != nullptr) { Ja::deleteSound(sound); }
}
namespace Resource {
auto Cache::get() -> Cache& {
static Cache instance_;
return instance_;
}
void Cache::loadSurface(const std::string& name, const std::string& file_path) {
auto surface = std::make_shared<Surface>(file_path);
surfaces_.emplace_back(SurfaceResource{.name = name, .surface = std::move(surface)});
}
void Cache::loadAnimation(const std::string& name, const std::string& file_path) {
auto bytes = Helper::loadFile(file_path);
if (bytes.empty()) {
throw std::runtime_error("Cache: cannot load animation " + file_path);
}
animations_.emplace_back(AnimationResource{.name = name, .yaml_data = std::move(bytes)});
printWithDots("Animation", getFileName(file_path), "[ LOADED ]");
}
void Cache::loadPalette(const std::string& name, const std::string& file_path) {
auto palette = PaletteLoader::loadFromFile(file_path);
palettes_.emplace_back(PaletteResource{.name = name, .palette = palette});
printWithDots("Palette", getFileName(file_path), "[ LOADED ]");
}
auto Cache::getSurface(const std::string& name) -> std::shared_ptr<Surface> {
auto it = std::ranges::find_if(surfaces_, [&name](const auto& s) { return s.name == name; });
if (it == surfaces_.end()) {
Log::error("Cache", "surface not found: {}", name);
throw std::runtime_error("Surface not found: " + name);
}
return it->surface;
}
auto Cache::getAnimationData(const std::string& name) -> const AnimationResource& {
auto it = std::ranges::find_if(animations_, [&name](const auto& a) { return a.name == name; });
if (it == animations_.end()) {
Log::error("Cache", "animation not found: {}", name);
throw std::runtime_error("Animation not found: " + name);
}
return *it;
}
auto Cache::getPalette(const std::string& name) -> const Palette& {
auto it = std::ranges::find_if(palettes_, [&name](const auto& p) { return p.name == name; });
if (it == palettes_.end()) {
Log::error("Cache", "palette not found: {}", name);
throw std::runtime_error("Palette not found: " + name);
}
return it->palette;
}
void Cache::loadMusic(const std::string& name, const std::string& file_path) {
auto bytes = Helper::loadFile(file_path);
if (bytes.empty()) {
throw std::runtime_error("Cache: cannot load music " + file_path);
}
Ja::Music* raw = Ja::loadMusic(bytes.data(), static_cast<Uint32>(bytes.size()), file_path.c_str());
if (raw == nullptr) {
throw std::runtime_error("Cache: Ja::loadMusic failed for " + file_path);
}
musics_.emplace_back(MusicResource{.name = name, .music = std::unique_ptr<Ja::Music, MusicDeleter>(raw)});
printWithDots("Music", getFileName(file_path), "[ LOADED ]");
}
void Cache::loadSound(const std::string& name, const std::string& file_path) {
auto bytes = Helper::loadFile(file_path);
if (bytes.empty()) {
throw std::runtime_error("Cache: cannot load sound " + file_path);
}
Ja::Sound* raw = Ja::loadSound(bytes.data(), static_cast<std::uint32_t>(bytes.size()));
if (raw == nullptr) {
throw std::runtime_error("Cache: Ja::loadSound failed for " + file_path);
}
sounds_.emplace_back(SoundResource{.name = name, .sound = std::unique_ptr<Ja::Sound, SoundDeleter>(raw)});
printWithDots("Sound", getFileName(file_path), "[ LOADED ]");
}
auto Cache::getMusic(const std::string& name) -> Ja::Music* {
auto it = std::ranges::find_if(musics_, [&name](const auto& m) { return m.name == name; });
if (it == musics_.end()) {
Log::error("Cache", "music not found: {}", name);
throw std::runtime_error("Music not found: " + name);
}
return it->music.get();
}
auto Cache::getSound(const std::string& name) -> Ja::Sound* {
auto it = std::ranges::find_if(sounds_, [&name](const auto& s) { return s.name == name; });
if (it == sounds_.end()) {
Log::error("Cache", "sound not found: {}", name);
throw std::runtime_error("Sound not found: " + name);
}
return it->sound.get();
}
void Cache::clearAudio() {
musics_.clear();
sounds_.clear();
}
} // namespace Resource