diff --git a/src/Linker/Linker.cpp b/src/Linker/Linker.cpp index 3db70738..1622e89d 100644 --- a/src/Linker/Linker.cpp +++ b/src/Linker/Linker.cpp @@ -59,6 +59,7 @@ class LinkerImpl final : public Linker } ZoneDefinitionInputStream zoneDefinitionInputStream(*definitionStream.m_stream, definitionFileName, m_args.m_verbose); + zoneDefinitionInputStream.SetPreviouslySetGame(zoneDefinition.m_game); includeDefinition = zoneDefinitionInputStream.ReadDefinition(); } diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionMetaData.cpp b/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionMetaData.cpp index a345c590..cb99bd30 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionMetaData.cpp +++ b/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionMetaData.cpp @@ -1,10 +1,5 @@ #include "SequenceZoneDefinitionMetaData.h" -#include "Game/IW3/AssetNameResolverIW3.h" -#include "Game/IW4/AssetNameResolverIW4.h" -#include "Game/IW5/AssetNameResolverIW5.h" -#include "Game/T5/AssetNameResolverT5.h" -#include "Game/T6/AssetNameResolverT6.h" #include "Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.h" #include "Utils/StringUtils.h" @@ -64,7 +59,7 @@ void SequenceZoneDefinitionMetaData::ProcessMatch(ZoneDefinitionParserState* sta const auto& keyToken = result.NextCapture(CAPTURE_KEY); auto key = keyToken.FieldValue(); const auto& valueToken = result.NextCapture(CAPTURE_VALUE); - const auto& value = result.NextCapture(CAPTURE_VALUE).FieldValue(); + const auto& value = valueToken.FieldValue(); utils::MakeStringLowerCase(key); @@ -78,8 +73,7 @@ void SequenceZoneDefinitionMetaData::ProcessMatch(ZoneDefinitionParserState* sta if (previousGame != GameId::COUNT && previousGame != *game) throw ParsingException(valueToken.GetPos(), std::format("Game was previously defined as: {}", GameId_Names[static_cast(previousGame)])); - state->m_definition->m_game = *game; - state->m_asset_name_resolver = IAssetNameResolver::GetResolverForGame(*game); + state->SetGame(*game); } else if (key == METADATA_GDT) { diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.cpp b/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.cpp index 8d1f576e..eba6f2fb 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.cpp +++ b/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.cpp @@ -7,9 +7,11 @@ #include "Sequence/SequenceZoneDefinitionInclude.h" #include "Sequence/SequenceZoneDefinitionMetaData.h" -ZoneDefinitionParser::ZoneDefinitionParser(ZoneDefinitionLexer* lexer) +ZoneDefinitionParser::ZoneDefinitionParser(ZoneDefinitionLexer* lexer, const std::optional maybeGame) : AbstractParser(lexer, std::make_unique()) { + if (maybeGame) + m_state->SetGame(*maybeGame); } const std::vector::sequence_t*>& ZoneDefinitionParser::GetTestsForState() diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.h b/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.h index 2ed520f4..4ffffeee 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.h +++ b/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.h @@ -1,17 +1,20 @@ #pragma once +#include "Game/IGame.h" #include "Parsing/Impl/AbstractParser.h" #include "Zone/Definition/ZoneDefinition.h" #include "ZoneDefinitionLexer.h" #include "ZoneDefinitionParserState.h" #include "ZoneDefinitionParserValue.h" +#include + class ZoneDefinitionParser final : public AbstractParser { protected: const std::vector& GetTestsForState() override; public: - explicit ZoneDefinitionParser(ZoneDefinitionLexer* lexer); + explicit ZoneDefinitionParser(ZoneDefinitionLexer* lexer, std::optional maybeGame = std::nullopt); std::unique_ptr GetParsedValue(); }; diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.cpp b/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.cpp index f28e90c5..54dffc88 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.cpp +++ b/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.cpp @@ -5,3 +5,9 @@ ZoneDefinitionParserState::ZoneDefinitionParserState() m_definition(std::make_unique()) { } + +void ZoneDefinitionParserState::SetGame(const GameId game) +{ + m_definition->m_game = game; + m_asset_name_resolver = IAssetNameResolver::GetResolverForGame(game); +} diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.h b/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.h index 6507265f..80074879 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.h +++ b/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.h @@ -10,6 +10,8 @@ class ZoneDefinitionParserState public: ZoneDefinitionParserState(); + void SetGame(GameId game); + const IAssetNameResolver* m_asset_name_resolver; std::unique_ptr m_definition; }; diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.cpp b/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.cpp index 7c763d14..72a34c8e 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.cpp +++ b/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.cpp @@ -1,18 +1,19 @@ #include "ZoneDefinitionStream.h" +#include "Parsing/Impl/CommentRemovingStreamProxy.h" #include "Parsing/Impl/DefinesStreamProxy.h" #include "Parsing/Impl/ParserSingleInputStream.h" -#include "Parsing/Simple/SimpleLexer.h" #include "Parsing/ZoneDefinition/ZoneDefinitionLexer.h" #include "Parsing/ZoneDefinition/ZoneDefinitionParser.h" -#include #include +#include ZoneDefinitionInputStream::ZoneDefinitionInputStream(std::istream& stream, std::string fileName, bool verbose) : m_file_name(std::move(fileName)), m_verbose(verbose), - m_stream(nullptr) + m_stream(nullptr), + m_previously_set_game(std::nullopt) { OpenBaseStream(stream); SetupStreamProxies(); @@ -29,21 +30,23 @@ void ZoneDefinitionInputStream::SetupStreamProxies() { m_open_streams.emplace_back(std::make_unique(m_open_streams.back().get())); auto definesProxy = std::make_unique(m_open_streams.back().get()); - definesProxy->AddDefine(DefinesStreamProxy::Define(ZONE_CODE_GENERATOR_DEFINE_NAME, ZONE_CODE_GENERATOR_DEFINE_VALUE)); m_open_streams.emplace_back(std::move(definesProxy)); m_stream = m_open_streams.back().get(); } +void ZoneDefinitionInputStream::SetPreviouslySetGame(GameId game) +{ + m_previously_set_game = game; +} + std::unique_ptr ZoneDefinitionInputStream::ReadDefinition() { if (m_verbose) - { - std::cout << "Reading zone definition file: " << m_file_name << "\n"; - } + std::cout << std::format("Reading zone definition file: {}\n", m_file_name); const auto lexer = std::make_unique(m_stream); - const auto parser = std::make_unique(lexer.get()); + const auto parser = std::make_unique(lexer.get(), m_previously_set_game); const auto start = std::chrono::steady_clock::now(); std::unique_ptr definition; @@ -52,9 +55,7 @@ std::unique_ptr ZoneDefinitionInputStream::ReadDefinition() const auto end = std::chrono::steady_clock::now(); if (m_verbose) - { - std::cout << "Processing zone definition took " << std::chrono::duration_cast(end - start).count() << "ms\n"; - } + std::cout << std::format("Processing zone definition took {}ms\n", std::chrono::duration_cast(end - start).count()); return std::move(definition); } diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.h b/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.h index 25723c18..b0b26984 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.h +++ b/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.h @@ -1,33 +1,34 @@ #pragma once + +#include "Game/IGame.h" #include "Parsing/IParserLineStream.h" #include "ZoneDefinition.h" #include #include +#include class ZoneDefinitionInputStream { - static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_NAME = "__zonecodegenerator"; - static constexpr const char* ZONE_CODE_GENERATOR_DEFINE_VALUE = "1"; +public: + ZoneDefinitionInputStream(std::istream& stream, std::string fileName, bool verbose); + + void SetPreviouslySetGame(GameId game); + std::unique_ptr ReadDefinition(); + +private: + bool OpenBaseStream(std::istream& stream); + void SetupStreamProxies(); std::string m_file_name; bool m_verbose; IParserLineStream* m_stream; std::vector> m_open_streams; - - bool OpenBaseStream(std::istream& stream); - void SetupStreamProxies(); - -public: - ZoneDefinitionInputStream(std::istream& stream, std::string fileName, bool verbose); - - std::unique_ptr ReadDefinition(); + std::optional m_previously_set_game; }; class ZoneDefinitionOutputStream { - std::ostream& m_stream; - public: explicit ZoneDefinitionOutputStream(std::ostream& stream); @@ -35,4 +36,7 @@ public: void WriteComment(const std::string& comment) const; void WriteMetaData(const std::string& metaDataKey, const std::string& metaDataValue) const; void WriteEntry(const std::string& entryKey, const std::string& entryValue) const; + +private: + std::ostream& m_stream; };