diff --git a/src/Unlinking/Unlinker.cpp b/src/Unlinking/Unlinker.cpp index 79cc38ca..77781fcf 100644 --- a/src/Unlinking/Unlinker.cpp +++ b/src/Unlinking/Unlinker.cpp @@ -67,7 +67,7 @@ namespace } const auto* zoneDefWriter = IZoneDefWriter::GetZoneDefWriterForGame(zone.m_game_id); - zoneDefWriter->WriteZoneDef(zoneDefinitionFile, zone, m_args.m_use_gdt); + zoneDefWriter->WriteZoneDef(zoneDefinitionFile, zone, m_args.m_use_gdt, m_args.m_minimal_zone_def); zoneDefinitionFile.close(); diff --git a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp index be9c658e..f82de509 100644 --- a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp +++ b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.cpp @@ -6,7 +6,7 @@ using namespace IW3; void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const {} -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -17,6 +17,9 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { + if (!ShouldWriteAsset(*asset, dependencyAssets)) + continue; + switch (asset->m_type) { case ASSET_TYPE_LOCALIZE_ENTRY: diff --git a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.h b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.h index 8bfe8f61..7cc56c55 100644 --- a/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.h +++ b/src/ZoneCommon/Game/IW3/Zone/Definition/ZoneDefWriterIW3.h @@ -8,6 +8,6 @@ namespace IW3 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; }; } // namespace IW3 diff --git a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp index 805aa822..9d07f3f8 100644 --- a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp +++ b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.cpp @@ -6,7 +6,7 @@ using namespace IW4; void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const {} -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -17,6 +17,9 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { + if (!ShouldWriteAsset(*asset, dependencyAssets)) + continue; + switch (asset->m_type) { case ASSET_TYPE_LOCALIZE_ENTRY: diff --git a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.h b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.h index e2f3bedc..4bfb0a6e 100644 --- a/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.h +++ b/src/ZoneCommon/Game/IW4/Zone/Definition/ZoneDefWriterIW4.h @@ -8,6 +8,6 @@ namespace IW4 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; }; } // namespace IW4 diff --git a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp index 6c77ee31..51cc37d3 100644 --- a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp +++ b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.cpp @@ -6,7 +6,7 @@ using namespace IW5; void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const {} -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -17,6 +17,9 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { + if (!ShouldWriteAsset(*asset, dependencyAssets)) + continue; + switch (asset->m_type) { case ASSET_TYPE_LOCALIZE_ENTRY: diff --git a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.h b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.h index 29f75f75..550b1dcc 100644 --- a/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.h +++ b/src/ZoneCommon/Game/IW5/Zone/Definition/ZoneDefWriterIW5.h @@ -8,6 +8,6 @@ namespace IW5 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; }; } // namespace IW5 diff --git a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp index a079938d..2647a45b 100644 --- a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp +++ b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.cpp @@ -6,7 +6,7 @@ using namespace T5; void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const {} -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -17,6 +17,9 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { + if (!ShouldWriteAsset(*asset, dependencyAssets)) + continue; + switch (asset->m_type) { case ASSET_TYPE_LOCALIZE_ENTRY: diff --git a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.h b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.h index 7dfb85b4..b7510e13 100644 --- a/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.h +++ b/src/ZoneCommon/Game/T5/Zone/Definition/ZoneDefWriterT5.h @@ -8,6 +8,6 @@ namespace T5 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; }; } // namespace T5 diff --git a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp index dd0dabd0..aa3133bf 100644 --- a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp +++ b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.cpp @@ -62,7 +62,7 @@ void ZoneDefWriter::WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone } } -void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const +void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const { const auto* game = IGame::GetGameById(zone.m_game_id); @@ -73,6 +73,9 @@ void ZoneDefWriter::WriteContent(ZoneDefinitionOutputStream& stream, const Zone& for (const auto& asset : zone.m_pools) { + if (!ShouldWriteAsset(*asset, dependencyAssets)) + continue; + switch (asset->m_type) { case ASSET_TYPE_LOCALIZE_ENTRY: diff --git a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.h b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.h index 842a7dd9..39709e55 100644 --- a/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.h +++ b/src/ZoneCommon/Game/T6/Zone/Definition/ZoneDefWriterT6.h @@ -8,6 +8,6 @@ namespace T6 { protected: void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; - void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const override; + void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const override; }; } // namespace T6 diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp index 2c032afe..35aa7f32 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp +++ b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp @@ -5,6 +5,7 @@ #include "Game/IW5/Zone/Definition/ZoneDefWriterIW5.h" #include "Game/T5/Zone/Definition/ZoneDefWriterT5.h" #include "Game/T6/Zone/Definition/ZoneDefWriterT6.h" +#include "Pool/XAssetInfo.h" #include @@ -25,7 +26,31 @@ const IZoneDefWriter* IZoneDefWriter::GetZoneDefWriterForGame(GameId game) return result; } -void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, const Zone& zone, const bool useGdt) const +AbstractZoneDefWriter::DependencyAssetLookup AbstractZoneDefWriter::CreateDependencyAssetLookup(const Zone& zone, const bool minimalZone) +{ + DependencyAssetLookup dependencyAssets; + + if (!minimalZone) + return dependencyAssets; + + for (const auto& asset : zone.m_pools) + { + for (const auto* dependency : asset->m_dependencies) + { + if (dependency != nullptr && dependency->m_zone == &zone) + dependencyAssets.emplace(dependency); + } + } + + return dependencyAssets; +} + +bool AbstractZoneDefWriter::ShouldWriteAsset(const XAssetInfoGeneric& asset, const DependencyAssetLookup& dependencyAssets) +{ + return dependencyAssets.empty() || !dependencyAssets.contains(&asset); +} + +void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, const Zone& zone, const bool useGdt, const bool minimalZone) const { ZoneDefinitionOutputStream out(stream); const auto* game = IGame::GetGameById(zone.m_game_id); @@ -42,5 +67,7 @@ void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, const Zone& zone, } WriteMetaData(out, zone); - WriteContent(out, zone); + + const auto dependencyAssets = CreateDependencyAssetLookup(zone, minimalZone); + WriteContent(out, zone, dependencyAssets); } diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h index 1458c1c7..6ec590bc 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h +++ b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h @@ -3,6 +3,10 @@ #include "Zone/Definition/ZoneDefinitionStream.h" #include "Zone/Zone.h" +#include + +class XAssetInfoGeneric; + class IZoneDefWriter { public: @@ -13,7 +17,7 @@ public: IZoneDefWriter& operator=(const IZoneDefWriter& other) = default; IZoneDefWriter& operator=(IZoneDefWriter&& other) noexcept = default; - virtual void WriteZoneDef(std::ostream& stream, const Zone& zone, bool useGdt) const = 0; + virtual void WriteZoneDef(std::ostream& stream, const Zone& zone, bool useGdt, bool minimalZone) const = 0; static const IZoneDefWriter* GetZoneDefWriterForGame(GameId game); }; @@ -24,9 +28,14 @@ protected: static constexpr auto META_DATA_KEY_GAME = "game"; static constexpr auto META_DATA_KEY_GDT = "gdt"; + using DependencyAssetLookup = std::unordered_set; + + static DependencyAssetLookup CreateDependencyAssetLookup(const Zone& zone, bool minimalZone); + static bool ShouldWriteAsset(const XAssetInfoGeneric& asset, const DependencyAssetLookup& dependencyAssets); + virtual void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const = 0; - virtual void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) const = 0; + virtual void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const DependencyAssetLookup& dependencyAssets) const = 0; public: - void WriteZoneDef(std::ostream& stream, const Zone& zone, bool useGdt) const override; + void WriteZoneDef(std::ostream& stream, const Zone& zone, bool useGdt, bool minimalZone) const override; };