Add AssetDumperContext to bundle context fields for dumping

(cherry picked from commit ed8331280392ef3a2b4657c5dbd0880463d85f2c)
This commit is contained in:
Jan 2021-03-05 18:11:56 +01:00
parent 88c48e8107
commit abb268a819
56 changed files with 191 additions and 156 deletions

View File

@ -7,15 +7,15 @@
#include <iostream> #include <iostream>
template<class T> template<class T>
class AbstractAssetDumper : public IAssetDumper<T> class AbstractFileDumper : public IAssetDumper<T>
{ {
protected: protected:
virtual bool ShouldDump(XAssetInfo<T>* asset) = 0; virtual bool ShouldDump(XAssetInfo<T>* asset) = 0;
virtual std::string GetFileNameForAsset(Zone* zone, XAssetInfo<T>* asset) = 0; virtual std::string GetFileNameForAsset(Zone* zone, XAssetInfo<T>* asset) = 0;
virtual void DumpAsset(Zone* zone, XAssetInfo<T>* asset, std::ostream& stream) = 0; virtual void DumpAsset(AssetDumpingContext& context, XAssetInfo<T>* asset, std::ostream& stream) = 0;
public: public:
void DumpPool(Zone* zone, AssetPool<T>* pool, const std::string& basePath) override void DumpPool(AssetDumpingContext& context, AssetPool<T>* pool) override
{ {
for(auto assetInfo : *pool) for(auto assetInfo : *pool)
{ {
@ -25,8 +25,8 @@ public:
continue; continue;
} }
std::filesystem::path assetFilePath(basePath); std::filesystem::path assetFilePath(context.m_base_path);
assetFilePath.append(GetFileNameForAsset(zone, assetInfo)); assetFilePath.append(GetFileNameForAsset(context.m_zone, assetInfo));
auto assetFileFolder(assetFilePath); auto assetFileFolder(assetFilePath);
assetFileFolder.replace_filename(""); assetFileFolder.replace_filename("");
@ -35,7 +35,7 @@ public:
std::ofstream file(assetFilePath, std::fstream::out | std::fstream::binary); std::ofstream file(assetFilePath, std::fstream::out | std::fstream::binary);
if(file.is_open()) if(file.is_open())
{ {
DumpAsset(zone, assetInfo, file); DumpAsset(context, assetInfo, file);
file.close(); file.close();
} }

View File

@ -0,0 +1,12 @@
#pragma once
#include <string>
#include "Zone/Zone.h"
class AssetDumpingContext
{
public:
Zone* m_zone;
std::string m_base_path;
};

View File

@ -1,13 +1,18 @@
#pragma once #pragma once
#include "Zone/Zone.h" #include "AssetDumpingContext.h"
#include "Pool/AssetPool.h" #include "Pool/AssetPool.h"
template<class T> template<class T>
class IAssetDumper class IAssetDumper
{ {
public: public:
IAssetDumper() = default;
virtual ~IAssetDumper() = default; virtual ~IAssetDumper() = default;
IAssetDumper(const IAssetDumper& other) = default;
IAssetDumper(IAssetDumper&& other) noexcept = default;
IAssetDumper& operator=(const IAssetDumper& other) = default;
IAssetDumper& operator=(IAssetDumper&& other) noexcept = default;
virtual void DumpPool(Zone* zone, AssetPool<T>* pool, const std::string& basePath) = 0; virtual void DumpPool(AssetDumpingContext& context, AssetPool<T>* pool) = 0;
}; };

View File

@ -1,12 +1,17 @@
#pragma once #pragma once
#include "Zone/Zone.h" #include "AssetDumpingContext.h"
class IZoneDumper class IZoneDumper
{ {
public: public:
IZoneDumper() = default;
virtual ~IZoneDumper() = default; virtual ~IZoneDumper() = default;
IZoneDumper(const IZoneDumper& other) = default;
IZoneDumper(IZoneDumper&& other) noexcept = default;
IZoneDumper& operator=(const IZoneDumper& other) = default;
IZoneDumper& operator=(IZoneDumper&& other) noexcept = default;
virtual bool CanHandleZone(Zone* zone) const = 0; virtual bool CanHandleZone(AssetDumpingContext& assetDumpingContext) const = 0;
virtual bool DumpZone(Zone* zone, const std::string& basePath) const = 0; virtual bool DumpZone(AssetDumpingContext& assetDumpingContext) const = 0;
}; };

View File

@ -15,7 +15,7 @@ std::string AssetDumperAddonMapEnts::GetFileNameForAsset(Zone* zone, XAssetInfo<
return asset->m_name; return asset->m_name;
} }
void AssetDumperAddonMapEnts::DumpAsset(Zone* zone, XAssetInfo<AddonMapEnts>* asset, std::ostream& stream) void AssetDumperAddonMapEnts::DumpAsset(AssetDumpingContext& context, XAssetInfo<AddonMapEnts>* asset, std::ostream& stream)
{ {
const auto* addonMapEnts = asset->Asset(); const auto* addonMapEnts = asset->Asset();
stream.write(addonMapEnts->entityString, std::max(addonMapEnts->numEntityChars - 1, 0)); stream.write(addonMapEnts->entityString, std::max(addonMapEnts->numEntityChars - 1, 0));

View File

@ -1,15 +1,15 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/IW4/IW4.h" #include "Game/IW4/IW4.h"
namespace IW4 namespace IW4
{ {
class AssetDumperAddonMapEnts final : public AbstractAssetDumper<AddonMapEnts> class AssetDumperAddonMapEnts final : public AbstractFileDumper<AddonMapEnts>
{ {
protected: protected:
bool ShouldDump(XAssetInfo<AddonMapEnts>* asset) override; bool ShouldDump(XAssetInfo<AddonMapEnts>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<AddonMapEnts>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<AddonMapEnts>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<AddonMapEnts>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<AddonMapEnts>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -42,7 +42,7 @@ std::string AssetDumperGfxImage::GetFileNameForAsset(Zone* zone, XAssetInfo<GfxI
return "images/" + asset->m_name + m_writer->GetFileExtension(); return "images/" + asset->m_name + m_writer->GetFileExtension();
} }
void AssetDumperGfxImage::DumpAsset(Zone* zone, XAssetInfo<GfxImage>* asset, std::ostream& stream) void AssetDumperGfxImage::DumpAsset(AssetDumpingContext& context, XAssetInfo<GfxImage>* asset, std::ostream& stream)
{ {
const auto* image = asset->Asset(); const auto* image = asset->Asset();
m_writer->DumpImage(stream, image->texture.texture); m_writer->DumpImage(stream, image->texture.texture);

View File

@ -1,19 +1,19 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/IW4/IW4.h" #include "Game/IW4/IW4.h"
#include "Image/IImageWriter.h" #include "Image/IImageWriter.h"
namespace IW4 namespace IW4
{ {
class AssetDumperGfxImage final : public AbstractAssetDumper<GfxImage> class AssetDumperGfxImage final : public AbstractFileDumper<GfxImage>
{ {
IImageWriter* m_writer; IImageWriter* m_writer;
protected: protected:
bool ShouldDump(XAssetInfo<GfxImage>* asset) override; bool ShouldDump(XAssetInfo<GfxImage>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<GfxImage>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<GfxImage>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<GfxImage>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<GfxImage>* asset, std::ostream& stream) override;
public: public:
AssetDumperGfxImage(); AssetDumperGfxImage();

View File

@ -14,7 +14,7 @@ std::string AssetDumperLoadedSound::GetFileNameForAsset(Zone* zone, XAssetInfo<L
return "sound/" + asset->m_name; return "sound/" + asset->m_name;
} }
void AssetDumperLoadedSound::DumpWavPcm(Zone* zone, const LoadedSound* asset, std::ostream& stream) void AssetDumperLoadedSound::DumpWavPcm(AssetDumpingContext& context, const LoadedSound* asset, std::ostream& stream)
{ {
const auto riffMasterChunkSize = sizeof(WAV_CHUNK_ID_RIFF) const auto riffMasterChunkSize = sizeof(WAV_CHUNK_ID_RIFF)
+ sizeof(uint32_t) + sizeof(uint32_t)
@ -55,13 +55,13 @@ void AssetDumperLoadedSound::DumpWavPcm(Zone* zone, const LoadedSound* asset, st
stream.write(asset->sound.data, asset->sound.info.data_len); stream.write(asset->sound.data, asset->sound.info.data_len);
} }
void AssetDumperLoadedSound::DumpAsset(Zone* zone, XAssetInfo<LoadedSound>* asset, std::ostream& stream) void AssetDumperLoadedSound::DumpAsset(AssetDumpingContext& context, XAssetInfo<LoadedSound>* asset, std::ostream& stream)
{ {
const auto* loadedSound = asset->Asset(); const auto* loadedSound = asset->Asset();
switch (static_cast<WavFormat>(loadedSound->sound.info.format)) switch (static_cast<WavFormat>(loadedSound->sound.info.format))
{ {
case WavFormat::PCM: case WavFormat::PCM:
DumpWavPcm(zone, loadedSound, stream); DumpWavPcm(context, loadedSound, stream);
break; break;
default: default:

View File

@ -1,16 +1,16 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/IW4/IW4.h" #include "Game/IW4/IW4.h"
namespace IW4 namespace IW4
{ {
class AssetDumperLoadedSound final : public AbstractAssetDumper<LoadedSound> class AssetDumperLoadedSound final : public AbstractFileDumper<LoadedSound>
{ {
static void DumpWavPcm(Zone* zone, const LoadedSound* asset, std::ostream& stream); static void DumpWavPcm(AssetDumpingContext& context, const LoadedSound* asset, std::ostream& stream);
protected: protected:
bool ShouldDump(XAssetInfo<LoadedSound>* asset) override; bool ShouldDump(XAssetInfo<LoadedSound>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<LoadedSound>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<LoadedSound>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<LoadedSound>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<LoadedSound>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -9,27 +9,27 @@
using namespace IW4; using namespace IW4;
namespace fs = std::filesystem; namespace fs = std::filesystem;
void AssetDumperLocalizeEntry::DumpPool(Zone* zone, AssetPool<LocalizeEntry>* pool, const std::string& basePath) void AssetDumperLocalizeEntry::DumpPool(AssetDumpingContext& context, AssetPool<LocalizeEntry>* pool)
{ {
if (pool->m_asset_lookup.empty()) if (pool->m_asset_lookup.empty())
return; return;
const auto language = LocalizeCommon::GetNameOfLanguage(zone->m_language); const auto language = LocalizeCommon::GetNameOfLanguage(context.m_zone->m_language);
fs::path stringsPath(basePath); fs::path stringsPath(context.m_base_path);
stringsPath.append(language); stringsPath.append(language);
stringsPath.append("/localizedstrings"); stringsPath.append("/localizedstrings");
create_directories(stringsPath); create_directories(stringsPath);
auto stringFilePath(stringsPath); auto stringFilePath(stringsPath);
stringFilePath.append(zone->m_name); stringFilePath.append(context.m_zone->m_name);
stringFilePath.append(".str"); stringFilePath.append(".str");
std::ofstream stringFile(stringFilePath, std::fstream::out | std::ofstream::binary); std::ofstream stringFile(stringFilePath, std::fstream::out | std::ofstream::binary);
if (stringFile.is_open()) if (stringFile.is_open())
{ {
StringFileDumper stringFileDumper(zone, stringFile); StringFileDumper stringFileDumper(context.m_zone, stringFile);
stringFileDumper.SetLanguageName(language); stringFileDumper.SetLanguageName(language);
@ -49,6 +49,6 @@ void AssetDumperLocalizeEntry::DumpPool(Zone* zone, AssetPool<LocalizeEntry>* po
} }
else else
{ {
printf("Could not create string file for dumping localized strings of zone '%s'\n", zone->m_name.c_str()); printf("Could not create string file for dumping localized strings of zone '%s'\n", context.m_zone->m_name.c_str());
} }
} }

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/IW4/IW4.h" #include "Game/IW4/IW4.h"
namespace IW4 namespace IW4
@ -8,6 +8,6 @@ namespace IW4
class AssetDumperLocalizeEntry final : public IAssetDumper<LocalizeEntry> class AssetDumperLocalizeEntry final : public IAssetDumper<LocalizeEntry>
{ {
public: public:
void DumpPool(Zone* zone, AssetPool<LocalizeEntry>* pool, const std::string& basePath) override; void DumpPool(AssetDumpingContext& context, AssetPool<LocalizeEntry>* pool) override;
}; };
} }

View File

@ -15,7 +15,7 @@ std::string AssetDumperRawFile::GetFileNameForAsset(Zone* zone, XAssetInfo<RawFi
return asset->m_name; return asset->m_name;
} }
void AssetDumperRawFile::DumpAsset(Zone* zone, XAssetInfo<RawFile>* asset, std::ostream& stream) void AssetDumperRawFile::DumpAsset(AssetDumpingContext& context, XAssetInfo<RawFile>* asset, std::ostream& stream)
{ {
const auto* rawFile = asset->Asset(); const auto* rawFile = asset->Asset();
if (rawFile->compressedLen > 0) if (rawFile->compressedLen > 0)

View File

@ -1,15 +1,15 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/IW4/IW4.h" #include "Game/IW4/IW4.h"
namespace IW4 namespace IW4
{ {
class AssetDumperRawFile final : public AbstractAssetDumper<RawFile> class AssetDumperRawFile final : public AbstractFileDumper<RawFile>
{ {
protected: protected:
bool ShouldDump(XAssetInfo<RawFile>* asset) override; bool ShouldDump(XAssetInfo<RawFile>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<RawFile>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<RawFile>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<RawFile>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<RawFile>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -14,7 +14,7 @@ std::string AssetDumperStringTable::GetFileNameForAsset(Zone* zone, XAssetInfo<S
return asset->m_name; return asset->m_name;
} }
void AssetDumperStringTable::DumpAsset(Zone* zone, XAssetInfo<StringTable>* asset, std::ostream& stream) void AssetDumperStringTable::DumpAsset(AssetDumpingContext& context, XAssetInfo<StringTable>* asset, std::ostream& stream)
{ {
const auto* stringTable = asset->Asset(); const auto* stringTable = asset->Asset();
CsvWriter csv(stream); CsvWriter csv(stream);

View File

@ -1,15 +1,15 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/IW4/IW4.h" #include "Game/IW4/IW4.h"
namespace IW4 namespace IW4
{ {
class AssetDumperStringTable final : public AbstractAssetDumper<StringTable> class AssetDumperStringTable final : public AbstractFileDumper<StringTable>
{ {
protected: protected:
bool ShouldDump(XAssetInfo<StringTable>* asset) override; bool ShouldDump(XAssetInfo<StringTable>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<StringTable>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<StringTable>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<StringTable>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<StringTable>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -241,7 +241,7 @@ std::string AssetDumperVehicle::GetFileNameForAsset(Zone* zone, XAssetInfo<Vehic
return "vehicles/" + asset->m_name; return "vehicles/" + asset->m_name;
} }
void AssetDumperVehicle::DumpAsset(Zone* zone, XAssetInfo<VehicleDef>* asset, std::ostream& stream) void AssetDumperVehicle::DumpAsset(AssetDumpingContext& context, XAssetInfo<VehicleDef>* asset, std::ostream& stream)
{ {
InfoStringFromVehicleConverter converter(asset->Asset(), vehicle_fields, std::extent<decltype(vehicle_fields)>::value, [asset](const scr_string_t scrStr) -> std::string InfoStringFromVehicleConverter converter(asset->Asset(), vehicle_fields, std::extent<decltype(vehicle_fields)>::value, [asset](const scr_string_t scrStr) -> std::string
{ {

View File

@ -1,11 +1,11 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/IW4/IW4.h" #include "Game/IW4/IW4.h"
namespace IW4 namespace IW4
{ {
class AssetDumperVehicle final : public AbstractAssetDumper<VehicleDef> class AssetDumperVehicle final : public AbstractFileDumper<VehicleDef>
{ {
static cspField_t vehicle_fields[]; static cspField_t vehicle_fields[];
static cspField_t vehicle_fields2[]; static cspField_t vehicle_fields2[];
@ -13,6 +13,6 @@ namespace IW4
protected: protected:
bool ShouldDump(XAssetInfo<VehicleDef>* asset) override; bool ShouldDump(XAssetInfo<VehicleDef>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<VehicleDef>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<VehicleDef>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<VehicleDef>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<VehicleDef>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -1172,7 +1172,7 @@ std::string AssetDumperWeapon::GetFileNameForAsset(Zone* zone, XAssetInfo<Weapon
return "weapons/" + asset->m_name; return "weapons/" + asset->m_name;
} }
void AssetDumperWeapon::DumpAsset(Zone* zone, XAssetInfo<WeaponCompleteDef>* asset, std::ostream& stream) void AssetDumperWeapon::DumpAsset(AssetDumpingContext& context, XAssetInfo<WeaponCompleteDef>* asset, std::ostream& stream)
{ {
auto* fullDef = new WeaponFullDef; auto* fullDef = new WeaponFullDef;
memset(fullDef, 0, sizeof(WeaponFullDef)); memset(fullDef, 0, sizeof(WeaponFullDef));

View File

@ -1,11 +1,11 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/IW4/IW4.h" #include "Game/IW4/IW4.h"
namespace IW4 namespace IW4
{ {
class AssetDumperWeapon final : public AbstractAssetDumper<WeaponCompleteDef> class AssetDumperWeapon final : public AbstractFileDumper<WeaponCompleteDef>
{ {
static cspField_t weapon_fields[]; static cspField_t weapon_fields[];
@ -14,6 +14,6 @@ namespace IW4
protected: protected:
bool ShouldDump(XAssetInfo<WeaponCompleteDef>* asset) override; bool ShouldDump(XAssetInfo<WeaponCompleteDef>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<WeaponCompleteDef>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<WeaponCompleteDef>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<WeaponCompleteDef>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<WeaponCompleteDef>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -14,21 +14,21 @@
using namespace IW4; using namespace IW4;
bool ZoneDumper::CanHandleZone(Zone* zone) const bool ZoneDumper::CanHandleZone(AssetDumpingContext& context) const
{ {
return zone->m_game == &g_GameIW4; return context.m_zone->m_game == &g_GameIW4;
} }
bool ZoneDumper::DumpZone(Zone* zone, const std::string& basePath) const bool ZoneDumper::DumpZone(AssetDumpingContext& context) const
{ {
#define DUMP_ASSET_POOL(dumperType, poolName) \ #define DUMP_ASSET_POOL(dumperType, poolName) \
if(assetPools->poolName) \ if(assetPools->poolName) \
{ \ { \
dumperType dumper; \ dumperType dumper; \
dumper.DumpPool(zone, assetPools->poolName.get(), basePath); \ dumper.DumpPool(context, assetPools->poolName.get()); \
} }
const auto* assetPools = dynamic_cast<GameAssetPoolIW4*>(zone->m_pools.get()); const auto* assetPools = dynamic_cast<GameAssetPoolIW4*>(context.m_zone->m_pools.get());
// DUMP_ASSET_POOL(AssetDumperPhysPreset, m_phys_preset) // DUMP_ASSET_POOL(AssetDumperPhysPreset, m_phys_preset)
// DUMP_ASSET_POOL(AssetDumperPhysCollmap, m_phys_collmap) // DUMP_ASSET_POOL(AssetDumperPhysCollmap, m_phys_collmap)

View File

@ -6,7 +6,7 @@ namespace IW4
class ZoneDumper final : public IZoneDumper class ZoneDumper final : public IZoneDumper
{ {
public: public:
bool CanHandleZone(Zone* zone) const override; bool CanHandleZone(AssetDumpingContext& context) const override;
bool DumpZone(Zone* zone, const std::string& basePath) const override; bool DumpZone(AssetDumpingContext& context) const override;
}; };
} }

View File

@ -265,7 +265,7 @@ std::string AssetDumperFontIcon::GetFileNameForAsset(Zone* zone, XAssetInfo<Font
return asset->m_name; return asset->m_name;
} }
void AssetDumperFontIcon::DumpAsset(Zone* zone, XAssetInfo<FontIcon>* asset, std::ostream& stream) void AssetDumperFontIcon::DumpAsset(AssetDumpingContext& context, XAssetInfo<FontIcon>* asset, std::ostream& stream)
{ {
AssetDumperFontIconInternal dumper(stream); AssetDumperFontIconInternal dumper(stream);
dumper.DumpFontIcon(asset->Asset()); dumper.DumpFontIcon(asset->Asset());

View File

@ -1,15 +1,15 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
{ {
class AssetDumperFontIcon final : public AbstractAssetDumper<FontIcon> class AssetDumperFontIcon final : public AbstractFileDumper<FontIcon>
{ {
protected: protected:
bool ShouldDump(XAssetInfo<FontIcon>* asset) override; bool ShouldDump(XAssetInfo<FontIcon>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<FontIcon>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<FontIcon>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<FontIcon>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<FontIcon>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -42,7 +42,7 @@ std::string AssetDumperGfxImage::GetFileNameForAsset(Zone* zone, XAssetInfo<GfxI
return "images/" + asset->m_name + m_writer->GetFileExtension(); return "images/" + asset->m_name + m_writer->GetFileExtension();
} }
void AssetDumperGfxImage::DumpAsset(Zone* zone, XAssetInfo<GfxImage>* asset, std::ostream& stream) void AssetDumperGfxImage::DumpAsset(AssetDumpingContext& context, XAssetInfo<GfxImage>* asset, std::ostream& stream)
{ {
const auto* image = asset->Asset(); const auto* image = asset->Asset();
m_writer->DumpImage(stream, image->texture.texture); m_writer->DumpImage(stream, image->texture.texture);

View File

@ -1,19 +1,19 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
#include "Image/IImageWriter.h" #include "Image/IImageWriter.h"
namespace T6 namespace T6
{ {
class AssetDumperGfxImage final : public AbstractAssetDumper<GfxImage> class AssetDumperGfxImage final : public AbstractFileDumper<GfxImage>
{ {
IImageWriter* m_writer; IImageWriter* m_writer;
protected: protected:
bool ShouldDump(XAssetInfo<GfxImage>* asset) override; bool ShouldDump(XAssetInfo<GfxImage>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<GfxImage>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<GfxImage>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<GfxImage>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<GfxImage>* asset, std::ostream& stream) override;
public: public:
AssetDumperGfxImage(); AssetDumperGfxImage();

View File

@ -9,27 +9,27 @@
using namespace T6; using namespace T6;
namespace fs = std::filesystem; namespace fs = std::filesystem;
void AssetDumperLocalizeEntry::DumpPool(Zone* zone, AssetPool<LocalizeEntry>* pool, const std::string& basePath) void AssetDumperLocalizeEntry::DumpPool(AssetDumpingContext& context, AssetPool<LocalizeEntry>* pool)
{ {
if (pool->m_asset_lookup.empty()) if (pool->m_asset_lookup.empty())
return; return;
const auto language = LocalizeCommon::GetNameOfLanguage(zone->m_language); const auto language = LocalizeCommon::GetNameOfLanguage(context.m_zone->m_language);
fs::path stringsPath(basePath); fs::path stringsPath(context.m_base_path);
stringsPath.append(language); stringsPath.append(language);
stringsPath.append("/localizedstrings"); stringsPath.append("/localizedstrings");
create_directories(stringsPath); create_directories(stringsPath);
auto stringFilePath(stringsPath); auto stringFilePath(stringsPath);
stringFilePath.append(zone->m_name); stringFilePath.append(context.m_zone->m_name);
stringFilePath.append(".str"); stringFilePath.append(".str");
std::ofstream stringFile(stringFilePath, std::fstream::out | std::ofstream::binary); std::ofstream stringFile(stringFilePath, std::fstream::out | std::ofstream::binary);
if(stringFile.is_open()) if(stringFile.is_open())
{ {
StringFileDumper stringFileDumper(zone, stringFile); StringFileDumper stringFileDumper(context.m_zone, stringFile);
stringFileDumper.SetLanguageName(language); stringFileDumper.SetLanguageName(language);
@ -49,6 +49,6 @@ void AssetDumperLocalizeEntry::DumpPool(Zone* zone, AssetPool<LocalizeEntry>* po
} }
else else
{ {
printf("Could not create string file for dumping localized strings of zone '%s'\n", zone->m_name.c_str()); printf("Could not create string file for dumping localized strings of zone '%s'\n", context.m_zone->m_name.c_str());
} }
} }

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
@ -8,6 +8,6 @@ namespace T6
class AssetDumperLocalizeEntry final : public IAssetDumper<LocalizeEntry> class AssetDumperLocalizeEntry final : public IAssetDumper<LocalizeEntry>
{ {
public: public:
void DumpPool(Zone* zone, AssetPool<LocalizeEntry>* pool, const std::string& basePath) override; void DumpPool(AssetDumpingContext& context, AssetPool<LocalizeEntry>* pool) override;
}; };
} }

View File

@ -139,7 +139,7 @@ std::string AssetDumperPhysConstraints::GetFileNameForAsset(Zone* zone, XAssetIn
return "physconstraints/" + asset->m_name; return "physconstraints/" + asset->m_name;
} }
void AssetDumperPhysConstraints::DumpAsset(Zone* zone, XAssetInfo<PhysConstraints>* asset, std::ostream& stream) void AssetDumperPhysConstraints::DumpAsset(AssetDumpingContext& context, XAssetInfo<PhysConstraints>* asset, std::ostream& stream)
{ {
assert(asset->Asset()->count <= 4); assert(asset->Asset()->count <= 4);

View File

@ -1,17 +1,17 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
{ {
class AssetDumperPhysConstraints final : public AbstractAssetDumper<PhysConstraints> class AssetDumperPhysConstraints final : public AbstractFileDumper<PhysConstraints>
{ {
static cspField_t phys_constraints_fields[]; static cspField_t phys_constraints_fields[];
protected: protected:
bool ShouldDump(XAssetInfo<PhysConstraints>* asset) override; bool ShouldDump(XAssetInfo<PhysConstraints>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<PhysConstraints>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<PhysConstraints>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<PhysConstraints>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<PhysConstraints>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -87,7 +87,7 @@ std::string AssetDumperPhysPreset::GetFileNameForAsset(Zone* zone, XAssetInfo<Ph
return "physic/" + asset->m_name; return "physic/" + asset->m_name;
} }
void AssetDumperPhysPreset::DumpAsset(Zone* zone, XAssetInfo<PhysPreset>* asset, std::ostream& stream) void AssetDumperPhysPreset::DumpAsset(AssetDumpingContext& context, XAssetInfo<PhysPreset>* asset, std::ostream& stream)
{ {
auto* physPresetInfo = new PhysPresetInfo; auto* physPresetInfo = new PhysPresetInfo;
CopyToPhysPresetInfo(asset->Asset(), physPresetInfo); CopyToPhysPresetInfo(asset->Asset(), physPresetInfo);

View File

@ -1,11 +1,11 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
{ {
class AssetDumperPhysPreset final : public AbstractAssetDumper<PhysPreset> class AssetDumperPhysPreset final : public AbstractFileDumper<PhysPreset>
{ {
static cspField_t physpreset_fields[]; static cspField_t physpreset_fields[];
@ -14,6 +14,6 @@ namespace T6
protected: protected:
bool ShouldDump(XAssetInfo<PhysPreset>* asset) override; bool ShouldDump(XAssetInfo<PhysPreset>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<PhysPreset>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<PhysPreset>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<PhysPreset>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<PhysPreset>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -12,7 +12,7 @@ std::string AssetDumperQdb::GetFileNameForAsset(Zone* zone, XAssetInfo<Qdb>* ass
return asset->m_name; return asset->m_name;
} }
void AssetDumperQdb::DumpAsset(Zone* zone, XAssetInfo<Qdb>* asset, std::ostream& stream) void AssetDumperQdb::DumpAsset(AssetDumpingContext& context, XAssetInfo<Qdb>* asset, std::ostream& stream)
{ {
const auto* qdb = asset->Asset(); const auto* qdb = asset->Asset();
stream.write(qdb->buffer, qdb->len); stream.write(qdb->buffer, qdb->len);

View File

@ -1,15 +1,15 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
{ {
class AssetDumperQdb final : public AbstractAssetDumper<Qdb> class AssetDumperQdb final : public AbstractFileDumper<Qdb>
{ {
protected: protected:
bool ShouldDump(XAssetInfo<Qdb>* asset) override; bool ShouldDump(XAssetInfo<Qdb>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<Qdb>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<Qdb>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<Qdb>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<Qdb>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -12,7 +12,7 @@ std::string AssetDumperRawFile::GetFileNameForAsset(Zone* zone, XAssetInfo<RawFi
return asset->m_name; return asset->m_name;
} }
void AssetDumperRawFile::DumpAsset(Zone* zone, XAssetInfo<RawFile>* asset, std::ostream& stream) void AssetDumperRawFile::DumpAsset(AssetDumpingContext& context, XAssetInfo<RawFile>* asset, std::ostream& stream)
{ {
const auto* rawFile = asset->Asset(); const auto* rawFile = asset->Asset();
stream.write(rawFile->buffer, rawFile->len); stream.write(rawFile->buffer, rawFile->len);

View File

@ -1,15 +1,15 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
{ {
class AssetDumperRawFile final : public AbstractAssetDumper<RawFile> class AssetDumperRawFile final : public AbstractFileDumper<RawFile>
{ {
protected: protected:
bool ShouldDump(XAssetInfo<RawFile>* asset) override; bool ShouldDump(XAssetInfo<RawFile>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<RawFile>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<RawFile>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<RawFile>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<RawFile>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -12,7 +12,7 @@ std::string AssetDumperScriptParseTree::GetFileNameForAsset(Zone* zone, XAssetIn
return asset->m_name; return asset->m_name;
} }
void AssetDumperScriptParseTree::DumpAsset(Zone* zone, XAssetInfo<ScriptParseTree>* asset, std::ostream& stream) void AssetDumperScriptParseTree::DumpAsset(AssetDumpingContext& context, XAssetInfo<ScriptParseTree>* asset, std::ostream& stream)
{ {
const auto* scriptParseTree = asset->Asset(); const auto* scriptParseTree = asset->Asset();
stream.write(scriptParseTree->buffer, scriptParseTree->len); stream.write(scriptParseTree->buffer, scriptParseTree->len);

View File

@ -1,15 +1,15 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
{ {
class AssetDumperScriptParseTree final : public AbstractAssetDumper<ScriptParseTree> class AssetDumperScriptParseTree final : public AbstractFileDumper<ScriptParseTree>
{ {
protected: protected:
bool ShouldDump(XAssetInfo<ScriptParseTree>* asset) override; bool ShouldDump(XAssetInfo<ScriptParseTree>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<ScriptParseTree>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<ScriptParseTree>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<ScriptParseTree>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<ScriptParseTree>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -12,7 +12,7 @@ std::string AssetDumperSlug::GetFileNameForAsset(Zone* zone, XAssetInfo<Slug>* a
return asset->m_name; return asset->m_name;
} }
void AssetDumperSlug::DumpAsset(Zone* zone, XAssetInfo<Slug>* asset, std::ostream& stream) void AssetDumperSlug::DumpAsset(AssetDumpingContext& context, XAssetInfo<Slug>* asset, std::ostream& stream)
{ {
const auto* slug = asset->Asset(); const auto* slug = asset->Asset();
stream.write(slug->buffer, slug->len); stream.write(slug->buffer, slug->len);

View File

@ -1,15 +1,15 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
{ {
class AssetDumperSlug final : public AbstractAssetDumper<Slug> class AssetDumperSlug final : public AbstractFileDumper<Slug>
{ {
protected: protected:
bool ShouldDump(XAssetInfo<Slug>* asset) override; bool ShouldDump(XAssetInfo<Slug>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<Slug>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<Slug>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<Slug>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<Slug>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -14,7 +14,7 @@ std::string AssetDumperStringTable::GetFileNameForAsset(Zone* zone, XAssetInfo<S
return asset->m_name; return asset->m_name;
} }
void AssetDumperStringTable::DumpAsset(Zone* zone, XAssetInfo<StringTable>* asset, std::ostream& stream) void AssetDumperStringTable::DumpAsset(AssetDumpingContext& context, XAssetInfo<StringTable>* asset, std::ostream& stream)
{ {
const auto* stringTable = asset->Asset(); const auto* stringTable = asset->Asset();
CsvWriter csv(stream); CsvWriter csv(stream);

View File

@ -1,15 +1,15 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
{ {
class AssetDumperStringTable final : public AbstractAssetDumper<StringTable> class AssetDumperStringTable final : public AbstractFileDumper<StringTable>
{ {
protected: protected:
bool ShouldDump(XAssetInfo<StringTable>* asset) override; bool ShouldDump(XAssetInfo<StringTable>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<StringTable>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<StringTable>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<StringTable>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<StringTable>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -86,7 +86,7 @@ std::string AssetDumperTracer::GetFileNameForAsset(Zone* zone, XAssetInfo<Tracer
return "tracer/" + asset->m_name; return "tracer/" + asset->m_name;
} }
void AssetDumperTracer::DumpAsset(Zone* zone, XAssetInfo<TracerDef>* asset, std::ostream& stream) void AssetDumperTracer::DumpAsset(AssetDumpingContext& context, XAssetInfo<TracerDef>* asset, std::ostream& stream)
{ {
InfoStringFromTracerConverter converter(asset->Asset(), tracer_fields, std::extent<decltype(tracer_fields)>::value, [asset](const scr_string_t scrStr) -> std::string InfoStringFromTracerConverter converter(asset->Asset(), tracer_fields, std::extent<decltype(tracer_fields)>::value, [asset](const scr_string_t scrStr) -> std::string
{ {

View File

@ -1,17 +1,17 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
{ {
class AssetDumperTracer final : public AbstractAssetDumper<TracerDef> class AssetDumperTracer final : public AbstractFileDumper<TracerDef>
{ {
static cspField_t tracer_fields[]; static cspField_t tracer_fields[];
protected: protected:
bool ShouldDump(XAssetInfo<TracerDef>* asset) override; bool ShouldDump(XAssetInfo<TracerDef>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<TracerDef>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<TracerDef>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<TracerDef>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<TracerDef>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -681,7 +681,7 @@ std::string AssetDumperVehicle::GetFileNameForAsset(Zone* zone, XAssetInfo<Vehic
return "vehicles/" + asset->m_name; return "vehicles/" + asset->m_name;
} }
void AssetDumperVehicle::DumpAsset(Zone* zone, XAssetInfo<VehicleDef>* asset, std::ostream& stream) void AssetDumperVehicle::DumpAsset(AssetDumpingContext& context, XAssetInfo<VehicleDef>* asset, std::ostream& stream)
{ {
InfoStringFromVehicleConverter converter(asset->Asset(), vehicle_fields, std::extent<decltype(vehicle_fields)>::value, [asset](const scr_string_t scrStr) -> std::string InfoStringFromVehicleConverter converter(asset->Asset(), vehicle_fields, std::extent<decltype(vehicle_fields)>::value, [asset](const scr_string_t scrStr) -> std::string
{ {

View File

@ -1,17 +1,17 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
{ {
class AssetDumperVehicle final : public AbstractAssetDumper<VehicleDef> class AssetDumperVehicle final : public AbstractFileDumper<VehicleDef>
{ {
static cspField_t vehicle_fields[]; static cspField_t vehicle_fields[];
protected: protected:
bool ShouldDump(XAssetInfo<VehicleDef>* asset) override; bool ShouldDump(XAssetInfo<VehicleDef>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<VehicleDef>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<VehicleDef>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<VehicleDef>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<VehicleDef>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -1633,7 +1633,7 @@ std::string AssetDumperWeapon::GetFileNameForAsset(Zone* zone, XAssetInfo<Weapon
return "weapons/" + asset->m_name; return "weapons/" + asset->m_name;
} }
void AssetDumperWeapon::DumpAsset(Zone* zone, XAssetInfo<WeaponVariantDef>* asset, std::ostream& stream) void AssetDumperWeapon::DumpAsset(AssetDumpingContext& context, XAssetInfo<WeaponVariantDef>* asset, std::ostream& stream)
{ {
auto* fullDef = new WeaponFullDef; auto* fullDef = new WeaponFullDef;
memset(fullDef, 0, sizeof(WeaponFullDef)); memset(fullDef, 0, sizeof(WeaponFullDef));

View File

@ -1,11 +1,11 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
{ {
class AssetDumperWeapon final : public AbstractAssetDumper<WeaponVariantDef> class AssetDumperWeapon final : public AbstractFileDumper<WeaponVariantDef>
{ {
static cspField_t weapon_fields[]; static cspField_t weapon_fields[];
@ -14,6 +14,6 @@ namespace T6
protected: protected:
bool ShouldDump(XAssetInfo<WeaponVariantDef>* asset) override; bool ShouldDump(XAssetInfo<WeaponVariantDef>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<WeaponVariantDef>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<WeaponVariantDef>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<WeaponVariantDef>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<WeaponVariantDef>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -184,7 +184,7 @@ std::string AssetDumperZBarrier::GetFileNameForAsset(Zone* zone, XAssetInfo<ZBar
return "zbarrier/" + asset->m_name; return "zbarrier/" + asset->m_name;
} }
void AssetDumperZBarrier::DumpAsset(Zone* zone, XAssetInfo<ZBarrierDef>* asset, std::ostream& stream) void AssetDumperZBarrier::DumpAsset(AssetDumpingContext& context, XAssetInfo<ZBarrierDef>* asset, std::ostream& stream)
{ {
InfoStringFromZBarrierConverter converter(asset->Asset(), zbarrier_fields, std::extent<decltype(zbarrier_fields)>::value, [asset](const scr_string_t scrStr) -> std::string InfoStringFromZBarrierConverter converter(asset->Asset(), zbarrier_fields, std::extent<decltype(zbarrier_fields)>::value, [asset](const scr_string_t scrStr) -> std::string
{ {

View File

@ -1,17 +1,17 @@
#pragma once #pragma once
#include "Dumping/AbstractAssetDumper.h" #include "Dumping/AbstractFileDumper.h"
#include "Game/T6/T6.h" #include "Game/T6/T6.h"
namespace T6 namespace T6
{ {
class AssetDumperZBarrier final : public AbstractAssetDumper<ZBarrierDef> class AssetDumperZBarrier final : public AbstractFileDumper<ZBarrierDef>
{ {
static cspField_t zbarrier_fields[]; static cspField_t zbarrier_fields[];
protected: protected:
bool ShouldDump(XAssetInfo<ZBarrierDef>* asset) override; bool ShouldDump(XAssetInfo<ZBarrierDef>* asset) override;
std::string GetFileNameForAsset(Zone* zone, XAssetInfo<ZBarrierDef>* asset) override; std::string GetFileNameForAsset(Zone* zone, XAssetInfo<ZBarrierDef>* asset) override;
void DumpAsset(Zone* zone, XAssetInfo<ZBarrierDef>* asset, std::ostream& stream) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo<ZBarrierDef>* asset, std::ostream& stream) override;
}; };
} }

View File

@ -20,21 +20,21 @@
using namespace T6; using namespace T6;
bool ZoneDumper::CanHandleZone(Zone* zone) const bool ZoneDumper::CanHandleZone(AssetDumpingContext& context) const
{ {
return zone->m_game == &g_GameT6; return context.m_zone->m_game == &g_GameT6;
} }
bool ZoneDumper::DumpZone(Zone* zone, const std::string& basePath) const bool ZoneDumper::DumpZone(AssetDumpingContext& context) const
{ {
#define DUMP_ASSET_POOL(dumperType, poolName) \ #define DUMP_ASSET_POOL(dumperType, poolName) \
if(assetPools->poolName) \ if(assetPools->poolName) \
{ \ { \
dumperType dumper; \ dumperType dumper; \
dumper.DumpPool(zone, assetPools->poolName, basePath); \ dumper.DumpPool(context, assetPools->poolName); \
} }
const auto* assetPools = dynamic_cast<GameAssetPoolT6*>(zone->m_pools.get()); const auto* assetPools = dynamic_cast<GameAssetPoolT6*>(context.m_zone->m_pools.get());
DUMP_ASSET_POOL(AssetDumperPhysPreset, m_phys_preset); DUMP_ASSET_POOL(AssetDumperPhysPreset, m_phys_preset);
DUMP_ASSET_POOL(AssetDumperPhysConstraints, m_phys_constraints); DUMP_ASSET_POOL(AssetDumperPhysConstraints, m_phys_constraints);

View File

@ -6,7 +6,7 @@ namespace T6
class ZoneDumper final : public IZoneDumper class ZoneDumper final : public IZoneDumper
{ {
public: public:
bool CanHandleZone(Zone* zone) const override; bool CanHandleZone(AssetDumpingContext& context) const override;
bool DumpZone(Zone* zone, const std::string& basePath) const override; bool DumpZone(AssetDumpingContext& context) const override;
}; };
} }

View File

@ -11,18 +11,18 @@ const IZoneDumper* const ZONE_DUMPER[]
new T6::ZoneDumper() new T6::ZoneDumper()
}; };
bool ObjWriting::DumpZone(Zone* zone, const std::string& basePath) bool ObjWriting::DumpZone(AssetDumpingContext& context)
{ {
for (auto dumper : ZONE_DUMPER) for (const auto* dumper : ZONE_DUMPER)
{ {
if (dumper->CanHandleZone(zone)) if (dumper->CanHandleZone(context))
{ {
if (dumper->DumpZone(zone, basePath)) if (dumper->DumpZone(context))
{ {
return true; return true;
} }
printf("Dumper for zone '%s' failed!\n", zone->m_name.c_str()); printf("Dumper for zone '%s' failed!\n", context.m_zone->m_name.c_str());
return false; return false;
} }
} }

View File

@ -1,7 +1,6 @@
#pragma once #pragma once
#include "Zone/Zone.h" #include "Dumping/AssetDumpingContext.h"
#include <string>
class ObjWriting class ObjWriting
{ {
@ -20,5 +19,5 @@ public:
} Configuration; } Configuration;
static bool DumpZone(Zone* zone, const std::string& basePath); static bool DumpZone(AssetDumpingContext& context);
}; };

View File

@ -150,6 +150,39 @@ class Unlinker::Impl
return true; return true;
} }
static bool WriteZoneDefinitionFile(Zone* zone, const fs::path& zoneDefinitionFileFolder)
{
auto zoneDefinitionFilePath(zoneDefinitionFileFolder);
zoneDefinitionFilePath.append(zone->m_name);
zoneDefinitionFilePath.replace_extension(".zone");
std::ofstream zoneDefinitionFile(zoneDefinitionFilePath, std::fstream::out | std::fstream::binary);
if (!zoneDefinitionFile.is_open())
{
printf("Failed to open file for zone definition file of zone \"%s\".\n", zone->m_name.c_str());
return false;
}
auto result = false;
for (const auto* zoneDefWriter : ZONE_DEF_WRITERS)
{
if (zoneDefWriter->CanHandleZone(zone))
{
zoneDefWriter->WriteZoneDef(zone, zoneDefinitionFile);
result = true;
break;
}
}
if(!result)
{
printf("Failed to find writer for zone definition file of zone \"%s\".\n", zone->m_name.c_str());
}
zoneDefinitionFile.close();
return result;
}
/** /**
* \brief Performs the tasks specified by the command line arguments on the specified zone. * \brief Performs the tasks specified by the command line arguments on the specified zone.
* \param zone The zone to handle. * \param zone The zone to handle.
@ -171,31 +204,12 @@ class Unlinker::Impl
zoneDefinitionFileFolder.append("zone_source"); zoneDefinitionFileFolder.append("zone_source");
fs::create_directories(zoneDefinitionFileFolder); fs::create_directories(zoneDefinitionFileFolder);
auto zoneDefinitionFilePath(zoneDefinitionFileFolder); WriteZoneDefinitionFile(zone, zoneDefinitionFileFolder);
zoneDefinitionFilePath.append(zone->m_name);
zoneDefinitionFilePath.replace_extension(".zone");
std::ofstream zoneDefinitionFile(zoneDefinitionFilePath, std::fstream::out | std::fstream::binary); AssetDumpingContext context;
context.m_zone = zone;
if (zoneDefinitionFile.is_open()) context.m_base_path = outputFolderPath;
{ ObjWriting::DumpZone(context);
for (const auto* zoneDefWriter : ZONE_DEF_WRITERS)
{
if (zoneDefWriter->CanHandleZone(zone))
{
zoneDefWriter->WriteZoneDef(zone, zoneDefinitionFile);
break;
}
}
ObjWriting::DumpZone(zone, outputFolderPath);
}
else
{
printf("Failed to open file for zone definition file of zone \"%s\".\n", zone->m_name.c_str());
return false;
}
zoneDefinitionFile.close();
} }
return true; return true;