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..fc9bd9b0 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 ZoneDefFilter& filter) 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 (!filter.ShouldWriteAsset(*asset)) + 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..1ce0cce0 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 ZoneDefFilter& filter) 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..f9d9d431 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 ZoneDefFilter& filter) 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 (!filter.ShouldWriteAsset(*asset)) + 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..43534de3 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 ZoneDefFilter& filter) 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..065c355f 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 ZoneDefFilter& filter) 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 (!filter.ShouldWriteAsset(*asset)) + 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..1c5360b6 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 ZoneDefFilter& filter) 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..0cf08df2 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 ZoneDefFilter& filter) 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 (!filter.ShouldWriteAsset(*asset)) + 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..77aa94a6 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 ZoneDefFilter& filter) 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..4971e847 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 ZoneDefFilter& filter) 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 (!filter.ShouldWriteAsset(*asset)) + 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..b5483751 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 ZoneDefFilter& filter) const override; }; } // namespace T6 diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp index 2c032afe..bb1a59b8 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp +++ b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.cpp @@ -5,9 +5,42 @@ #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 +namespace +{ + constexpr auto META_DATA_KEY_GAME = "game"; + constexpr auto META_DATA_KEY_GDT = "gdt"; +} // namespace + +ZoneDefFilter ZoneDefFilter::AllEntries() +{ + return ZoneDefFilter(); +} + +ZoneDefFilter ZoneDefFilter::WithOnlyRootAssets(const Zone& zone) +{ + ZoneDefFilter result; + + for (const auto& asset : zone.m_pools) + { + for (const auto* dependency : asset->m_dependencies) + { + if (dependency != nullptr && dependency->m_zone == &zone) + result.m_non_root_asset_lookup.emplace(dependency); + } + } + + return std::move(result); +} + +bool ZoneDefFilter::ShouldWriteAsset(const XAssetInfoGeneric& asset) const +{ + return m_non_root_asset_lookup.empty() || !m_non_root_asset_lookup.contains(&asset); +} + const IZoneDefWriter* IZoneDefWriter::GetZoneDefWriterForGame(GameId game) { static const IZoneDefWriter* zoneDefWriters[static_cast(GameId::COUNT)]{ @@ -25,7 +58,7 @@ const IZoneDefWriter* IZoneDefWriter::GetZoneDefWriterForGame(GameId game) return result; } -void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, const Zone& zone, const bool useGdt) const +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 +75,7 @@ void AbstractZoneDefWriter::WriteZoneDef(std::ostream& stream, const Zone& zone, } WriteMetaData(out, zone); - WriteContent(out, zone); + + const auto filter = minimalZone ? ZoneDefFilter::WithOnlyRootAssets(zone) : ZoneDefFilter::AllEntries(); + WriteContent(out, zone, filter); } diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h index 1458c1c7..723da73e 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h +++ b/src/ZoneCommon/Zone/Definition/ZoneDefWriter.h @@ -1,8 +1,25 @@ #pragma once +#include "Pool/XAssetInfo.h" #include "Zone/Definition/ZoneDefinitionStream.h" #include "Zone/Zone.h" +#include + +class ZoneDefFilter +{ +public: + static ZoneDefFilter AllEntries(); + static ZoneDefFilter WithOnlyRootAssets(const Zone& zone); + + [[nodiscard]] bool ShouldWriteAsset(const XAssetInfoGeneric& asset) const; + +private: + ZoneDefFilter() = default; + + std::unordered_set m_non_root_asset_lookup; +}; + class IZoneDefWriter { public: @@ -13,20 +30,17 @@ 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); }; class AbstractZoneDefWriter : public IZoneDefWriter { -protected: - static constexpr auto META_DATA_KEY_GAME = "game"; - static constexpr auto META_DATA_KEY_GDT = "gdt"; - - virtual void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const = 0; - virtual void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone) 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; + +protected: + virtual void WriteMetaData(ZoneDefinitionOutputStream& stream, const Zone& zone) const = 0; + virtual void WriteContent(ZoneDefinitionOutputStream& stream, const Zone& zone, const ZoneDefFilter& filter) const = 0; };