From eef269f497808be338b6ae5b6ce313fb83f6335d Mon Sep 17 00:00:00 2001 From: LJW-Dev Date: Sat, 1 Nov 2025 16:16:15 +0800 Subject: [PATCH] Added map type metadata parsing to zone file --- .../SequenceZoneDefinitionMetaData.cpp | 22 +++++++++++++++---- .../Parsing/ZoneDefinitionParserState.cpp | 20 ++--------------- .../Parsing/ZoneDefinitionParserState.h | 2 +- .../Zone/Definition/ZoneDefinition.cpp | 3 ++- .../Zone/Definition/ZoneDefinition.h | 11 ++++++++-- 5 files changed, 32 insertions(+), 26 deletions(-) diff --git a/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionMetaData.cpp b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionMetaData.cpp index f60b2f20..b1f1588e 100644 --- a/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionMetaData.cpp +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionMetaData.cpp @@ -1,5 +1,4 @@ #include "SequenceZoneDefinitionMetaData.h" - #include "Utils/Logging/Log.h" #include "Utils/StringUtils.h" #include "Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherFactory.h" @@ -10,7 +9,7 @@ namespace { - constexpr auto METADATA_CUSTOM_MAP = "custom_map"; + constexpr auto METADATA_MAP_TYPE = "map"; constexpr auto METADATA_GAME = "game"; constexpr auto METADATA_GDT = "gdt"; @@ -136,9 +135,24 @@ void SequenceZoneDefinitionMetaData::ProcessMatch(ZoneDefinitionParserState* sta { ProcessMetaDataGame(state, valueToken, value); } - else if (key == METADATA_CUSTOM_MAP) + else if (key == METADATA_MAP_TYPE) { - state->SetCustomMap(); + std::string valueLowerCase = value; + std::transform(valueLowerCase.begin(), + valueLowerCase.end(), + valueLowerCase.begin(), + [](unsigned char c) + { + return std::tolower(c); + }); + if (valueLowerCase.compare("sp") == 0) + state->SetMapType(ZoneDefinitionMapType::SP); + else if (valueLowerCase.compare("mp") == 0) + state->SetMapType(ZoneDefinitionMapType::MP); + else if (valueLowerCase.compare("zm") == 0) + state->SetMapType(ZoneDefinitionMapType::ZM); + else + throw ParsingException(valueToken.GetPos(), "map must be SP, MP or ZM"); } else if (key == METADATA_GDT) { diff --git a/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.cpp b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.cpp index a5ed3bf0..53aaa0a1 100644 --- a/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.cpp +++ b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.cpp @@ -19,25 +19,9 @@ void ZoneDefinitionParserState::SetGame(const GameId game) m_asset_name_resolver = IAssetNameResolver::GetResolverForGame(game); } -void ZoneDefinitionParserState::SetCustomMap() +void ZoneDefinitionParserState::SetMapType(ZoneDefinitionMapType mapType) { - if (m_definition->is_custom_map == false) - { - m_definition->is_custom_map = true; - if (m_definition->m_game != GameId::T6) - { - printf("ERROR: Custom map linking is only supported on BO2 (T6).\n"); - return; - } - - printf("Processing zone as a custom map zone.\n"); - const auto gfxWorldAssetType = m_asset_name_resolver->GetAssetTypeByName("gfxworld"); - _ASSERT(gfxWorldAssetType); - - m_definition->m_assets.emplace_back(*gfxWorldAssetType, "gfxworld", false); - } - - + m_definition->m_map_type = mapType; } namespace diff --git a/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.h b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.h index 1be1bd84..74d9a081 100644 --- a/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.h @@ -17,7 +17,7 @@ public: void SetGame(GameId game); - void SetCustomMap(); + void SetMapType(ZoneDefinitionMapType mapType); void StartIPak(std::string ipakName); void StartIwd(std::string iwdName); diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefinition.cpp b/src/ZoneCommon/Zone/Definition/ZoneDefinition.cpp index 41c401da..53233f54 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefinition.cpp +++ b/src/ZoneCommon/Zone/Definition/ZoneDefinition.cpp @@ -34,6 +34,7 @@ void ZoneDefinitionProperties::Include(const ZoneDefinitionProperties& otherProp } ZoneDefinition::ZoneDefinition() - : m_game(GameId::COUNT) + : m_game(GameId::COUNT), + m_map_type(ZoneDefinitionMapType::NONE) { } diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefinition.h b/src/ZoneCommon/Zone/Definition/ZoneDefinition.h index e87f52cb..e774b1f2 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefinition.h +++ b/src/ZoneCommon/Zone/Definition/ZoneDefinition.h @@ -15,6 +15,14 @@ enum class ZoneDefinitionObjContainerType : uint8_t IPAK }; +enum class ZoneDefinitionMapType : uint8_t +{ + NONE, + SP, + MP, + ZM +}; + class ZoneDefinitionObjContainer { public: @@ -69,6 +77,5 @@ public: std::vector m_gdts; std::vector m_assets; std::vector m_obj_containers; - - bool is_custom_map = false; + ZoneDefinitionMapType m_map_type; };