#ifndef __RETRO_CPAKFILE_HPP__ #define __RETRO_CPAKFILE_HPP__ #include #include "RetroTypes.hpp" #include "CStringExtras.hpp" #include "CDvdFile.hpp" #include "CDvdRequest.hpp" namespace Retro { class CPakFile : public CDvdFile { friend class CResLoader; public: struct SResInfo { u32 compressed; SObjectTag tag; u32 size; u32 offset; }; private: enum EAsyncPhase { PakAsyncWarmup = 0, PakAsyncInitialHeader = 1, PakAsyncDataLoad = 2, PakAsyncLoaded = 3 } x2c_asyncLoadPhase; CDvdRequest* x34_dvdReq; std::vector> x4c_nameList; std::vector x5c_depList; std::vector> x6c_resList; public: CPakFile(const std::string& filename); const std::vector& GetDepList() const {return x5c_depList;} u32 GetResIdByName(const char* name) const { for (const std::pair& p : x4c_nameList) if (!CStringExtras::CompareCaseInsensitive(p.first.c_str(), name)) return p.second.id; return 0; } const SResInfo* GetResInfoForLoad(u32 id); const SResInfo* GetResInfo(u32 id) const; u32 GetFakeStaticSize() const; void DataLoad(); void InitialHeaderLoad(); void Warmup(); void AsyncIdle() { if (x2c_asyncLoadPhase == PakAsyncLoaded) return; if (x34_dvdReq && x34_dvdReq->IsComplete()) return; switch (x2c_asyncLoadPhase) { case PakAsyncWarmup: Warmup(); break; case PakAsyncInitialHeader: InitialHeaderLoad(); break; case PakAsyncDataLoad: DataLoad(); break; default: break; } } }; } #endif // __RETRO_CPAKFILE_HPP__