diff --git a/src/Components/Modules/FileSystem.cpp b/src/Components/Modules/FileSystem.cpp index fd5cfecb..2e3c5748 100644 --- a/src/Components/Modules/FileSystem.cpp +++ b/src/Components/Modules/FileSystem.cpp @@ -19,6 +19,16 @@ namespace Components } } + void FileSystem::RawFile::read() + { + this->buffer.clear(); + + Game::RawFile* rawfile = Game::DB_FindXAssetHeader(Game::XAssetType::ASSET_TYPE_RAWFILE, this->filePath.data()).rawfile; + if (!rawfile || Game::DB_IsXAssetDefault(Game::XAssetType::ASSET_TYPE_RAWFILE, this->filePath.data())) return; + + this->buffer.resize(Game::DB_GetRawFileLen(rawfile)); + Game::DB_GetRawBuffer(rawfile, const_cast(this->buffer.data()), this->buffer.size()); + } FileSystem::FileReader::FileReader(std::string file) : name(file), handle(0) { diff --git a/src/Components/Modules/FileSystem.hpp b/src/Components/Modules/FileSystem.hpp index ae7f6033..aedc23f2 100644 --- a/src/Components/Modules/FileSystem.hpp +++ b/src/Components/Modules/FileSystem.hpp @@ -3,8 +3,17 @@ namespace Components class FileSystem : public Component { public: + class AbstractFile + { + public: + virtual ~AbstractFile() {}; - class File + virtual bool exists() = 0; + virtual std::string getName() = 0; + virtual std::string& getBuffer() = 0; + }; + + class File : public AbstractFile { public: File() {}; @@ -21,6 +30,23 @@ namespace Components void read(); }; + class RawFile : public AbstractFile + { + public: + RawFile() {}; + RawFile(std::string file) : filePath(file) { this->read(); }; + + bool exists() { return !this->buffer.empty(); }; + std::string getName() { return this->filePath; }; + std::string& getBuffer() { return this->buffer; }; + + private: + std::string filePath; + std::string buffer; + + void read(); + }; + class FileReader { public: diff --git a/src/Game/Functions.cpp b/src/Game/Functions.cpp index 97db8eb4..1d3a2a39 100644 --- a/src/Game/Functions.cpp +++ b/src/Game/Functions.cpp @@ -45,6 +45,8 @@ namespace Game DB_EnumXAssets_t DB_EnumXAssets = (DB_EnumXAssets_t)0x4B76D0; DB_EnumXAssets_Internal_t DB_EnumXAssets_Internal = (DB_EnumXAssets_Internal_t)0x5BB0A0; DB_FindXAssetHeader_t DB_FindXAssetHeader = (DB_FindXAssetHeader_t)0x407930; + DB_GetRawBuffer_t DB_GetRawBuffer = (DB_GetRawBuffer_t)0x4CDC50; + DB_GetRawFileLen_t DB_GetRawFileLen = (DB_GetRawFileLen_t)0x4DAA80; DB_GetLoadedFraction_t DB_GetLoadedFraction = (DB_GetLoadedFraction_t)0x468380; DB_GetXAssetNameHandler_t* DB_GetXAssetNameHandlers = (DB_GetXAssetNameHandler_t*)0x799328; DB_GetXAssetSizeHandler_t* DB_GetXAssetSizeHandlers = (DB_GetXAssetSizeHandler_t*)0x799488; diff --git a/src/Game/Functions.hpp b/src/Game/Functions.hpp index 9334d6aa..e339568b 100644 --- a/src/Game/Functions.hpp +++ b/src/Game/Functions.hpp @@ -117,6 +117,12 @@ namespace Game typedef const char *(__cdecl * DB_IsXAssetDefault_t)(XAssetType type, const char* name); extern DB_IsXAssetDefault_t DB_IsXAssetDefault; + typedef void(__cdecl * DB_GetRawBuffer_t)(RawFile* rawfile, char* buffer, int size); + extern DB_GetRawBuffer_t DB_GetRawBuffer; + + typedef int(__cdecl * DB_GetRawFileLen_t)(RawFile* rawfile); + extern DB_GetRawFileLen_t DB_GetRawFileLen; + typedef void(*DB_LoadXAssets_t)(XZoneInfo *zoneInfo, unsigned int zoneCount, int sync); extern DB_LoadXAssets_t DB_LoadXAssets;