config/ dins del pack: assets, params, stages, pools, formations

This commit is contained in:
2026-05-17 08:38:46 +02:00
parent a39cd45bf1
commit 0d14e10de5
18 changed files with 95 additions and 2282 deletions
+8 -4
View File
@@ -20,10 +20,14 @@
#include "core/rendering/text.hpp" // Para Text
#include "core/rendering/texture.hpp" // Para Texture
#include "core/resources/asset.hpp" // Para Asset
#include "game/options.hpp" // Para Video, video, Window, window
#include "game/ui/notifier.hpp" // Para Notifier
#include "game/ui/service_menu.hpp" // Para ServiceMenu
#include "utils/param.hpp" // Para Param, param, ParamGame, ParamDebug
#ifdef _DEBUG
#include "core/resources/resource.hpp" // Para Resource (només a debug, font 8bithud)
#include "core/system/director.hpp" // Para Director::debug_config (només a debug)
#endif
#include "game/options.hpp" // Para Video, video, Window, window
#include "game/ui/notifier.hpp" // Para Notifier
#include "game/ui/service_menu.hpp" // Para ServiceMenu
#include "utils/param.hpp" // Para Param, param, ParamGame, ParamDebug
// Singleton
Screen* Screen::instance = nullptr;
+17 -7
View File
@@ -47,27 +47,39 @@ void Asset::add(const std::string& file_path, Type type, bool required, bool abs
addToMap(file_path, type, required, absolute);
}
// Carga recursos desde un archivo de configuración con soporte para variables
// Carga recursos desde un archivo de configuración en el filesystem
void Asset::loadFromFile(const std::string& config_file_path, const std::string& prefix, const std::string& system_folder) {
std::ifstream file(config_file_path);
if (!file.is_open()) {
std::cout << "Error: Cannot open config file: " << config_file_path << '\n';
return;
}
parseConfigStream(file, prefix, system_folder);
}
// Carga recursos desde un buffer en memoria (p.ex. obtenido del pack)
void Asset::loadFromBuffer(const std::vector<uint8_t>& buffer, const std::string& prefix, const std::string& system_folder) {
if (buffer.empty()) {
std::cout << "Error: Asset index buffer is empty" << '\n';
return;
}
std::string content(buffer.begin(), buffer.end());
std::istringstream stream(content);
parseConfigStream(stream, prefix, system_folder);
}
// Parsea el contenido del índice (formato común a loadFromFile y loadFromBuffer)
void Asset::parseConfigStream(std::istream& stream, const std::string& prefix, const std::string& system_folder) {
std::string line;
int line_number = 0;
while (std::getline(file, line)) {
while (std::getline(stream, line)) {
++line_number;
// Limpiar espacios en blanco al principio y final
line.erase(0, line.find_first_not_of(" \t\r"));
line.erase(line.find_last_not_of(" \t\r") + 1);
// DEBUG: mostrar línea leída (opcional, puedes comentar esta línea)
// SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Line %d: '%s'", line_number, line.c_str());
// Ignorar líneas vacías y comentarios
if (line.empty() || line[0] == '#' || line[0] == ';') {
continue;
@@ -114,8 +126,6 @@ void Asset::loadFromFile(const std::string& config_file_path, const std::string&
std::cout << "Error parsing line " << line_number << " in config file: " << e.what() << '\n';
}
}
file.close();
}
// Devuelve la ruta completa a un fichero (búsqueda O(1))
+4 -1
View File
@@ -1,6 +1,7 @@
#pragma once
#include <cstdint> // Para uint8_t
#include <iosfwd> // Para istream (forward decl)
#include <string> // Para string
#include <unordered_map> // Para unordered_map
#include <utility> // Para move
@@ -32,7 +33,8 @@ class Asset {
// --- Métodos para la gestión de recursos ---
void add(const std::string& file_path, Type type, bool required = true, bool absolute = false);
void loadFromFile(const std::string& config_file_path, const std::string& prefix = "", const std::string& system_folder = ""); // Con soporte para variables
void loadFromFile(const std::string& config_file_path, const std::string& prefix = "", const std::string& system_folder = ""); // Carga el índice desde el filesystem
void loadFromBuffer(const std::vector<uint8_t>& buffer, const std::string& prefix = "", const std::string& system_folder = ""); // Carga el índice desde memoria (p.ex. desde el pack)
[[nodiscard]] auto getPath(const std::string& filename) const -> std::string;
[[nodiscard]] auto loadData(const std::string& filename) const -> std::vector<uint8_t>; // Carga datos del archivo
[[nodiscard]] auto check() const -> bool;
@@ -63,6 +65,7 @@ class Asset {
void addToMap(const std::string& file_path, Type type, bool required, bool absolute); // Añade archivo al mapa
[[nodiscard]] static auto replaceVariables(const std::string& path, const std::string& prefix, const std::string& system_folder) -> std::string; // Reemplaza variables en la ruta
static auto parseOptions(const std::string& options, bool& required, bool& absolute) -> void; // Parsea opciones
void parseConfigStream(std::istream& stream, const std::string& prefix, const std::string& system_folder); // Lógica común de parseo del índice
// --- Constructores y destructor privados (singleton) ---
explicit Asset(std::string executable_path) // Constructor privado
+6 -15
View File
@@ -88,20 +88,11 @@ auto AssetIntegrated::getSystemPath(const std::string& filename) -> std::string
}
auto AssetIntegrated::shouldUseResourcePack(const std::string& filepath) -> bool {
// Los archivos que NO van al pack:
// - Archivos de config/ (ahora están fuera de data/)
// - Archivos con absolute=true en assets.txt
// - Archivos de sistema (${SYSTEM_FOLDER})
// Els fitxers que NO van al pack:
// - Fitxers amb absolute=true a assets.txt
// - Fitxers de sistema (${SYSTEM_FOLDER})
// - Fitxers al costat del binari (com gamecontrollerdb.txt)
if (filepath.find("/config/") != std::string::npos ||
filepath.starts_with("config/")) {
return false;
}
if (filepath.find("/data/") != std::string::npos ||
filepath.starts_with("data/")) {
return true;
}
return false;
return filepath.find("/data/") != std::string::npos ||
filepath.starts_with("data/");
}
+4 -14
View File
@@ -59,20 +59,10 @@ namespace ResourceHelper {
}
auto shouldUseResourcePack(const std::string& filepath) -> bool {
// Archivos que NO van al pack:
// - config/ (ahora está fuera de data/)
// - archivos absolutos del sistema
if (filepath.find("config/") != std::string::npos) {
return false;
}
// Si contiene "data/" es candidato para el pack
if (filepath.find("data/") != std::string::npos) {
return true;
}
return false;
// Si la ruta conté "data/" és candidat al pack. La resta (paths absoluts del
// SYSTEM_FOLDER o relatives al binari com gamecontrollerdb.txt) van sempre al
// filesystem.
return filepath.find("data/") != std::string::npos;
}
auto getPackPath(const std::string& asset_path) -> std::string {
+11 -5
View File
@@ -141,7 +141,9 @@ void Director::init() {
loadAssets(); // Crea el índice de archivos
Input::init(Asset::get()->getPath("gamecontrollerdb.txt"), Asset::get()->getPath("controllers.json")); // Carga configuración de controles
// gamecontrollerdb.txt no pot anar al pack (SDL_AddGamepadMappingsFromFile només llegeix del FS).
// Sempre viu al costat del binari, fora del índex d'assets.
Input::init(executable_path_ + "gamecontrollerdb.txt", Asset::get()->getPath("controllers.json")); // Carga configuración de controles
Options::setConfigFile(Asset::get()->getPath("config.yaml")); // Establece el fichero de configuración
Options::setControllersFile(Asset::get()->getPath("controllers.json")); // Establece el fichero de configuración de mandos
@@ -256,7 +258,7 @@ void Director::loadScoreFile() {
#endif
}
// Carga el indice de ficheros desde un fichero
// Carga el indice de ficheros desde el pack (o filesystem como fallback)
void Director::loadAssets() {
#ifdef MACOS_BUNDLE
const std::string PREFIX = "/../Resources";
@@ -264,9 +266,13 @@ void Director::loadAssets() {
const std::string PREFIX;
#endif
// Cargar la configuración de assets (también aplicar el prefijo al archivo de configuración)
std::string config_path = executable_path_ + PREFIX + "/config/assets.txt";
Asset::get()->loadFromFile(config_path, PREFIX, system_folder_);
// El índice ahora vive dins el pack a "config/assets.txt" (ResourceHelper li trau el "data/" prefix).
// ResourceHelper::loadFile fa fallback automàtic al filesystem si el pack no està o no conté el fitxer.
auto buffer = ResourceHelper::loadFile("/data/config/assets.txt");
if (buffer.empty()) {
throw std::runtime_error("No s'ha pogut carregar l'índex d'assets (data/config/assets.txt)");
}
Asset::get()->loadFromBuffer(buffer, PREFIX, system_folder_);
// Si falta algun fichero, sale del programa
if (!Asset::get()->check()) {