#ifndef CGAMEEXPORTER_H #define CGAMEEXPORTER_H #include "CAssetNameMap.h" #include "CGameInfo.h" #include "CGameProject.h" #include "CResourceStore.h" #include #include #include #include #include enum class EDiscType { Normal, WiiDeAsobu, Trilogy }; class CGameExporter { // Project Data CGameProject *mpProject; TString mProjectPath; CResourceStore *mpStore; EGame mGame; ERegion mRegion; TString mGameName; TString mGameID; float mBuildVersion; // Directories TString mExportDir; TString mDiscDir; TString mResourcesDir; TString mWorldsDirName; // Files nod::DiscBase *mpDisc; EDiscType mDiscType; bool mFrontEnd; // Resources TStringList mPaks; std::map mAreaDuplicateMap; CAssetNameMap *mpNameMap; CGameInfo *mpGameInfo; struct SResourceInstance { TString PakFile; CAssetID ResourceID; CFourCC ResourceType; uint32 PakOffset; uint32 PakSize; bool Compressed; bool Exported; }; std::map mResourceMap; // Progress IProgressNotifier *mpProgress; public: enum EExportStep { eES_ExtractDisc, eES_ExportCooked, eES_GenerateRaw, // eES_Max must be last eES_NumSteps }; CGameExporter(EDiscType DiscType, EGame Game, bool FrontEnd, ERegion Region, const TString& rkGameName, const TString& rkGameID, float BuildVersion); bool Export(nod::DiscBase *pDisc, const TString& rkOutputDir, CAssetNameMap *pNameMap, CGameInfo *pGameInfo, IProgressNotifier *pProgress); void LoadResource(const CAssetID& rkID, std::vector& rBuffer); bool ShouldExportDiscNode(const nod::Node *pkNode, bool IsInRoot); inline TString ProjectPath() const { return mProjectPath; } protected: bool ExtractDiscData(); bool ExtractDiscNodeRecursive(const nod::Node *pkNode, const TString& rkDir, bool RootNode, const nod::ExtractionContext& rkContext); void LoadPaks(); void LoadResource(const SResourceInstance& rkResource, std::vector& rBuffer); void ExportCookedResources(); void ExportResourceEditorData(); void ExportResource(SResourceInstance& rRes); TString MakeWorldName(CAssetID WorldID); // Convenience Functions inline SResourceInstance* FindResourceInstance(const CAssetID& rkID) { uint64 IntegralID = rkID.ToLongLong(); auto Found = mResourceMap.find(IntegralID); return (Found == mResourceMap.end() ? nullptr : &Found->second); } }; #endif // CGAMEEXPORTER_H