From 6bf8490776d03ce30a9b9cb4037fe557cfec0dc9 Mon Sep 17 00:00:00 2001 From: Sergio Date: Tue, 19 Aug 2025 13:08:37 +0200 Subject: [PATCH] integrades mes clases amb ResourceHelper mogudes les dades de la demo a resource.pack --- config/assets.txt | 8 ++-- {config => data/demo}/demo1.bin | Bin {config => data/demo}/demo2.bin | Bin resources.pack | Bin 9596122 -> 9620198 bytes source/lang.cpp | 23 ++++++++--- source/texture.cpp | 36 +++++++++++------- source/utils.cpp | 14 ++++++- tools/pack_resources | Bin 0 -> 43440 bytes tools/pack_resources.cpp | 65 +++++++++++++++++++++++++++++--- 9 files changed, 116 insertions(+), 30 deletions(-) rename {config => data/demo}/demo1.bin (100%) rename {config => data/demo}/demo2.bin (100%) create mode 100755 tools/pack_resources diff --git a/config/assets.txt b/config/assets.txt index 4df3c9b..e028cd0 100644 --- a/config/assets.txt +++ b/config/assets.txt @@ -16,10 +16,12 @@ DATA|${PREFIX}/config/param_320x256.txt DATA|${PREFIX}/config/param_red.txt DATA|${PREFIX}/config/pools.txt DATA|${PREFIX}/config/stages.txt -DEMODATA|${PREFIX}/config/demo1.bin -DEMODATA|${PREFIX}/config/demo2.bin -# Música (archivos empaquetados) +# Archivos con los datos de la demo +DEMODATA|${PREFIX}/data/demo/demo1.bin +DEMODATA|${PREFIX}/data/demo/demo2.bin + +# Música MUSIC|${PREFIX}/data/music/credits.ogg MUSIC|${PREFIX}/data/music/intro.ogg MUSIC|${PREFIX}/data/music/playing.ogg diff --git a/config/demo1.bin b/data/demo/demo1.bin similarity index 100% rename from config/demo1.bin rename to data/demo/demo1.bin diff --git a/config/demo2.bin b/data/demo/demo2.bin similarity index 100% rename from config/demo2.bin rename to data/demo/demo2.bin diff --git a/resources.pack b/resources.pack index 1f060f93c2da1f03e1d639e605c6bc85dbef5341..86771f77aa590fe6414fa61bec3474a1b7367454 100644 GIT binary patch delta 40605 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 X8^32~wQzXSW4grl%#;#s?kD~SaUQ|- delta 27684 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 h`t4dWz(QQC7 languages = { auto loadFromFile(const std::string &file_path) -> bool { texts.clear(); - std::ifstream rfile(file_path); - if (!rfile.is_open()) { - return false; - } - + // Intentar cargar desde ResourceHelper primero + auto resource_data = ResourceHelper::loadFile(file_path); + try { json j; - rfile >> j; + + if (!resource_data.empty()) { + // Cargar desde datos del pack + std::string content(resource_data.begin(), resource_data.end()); + j = json::parse(content); + } else { + // Fallback a filesystem directo + std::ifstream rfile(file_path); + if (!rfile.is_open()) { + return false; + } + rfile >> j; + } for (const auto &el : j.items()) { texts[el.key()] = el.value(); diff --git a/source/texture.cpp b/source/texture.cpp index b2b54d8..ce4e600 100644 --- a/source/texture.cpp +++ b/source/texture.cpp @@ -225,22 +225,30 @@ auto Texture::loadSurface(const std::string &file_path) -> std::shared_ptr buffer; + + // Intentar cargar desde ResourceHelper primero + auto resource_data = ResourceHelper::loadFile(file_path); + if (!resource_data.empty()) { + buffer = resource_data; + } else { + // Fallback a filesystem directo + std::ifstream file(file_path, std::ios::binary | std::ios::ate); + if (!file) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error: Fichero no encontrado %s", file_path.c_str()); + throw std::runtime_error("Fichero no encontrado: " + file_path); + } - // Obtener el tamaño del archivo - std::streamsize size = file.tellg(); - file.seekg(0, std::ios::beg); + // Obtener el tamaño del archivo + std::streamsize size = file.tellg(); + file.seekg(0, std::ios::beg); - // Leer el contenido del archivo en un buffer - std::vector buffer(size); - if (!file.read(reinterpret_cast(buffer.data()), size)) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error al leer el fichero %s", file_path.c_str()); - throw std::runtime_error("Error al leer el fichero: " + file_path); + // Leer el contenido del archivo en un buffer + buffer.resize(size); + if (!file.read(reinterpret_cast(buffer.data()), size)) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error al leer el fichero %s", file_path.c_str()); + throw std::runtime_error("Error al leer el fichero: " + file_path); + } } // Crear un objeto Gif y llamar a la función loadGif diff --git a/source/utils.cpp b/source/utils.cpp index 044f759..95dc4e1 100644 --- a/source/utils.cpp +++ b/source/utils.cpp @@ -13,6 +13,7 @@ #include // Para basic_string, allocator, string, operator==, operator+, char_traits #include "lang.h" // Para getText +#include "resource_helper.h" // Para ResourceHelper // Variables Overrides overrides = Overrides(); @@ -323,8 +324,17 @@ void printWithDots(const std::string &text1, const std::string &text2, const std auto loadDemoDataFromFile(const std::string &file_path) -> DemoData { DemoData dd; - // Indicador de éxito en la carga - auto *file = SDL_IOFromFile(file_path.c_str(), "r+b"); + SDL_IOStream *file = nullptr; + + // Intentar cargar desde ResourceHelper primero + auto resource_data = ResourceHelper::loadFile(file_path); + if (!resource_data.empty()) { + file = SDL_IOFromConstMem(resource_data.data(), resource_data.size()); + } else { + // Fallback a filesystem directo + file = SDL_IOFromFile(file_path.c_str(), "r+b"); + } + if (file == nullptr) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Error: Fichero no encontrado %s", file_path.c_str()); throw std::runtime_error("Fichero no encontrado: " + file_path); diff --git a/tools/pack_resources b/tools/pack_resources new file mode 100755 index 0000000000000000000000000000000000000000..6c4dd0280cadbeb78fe6e9d46f73ef71c9496a84 GIT binary patch literal 43440 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%0DUPk2k5)AtY-zKx6Z+`Hx*B=<8=daPPUSr5 zkii<=DQ`r>4)J3r5r*jeU^>+Ai&`Ac^o5|lfPF5E**Z}gmW|q!nRqptNp~$8l{9;G5)#hj}!@m^=6x+(F&wKbY)#&xk<}lunkwb#XWI<+MF1t+s1P+s@2No`hpH zrIK+?wCQ!6S;dr+Uc)#5`0pv0soB?!gL|u}A6h5TI~?SNaXHhM$2*&GcoDmDTer#fgWagVFl|{LpRLxpZBdj{W^&`Rd9~ub&pTfL!#(>>kJV?1qHH%+?>ExJOpfT8Cz^q7l z@F~|G4ldx)d6bPOk)-ivC^pmF{-0Dm zr5Vm}$EuKQ($|SM8AJ9C42X^Xrc{+wGpkHhiFK0B%i`_7&JdUX3!k{2q8%Ki%*LS% zr&;T1d3(rF^)z~7VztSKVp@H{r04``I@dZ7a*~VTCDQrP6}-SNe!@5N!}A-}=q-!4;osb^!N^RWO?#q{_mEI-`obo$kQuu24PRa)%!>t{YEP&Z!nc zY#C$dJZwmD)7#C|O>7<5Bg)*tS;r7F_Qnv@1Z7y=ZLWY^GGiAmje^|RKSJffT3>Y( z)48g{fbq09tnARuF>&Jj$?K4IzsvI_*CDA2$KDtl*HW>7O!M6i=I=n2LEZlJD=eJgqX46`v&caWstoAWH1Tr(seCpk{gd_1{3{`Tk3r93)?{%TF2uHcKL%|?pQ-X+i-auP4zrCzhjIV!h?YM`82^OP#gRU%4va!z}^y zcLUSYo0r=$c42`$*A26p$gJdZOe|^U(&_bLcT|kT9Vu?Ml+7+-`1(0qHI1e0vlr<` zP<=h+G|X2S^m1Y4oVQRvHbzodWG zS45f#8>{N9r#C0dv>}%C8}ddFxq#HqY1n8*=I(Yu`)o3*8_js#tzr|>-y$XuX~t}} zcW+Q+b1*3NXxy5cj2)y|Xu#9lJc1wMqLo8?xcz{k$A=HW+z1nrb?bCm+2)Q7o5F%5 znPzWj!-5GrI1`=N%HgbJJA7`pP2Dx%?P_NI7T}vK z9Vab)thA#P)XpF<(n((^9C^iLJF#w`V~g>XNr~#paH* z>{B|Zf1qXa;S`JhREJ0PO57a75VMetX8(6@kin2A`|y>!)&S;_>@!}j&XB#C-=3Tt z;Gf{4(T5pCS#ohK4fWJUc=8qQ4`>BKt97X6u&>=S0iP%1RJAkh6X=l=Mov2pN~vdcCyL-O6yPc1!(k~A zC(>xcfHH`yuJ({p%GO+^xGZh;BT5%RuUjb%dAkv1J7c8*Kf9e+>TMHGBD8tHO~z1+ z+wJsryS-f@Jat0Oj&bF?QJjaoM&YgwAJ}t-7~YjqJRL#bD3lM-d^w26y%c%`NIV9u z6pH7=B$Ur>$x?_`A1+1&kAx@k)Aze5NGP8xopRbh94NJBzT;S2@ME&J^X9*~t!zLL? zcQQX7XJo;LU#hY!U%tmCp?q(RQ*$2jn&1uir+30+e)%4lgtrP}DZiwXkkaWLGZ~lf znMqh98l2=O-AVZcTO}s&GQWK9O+xwJn=D`Em-YXS$Ujpsl<(0=DBruI{CGq&QNGOo z1K>zR$zQP`Lczj*@kC^5Ft-1LNY>}KSUA0e^qz=5;4x_yB>V|t`uq(S^K=O%9mmo$ znmkCj5m9~qr#j+>r; zg1C!A*-s@4nNP+qL}tRt@@sl{N} BHdp`v literal 0 HcmV?d00001 diff --git a/tools/pack_resources.cpp b/tools/pack_resources.cpp index 6b68ffa..c8ba3bf 100644 --- a/tools/pack_resources.cpp +++ b/tools/pack_resources.cpp @@ -2,22 +2,77 @@ #include #include +void showHelp() { + std::cout << "Coffee Crisis Arcade Edition - Resource Packer" << std::endl; + std::cout << "===============================================" << std::endl; + std::cout << "Usage: pack_resources [options] [input_dir] [output_file]" << std::endl; + std::cout << std::endl; + std::cout << "Options:" << std::endl; + std::cout << " --help Show this help message" << std::endl; + std::cout << " --list List contents of an existing pack file" << std::endl; + std::cout << std::endl; + std::cout << "Arguments:" << std::endl; + std::cout << " input_dir Directory to pack (default: data)" << std::endl; + std::cout << " output_file Pack file name (default: resources.pack)" << std::endl; + std::cout << std::endl; + std::cout << "Examples:" << std::endl; + std::cout << " pack_resources # Pack 'data' to 'resources.pack'" << std::endl; + std::cout << " pack_resources mydata # Pack 'mydata' to 'resources.pack'" << std::endl; + std::cout << " pack_resources data my.pack # Pack 'data' to 'my.pack'" << std::endl; + std::cout << " pack_resources --list my.pack # List contents of 'my.pack'" << std::endl; +} + +void listPackContents(const std::string& packFile) { + ResourcePack pack; + if (!pack.loadPack(packFile)) { + std::cerr << "Error: Cannot open pack file: " << packFile << std::endl; + return; + } + + auto resources = pack.getResourceList(); + std::cout << "Pack file: " << packFile << std::endl; + std::cout << "Resources: " << resources.size() << std::endl; + std::cout << "Contents:" << std::endl; + + for (const auto& resource : resources) { + std::cout << " " << resource << std::endl; + } +} + int main(int argc, char* argv[]) { std::string dataDir = "data"; std::string outputFile = "resources.pack"; + bool listMode = false; - if (argc > 1) { - dataDir = argv[1]; + // Parse arguments + for (int i = 1; i < argc; i++) { + std::string arg = argv[i]; + if (arg == "--help" || arg == "-h") { + showHelp(); + return 0; + } else if (arg == "--list") { + listMode = true; + if (i + 1 < argc) { + outputFile = argv[++i]; // Next argument is pack file to list + } + } else if (!arg.empty() && arg[0] != '-') { + if (dataDir == "data") { + dataDir = arg; + } else { + outputFile = arg; + } + } } - if (argc > 2) { - outputFile = argv[2]; + + if (listMode) { + listPackContents(outputFile); + return 0; } std::cout << "Coffee Crisis Arcade Edition - Resource Packer" << std::endl; std::cout << "===============================================" << std::endl; std::cout << "Input directory: " << dataDir << std::endl; std::cout << "Output file: " << outputFile << std::endl; - std::cout << "Note: config/ directory is excluded from packing" << std::endl; std::cout << std::endl; if (!std::filesystem::exists(dataDir)) {