From 6e99fd0a8be2f5310b76662e5c6cdafb525487e0 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 8 May 2026 09:10:03 +0200 Subject: [PATCH] refactor(log): migra core/resources i core/system a Log:: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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) --- CMakeLists.txt | 2 ++ source/core/rendering/surface.cpp | 2 +- source/core/rendering/text.cpp | 2 +- source/core/resources/resource_cache.cpp | 20 ++++++++++---------- source/core/resources/resource_pack.cpp | 19 ++++++++++--------- source/core/system/director.cpp | 24 +++++++++++------------- source/utils/utils.cpp | 22 +++++++++++++--------- source/utils/utils.hpp | 4 +++- 8 files changed, 51 insertions(+), 44 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 396154b..537e2be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -219,8 +219,10 @@ target_link_libraries(${PROJECT_NAME} PRIVATE SDL3::SDL3) add_executable(pack_resources EXCLUDE_FROM_ALL tools/pack_resources/pack_resources.cpp source/core/resources/resource_pack.cpp + source/utils/log.cpp ) target_include_directories(pack_resources PRIVATE "${CMAKE_SOURCE_DIR}/source") +target_link_libraries(pack_resources PRIVATE SDL3::SDL3) target_compile_options(pack_resources PRIVATE -Wall -Wextra -Wpedantic) # --- REGENERACIÓ AUTOMÀTICA DE build/resources.pack --- diff --git a/source/core/rendering/surface.cpp b/source/core/rendering/surface.cpp index f0a12a6..ded56a8 100644 --- a/source/core/rendering/surface.cpp +++ b/source/core/rendering/surface.cpp @@ -63,7 +63,7 @@ Surface::Surface(const std::string& file_path) { palette_[i] = Rendering::OPAQUE_ALPHA | rgb[i]; } - printWithDots("Surface : ", getFileName(file_path), "[ LOADED ]"); + printWithDots("Surface", getFileName(file_path), "[ LOADED ]"); } void Surface::clear(Uint8 color) { diff --git a/source/core/rendering/text.cpp b/source/core/rendering/text.cpp index 5cc266d..6d04718 100644 --- a/source/core/rendering/text.cpp +++ b/source/core/rendering/text.cpp @@ -101,7 +101,7 @@ auto Text::loadTextFile(const std::string& file_path) -> std::shared_ptr { } } - printWithDots("Text File : ", getFileName(file_path), "[ LOADED ]"); + printWithDots("Text File", getFileName(file_path), "[ LOADED ]"); return tf; } diff --git a/source/core/resources/resource_cache.cpp b/source/core/resources/resource_cache.cpp index 6856345..02b0a6b 100644 --- a/source/core/resources/resource_cache.cpp +++ b/source/core/resources/resource_cache.cpp @@ -1,12 +1,12 @@ #include "core/resources/resource_cache.hpp" #include -#include #include #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 @@ -37,19 +37,19 @@ namespace Resource { 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 ]"); + 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 ]"); + printWithDots("Palette", getFileName(file_path), "[ LOADED ]"); } auto Cache::getSurface(const std::string& name) -> std::shared_ptr { auto it = std::ranges::find_if(surfaces_, [&name](const auto& s) { return s.name == name; }); if (it == surfaces_.end()) { - std::cerr << "Cache: surface not found: " << name << '\n'; + Log::error("Cache", "surface not found: {}", name); throw std::runtime_error("Surface not found: " + name); } return it->surface; @@ -58,7 +58,7 @@ namespace Resource { 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()) { - std::cerr << "Cache: animation not found: " << name << '\n'; + Log::error("Cache", "animation not found: {}", name); throw std::runtime_error("Animation not found: " + name); } return *it; @@ -67,7 +67,7 @@ namespace Resource { 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()) { - std::cerr << "Cache: palette not found: " << name << '\n'; + Log::error("Cache", "palette not found: {}", name); throw std::runtime_error("Palette not found: " + name); } return it->palette; @@ -83,7 +83,7 @@ namespace Resource { throw std::runtime_error("Cache: Ja::loadMusic failed for " + file_path); } musics_.emplace_back(MusicResource{.name = name, .music = std::unique_ptr(raw)}); - printWithDots("Music : ", getFileName(file_path), "[ LOADED ]"); + printWithDots("Music", getFileName(file_path), "[ LOADED ]"); } void Cache::loadSound(const std::string& name, const std::string& file_path) { @@ -96,13 +96,13 @@ namespace Resource { throw std::runtime_error("Cache: Ja::loadSound failed for " + file_path); } sounds_.emplace_back(SoundResource{.name = name, .sound = std::unique_ptr(raw)}); - printWithDots("Sound : ", getFileName(file_path), "[ LOADED ]"); + 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()) { - std::cerr << "Cache: music not found: " << name << '\n'; + Log::error("Cache", "music not found: {}", name); throw std::runtime_error("Music not found: " + name); } return it->music.get(); @@ -111,7 +111,7 @@ namespace Resource { 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()) { - std::cerr << "Cache: sound not found: " << name << '\n'; + Log::error("Cache", "sound not found: {}", name); throw std::runtime_error("Sound not found: " + name); } return it->sound.get(); diff --git a/source/core/resources/resource_pack.cpp b/source/core/resources/resource_pack.cpp index ce3db93..ef981fc 100644 --- a/source/core/resources/resource_pack.cpp +++ b/source/core/resources/resource_pack.cpp @@ -4,7 +4,8 @@ #include #include #include -#include + +#include "utils/log.hpp" namespace Resource { @@ -40,14 +41,14 @@ namespace Resource { std::array header{}; file.read(header.data(), 4); if (std::string(header.data(), 4) != MAGIC) { - std::cerr << "Resource::Pack: invalid pack file format (bad magic): " << pack_file << '\n'; + Log::error("Resource::Pack", "invalid pack file format (bad magic): {}", pack_file); return false; } std::uint32_t version = 0; file.read(reinterpret_cast(&version), sizeof(version)); if (version != VERSION) { - std::cerr << "Resource::Pack: unsupported pack version: " << version << '\n'; + Log::error("Resource::Pack", "unsupported pack version: {}", version); return false; } @@ -86,7 +87,7 @@ namespace Resource { auto Pack::savePack(const std::string& pack_file) const -> bool { std::ofstream file(pack_file, std::ios::binary); if (!file) { - std::cerr << "Resource::Pack: could not create pack file: " << pack_file << '\n'; + Log::error("Resource::Pack", "could not create pack file: {}", pack_file); return false; } @@ -120,7 +121,7 @@ namespace Resource { auto Pack::addFile(const std::string& filename, const std::string& filepath) -> bool { std::ifstream file(filepath, std::ios::binary | std::ios::ate); if (!file) { - std::cerr << "Resource::Pack: could not open file: " << filepath << '\n'; + Log::error("Resource::Pack", "could not open file: {}", filepath); return false; } @@ -129,7 +130,7 @@ namespace Resource { std::vector file_data(file_size); if (!file.read(reinterpret_cast(file_data.data()), file_size)) { - std::cerr << "Resource::Pack: could not read file: " << filepath << '\n'; + Log::error("Resource::Pack", "could not read file: {}", filepath); return false; } @@ -146,7 +147,7 @@ namespace Resource { auto Pack::addDirectory(const std::string& directory) -> bool { if (!std::filesystem::exists(directory)) { - std::cerr << "Resource::Pack: directory does not exist: " << directory << '\n'; + Log::error("Resource::Pack", "directory does not exist: {}", directory); return false; } @@ -169,7 +170,7 @@ namespace Resource { const PackEntry& entry = it->second; if (entry.offset + entry.size > data_.size()) { - std::cerr << "Resource::Pack: invalid resource data: " << filename << '\n'; + Log::error("Resource::Pack", "invalid resource data: {}", filename); return {}; } @@ -179,7 +180,7 @@ namespace Resource { std::uint32_t checksum = calculateChecksum(result); if (checksum != entry.checksum) { - std::cerr << "Resource::Pack: checksum mismatch for: " << filename << '\n'; + Log::error("Resource::Pack", "checksum mismatch for: {}", filename); } return result; } diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index ede5663..c8f76d5 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -4,10 +4,8 @@ #include #include -#include #include #include -#include #include #include #include @@ -42,10 +40,11 @@ #include "game/scenes/title_scene.hpp" #include "game/ui/service_menu.hpp" #include "utils/defaults.hpp" +#include "utils/log.hpp" Director::Director() { if (!SDL_Init(0)) { - std::fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError()); + Log::critical("Director", "SDL_Init failed: {}", SDL_GetError()); } // Sistema de recursos: el pack viu al costat del binari (build/), el @@ -66,7 +65,7 @@ Director::Director() { constexpr bool ENABLE_FALLBACK = false; #endif if (!Resource::Helper::initializeResourceSystem(pack_file, ENABLE_FALLBACK)) { - std::fprintf(stderr, "Director: sistema de recursos no disponible; avortem\n"); + Log::critical("Director", "sistema de recursos no disponible; avortem"); std::exit(1); } @@ -85,7 +84,7 @@ Director::Director() { Options::setConfigFile(system_folder_ + "config.yaml"); if (!Options::loadFromFile()) { - std::cerr << "Director: no s'ha pogut carregar ni desar config.yaml a " << system_folder_ << '\n'; + Log::error("Director", "no s'ha pogut carregar ni desar config.yaml a {}", system_folder_); } // Vinculacions de mando per dispositiu — fitxer aïllat de `config.yaml` @@ -97,12 +96,12 @@ Director::Director() { // es crea amb presets per defecte (off, crt, ntsc). Options::setPostFXFile(system_folder_ + Defaults::Video::POSTFX_FILE); if (!Options::loadPostFXFromFile()) { - std::cerr << "Director: no s'ha pogut carregar ni desar postfx.yaml.\n"; + Log::error("Director", "no s'ha pogut carregar ni desar postfx.yaml."); } // Presets del shader CRT-Pi (shaders/crtpi.yaml). Options::setCrtPiFile(system_folder_ + Defaults::Video::CRTPI_FILE); if (!Options::loadCrtPiFromFile()) { - std::cerr << "Director: no s'ha pogut carregar ni desar crtpi.yaml.\n"; + Log::error("Director", "no s'ha pogut carregar ni desar crtpi.yaml."); } // Screen es configura ara (subsystem + finestra + GPU/renderer); la seua @@ -295,8 +294,7 @@ Director::Director() { const auto START = DebugConfig::StartScene::LOGO; const auto STARTING_PLAYERS = DebugConfig::StartingPlayers::BOTH; #endif - std::cout << "Director: start_scene=" << DebugConfig::toString(START) - << " starting_players=" << DebugConfig::toString(STARTING_PLAYERS) << '\n'; + Log::info("Director", "start_scene={} starting_players={}", DebugConfig::toString(START), DebugConfig::toString(STARTING_PLAYERS)); switch (START) { case DebugConfig::StartScene::LOGO: @@ -351,7 +349,7 @@ void Director::createSystemFolder() { // Subcarpeta per als presets de shaders. std::filesystem és tolerant si ja existeix. std::filesystem::create_directories(system_folder_ + "shaders/", error); if (error) { - std::cerr << "Director: no s'ha pogut crear " << system_folder_ << ": " << error.message() << '\n'; + Log::error("Director", "no s'ha pogut crear {}: {}", system_folder_, error.message()); } } @@ -433,7 +431,7 @@ void Director::switchSceneIfRequested() { // l'escena en aquest mateix frame — l'usuari ha cancel·lat l'estat // de joc explícitament i no ens interessa mantenir-ne la sortida. if (auto menu_req = ServiceMenu::get().takePendingSceneRequest(); menu_req.has_value()) { - std::cout << "Director: scene transition (menu) → " << toString(menu_req->next) << '\n'; + Log::info("Director", "scene transition (menu) → {}", toString(menu_req->next)); current_scene_ = buildScene(menu_req->next, menu_req->params); return; } @@ -445,10 +443,10 @@ void Director::switchSceneIfRequested() { if (!request.has_value()) { return; } try { const auto& req = std::any_cast(request); - std::cout << "Director: scene transition → " << toString(req.next) << '\n'; + Log::info("Director", "scene transition → {}", toString(req.next)); current_scene_ = buildScene(req.next, req.params); } catch (const std::bad_any_cast&) { - std::cerr << "Director: exit_request_ amb tipus inesperat — ignorant\n"; + Log::error("Director", "exit_request_ amb tipus inesperat — ignorant"); } } diff --git a/source/utils/utils.cpp b/source/utils/utils.cpp index a9df72c..f1d5bd4 100644 --- a/source/utils/utils.cpp +++ b/source/utils/utils.cpp @@ -1,18 +1,22 @@ #include "utils/utils.hpp" #include -#include -#include +#include + +#include "utils/log.hpp" auto getFileName(const std::string& path) -> std::string { return std::filesystem::path(path).filename().string(); } -void printWithDots(const std::string& text1, const std::string& text2, const std::string& text3) { - std::cout.setf(std::ios::left, std::ios::adjustfield); - std::cout << text1; - std::cout.width(50 - text1.length() - text3.length()); - std::cout.fill('.'); - std::cout << text2; - std::cout << text3 << '\n'; +void printWithDots(const std::string& tag, const std::string& filename, const std::string& status) { + // Reprodueix l'alineació històrica (amplada total ≈ 50). El logger anteposa + // automàticament "tag: ", per això aquí només componem el cos. + constexpr std::size_t TOTAL_WIDTH = 50; + const std::size_t PREFIX_LEN = tag.size() + 2; // "{tag}: " + const std::size_t USED = PREFIX_LEN + status.size(); + const std::size_t FIELD = (USED < TOTAL_WIDTH) ? (TOTAL_WIDTH - USED) : 0; + std::string body = filename; + if (body.size() < FIELD) { body.resize(FIELD, '.'); } + Log::info(tag, "{}{}", body, status); } diff --git a/source/utils/utils.hpp b/source/utils/utils.hpp index e4ae815..ce6561a 100644 --- a/source/utils/utils.hpp +++ b/source/utils/utils.hpp @@ -3,4 +3,6 @@ #include auto getFileName(const std::string& path) -> std::string; -void printWithDots(const std::string& text1, const std::string& text2, const std::string& text3); +// Línia de càrrega amb alineació de punts: "{tag}: filename..........{status}". +// Embolcalla `Log::info`, amb la qual cosa respecta `AEE_LOG`. +void printWithDots(const std::string& tag, const std::string& filename, const std::string& status);