treball en curs: correccions de tidy

This commit is contained in:
2026-05-16 17:19:40 +02:00
parent 3421f34a84
commit ee2dd0bc2c
30 changed files with 1220 additions and 1479 deletions
+86 -71
View File
@@ -1,7 +1,5 @@
#include "core/resources/resource.h"
#include <algorithm>
#include <filesystem>
#include <iostream>
#include <sstream>
@@ -15,7 +13,7 @@
// Nota: Asset::get() e Input::get() se consultan en preloadAll y al construir
// los menús; no se guardan punteros en el objeto Resource.
Resource *Resource::instance_ = nullptr;
Resource *Resource::instance = nullptr;
static auto basename(const std::string &path) -> std::string {
return path.substr(path.find_last_of("\\/") + 1);
@@ -31,19 +29,19 @@ static auto stem(const std::string &path) -> std::string {
}
void Resource::init(SDL_Renderer *renderer) {
if (instance_ == nullptr) {
instance_ = new Resource(renderer);
instance_->preloadAll();
if (instance == nullptr) {
instance = new Resource(renderer);
instance->preloadAll();
}
}
void Resource::destroy() {
delete instance_;
instance_ = nullptr;
delete instance;
instance = nullptr;
}
auto Resource::get() -> Resource * {
return instance_;
return instance;
}
Resource::Resource(SDL_Renderer *renderer)
@@ -77,11 +75,17 @@ Resource::~Resource() {
}
void Resource::preloadAll() {
preloadResources();
preloadFonts();
preloadMenus();
}
// Pass 1: texturas, sonidos, músicas y datos (animaciones / demo / menús)
void Resource::preloadResources() {
const auto &items = Asset::get()->getAll();
// Pass 1: texturas, sonidos, músicas, animaciones (raw lines), demo, lenguajes
for (const auto &it : items) {
if (!ResourceHelper::shouldUseResourcePack(it.file) && it.type != t_lang) {
if (!ResourceHelper::shouldUseResourcePack(it.file) && it.type != Asset::Type::LANG) {
// Ficheros absolutos (config.txt, score.bin, systemFolder) — no se precargan
continue;
}
@@ -90,97 +94,108 @@ void Resource::preloadAll() {
continue;
}
const std::string bname = basename(it.file);
const std::string BASE_NAME = basename(it.file);
switch (it.type) {
case t_bitmap: {
case Asset::Type::BITMAP: {
auto *tex = new Texture(renderer_, bytes);
textures_[bname] = tex;
textures_[BASE_NAME] = tex;
break;
}
case t_sound: {
case Asset::Type::SOUND: {
JA_Sound_t *s = JA_LoadSound(bytes.data(), (uint32_t)bytes.size());
if (s != nullptr) {
sounds_[bname] = s;
sounds_[BASE_NAME] = s;
}
break;
}
case t_music: {
case Asset::Type::MUSIC: {
JA_Music_t *m = JA_LoadMusic(bytes.data(), (Uint32)bytes.size());
if (m != nullptr) {
musics_[bname] = m;
musics_[BASE_NAME] = m;
}
break;
}
case t_data: {
if (bname.size() >= 4 && bname.substr(bname.size() - 4) == ".ani") {
std::string content(reinterpret_cast<const char *>(bytes.data()), bytes.size());
std::stringstream ss(content);
std::vector<std::string> lines;
std::string line;
while (std::getline(ss, line)) {
// Normalitza CRLF perquè loadFromVector compari línies amb literals
// ("[animation]", "[/animation]") sense \r residual.
if (!line.empty() && line.back() == '\r') {
line.pop_back();
}
lines.push_back(line);
}
animationLines_[bname] = std::move(lines);
} else if (bname == "demo.bin") {
demoBytes_ = bytes;
} else if (bname.size() >= 4 && bname.substr(bname.size() - 4) == ".men") {
// Menús: se construyen en pass 2 porque dependen de textos y sonidos
}
case Asset::Type::DATA:
loadDataAsset(BASE_NAME, bytes);
break;
}
case t_font: // Fonts: se emparejan en pass 2
case t_lang: // Lenguaje: lo sigue leyendo la clase Lang via ResourceHelper
case Asset::Type::FONT: // Fonts: se emparejan en pass 2
case Asset::Type::LANG: // Lenguaje: lo sigue leyendo la clase Lang via ResourceHelper
default:
break;
}
}
}
// Pass 2: Text (fuentes emparejadas png+txt) y Menus (dependen de Text+sonidos)
// Fuentes: construimos un Text por cada par basename.png + basename.txt
// Acumulamos los bytes encontrados por stem (basename sin ext.)
std::unordered_map<std::string, std::vector<uint8_t>> fontPngs;
std::unordered_map<std::string, std::vector<uint8_t>> fontTxts;
// Despacha un asset Asset::Type::DATA en función de la extensión / nombre
void Resource::loadDataAsset(const std::string &bname, const std::vector<uint8_t> &bytes) {
if (bname.size() >= 4 && bname.substr(bname.size() - 4) == ".ani") {
std::string content(reinterpret_cast<const char *>(bytes.data()), bytes.size());
std::stringstream ss(content);
std::vector<std::string> lines;
std::string line;
while (std::getline(ss, line)) {
// Normalitza CRLF perquè loadFromVector compari línies amb literals
// ("[animation]", "[/animation]") sense \r residual.
if (!line.empty() && line.back() == '\r') {
line.pop_back();
}
lines.push_back(line);
}
animation_lines_[bname] = std::move(lines);
} else if (bname == "demo.bin") {
demo_bytes_ = bytes;
}
// Menús (.men): se construyen en pass 2 porque dependen de textos y sonidos
}
// Pass 2a: construye Text por cada par basename.png + basename.txt
void Resource::preloadFonts() {
const auto &items = Asset::get()->getAll();
std::unordered_map<std::string, std::vector<uint8_t>> font_pngs;
std::unordered_map<std::string, std::vector<uint8_t>> font_txts;
for (const auto &it : items) {
if (it.type != t_font) {
if (it.type != Asset::Type::FONT) {
continue;
}
auto bytes = ResourceHelper::loadFile(it.file);
if (bytes.empty()) {
continue;
}
const std::string s = stem(it.file);
const std::string bname = basename(it.file);
if (bname.size() >= 4 && bname.substr(bname.size() - 4) == ".png") {
fontPngs[s] = std::move(bytes);
} else if (bname.size() >= 4 && bname.substr(bname.size() - 4) == ".txt") {
fontTxts[s] = std::move(bytes);
const std::string S = stem(it.file);
const std::string BASE_NAME = basename(it.file);
if (BASE_NAME.size() >= 4 && BASE_NAME.substr(BASE_NAME.size() - 4) == ".png") {
font_pngs[S] = std::move(bytes);
} else if (BASE_NAME.size() >= 4 && BASE_NAME.substr(BASE_NAME.size() - 4) == ".txt") {
font_txts[S] = std::move(bytes);
}
}
for (const auto &[s, png] : fontPngs) {
auto itTxt = fontTxts.find(s);
if (itTxt == fontTxts.end()) {
for (const auto &[s, png] : font_pngs) {
auto it_txt = font_txts.find(s);
if (it_txt == font_txts.end()) {
continue;
}
Text *t = new Text(png, itTxt->second, renderer_);
Text *t = new Text(png, it_txt->second, renderer_);
texts_[s] = t;
}
}
// Pass 2b: construye los Menu (dependen de Text+sonidos cargados antes)
//
// NOTA: Menu::loadFromBytes aún llama internamente a asset->get() y Text/
// JA_LoadSound por path. Funciona en modo fallback; en pack estricto requiere
// que Menu se adapte a cargar desde ResourceHelper. Migración pendiente.
void Resource::preloadMenus() {
const auto &items = Asset::get()->getAll();
// Menus: usan aún Menu::loadFromBytes que internamente llama a asset->get() y
// Text/JA_LoadSound por path. Funciona en modo fallback; en pack estricto
// requiere que Menu se adapte a cargar desde ResourceHelper. Por ahora
// lo dejamos así y será una migración del paso 7.
for (const auto &it : items) {
if (it.type != t_data) {
if (it.type != Asset::Type::DATA) {
continue;
}
const std::string bname = basename(it.file);
if (bname.size() < 4 || bname.substr(bname.size() - 4) != ".men") {
const std::string BASE_NAME = basename(it.file);
if (BASE_NAME.size() < 4 || BASE_NAME.substr(BASE_NAME.size() - 4) != ".men") {
continue;
}
auto bytes = ResourceHelper::loadFile(it.file);
@@ -188,9 +203,9 @@ void Resource::preloadAll() {
continue;
}
Menu *m = new Menu(renderer_, "");
m->loadFromBytes(bytes, bname);
const std::string s = stem(it.file);
menus_[s] = m;
m->loadFromBytes(bytes, BASE_NAME);
const std::string S = stem(it.file);
menus_[S] = m;
}
}
@@ -222,11 +237,11 @@ auto Resource::getMusic(const std::string &name) -> JA_Music_t * {
}
auto Resource::getAnimationLines(const std::string &name) -> std::vector<std::string> & {
auto it = animationLines_.find(name);
if (it == animationLines_.end()) {
static std::vector<std::string> empty;
auto it = animation_lines_.find(name);
if (it == animation_lines_.end()) {
static std::vector<std::string> empty_;
std::cerr << "Resource::getAnimationLines: missing " << name << '\n';
return empty;
return empty_;
}
return it->second;
}