#ifndef RESOURCE_PACK_H #define RESOURCE_PACK_H #include #include #include #include #include /** * ResourcePack - Sistema de empaquetado de recursos para ViBe3 Physics * * Permite empaquetar todos los recursos (imágenes, etc.) en un archivo binario * único y ofuscado. Proporciona fallback automático a carpeta data/ si no existe pack. */ class ResourcePack { public: ResourcePack(); ~ResourcePack(); // Empaquetado (usado por herramienta pack_resources) bool addDirectory(const std::string& dirPath, const std::string& prefix = ""); bool savePack(const std::string& packFilePath); // Desempaquetado (usado por el juego) bool loadPack(const std::string& packFilePath); // Carga de recursos individuales struct ResourceData { unsigned char* data; size_t size; }; ResourceData loadResource(const std::string& resourcePath); // Utilidades std::vector getResourceList() const; size_t getResourceCount() const; void clear(); private: // Header del pack (12 bytes) struct PackHeader { char magic[4]; // "VBE3" uint32_t version; // Versión del formato (1) uint32_t fileCount; // Número de archivos empaquetados }; // Índice de un recurso (variable length) struct ResourceEntry { std::string path; // Ruta relativa del recurso uint32_t offset; // Offset en el archivo pack uint32_t size; // Tamaño en bytes uint32_t checksum; // Checksum simple (XOR de bytes) }; // Datos internos std::map resources_; std::ifstream packFile_; bool isLoaded_; // Funciones auxiliares void encryptData(unsigned char* data, size_t size); void decryptData(unsigned char* data, size_t size); uint32_t calculateChecksum(const unsigned char* data, size_t size); std::string normalizePath(const std::string& path); }; #endif // RESOURCE_PACK_H