From 0eb14890ab937f2329652dae813c29587721e804 Mon Sep 17 00:00:00 2001 From: Jan Laupetin Date: Wed, 30 Jul 2025 21:41:39 +0100 Subject: [PATCH] refactor: streamline slug, qdb and script dumper --- src/ObjWriting/Game/IW5/ObjWriterIW5.cpp | 4 +-- .../Game/IW5/Script/AssetDumperScriptFile.cpp | 30 ----------------- .../Game/IW5/Script/ScriptDumperIW5.cpp | 33 +++++++++++++++++++ ...etDumperScriptFile.h => ScriptDumperIW5.h} | 6 ++-- src/ObjWriting/Game/T6/ObjWriterT6.cpp | 12 +++---- src/ObjWriting/Game/T6/Qdb/AssetDumperQdb.cpp | 20 ----------- src/ObjWriting/Game/T6/Qdb/QdbDumperT6.cpp | 23 +++++++++++++ .../Qdb/{AssetDumperQdb.h => QdbDumperT6.h} | 6 ++-- .../T6/Script/AssetDumperScriptParseTree.cpp | 20 ----------- .../Game/T6/Script/ScriptDumperT6.cpp | 23 +++++++++++++ ...mperScriptParseTree.h => ScriptDumperT6.h} | 6 ++-- .../Game/T6/Slug/AssetDumperSlug.cpp | 20 ----------- src/ObjWriting/Game/T6/Slug/SlugDumperT6.cpp | 23 +++++++++++++ .../{AssetDumperSlug.h => SlugDumperT6.h} | 6 ++-- 14 files changed, 122 insertions(+), 110 deletions(-) delete mode 100644 src/ObjWriting/Game/IW5/Script/AssetDumperScriptFile.cpp create mode 100644 src/ObjWriting/Game/IW5/Script/ScriptDumperIW5.cpp rename src/ObjWriting/Game/IW5/Script/{AssetDumperScriptFile.h => ScriptDumperIW5.h} (70%) delete mode 100644 src/ObjWriting/Game/T6/Qdb/AssetDumperQdb.cpp create mode 100644 src/ObjWriting/Game/T6/Qdb/QdbDumperT6.cpp rename src/ObjWriting/Game/T6/Qdb/{AssetDumperQdb.h => QdbDumperT6.h} (72%) delete mode 100644 src/ObjWriting/Game/T6/Script/AssetDumperScriptParseTree.cpp create mode 100644 src/ObjWriting/Game/T6/Script/ScriptDumperT6.cpp rename src/ObjWriting/Game/T6/Script/{AssetDumperScriptParseTree.h => ScriptDumperT6.h} (69%) delete mode 100644 src/ObjWriting/Game/T6/Slug/AssetDumperSlug.cpp create mode 100644 src/ObjWriting/Game/T6/Slug/SlugDumperT6.cpp rename src/ObjWriting/Game/T6/Slug/{AssetDumperSlug.h => SlugDumperT6.h} (71%) diff --git a/src/ObjWriting/Game/IW5/ObjWriterIW5.cpp b/src/ObjWriting/Game/IW5/ObjWriterIW5.cpp index 254a0d9b..89618e2c 100644 --- a/src/ObjWriting/Game/IW5/ObjWriterIW5.cpp +++ b/src/ObjWriting/Game/IW5/ObjWriterIW5.cpp @@ -11,7 +11,7 @@ #include "Menu/AssetDumperMenuList.h" #include "ObjWriting.h" #include "RawFile/RawFileDumperIW5.h" -#include "Script/AssetDumperScriptFile.h" +#include "Script/ScriptDumperIW5.h" #include "Sound/AssetDumperLoadedSound.h" #include "StringTable/AssetDumperStringTable.h" #include "Weapon/AssetDumperWeapon.h" @@ -62,7 +62,7 @@ bool ObjWriter::DumpZone(AssetDumpingContext& context) const // DUMP_ASSET_POOL(AssetDumperFxImpactTable, m_fx_impact_table, ASSET_TYPE_IMPACT_FX) // DUMP_ASSET_POOL(AssetDumperSurfaceFxTable, m_surface_fx_table, ASSET_TYPE_SURFACE_FX) DUMP_ASSET_POOL(raw_file::Dumper, m_raw_file, ASSET_TYPE_RAWFILE) - DUMP_ASSET_POOL(AssetDumperScriptFile, m_script_file, ASSET_TYPE_SCRIPTFILE) + DUMP_ASSET_POOL(script::Dumper, m_script_file, ASSET_TYPE_SCRIPTFILE) DUMP_ASSET_POOL(AssetDumperStringTable, m_string_table, ASSET_TYPE_STRINGTABLE) DUMP_ASSET_POOL(leaderboard::JsonDumper, m_leaderboard, ASSET_TYPE_LEADERBOARD) // DUMP_ASSET_POOL(AssetDumperStructuredDataDefSet, m_structed_data_def_set, ASSET_TYPE_STRUCTURED_DATA_DEF) diff --git a/src/ObjWriting/Game/IW5/Script/AssetDumperScriptFile.cpp b/src/ObjWriting/Game/IW5/Script/AssetDumperScriptFile.cpp deleted file mode 100644 index c432a700..00000000 --- a/src/ObjWriting/Game/IW5/Script/AssetDumperScriptFile.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "AssetDumperScriptFile.h" - -using namespace IW5; - -bool AssetDumperScriptFile::ShouldDump(XAssetInfo* asset) -{ - return true; -} - -// See https://github.com/xensik/gsc-tool#file-format for an in-depth explanation about the .gscbin format -void AssetDumperScriptFile::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) -{ - auto* scriptFile = asset->Asset(); - const auto assetFile = context.OpenAssetFile(asset->m_name + ".gscbin"); - - if (!assetFile) - return; - - auto& stream = *assetFile; - - // Dump the name and the numeric fields - stream.write(asset->m_name.c_str(), asset->m_name.size() + 1); - stream.write(reinterpret_cast(&scriptFile->compressedLen), sizeof(scriptFile->compressedLen)); - stream.write(reinterpret_cast(&scriptFile->len), sizeof(scriptFile->len)); - stream.write(reinterpret_cast(&scriptFile->bytecodeLen), sizeof(scriptFile->bytecodeLen)); - - // Dump the buffers - stream.write(scriptFile->buffer, scriptFile->compressedLen); - stream.write(reinterpret_cast(scriptFile->bytecode), scriptFile->bytecodeLen); -} diff --git a/src/ObjWriting/Game/IW5/Script/ScriptDumperIW5.cpp b/src/ObjWriting/Game/IW5/Script/ScriptDumperIW5.cpp new file mode 100644 index 00000000..c81ba1d4 --- /dev/null +++ b/src/ObjWriting/Game/IW5/Script/ScriptDumperIW5.cpp @@ -0,0 +1,33 @@ +#include "ScriptDumperIW5.h" + +using namespace IW5; + +namespace IW5::script +{ + bool Dumper::ShouldDump(XAssetInfo* asset) + { + return true; + } + + // See https://github.com/xensik/gsc-tool#file-format for an in-depth explanation about the .gscbin format + void Dumper::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) + { + auto* scriptFile = asset->Asset(); + const auto assetFile = context.OpenAssetFile(asset->m_name + ".gscbin"); + + if (!assetFile) + return; + + auto& stream = *assetFile; + + // Dump the name and the numeric fields + stream.write(asset->m_name.c_str(), asset->m_name.size() + 1); + stream.write(reinterpret_cast(&scriptFile->compressedLen), sizeof(scriptFile->compressedLen)); + stream.write(reinterpret_cast(&scriptFile->len), sizeof(scriptFile->len)); + stream.write(reinterpret_cast(&scriptFile->bytecodeLen), sizeof(scriptFile->bytecodeLen)); + + // Dump the buffers + stream.write(scriptFile->buffer, scriptFile->compressedLen); + stream.write(reinterpret_cast(scriptFile->bytecode), scriptFile->bytecodeLen); + } +} // namespace IW5::script diff --git a/src/ObjWriting/Game/IW5/Script/AssetDumperScriptFile.h b/src/ObjWriting/Game/IW5/Script/ScriptDumperIW5.h similarity index 70% rename from src/ObjWriting/Game/IW5/Script/AssetDumperScriptFile.h rename to src/ObjWriting/Game/IW5/Script/ScriptDumperIW5.h index 2397f387..7a3dce2b 100644 --- a/src/ObjWriting/Game/IW5/Script/AssetDumperScriptFile.h +++ b/src/ObjWriting/Game/IW5/Script/ScriptDumperIW5.h @@ -3,12 +3,12 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/IW5/IW5.h" -namespace IW5 +namespace IW5::script { - class AssetDumperScriptFile final : public AbstractAssetDumper + class Dumper final : public AbstractAssetDumper { protected: bool ShouldDump(XAssetInfo* asset) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) override; }; -} // namespace IW5 +} // namespace IW5::script diff --git a/src/ObjWriting/Game/T6/ObjWriterT6.cpp b/src/ObjWriting/Game/T6/ObjWriterT6.cpp index 79c6778c..73315ffe 100644 --- a/src/ObjWriting/Game/T6/ObjWriterT6.cpp +++ b/src/ObjWriting/Game/T6/ObjWriterT6.cpp @@ -11,10 +11,10 @@ #include "ObjWriting.h" #include "PhysConstraints/PhysConstraintsInfoStringDumperT6.h" #include "PhysPreset/PhysPresetInfoStringDumperT6.h" -#include "Qdb/AssetDumperQdb.h" +#include "Qdb/QdbDumperT6.h" #include "RawFile/RawFileDumperT6.h" -#include "Script/AssetDumperScriptParseTree.h" -#include "Slug/AssetDumperSlug.h" +#include "Script/ScriptDumperT6.h" +#include "Slug/SlugDumperT6.h" #include "Sound/AssetDumperSndBank.h" #include "Sound/AssetDumperSndDriverGlobals.h" #include "StringTable/AssetDumperStringTable.h" @@ -82,15 +82,15 @@ bool ObjWriter::DumpZone(AssetDumpingContext& context) const // DUMP_ASSET_POOL(AssetDumperDDLRoot, m_ddl, ASSET_TYPE_DDL) // DUMP_ASSET_POOL(AssetDumperGlasses, m_glasses, ASSET_TYPE_GLASSES) // DUMP_ASSET_POOL(AssetDumperEmblemSet, m_emblem_set, ASSET_TYPE_EMBLEMSET) - DUMP_ASSET_POOL(AssetDumperScriptParseTree, m_script, ASSET_TYPE_SCRIPTPARSETREE) + DUMP_ASSET_POOL(script::Dumper, m_script, ASSET_TYPE_SCRIPTPARSETREE) // DUMP_ASSET_POOL(AssetDumperKeyValuePairs, m_key_value_pairs, ASSET_TYPE_KEYVALUEPAIRS) DUMP_ASSET_POOL(AssetDumperVehicle, m_vehicle, ASSET_TYPE_VEHICLEDEF) // DUMP_ASSET_POOL(AssetDumperMemoryBlock, m_memory_block, ASSET_TYPE_MEMORYBLOCK) // DUMP_ASSET_POOL(AssetDumperAddonMapEnts, m_addon_map_ents, ASSET_TYPE_ADDON_MAP_ENTS) DUMP_ASSET_POOL(AssetDumperTracer, m_tracer, ASSET_TYPE_TRACER) // DUMP_ASSET_POOL(AssetDumperSkinnedVertsDef, m_skinned_verts, ASSET_TYPE_SKINNEDVERTS) - DUMP_ASSET_POOL(AssetDumperQdb, m_qdb, ASSET_TYPE_QDB) - DUMP_ASSET_POOL(AssetDumperSlug, m_slug, ASSET_TYPE_SLUG) + DUMP_ASSET_POOL(qdb::Dumper, m_qdb, ASSET_TYPE_QDB) + DUMP_ASSET_POOL(slug::Dumper, m_slug, ASSET_TYPE_SLUG) // DUMP_ASSET_POOL(AssetDumperFootstepTableDef, m_footstep_table, ASSET_TYPE_FOOTSTEP_TABLE) // DUMP_ASSET_POOL(AssetDumperFootstepFXTableDef, m_footstep_fx_table, ASSET_TYPE_FOOTSTEPFX_TABLE) DUMP_ASSET_POOL(AssetDumperZBarrier, m_zbarrier, ASSET_TYPE_ZBARRIER) diff --git a/src/ObjWriting/Game/T6/Qdb/AssetDumperQdb.cpp b/src/ObjWriting/Game/T6/Qdb/AssetDumperQdb.cpp deleted file mode 100644 index dde4a739..00000000 --- a/src/ObjWriting/Game/T6/Qdb/AssetDumperQdb.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "AssetDumperQdb.h" - -using namespace T6; - -bool AssetDumperQdb::ShouldDump(XAssetInfo* asset) -{ - return true; -} - -void AssetDumperQdb::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) -{ - const auto* qdb = asset->Asset(); - const auto assetFile = context.OpenAssetFile(asset->m_name); - - if (!assetFile) - return; - - auto& stream = *assetFile; - stream.write(qdb->buffer, qdb->len); -} diff --git a/src/ObjWriting/Game/T6/Qdb/QdbDumperT6.cpp b/src/ObjWriting/Game/T6/Qdb/QdbDumperT6.cpp new file mode 100644 index 00000000..5d4aa41b --- /dev/null +++ b/src/ObjWriting/Game/T6/Qdb/QdbDumperT6.cpp @@ -0,0 +1,23 @@ +#include "QdbDumperT6.h" + +using namespace T6; + +namespace T6::qdb +{ + bool Dumper::ShouldDump(XAssetInfo* asset) + { + return true; + } + + void Dumper::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) + { + const auto* qdb = asset->Asset(); + const auto assetFile = context.OpenAssetFile(asset->m_name); + + if (!assetFile) + return; + + auto& stream = *assetFile; + stream.write(qdb->buffer, qdb->len); + } +} // namespace T6::qdb diff --git a/src/ObjWriting/Game/T6/Qdb/AssetDumperQdb.h b/src/ObjWriting/Game/T6/Qdb/QdbDumperT6.h similarity index 72% rename from src/ObjWriting/Game/T6/Qdb/AssetDumperQdb.h rename to src/ObjWriting/Game/T6/Qdb/QdbDumperT6.h index fd6a7456..9f270398 100644 --- a/src/ObjWriting/Game/T6/Qdb/AssetDumperQdb.h +++ b/src/ObjWriting/Game/T6/Qdb/QdbDumperT6.h @@ -3,12 +3,12 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/T6/T6.h" -namespace T6 +namespace T6::qdb { - class AssetDumperQdb final : public AbstractAssetDumper + class Dumper final : public AbstractAssetDumper { protected: bool ShouldDump(XAssetInfo* asset) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) override; }; -} // namespace T6 +} // namespace T6::qdb diff --git a/src/ObjWriting/Game/T6/Script/AssetDumperScriptParseTree.cpp b/src/ObjWriting/Game/T6/Script/AssetDumperScriptParseTree.cpp deleted file mode 100644 index fb1ff079..00000000 --- a/src/ObjWriting/Game/T6/Script/AssetDumperScriptParseTree.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "AssetDumperScriptParseTree.h" - -using namespace T6; - -bool AssetDumperScriptParseTree::ShouldDump(XAssetInfo* asset) -{ - return true; -} - -void AssetDumperScriptParseTree::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) -{ - const auto* scriptParseTree = asset->Asset(); - const auto assetFile = context.OpenAssetFile(asset->m_name); - - if (!assetFile) - return; - - auto& stream = *assetFile; - stream.write(scriptParseTree->buffer, scriptParseTree->len); -} diff --git a/src/ObjWriting/Game/T6/Script/ScriptDumperT6.cpp b/src/ObjWriting/Game/T6/Script/ScriptDumperT6.cpp new file mode 100644 index 00000000..15c4eb6c --- /dev/null +++ b/src/ObjWriting/Game/T6/Script/ScriptDumperT6.cpp @@ -0,0 +1,23 @@ +#include "ScriptDumperT6.h" + +using namespace T6; + +namespace T6::script +{ + bool Dumper::ShouldDump(XAssetInfo* asset) + { + return true; + } + + void Dumper::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) + { + const auto* scriptParseTree = asset->Asset(); + const auto assetFile = context.OpenAssetFile(asset->m_name); + + if (!assetFile) + return; + + auto& stream = *assetFile; + stream.write(scriptParseTree->buffer, scriptParseTree->len); + } +} // namespace T6::script diff --git a/src/ObjWriting/Game/T6/Script/AssetDumperScriptParseTree.h b/src/ObjWriting/Game/T6/Script/ScriptDumperT6.h similarity index 69% rename from src/ObjWriting/Game/T6/Script/AssetDumperScriptParseTree.h rename to src/ObjWriting/Game/T6/Script/ScriptDumperT6.h index 8ff1db2e..fb388b36 100644 --- a/src/ObjWriting/Game/T6/Script/AssetDumperScriptParseTree.h +++ b/src/ObjWriting/Game/T6/Script/ScriptDumperT6.h @@ -3,12 +3,12 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/T6/T6.h" -namespace T6 +namespace T6::script { - class AssetDumperScriptParseTree final : public AbstractAssetDumper + class Dumper final : public AbstractAssetDumper { protected: bool ShouldDump(XAssetInfo* asset) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) override; }; -} // namespace T6 +} // namespace T6::script diff --git a/src/ObjWriting/Game/T6/Slug/AssetDumperSlug.cpp b/src/ObjWriting/Game/T6/Slug/AssetDumperSlug.cpp deleted file mode 100644 index 09dd50a4..00000000 --- a/src/ObjWriting/Game/T6/Slug/AssetDumperSlug.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "AssetDumperSlug.h" - -using namespace T6; - -bool AssetDumperSlug::ShouldDump(XAssetInfo* asset) -{ - return true; -} - -void AssetDumperSlug::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) -{ - const auto* slug = asset->Asset(); - const auto assetFile = context.OpenAssetFile(asset->m_name); - - if (!assetFile) - return; - - auto& stream = *assetFile; - stream.write(slug->buffer, slug->len); -} diff --git a/src/ObjWriting/Game/T6/Slug/SlugDumperT6.cpp b/src/ObjWriting/Game/T6/Slug/SlugDumperT6.cpp new file mode 100644 index 00000000..63f07f7a --- /dev/null +++ b/src/ObjWriting/Game/T6/Slug/SlugDumperT6.cpp @@ -0,0 +1,23 @@ +#include "SlugDumperT6.h" + +using namespace T6; + +namespace T6::slug +{ + bool Dumper::ShouldDump(XAssetInfo* asset) + { + return true; + } + + void Dumper::DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) + { + const auto* slug = asset->Asset(); + const auto assetFile = context.OpenAssetFile(asset->m_name); + + if (!assetFile) + return; + + auto& stream = *assetFile; + stream.write(slug->buffer, slug->len); + } +} // namespace T6::slug diff --git a/src/ObjWriting/Game/T6/Slug/AssetDumperSlug.h b/src/ObjWriting/Game/T6/Slug/SlugDumperT6.h similarity index 71% rename from src/ObjWriting/Game/T6/Slug/AssetDumperSlug.h rename to src/ObjWriting/Game/T6/Slug/SlugDumperT6.h index 01598810..f33960e6 100644 --- a/src/ObjWriting/Game/T6/Slug/AssetDumperSlug.h +++ b/src/ObjWriting/Game/T6/Slug/SlugDumperT6.h @@ -3,12 +3,12 @@ #include "Dumping/AbstractAssetDumper.h" #include "Game/T6/T6.h" -namespace T6 +namespace T6::slug { - class AssetDumperSlug final : public AbstractAssetDumper + class Dumper final : public AbstractAssetDumper { protected: bool ShouldDump(XAssetInfo* asset) override; void DumpAsset(AssetDumpingContext& context, XAssetInfo* asset) override; }; -} // namespace T6 +} // namespace T6::slug