From aa212e0958f090862b68cd01990081d798db255c Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 1 Jan 2025 18:13:23 +0100 Subject: [PATCH] chore: parse includes and assetlists while parsing zone definition --- premake5.lua | 2 + src/Linker/Linker.cpp | 153 +++++------------- src/ObjCommon.lua | 2 + .../SearchPath/ISearchPath.cpp | 0 .../SearchPath/ISearchPath.h | 0 .../SearchPath/SearchPathFilesystem.cpp | 0 .../SearchPath/SearchPathFilesystem.h | 0 .../SearchPath/SearchPathMultiInputStream.cpp | 15 ++ .../SearchPath/SearchPathMultiInputStream.h | 15 ++ .../SearchPath/SearchPathSearchOptions.cpp | 0 .../SearchPath/SearchPathSearchOptions.h | 0 .../SearchPath/SearchPaths.cpp | 0 .../SearchPath/SearchPaths.h | 0 .../Game/IW4/Menu/LoaderMenuListIW4.cpp | 12 +- .../LoaderStructuredDataDefIW4.cpp | 11 +- .../Game/IW5/Menu/LoaderMenuListIW5.cpp | 12 +- .../Parsing/Menu/MenuFileReader.cpp | 26 +-- src/ObjLoading/Parsing/Menu/MenuFileReader.h | 34 ++-- .../StructuredDataDefReader.cpp | 25 ++- .../StructuredDataDefReader.h | 20 ++- .../Parsing/Impl/IncludingStreamProxy.cpp | 8 +- .../Parsing/Impl/ParserMultiInputStream.cpp | 13 +- .../Parsing/Impl/ParserMultiInputStream.h | 29 ++-- .../SequenceZoneDefinitionAssetList.cpp | 19 --- .../SequenceZoneDefinitionInclude.cpp | 19 --- .../Zone/AssetList/AssetListOutputStream.cpp | 14 ++ ...etListStream.h => AssetListOutputStream.h} | 15 +- .../Zone/AssetList/AssetListReader.cpp | 96 +++++++++++ .../Zone/AssetList/AssetListReader.h | 20 +++ .../Zone/AssetList/AssetListStream.cpp | 62 ------- .../ZoneDefinitionMatcherCharacter.cpp | 0 .../Matcher/ZoneDefinitionMatcherCharacter.h | 2 +- .../Matcher/ZoneDefinitionMatcherFactory.cpp | 0 .../Matcher/ZoneDefinitionMatcherFactory.h | 2 +- .../Matcher/ZoneDefinitionMatcherKeyword.cpp | 0 .../Matcher/ZoneDefinitionMatcherKeyword.h | 2 +- .../ZoneDefinitionMatcherValueType.cpp | 0 .../Matcher/ZoneDefinitionMatcherValueType.h | 2 +- .../SequenceZoneDefinitionAssetList.cpp | 35 ++++ .../SequenceZoneDefinitionAssetList.h | 5 +- .../Sequence/SequenceZoneDefinitionBuild.cpp | 2 +- .../Sequence/SequenceZoneDefinitionBuild.h | 2 +- .../Sequence/SequenceZoneDefinitionEntry.cpp | 2 +- .../Sequence/SequenceZoneDefinitionEntry.h | 2 +- .../Sequence/SequenceZoneDefinitionIgnore.cpp | 2 +- .../Sequence/SequenceZoneDefinitionIgnore.h | 2 +- .../SequenceZoneDefinitionInclude.cpp | 32 ++++ .../Sequence/SequenceZoneDefinitionInclude.h | 2 +- .../SequenceZoneDefinitionMetaData.cpp | 2 +- .../Sequence/SequenceZoneDefinitionMetaData.h | 2 +- .../Parsing}/ZoneDefinitionLexer.cpp | 0 .../Definition/Parsing}/ZoneDefinitionLexer.h | 0 .../Parsing}/ZoneDefinitionParser.cpp | 5 +- .../Parsing}/ZoneDefinitionParser.h | 13 +- .../Parsing}/ZoneDefinitionParserState.cpp | 8 +- .../Parsing}/ZoneDefinitionParserState.h | 10 +- .../Parsing}/ZoneDefinitionParserValue.cpp | 0 .../Parsing}/ZoneDefinitionParserValue.h | 0 .../Zone/Definition/ZoneDefinition.cpp | 17 -- .../Zone/Definition/ZoneDefinition.h | 5 - .../Zone/Definition/ZoneDefinitionStream.cpp | 25 ++- .../Zone/Definition/ZoneDefinitionStream.h | 7 +- test/ObjCommonTestUtils.lua | 53 ++++++ .../SearchPath}/MockSearchPath.cpp | 0 .../SearchPath}/MockSearchPath.h | 8 +- test/ObjLoadingTests.lua | 2 + .../AssetLoaderStringTableIW3Test.cpp | 2 +- .../AssetLoaders/LoaderStringTableIW4Test.cpp | 2 +- .../Game/IW4/Menu/LoaderMenuListIW4Test.cpp | 2 +- .../AssetLoaders/LoaderStringTableIW5Test.cpp | 2 +- .../AssetLoaders/LoaderStringTableT5Test.cpp | 2 +- .../AssetLoaders/LoaderStringTableT6Test.cpp | 2 +- test/ZoneCommonTests.lua | 2 + .../Definition/ZoneDefinitionStreamTests.cpp | 80 +++++++-- 74 files changed, 530 insertions(+), 437 deletions(-) rename src/{ObjLoading => ObjCommon}/SearchPath/ISearchPath.cpp (100%) rename src/{ObjLoading => ObjCommon}/SearchPath/ISearchPath.h (100%) rename src/{ObjLoading => ObjCommon}/SearchPath/SearchPathFilesystem.cpp (100%) rename src/{ObjLoading => ObjCommon}/SearchPath/SearchPathFilesystem.h (100%) create mode 100644 src/ObjCommon/SearchPath/SearchPathMultiInputStream.cpp create mode 100644 src/ObjCommon/SearchPath/SearchPathMultiInputStream.h rename src/{ObjLoading => ObjCommon}/SearchPath/SearchPathSearchOptions.cpp (100%) rename src/{ObjLoading => ObjCommon}/SearchPath/SearchPathSearchOptions.h (100%) rename src/{ObjLoading => ObjCommon}/SearchPath/SearchPaths.cpp (100%) rename src/{ObjLoading => ObjCommon}/SearchPath/SearchPaths.h (100%) delete mode 100644 src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionAssetList.cpp delete mode 100644 src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionInclude.cpp create mode 100644 src/ZoneCommon/Zone/AssetList/AssetListOutputStream.cpp rename src/ZoneCommon/Zone/AssetList/{AssetListStream.h => AssetListOutputStream.h} (54%) create mode 100644 src/ZoneCommon/Zone/AssetList/AssetListReader.cpp create mode 100644 src/ZoneCommon/Zone/AssetList/AssetListReader.h delete mode 100644 src/ZoneCommon/Zone/AssetList/AssetListStream.cpp rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Matcher/ZoneDefinitionMatcherCharacter.cpp (100%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Matcher/ZoneDefinitionMatcherCharacter.h (85%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Matcher/ZoneDefinitionMatcherFactory.cpp (100%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Matcher/ZoneDefinitionMatcherFactory.h (92%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Matcher/ZoneDefinitionMatcherKeyword.cpp (100%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Matcher/ZoneDefinitionMatcherKeyword.h (87%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Matcher/ZoneDefinitionMatcherValueType.cpp (100%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Matcher/ZoneDefinitionMatcherValueType.h (87%) create mode 100644 src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionAssetList.cpp rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Sequence/SequenceZoneDefinitionAssetList.h (62%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Sequence/SequenceZoneDefinitionBuild.cpp (88%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Sequence/SequenceZoneDefinitionBuild.h (85%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Sequence/SequenceZoneDefinitionEntry.cpp (95%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Sequence/SequenceZoneDefinitionEntry.h (88%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Sequence/SequenceZoneDefinitionIgnore.cpp (88%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Sequence/SequenceZoneDefinitionIgnore.h (85%) create mode 100644 src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionInclude.cpp rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Sequence/SequenceZoneDefinitionInclude.h (85%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Sequence/SequenceZoneDefinitionMetaData.cpp (98%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/Sequence/SequenceZoneDefinitionMetaData.h (86%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/ZoneDefinitionLexer.cpp (100%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/ZoneDefinitionLexer.h (100%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/ZoneDefinitionParser.cpp (80%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/ZoneDefinitionParser.h (61%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/ZoneDefinitionParserState.cpp (90%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/ZoneDefinitionParserState.h (60%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/ZoneDefinitionParserValue.cpp (100%) rename src/ZoneCommon/{Parsing/ZoneDefinition => Zone/Definition/Parsing}/ZoneDefinitionParserValue.h (100%) create mode 100644 test/ObjCommonTestUtils.lua rename test/{ObjLoadingTests/Mock => ObjCommonTestUtils/SearchPath}/MockSearchPath.cpp (100%) rename test/{ObjLoadingTests/Mock => ObjCommonTestUtils/SearchPath}/MockSearchPath.h (80%) diff --git a/premake5.lua b/premake5.lua index 8dc5f3c9..331ae3e4 100644 --- a/premake5.lua +++ b/premake5.lua @@ -170,6 +170,7 @@ group "" -- ======================== -- Tests -- ======================== +include "test/ObjCommonTestUtils.lua" include "test/ObjCommonTests.lua" include "test/ObjLoadingTests.lua" include "test/ParserTestUtils.lua" @@ -179,6 +180,7 @@ include "test/ZoneCommonTests.lua" -- Tests group: Unit test and other tests projects group "Tests" + ObjCommonTestUtils:project() ObjCommonTests:project() ObjLoadingTests:project() ParserTestUtils:project() diff --git a/src/Linker/Linker.cpp b/src/Linker/Linker.cpp index 3aee78ab..b5ecf427 100644 --- a/src/Linker/Linker.cpp +++ b/src/Linker/Linker.cpp @@ -8,7 +8,7 @@ #include "SearchPath/SearchPaths.h" #include "Utils/ObjFileStream.h" #include "Zone/AssetList/AssetList.h" -#include "Zone/AssetList/AssetListStream.h" +#include "Zone/AssetList/AssetListReader.h" #include "Zone/Definition/ZoneDefinitionStream.h" #include "ZoneCreation/ZoneCreationContext.h" #include "ZoneCreation/ZoneCreator.h" @@ -155,111 +155,7 @@ namespace class LinkerImpl final : public Linker { - bool IncludeAdditionalZoneDefinitions(const std::string& initialFileName, ZoneDefinition& zoneDefinition, ISearchPath& sourceSearchPath) const - { - std::set sourceNames; - sourceNames.emplace(initialFileName); - - std::deque toIncludeQueue; - for (const auto& include : zoneDefinition.m_includes) - toIncludeQueue.emplace_back(include); - - while (!toIncludeQueue.empty()) - { - const auto& source = toIncludeQueue.front(); - - if (sourceNames.find(source) == sourceNames.end()) - { - sourceNames.emplace(source); - - std::unique_ptr includeDefinition; - { - const auto definitionFileName = std::format("{}.zone", source); - const auto definitionStream = sourceSearchPath.Open(definitionFileName); - if (!definitionStream.IsOpen()) - { - std::cerr << std::format("Could not find zone definition file for project \"{}\".\n", source); - return false; - } - - ZoneDefinitionInputStream zoneDefinitionInputStream(*definitionStream.m_stream, source, definitionFileName, m_args.m_verbose); - zoneDefinitionInputStream.SetPreviouslySetGame(zoneDefinition.m_game); - includeDefinition = zoneDefinitionInputStream.ReadDefinition(); - } - - if (!includeDefinition) - { - std::cerr << std::format("Failed to read zone definition file for project \"{}\".\n", source); - return false; - } - - for (const auto& include : includeDefinition->m_includes) - toIncludeQueue.emplace_back(include); - - zoneDefinition.Include(*includeDefinition); - } - - toIncludeQueue.pop_front(); - } - - return true; - } - - bool ReadAssetList(LinkerPathManager& paths, const std::string& zoneName, const GameId game, AssetList& assetList) const - { - { - const auto assetListFileName = std::format("assetlist/{}.csv", zoneName); - const auto assetListStream = paths.m_source_paths.GetSearchPaths().Open(assetListFileName); - - if (assetListStream.IsOpen()) - { - const AssetListInputStream stream(*assetListStream.m_stream, game); - AssetListEntry entry; - - bool failure; - while (stream.NextEntry(entry, &failure)) - { - assetList.m_entries.emplace_back(std::move(entry)); - } - - return !failure; - } - } - - { - const auto zoneDefinition = ReadZoneDefinition(paths, zoneName); - - if (zoneDefinition) - { - for (const auto& entry : zoneDefinition->m_assets) - { - assetList.m_entries.emplace_back(entry.m_asset_type, entry.m_asset_name, entry.m_is_reference); - } - return true; - } - } - - return false; - } - - bool IncludeAssetLists(LinkerPathManager& paths, ZoneDefinition& zoneDefinition) const - { - for (const auto& assetListName : zoneDefinition.m_asset_lists) - { - AssetList assetList; - if (!ReadAssetList(paths, assetListName, zoneDefinition.m_game, assetList)) - { - std::cerr << std::format("Failed to read asset list \"{}\"\n", assetListName); - return false; - } - - zoneDefinition.Include(assetList); - } - - return true; - } - - std::unique_ptr ReadZoneDefinition(LinkerPathManager& paths, const std::string& targetName) const + std::unique_ptr ReadZoneDefinition(LinkerPathManager& paths, const std::string& targetName, bool logMissing = true) const { auto& sourceSearchPath = paths.m_source_paths.GetSearchPaths(); std::unique_ptr zoneDefinition; @@ -268,11 +164,12 @@ class LinkerImpl final : public Linker const auto definitionStream = sourceSearchPath.Open(definitionFileName); if (!definitionStream.IsOpen()) { - std::cerr << std::format("Could not find zone definition file for target \"{}\".\n", targetName); + if (logMissing) + std::cerr << std::format("Could not find zone definition file for target \"{}\".\n", targetName); return nullptr; } - ZoneDefinitionInputStream zoneDefinitionInputStream(*definitionStream.m_stream, targetName, definitionFileName, m_args.m_verbose); + ZoneDefinitionInputStream zoneDefinitionInputStream(*definitionStream.m_stream, targetName, definitionFileName, sourceSearchPath); zoneDefinition = zoneDefinitionInputStream.ReadDefinition(); } @@ -282,15 +179,40 @@ class LinkerImpl final : public Linker return nullptr; } - if (!IncludeAdditionalZoneDefinitions(targetName, *zoneDefinition, sourceSearchPath)) - return nullptr; - - if (!IncludeAssetLists(paths, *zoneDefinition)) - return nullptr; - return zoneDefinition; } + bool ReadIgnoreEntries(LinkerPathManager& paths, const std::string& zoneName, const GameId game, AssetList& assetList) const + { + { + AssetListReader assetListReader(paths.m_source_paths.GetSearchPaths(), game); + const auto maybeReadAssetList = assetListReader.ReadAssetList(zoneName, false); + if (maybeReadAssetList) + { + assetList.m_entries.reserve(assetList.m_entries.size() + maybeReadAssetList->m_entries.size()); + for (auto& entry : maybeReadAssetList->m_entries) + assetList.m_entries.emplace_back(std::move(entry)); + + return true; + } + } + + { + const auto zoneDefinition = ReadZoneDefinition(paths, zoneName, false); + + if (zoneDefinition) + { + assetList.m_entries.reserve(assetList.m_entries.size() + zoneDefinition->m_assets.size()); + for (const auto& entry : zoneDefinition->m_assets) + assetList.m_entries.emplace_back(entry.m_asset_type, entry.m_asset_name, entry.m_is_reference); + + return true; + } + } + + return false; + } + bool ProcessZoneDefinitionIgnores(LinkerPathManager& paths, const std::string& targetName, ZoneCreationContext& context) const { if (context.m_definition->m_ignores.empty()) @@ -301,8 +223,7 @@ class LinkerImpl final : public Linker if (ignore == targetName) continue; - std::vector assetList; - if (!ReadAssetList(paths, ignore, context.m_definition->m_game, context.m_ignored_assets)) + if (!ReadIgnoreEntries(paths, ignore, context.m_definition->m_game, context.m_ignored_assets)) { std::cerr << std::format("Failed to read asset listing for ignoring assets of project \"{}\".\n", ignore); return false; diff --git a/src/ObjCommon.lua b/src/ObjCommon.lua index df91eae8..bcbed0e1 100644 --- a/src/ObjCommon.lua +++ b/src/ObjCommon.lua @@ -5,6 +5,7 @@ function ObjCommon:include(includes) Common:include(includes) json:include(includes) minizip:include(includes) + Parser:include(includes) includedirs { path.join(ProjectFolder(), "ObjCommon") } @@ -16,6 +17,7 @@ function ObjCommon:link(links) links:linkto(Utils) links:linkto(Common) links:linkto(minizip) + links:linkto(Parser) end function ObjCommon:use() diff --git a/src/ObjLoading/SearchPath/ISearchPath.cpp b/src/ObjCommon/SearchPath/ISearchPath.cpp similarity index 100% rename from src/ObjLoading/SearchPath/ISearchPath.cpp rename to src/ObjCommon/SearchPath/ISearchPath.cpp diff --git a/src/ObjLoading/SearchPath/ISearchPath.h b/src/ObjCommon/SearchPath/ISearchPath.h similarity index 100% rename from src/ObjLoading/SearchPath/ISearchPath.h rename to src/ObjCommon/SearchPath/ISearchPath.h diff --git a/src/ObjLoading/SearchPath/SearchPathFilesystem.cpp b/src/ObjCommon/SearchPath/SearchPathFilesystem.cpp similarity index 100% rename from src/ObjLoading/SearchPath/SearchPathFilesystem.cpp rename to src/ObjCommon/SearchPath/SearchPathFilesystem.cpp diff --git a/src/ObjLoading/SearchPath/SearchPathFilesystem.h b/src/ObjCommon/SearchPath/SearchPathFilesystem.h similarity index 100% rename from src/ObjLoading/SearchPath/SearchPathFilesystem.h rename to src/ObjCommon/SearchPath/SearchPathFilesystem.h diff --git a/src/ObjCommon/SearchPath/SearchPathMultiInputStream.cpp b/src/ObjCommon/SearchPath/SearchPathMultiInputStream.cpp new file mode 100644 index 00000000..09477982 --- /dev/null +++ b/src/ObjCommon/SearchPath/SearchPathMultiInputStream.cpp @@ -0,0 +1,15 @@ +#include "SearchPathMultiInputStream.h" + +SearchPathMultiInputStream::SearchPathMultiInputStream(ISearchPath& searchPath) + : m_search_path(searchPath) +{ +} + +std::unique_ptr SearchPathMultiInputStream::OpenIncludedFile(const std::string& filename, const std::string& sourceFile) +{ + auto foundFileToInclude = m_search_path.Open(filename); + if (!foundFileToInclude.IsOpen() || !foundFileToInclude.m_stream) + return nullptr; + + return std::move(foundFileToInclude.m_stream); +} diff --git a/src/ObjCommon/SearchPath/SearchPathMultiInputStream.h b/src/ObjCommon/SearchPath/SearchPathMultiInputStream.h new file mode 100644 index 00000000..7c966295 --- /dev/null +++ b/src/ObjCommon/SearchPath/SearchPathMultiInputStream.h @@ -0,0 +1,15 @@ +#pragma once + +#include "Parsing/Impl/ParserMultiInputStream.h" +#include "SearchPath/ISearchPath.h" + +class SearchPathMultiInputStream : public IInclusionCallback +{ +public: + explicit SearchPathMultiInputStream(ISearchPath& searchPath); + + std::unique_ptr OpenIncludedFile(const std::string& filename, const std::string& sourceFile) override; + +protected: + ISearchPath& m_search_path; +}; diff --git a/src/ObjLoading/SearchPath/SearchPathSearchOptions.cpp b/src/ObjCommon/SearchPath/SearchPathSearchOptions.cpp similarity index 100% rename from src/ObjLoading/SearchPath/SearchPathSearchOptions.cpp rename to src/ObjCommon/SearchPath/SearchPathSearchOptions.cpp diff --git a/src/ObjLoading/SearchPath/SearchPathSearchOptions.h b/src/ObjCommon/SearchPath/SearchPathSearchOptions.h similarity index 100% rename from src/ObjLoading/SearchPath/SearchPathSearchOptions.h rename to src/ObjCommon/SearchPath/SearchPathSearchOptions.h diff --git a/src/ObjLoading/SearchPath/SearchPaths.cpp b/src/ObjCommon/SearchPath/SearchPaths.cpp similarity index 100% rename from src/ObjLoading/SearchPath/SearchPaths.cpp rename to src/ObjCommon/SearchPath/SearchPaths.cpp diff --git a/src/ObjLoading/SearchPath/SearchPaths.h b/src/ObjCommon/SearchPath/SearchPaths.h similarity index 100% rename from src/ObjLoading/SearchPath/SearchPaths.h rename to src/ObjCommon/SearchPath/SearchPaths.h diff --git a/src/ObjLoading/Game/IW4/Menu/LoaderMenuListIW4.cpp b/src/ObjLoading/Game/IW4/Menu/LoaderMenuListIW4.cpp index fdeb0b25..d427cfaf 100644 --- a/src/ObjLoading/Game/IW4/Menu/LoaderMenuListIW4.cpp +++ b/src/ObjLoading/Game/IW4/Menu/LoaderMenuListIW4.cpp @@ -198,17 +198,7 @@ namespace std::unique_ptr ParseMenuFile(std::istream& stream, const std::string& menuFileName, const menu::MenuAssetZoneState* zoneState) { - menu::MenuFileReader reader(stream, - menuFileName, - menu::FeatureLevel::IW4, - [this](const std::string& filename, const std::string& sourceFile) -> std::unique_ptr - { - auto foundFileToInclude = m_search_path.Open(filename); - if (!foundFileToInclude.IsOpen() || !foundFileToInclude.m_stream) - return nullptr; - - return std::move(foundFileToInclude.m_stream); - }); + menu::MenuFileReader reader(stream, menuFileName, menu::FeatureLevel::IW4, m_search_path); reader.IncludeZoneState(zoneState); reader.SetPermissiveMode(ObjLoading::Configuration.MenuPermissiveParsing); diff --git a/src/ObjLoading/Game/IW4/StructuredDataDef/LoaderStructuredDataDefIW4.cpp b/src/ObjLoading/Game/IW4/StructuredDataDef/LoaderStructuredDataDefIW4.cpp index cbf2e51f..1e74175c 100644 --- a/src/ObjLoading/Game/IW4/StructuredDataDef/LoaderStructuredDataDefIW4.cpp +++ b/src/ObjLoading/Game/IW4/StructuredDataDef/LoaderStructuredDataDefIW4.cpp @@ -26,16 +26,7 @@ namespace if (!file.IsOpen()) return AssetCreationResult::NoAction(); - StructuredDataDefReader reader(*file.m_stream, - assetName, - [this](const std::string& filename, const std::string& sourceFile) -> std::unique_ptr - { - auto foundFileToInclude = m_search_path.Open(filename); - if (!foundFileToInclude.IsOpen() || !foundFileToInclude.m_stream) - return nullptr; - - return std::move(foundFileToInclude.m_stream); - }); + StructuredDataDefReader reader(*file.m_stream, assetName, m_search_path); bool readingDefsSuccessful; const auto defs = reader.ReadStructureDataDefs(readingDefsSuccessful); diff --git a/src/ObjLoading/Game/IW5/Menu/LoaderMenuListIW5.cpp b/src/ObjLoading/Game/IW5/Menu/LoaderMenuListIW5.cpp index 5ca990c8..f993b9eb 100644 --- a/src/ObjLoading/Game/IW5/Menu/LoaderMenuListIW5.cpp +++ b/src/ObjLoading/Game/IW5/Menu/LoaderMenuListIW5.cpp @@ -198,17 +198,7 @@ namespace std::unique_ptr ParseMenuFile(std::istream& stream, const std::string& menuFileName, const menu::MenuAssetZoneState* zoneState) { - menu::MenuFileReader reader(stream, - menuFileName, - menu::FeatureLevel::IW4, - [this](const std::string& filename, const std::string& sourceFile) -> std::unique_ptr - { - auto foundFileToInclude = m_search_path.Open(filename); - if (!foundFileToInclude.IsOpen() || !foundFileToInclude.m_stream) - return nullptr; - - return std::move(foundFileToInclude.m_stream); - }); + menu::MenuFileReader reader(stream, menuFileName, menu::FeatureLevel::IW5, m_search_path); reader.IncludeZoneState(zoneState); reader.SetPermissiveMode(ObjLoading::Configuration.MenuPermissiveParsing); diff --git a/src/ObjLoading/Parsing/Menu/MenuFileReader.cpp b/src/ObjLoading/Parsing/Menu/MenuFileReader.cpp index 710b4dea..e427c341 100644 --- a/src/ObjLoading/Parsing/Menu/MenuFileReader.cpp +++ b/src/ObjLoading/Parsing/Menu/MenuFileReader.cpp @@ -11,36 +11,22 @@ using namespace menu; -MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName, const FeatureLevel featureLevel, include_callback_t includeCallback) - : m_feature_level(featureLevel), +MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName, const FeatureLevel featureLevel, ISearchPath& searchPath) + : SearchPathMultiInputStream(searchPath), + m_feature_level(featureLevel), m_file_name(std::move(fileName)), m_stream(nullptr), m_zone_state(nullptr), m_permissive_mode(false) { - OpenBaseStream(stream, std::move(includeCallback)); + OpenBaseStream(stream); SetupStreamProxies(); m_stream = m_open_streams.back().get(); } -MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName, const FeatureLevel featureLevel) - : m_feature_level(featureLevel), - m_file_name(std::move(fileName)), - m_stream(nullptr), - m_zone_state(nullptr), - m_permissive_mode(false) +bool MenuFileReader::OpenBaseStream(std::istream& stream) { - OpenBaseStream(stream, nullptr); - SetupStreamProxies(); - m_stream = m_open_streams.back().get(); -} - -bool MenuFileReader::OpenBaseStream(std::istream& stream, include_callback_t includeCallback) -{ - if (includeCallback) - m_open_streams.emplace_back(std::make_unique(stream, m_file_name, std::move(includeCallback))); - else - m_open_streams.emplace_back(std::make_unique(stream, m_file_name)); + m_open_streams.emplace_back(std::make_unique(stream, m_file_name, *this)); return true; } diff --git a/src/ObjLoading/Parsing/Menu/MenuFileReader.h b/src/ObjLoading/Parsing/Menu/MenuFileReader.h index 0947e2d2..53bddc20 100644 --- a/src/ObjLoading/Parsing/Menu/MenuFileReader.h +++ b/src/ObjLoading/Parsing/Menu/MenuFileReader.h @@ -5,6 +5,8 @@ #include "MenuAssetZoneState.h" #include "MenuFileParserState.h" #include "Parsing/IParserLineStream.h" +#include "SearchPath/ISearchPath.h" +#include "SearchPath/SearchPathMultiInputStream.h" #include #include @@ -12,12 +14,24 @@ namespace menu { - class MenuFileReader + class MenuFileReader : public SearchPathMultiInputStream { public: - using include_callback_t = std::function(const std::string& filename, const std::string& sourceFile)>; + MenuFileReader(std::istream& stream, std::string fileName, FeatureLevel featureLevel, ISearchPath& searchPath); + + void IncludeZoneState(const MenuAssetZoneState* zoneState); + void SetPermissiveMode(bool usePermissiveMode); + + std::unique_ptr ReadMenuFile(); private: + bool OpenBaseStream(std::istream& stream); + void SetupDefinesProxy(); + void SetupStreamProxies(); + + bool IsValidEndState(const MenuFileParserState* state) const; + std::unique_ptr CreateParsingResult(MenuFileParserState* state) const; + const FeatureLevel m_feature_level; const std::string m_file_name; @@ -26,21 +40,5 @@ namespace menu const MenuAssetZoneState* m_zone_state; bool m_permissive_mode; - - bool OpenBaseStream(std::istream& stream, include_callback_t includeCallback); - void SetupDefinesProxy(); - void SetupStreamProxies(); - - bool IsValidEndState(const MenuFileParserState* state) const; - std::unique_ptr CreateParsingResult(MenuFileParserState* state) const; - - public: - MenuFileReader(std::istream& stream, std::string fileName, FeatureLevel featureLevel); - MenuFileReader(std::istream& stream, std::string fileName, FeatureLevel featureLevel, include_callback_t includeCallback); - - void IncludeZoneState(const MenuAssetZoneState* zoneState); - void SetPermissiveMode(bool usePermissiveMode); - - std::unique_ptr ReadMenuFile(); }; } // namespace menu diff --git a/src/ObjLoading/StructuredDataDef/StructuredDataDefReader.cpp b/src/ObjLoading/StructuredDataDef/StructuredDataDefReader.cpp index 8b5fab15..c5c9f62c 100644 --- a/src/ObjLoading/StructuredDataDef/StructuredDataDefReader.cpp +++ b/src/ObjLoading/StructuredDataDef/StructuredDataDefReader.cpp @@ -7,28 +7,24 @@ #include "Parsing/Impl/ParserSingleInputStream.h" #include "StructuredDataDef/Parsing/StructuredDataDefParser.h" +#include +#include + using namespace sdd; -StructuredDataDefReader::StructuredDataDefReader(std::istream& stream, std::string fileName) - : StructuredDataDefReader(stream, std::move(fileName), nullptr) -{ -} - -StructuredDataDefReader::StructuredDataDefReader(std::istream& stream, std::string fileName, include_callback_t includeCallback) - : m_file_name(std::move(fileName)), +StructuredDataDefReader::StructuredDataDefReader(std::istream& stream, std::string fileName, ISearchPath& searchPath) + : SearchPathMultiInputStream(searchPath), + m_file_name(std::move(fileName)), m_stream(nullptr) { - OpenBaseStream(stream, std::move(includeCallback)); + OpenBaseStream(stream); SetupStreamProxies(); m_stream = m_open_streams.back().get(); } -bool StructuredDataDefReader::OpenBaseStream(std::istream& stream, include_callback_t includeCallback) +bool StructuredDataDefReader::OpenBaseStream(std::istream& stream) { - if (includeCallback) - m_open_streams.emplace_back(std::make_unique(stream, m_file_name, std::move(includeCallback))); - else - m_open_streams.emplace_back(std::make_unique(stream, m_file_name)); + m_open_streams.emplace_back(std::make_unique(stream, m_file_name, *this)); return true; } @@ -58,6 +54,7 @@ std::vector> StructuredDataDefReader::R if (success) return parser->GetDefs(); - std::cout << "Parsing structured data def file \"" << m_file_name << "\" failed!\n"; + std::cerr << std::format("Parsing structured data def file \"{}\" failed!\n", m_file_name); + return {}; } diff --git a/src/ObjLoading/StructuredDataDef/StructuredDataDefReader.h b/src/ObjLoading/StructuredDataDef/StructuredDataDefReader.h index 3ecb8899..b5bdaa66 100644 --- a/src/ObjLoading/StructuredDataDef/StructuredDataDefReader.h +++ b/src/ObjLoading/StructuredDataDef/StructuredDataDefReader.h @@ -1,28 +1,26 @@ #pragma once #include "Parsing/IParserLineStream.h" +#include "SearchPath/ISearchPath.h" +#include "SearchPath/SearchPathMultiInputStream.h" #include "StructuredDataDef/CommonStructuredDataDef.h" #include #include #include -class StructuredDataDefReader +class StructuredDataDefReader : public SearchPathMultiInputStream { public: - using include_callback_t = std::function(const std::string& filename, const std::string& sourceFile)>; + StructuredDataDefReader(std::istream& stream, std::string fileName, ISearchPath& searchPath); + + std::vector> ReadStructureDataDefs(bool& success); private: + bool OpenBaseStream(std::istream& stream); + void SetupStreamProxies(); + std::string m_file_name; IParserLineStream* m_stream; std::vector> m_open_streams; - - bool OpenBaseStream(std::istream& stream, include_callback_t includeCallback); - void SetupStreamProxies(); - -public: - StructuredDataDefReader(std::istream& stream, std::string fileName); - StructuredDataDefReader(std::istream& stream, std::string fileName, include_callback_t includeCallback); - - std::vector> ReadStructureDataDefs(bool& success); }; diff --git a/src/Parser/Parsing/Impl/IncludingStreamProxy.cpp b/src/Parser/Parsing/Impl/IncludingStreamProxy.cpp index 6b628e8e..f2a96101 100644 --- a/src/Parser/Parsing/Impl/IncludingStreamProxy.cpp +++ b/src/Parser/Parsing/Impl/IncludingStreamProxy.cpp @@ -3,7 +3,7 @@ #include "Parsing/ParsingException.h" #include -#include +#include namespace fs = std::filesystem; @@ -81,11 +81,7 @@ bool IncludingStreamProxy::MatchIncludeDirective(const ParserLine& line, const u const auto filename = line.m_line.substr(filenameStart, filenameEnd - filenameStart); if (!m_stream->IncludeFile(filename)) - { - std::ostringstream errorStr; - errorStr << "Could not include file \"" << filename << "\""; - throw ParsingException(CreatePos(line, currentPos), errorStr.str()); - } + throw ParsingException(CreatePos(line, currentPos), std::format("Could not include file \"{}\"", filename)); return true; } diff --git a/src/Parser/Parsing/Impl/ParserMultiInputStream.cpp b/src/Parser/Parsing/Impl/ParserMultiInputStream.cpp index 78e2d5ee..536a0e3f 100644 --- a/src/Parser/Parsing/Impl/ParserMultiInputStream.cpp +++ b/src/Parser/Parsing/Impl/ParserMultiInputStream.cpp @@ -17,14 +17,14 @@ ParserMultiInputStream::FileInfo::FileInfo(std::istream& stream, std::string fil { } -ParserMultiInputStream::ParserMultiInputStream(std::unique_ptr stream, std::string fileName, include_callback_t includeCallback) - : m_include_callback(std::move(includeCallback)) +ParserMultiInputStream::ParserMultiInputStream(std::unique_ptr stream, std::string fileName, IInclusionCallback& includeCallback) + : m_include_callback(includeCallback) { m_files.emplace(std::move(stream), std::move(fileName)); } -ParserMultiInputStream::ParserMultiInputStream(std::istream& stream, std::string fileName, include_callback_t includeCallback) - : m_include_callback(std::move(includeCallback)) +ParserMultiInputStream::ParserMultiInputStream(std::istream& stream, std::string fileName, IInclusionCallback& includeCallback) + : m_include_callback(includeCallback) { m_files.emplace(stream, std::move(fileName)); } @@ -76,10 +76,7 @@ ParserLine ParserMultiInputStream::NextLine() bool ParserMultiInputStream::IncludeFile(const std::string& filename) { - if (!m_include_callback) - return false; - - auto newFile = m_include_callback(filename, m_files.empty() ? "" : *m_files.top().m_file_path); + auto newFile = m_include_callback.OpenIncludedFile(filename, m_files.empty() ? "" : *m_files.top().m_file_path); if (!newFile) return false; diff --git a/src/Parser/Parsing/Impl/ParserMultiInputStream.h b/src/Parser/Parsing/Impl/ParserMultiInputStream.h index 1d74d659..2b26e7e5 100644 --- a/src/Parser/Parsing/Impl/ParserMultiInputStream.h +++ b/src/Parser/Parsing/Impl/ParserMultiInputStream.h @@ -7,10 +7,25 @@ #include #include +class IInclusionCallback +{ +public: + virtual ~IInclusionCallback() = default; + + virtual std::unique_ptr OpenIncludedFile(const std::string& filename, const std::string& sourceFile) = 0; +}; + class ParserMultiInputStream final : public IParserLineStream { public: - using include_callback_t = std::function(const std::string& filename, const std::string& sourceFile)>; + ParserMultiInputStream(std::unique_ptr stream, std::string fileName, IInclusionCallback& includeCallback); + ParserMultiInputStream(std::istream& stream, std::string fileName, IInclusionCallback& includeCallback); + + ParserLine NextLine() override; + bool IncludeFile(const std::string& filename) override; + void PopCurrentFile() override; + _NODISCARD bool IsOpen() const override; + _NODISCARD bool Eof() const override; private: class FileInfo @@ -25,16 +40,6 @@ private: FileInfo(std::istream& stream, std::string filePath); }; - const include_callback_t m_include_callback; + IInclusionCallback& m_include_callback; std::stack m_files; - -public: - ParserMultiInputStream(std::unique_ptr stream, std::string fileName, include_callback_t includeCallback); - ParserMultiInputStream(std::istream& stream, std::string fileName, include_callback_t includeCallback); - - ParserLine NextLine() override; - bool IncludeFile(const std::string& filename) override; - void PopCurrentFile() override; - _NODISCARD bool IsOpen() const override; - _NODISCARD bool Eof() const override; }; diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionAssetList.cpp b/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionAssetList.cpp deleted file mode 100644 index 203ca22c..00000000 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionAssetList.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "SequenceZoneDefinitionAssetList.h" - -#include "Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.h" - -SequenceZoneDefinitionAssetList::SequenceZoneDefinitionAssetList() -{ - const ZoneDefinitionMatcherFactory create(this); - - AddMatchers({ - create.Keyword("assetlist"), - create.Char(','), - create.Field().Capture(CAPTURE_ASSET_LIST_NAME), - }); -} - -void SequenceZoneDefinitionAssetList::ProcessMatch(ZoneDefinitionParserState* state, SequenceResult& result) const -{ - state->m_definition->m_asset_lists.emplace_back(result.NextCapture(CAPTURE_ASSET_LIST_NAME).FieldValue()); -} diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionInclude.cpp b/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionInclude.cpp deleted file mode 100644 index 29488a86..00000000 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionInclude.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "SequenceZoneDefinitionInclude.h" - -#include "Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.h" - -SequenceZoneDefinitionInclude::SequenceZoneDefinitionInclude() -{ - const ZoneDefinitionMatcherFactory create(this); - - AddMatchers({ - create.Keyword("include"), - create.Char(','), - create.Field().Capture(CAPTURE_INCLUDE_NAME), - }); -} - -void SequenceZoneDefinitionInclude::ProcessMatch(ZoneDefinitionParserState* state, SequenceResult& result) const -{ - state->m_definition->m_includes.emplace_back(result.NextCapture(CAPTURE_INCLUDE_NAME).FieldValue()); -} diff --git a/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.cpp b/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.cpp new file mode 100644 index 00000000..5df9139e --- /dev/null +++ b/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.cpp @@ -0,0 +1,14 @@ +#include "AssetListOutputStream.h" + +AssetListOutputStream::AssetListOutputStream(std::ostream& stream, const GameId game) + : m_stream(stream), + m_asset_name_resolver(IAssetNameResolver::GetResolverForGame(game)) +{ +} + +void AssetListOutputStream::WriteEntry(const AssetListEntry& entry) +{ + m_stream.WriteColumn(*m_asset_name_resolver->GetAssetTypeName(entry.m_type)); + m_stream.WriteColumn(entry.m_name); + m_stream.NextRow(); +} diff --git a/src/ZoneCommon/Zone/AssetList/AssetListStream.h b/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.h similarity index 54% rename from src/ZoneCommon/Zone/AssetList/AssetListStream.h rename to src/ZoneCommon/Zone/AssetList/AssetListOutputStream.h index da16def6..902d935b 100644 --- a/src/ZoneCommon/Zone/AssetList/AssetListStream.h +++ b/src/ZoneCommon/Zone/AssetList/AssetListOutputStream.h @@ -1,23 +1,12 @@ #pragma once + #include "AssetList.h" #include "Csv/CsvStream.h" #include "Game/IGame.h" +#include "Zone/AssetNameResolver.h" -#include #include -class AssetListInputStream -{ -public: - AssetListInputStream(std::istream& stream, GameId game); - - bool NextEntry(AssetListEntry& entry, bool* failure) const; - -private: - CsvInputStream m_stream; - const IAssetNameResolver* m_asset_name_resolver; -}; - class AssetListOutputStream { public: diff --git a/src/ZoneCommon/Zone/AssetList/AssetListReader.cpp b/src/ZoneCommon/Zone/AssetList/AssetListReader.cpp new file mode 100644 index 00000000..fbc616bc --- /dev/null +++ b/src/ZoneCommon/Zone/AssetList/AssetListReader.cpp @@ -0,0 +1,96 @@ +#include "AssetListReader.h" + +#include "Csv/CsvStream.h" +#include "Game/IGame.h" +#include "Zone/AssetNameResolver.h" + +#include + +namespace +{ + class AssetListInputStream + { + public: + AssetListInputStream(std::istream& stream, GameId game) + : m_stream(stream), + m_asset_name_resolver(IAssetNameResolver::GetResolverForGame(game)) + { + } + + bool NextEntry(AssetListEntry& entry, bool* failure) const + { + std::vector row; + if (failure) + *failure = false; + + while (true) + { + if (!m_stream.NextRow(row)) + return false; + + if (row.empty() || (row.size() == 1 && row[0].empty())) + continue; + + const auto& typeName = row[0]; + const auto maybeType = m_asset_name_resolver->GetAssetTypeByName(typeName); + if (!maybeType) + { + std::cerr << std::format("Unknown asset type name \"{}\"\n", typeName); + if (failure) + *failure = true; + return false; + } + + entry.m_type = *maybeType; + if (row.size() >= 3 && row[1].empty()) + { + entry.m_name = row[2]; + entry.m_is_reference = true; + } + else + { + entry.m_name = row[1]; + entry.m_is_reference = false; + } + + return true; + } + } + + private: + CsvInputStream m_stream; + const IAssetNameResolver* m_asset_name_resolver; + }; +} // namespace + +AssetListReader::AssetListReader(ISearchPath& searchPath, const GameId game) + : m_search_path(searchPath), + m_game(game) +{ +} + +std::optional AssetListReader::ReadAssetList(const std::string& zoneName, const bool logMissing) const +{ + const auto assetListFileName = std::format("assetlist/{}.csv", zoneName); + const auto assetListStream = m_search_path.Open(assetListFileName); + + if (assetListStream.IsOpen()) + { + AssetList assetList; + const AssetListInputStream stream(*assetListStream.m_stream, m_game); + AssetListEntry entry; + + bool failure; + while (stream.NextEntry(entry, &failure)) + { + assetList.m_entries.emplace_back(std::move(entry)); + } + + if (!failure) + return assetList; + } + else if (logMissing) + std::cerr << std::format("Failed to open file for assetlist: {}\n", assetListFileName); + + return std::nullopt; +} diff --git a/src/ZoneCommon/Zone/AssetList/AssetListReader.h b/src/ZoneCommon/Zone/AssetList/AssetListReader.h new file mode 100644 index 00000000..819c1c70 --- /dev/null +++ b/src/ZoneCommon/Zone/AssetList/AssetListReader.h @@ -0,0 +1,20 @@ +#pragma once + +#include "AssetList.h" +#include "Game/IGame.h" +#include "SearchPath/ISearchPath.h" + +#include +#include + +class AssetListReader +{ +public: + AssetListReader(ISearchPath& searchPath, GameId game); + + std::optional ReadAssetList(const std::string& zoneName, bool logMissing = true) const; + +private: + ISearchPath& m_search_path; + GameId m_game; +}; diff --git a/src/ZoneCommon/Zone/AssetList/AssetListStream.cpp b/src/ZoneCommon/Zone/AssetList/AssetListStream.cpp deleted file mode 100644 index 2615ca92..00000000 --- a/src/ZoneCommon/Zone/AssetList/AssetListStream.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include "AssetListStream.h" - -#include - -AssetListInputStream::AssetListInputStream(std::istream& stream, const GameId game) - : m_stream(stream), - m_asset_name_resolver(IAssetNameResolver::GetResolverForGame(game)) -{ -} - -bool AssetListInputStream::NextEntry(AssetListEntry& entry, bool* failure) const -{ - std::vector row; - if (failure) - *failure = false; - - while (true) - { - if (!m_stream.NextRow(row)) - return false; - - if (row.empty()) - continue; - - const auto& typeName = row[0]; - const auto maybeType = m_asset_name_resolver->GetAssetTypeByName(typeName); - if (!maybeType) - { - std::cerr << std::format("Unknown asset type name \"{}\"\n", typeName); - if (failure) - *failure = true; - return false; - } - - entry.m_type = *maybeType; - if (row.size() >= 3 && row[1].empty()) - { - entry.m_name = row[2]; - entry.m_is_reference = true; - } - else - { - entry.m_name = row[1]; - entry.m_is_reference = false; - } - - return true; - } -} - -AssetListOutputStream::AssetListOutputStream(std::ostream& stream, const GameId game) - : m_stream(stream), - m_asset_name_resolver(IAssetNameResolver::GetResolverForGame(game)) -{ -} - -void AssetListOutputStream::WriteEntry(const AssetListEntry& entry) -{ - m_stream.WriteColumn(*m_asset_name_resolver->GetAssetTypeName(entry.m_type)); - m_stream.WriteColumn(entry.m_name); - m_stream.NextRow(); -} diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherCharacter.cpp b/src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherCharacter.cpp similarity index 100% rename from src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherCharacter.cpp rename to src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherCharacter.cpp diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherCharacter.h b/src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherCharacter.h similarity index 85% rename from src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherCharacter.h rename to src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherCharacter.h index 9cb0fc68..4f7f70bd 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherCharacter.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherCharacter.h @@ -1,7 +1,7 @@ #pragma once #include "Parsing/Matcher/AbstractMatcher.h" -#include "Parsing/ZoneDefinition/ZoneDefinitionParserValue.h" +#include "Zone/Definition/Parsing/ZoneDefinitionParserValue.h" class ZoneDefinitionMatcherCharacter final : public AbstractMatcher { diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.cpp b/src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherFactory.cpp similarity index 100% rename from src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.cpp rename to src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherFactory.cpp diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.h b/src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherFactory.h similarity index 92% rename from src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.h rename to src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherFactory.h index 00903ec2..eff3f346 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherFactory.h @@ -1,7 +1,7 @@ #pragma once #include "Parsing/Matcher/AbstractMatcherFactory.h" -#include "Parsing/ZoneDefinition/ZoneDefinitionParserValue.h" +#include "Zone/Definition/Parsing/ZoneDefinitionParserValue.h" #include diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherKeyword.cpp b/src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherKeyword.cpp similarity index 100% rename from src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherKeyword.cpp rename to src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherKeyword.cpp diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherKeyword.h b/src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherKeyword.h similarity index 87% rename from src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherKeyword.h rename to src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherKeyword.h index 0a8684a0..a6497937 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherKeyword.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherKeyword.h @@ -1,7 +1,7 @@ #pragma once #include "Parsing/Matcher/AbstractMatcher.h" -#include "Parsing/ZoneDefinition/ZoneDefinitionParserValue.h" +#include "Zone/Definition/Parsing/ZoneDefinitionParserValue.h" #include diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherValueType.cpp b/src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherValueType.cpp similarity index 100% rename from src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherValueType.cpp rename to src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherValueType.cpp diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherValueType.h b/src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherValueType.h similarity index 87% rename from src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherValueType.h rename to src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherValueType.h index 0aefbc85..4a6b3545 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherValueType.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherValueType.h @@ -1,7 +1,7 @@ #pragma once #include "Parsing/Matcher/AbstractMatcher.h" -#include "Parsing/ZoneDefinition/ZoneDefinitionParserValue.h" +#include "Zone/Definition/Parsing/ZoneDefinitionParserValue.h" class ZoneDefinitionMatcherValueType final : public AbstractMatcher { diff --git a/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionAssetList.cpp b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionAssetList.cpp new file mode 100644 index 00000000..04730010 --- /dev/null +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionAssetList.cpp @@ -0,0 +1,35 @@ +#include "SequenceZoneDefinitionAssetList.h" + +#include "Zone/AssetList/AssetListReader.h" +#include "Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherFactory.h" + +SequenceZoneDefinitionAssetList::SequenceZoneDefinitionAssetList() +{ + const ZoneDefinitionMatcherFactory create(this); + + AddMatchers({ + create.Keyword("assetlist").Capture(CAPTURE_ASSET_LIST_KEYWORD), + create.Char(','), + create.Field().Capture(CAPTURE_ASSET_LIST_NAME), + }); +} + +void SequenceZoneDefinitionAssetList::ProcessMatch(ZoneDefinitionParserState* state, SequenceResult& result) const +{ + if (state->m_definition->m_game == GameId::COUNT) + { + const auto& assetListKeywordToken = result.NextCapture(CAPTURE_ASSET_LIST_KEYWORD); + throw ParsingException(assetListKeywordToken.GetPos(), "Must define game before using assetlist"); + } + + const auto& assetListNameToken = result.NextCapture(CAPTURE_ASSET_LIST_NAME); + + AssetListReader assetListReader(state->m_search_path, state->m_definition->m_game); + const auto maybeAssetList = assetListReader.ReadAssetList(assetListNameToken.FieldValue()); + + if (!maybeAssetList) + throw ParsingException(assetListNameToken.GetPos(), "Failed to read asset list"); + + for (auto& assetListEntry : maybeAssetList->m_entries) + state->m_definition->m_assets.emplace_back(assetListEntry.m_type, std::move(assetListEntry.m_name), assetListEntry.m_is_reference); +} diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionAssetList.h b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionAssetList.h similarity index 62% rename from src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionAssetList.h rename to src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionAssetList.h index 245fc7b7..72ddee99 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionAssetList.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionAssetList.h @@ -1,10 +1,11 @@ #pragma once -#include "Parsing/ZoneDefinition/ZoneDefinitionParser.h" +#include "Zone/Definition/Parsing/ZoneDefinitionParser.h" class SequenceZoneDefinitionAssetList final : public ZoneDefinitionParser::sequence_t { - static constexpr auto CAPTURE_ASSET_LIST_NAME = 1; + static constexpr auto CAPTURE_ASSET_LIST_KEYWORD = 1; + static constexpr auto CAPTURE_ASSET_LIST_NAME = 2; protected: void ProcessMatch(ZoneDefinitionParserState* state, SequenceResult& result) const override; diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.cpp b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionBuild.cpp similarity index 88% rename from src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.cpp rename to src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionBuild.cpp index bbae196b..647a0a39 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.cpp +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionBuild.cpp @@ -1,6 +1,6 @@ #include "SequenceZoneDefinitionBuild.h" -#include "Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.h" +#include "Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherFactory.h" SequenceZoneDefinitionBuild::SequenceZoneDefinitionBuild() { diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.h b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionBuild.h similarity index 85% rename from src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.h rename to src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionBuild.h index ff965224..7cb37e88 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionBuild.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionBuild.h @@ -1,6 +1,6 @@ #pragma once -#include "Parsing/ZoneDefinition/ZoneDefinitionParser.h" +#include "Zone/Definition/Parsing/ZoneDefinitionParser.h" class SequenceZoneDefinitionBuild final : public ZoneDefinitionParser::sequence_t { diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionEntry.cpp b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionEntry.cpp similarity index 95% rename from src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionEntry.cpp rename to src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionEntry.cpp index d335df3a..f6bcd436 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionEntry.cpp +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionEntry.cpp @@ -1,6 +1,6 @@ #include "SequenceZoneDefinitionEntry.h" -#include "Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.h" +#include "Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherFactory.h" SequenceZoneDefinitionEntry::SequenceZoneDefinitionEntry() { diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionEntry.h b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionEntry.h similarity index 88% rename from src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionEntry.h rename to src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionEntry.h index c88de4ee..d441a607 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionEntry.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionEntry.h @@ -1,6 +1,6 @@ #pragma once -#include "Parsing/ZoneDefinition/ZoneDefinitionParser.h" +#include "Zone/Definition/Parsing/ZoneDefinitionParser.h" class SequenceZoneDefinitionEntry final : public ZoneDefinitionParser::sequence_t { diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionIgnore.cpp b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionIgnore.cpp similarity index 88% rename from src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionIgnore.cpp rename to src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionIgnore.cpp index 19b5f59a..918ad88a 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionIgnore.cpp +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionIgnore.cpp @@ -1,6 +1,6 @@ #include "SequenceZoneDefinitionIgnore.h" -#include "Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.h" +#include "Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherFactory.h" SequenceZoneDefinitionIgnore::SequenceZoneDefinitionIgnore() { diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionIgnore.h b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionIgnore.h similarity index 85% rename from src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionIgnore.h rename to src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionIgnore.h index 6fabb705..227b1c7c 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionIgnore.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionIgnore.h @@ -1,6 +1,6 @@ #pragma once -#include "Parsing/ZoneDefinition/ZoneDefinitionParser.h" +#include "Zone/Definition/Parsing/ZoneDefinitionParser.h" class SequenceZoneDefinitionIgnore final : public ZoneDefinitionParser::sequence_t { diff --git a/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionInclude.cpp b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionInclude.cpp new file mode 100644 index 00000000..53deeca5 --- /dev/null +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionInclude.cpp @@ -0,0 +1,32 @@ +#include "SequenceZoneDefinitionInclude.h" + +#include "Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherFactory.h" + +#include + +SequenceZoneDefinitionInclude::SequenceZoneDefinitionInclude() +{ + const ZoneDefinitionMatcherFactory create(this); + + AddMatchers({ + create.Keyword("include"), + create.Char(','), + create.Field().Capture(CAPTURE_INCLUDE_NAME), + }); +} + +void SequenceZoneDefinitionInclude::ProcessMatch(ZoneDefinitionParserState* state, SequenceResult& result) const +{ + const auto& inclusionNameToken = result.NextCapture(CAPTURE_INCLUDE_NAME); + const auto inclusionName = inclusionNameToken.FieldValue(); + const auto existingInclusion = state->m_inclusions.find(inclusionName); + if (existingInclusion != state->m_inclusions.end()) + throw ParsingException(inclusionNameToken.GetPos(), "Zone definition has already been included"); + + const auto zoneDefinitionFileNameToInclude = std::format("{}.zone", inclusionName); + + if (!state->m_underlying_stream.IncludeFile(zoneDefinitionFileNameToInclude)) + throw ParsingException(inclusionNameToken.GetPos(), "Could not find zone definition with this filename"); + + state->m_inclusions.emplace(inclusionName); +} diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionInclude.h b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionInclude.h similarity index 85% rename from src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionInclude.h rename to src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionInclude.h index 09f85c17..a86b73fd 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionInclude.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionInclude.h @@ -1,6 +1,6 @@ #pragma once -#include "Parsing/ZoneDefinition/ZoneDefinitionParser.h" +#include "Zone/Definition/Parsing/ZoneDefinitionParser.h" class SequenceZoneDefinitionInclude final : public ZoneDefinitionParser::sequence_t { diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionMetaData.cpp b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionMetaData.cpp similarity index 98% rename from src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionMetaData.cpp rename to src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionMetaData.cpp index 3d6d4c46..68e8d3c1 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionMetaData.cpp +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionMetaData.cpp @@ -1,7 +1,7 @@ #include "SequenceZoneDefinitionMetaData.h" -#include "Parsing/ZoneDefinition/Matcher/ZoneDefinitionMatcherFactory.h" #include "Utils/StringUtils.h" +#include "Zone/Definition/Parsing/Matcher/ZoneDefinitionMatcherFactory.h" #include #include diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionMetaData.h b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionMetaData.h similarity index 86% rename from src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionMetaData.h rename to src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionMetaData.h index bcb3b249..40d9b802 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/Sequence/SequenceZoneDefinitionMetaData.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/Sequence/SequenceZoneDefinitionMetaData.h @@ -1,6 +1,6 @@ #pragma once -#include "Parsing/ZoneDefinition/ZoneDefinitionParser.h" +#include "Zone/Definition/Parsing/ZoneDefinitionParser.h" class SequenceZoneDefinitionMetaData final : public ZoneDefinitionParser::sequence_t { diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionLexer.cpp b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionLexer.cpp similarity index 100% rename from src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionLexer.cpp rename to src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionLexer.cpp diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionLexer.h b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionLexer.h similarity index 100% rename from src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionLexer.h rename to src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionLexer.h diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.cpp b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParser.cpp similarity index 80% rename from src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.cpp rename to src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParser.cpp index da287d10..f641c2bb 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.cpp +++ b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParser.cpp @@ -7,8 +7,9 @@ #include "Sequence/SequenceZoneDefinitionInclude.h" #include "Sequence/SequenceZoneDefinitionMetaData.h" -ZoneDefinitionParser::ZoneDefinitionParser(ZoneDefinitionLexer* lexer, std::string targetName, const std::optional maybeGame) - : AbstractParser(lexer, std::make_unique(std::move(targetName))) +ZoneDefinitionParser::ZoneDefinitionParser( + ZoneDefinitionLexer* lexer, std::string targetName, ISearchPath& searchPath, IParserLineStream& underlyingStream, const std::optional maybeGame) + : AbstractParser(lexer, std::make_unique(std::move(targetName), searchPath, underlyingStream)) { if (maybeGame) m_state->SetGame(*maybeGame); diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.h b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParser.h similarity index 61% rename from src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.h rename to src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParser.h index 37b37242..7ea0abe2 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParser.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParser.h @@ -2,6 +2,7 @@ #include "Game/IGame.h" #include "Parsing/Impl/AbstractParser.h" +#include "SearchPath/ISearchPath.h" #include "Zone/Definition/ZoneDefinition.h" #include "ZoneDefinitionLexer.h" #include "ZoneDefinitionParserState.h" @@ -11,10 +12,14 @@ class ZoneDefinitionParser final : public AbstractParser { +public: + ZoneDefinitionParser(ZoneDefinitionLexer* lexer, + std::string targetName, + ISearchPath& searchPath, + IParserLineStream& underlyingStream, + std::optional maybeGame = std::nullopt); + std::unique_ptr GetParsedValue(); + protected: const std::vector& GetTestsForState() override; - -public: - ZoneDefinitionParser(ZoneDefinitionLexer* lexer, std::string targetName, std::optional maybeGame = std::nullopt); - std::unique_ptr GetParsedValue(); }; diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.cpp b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.cpp similarity index 90% rename from src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.cpp rename to src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.cpp index 17cd9df0..30c8d564 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.cpp +++ b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.cpp @@ -2,10 +2,14 @@ #include -ZoneDefinitionParserState::ZoneDefinitionParserState(std::string targetName) - : m_asset_name_resolver(nullptr), +ZoneDefinitionParserState::ZoneDefinitionParserState(std::string targetName, ISearchPath& searchPath, IParserLineStream& underlyingStream) + : m_search_path(searchPath), + m_underlying_stream(underlyingStream), + m_asset_name_resolver(nullptr), m_definition(std::make_unique()) + { + m_inclusions.emplace(targetName); m_definition->m_name = std::move(targetName); } diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.h b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.h similarity index 60% rename from src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.h rename to src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.h index 75c3fb0b..4fa60515 100644 --- a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserState.h +++ b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserState.h @@ -1,15 +1,19 @@ #pragma once +#include "Parsing/IParserLineStream.h" +#include "SearchPath/ISearchPath.h" #include "Zone/AssetNameResolver.h" #include "Zone/Definition/ZoneDefinition.h" #include #include +#include +#include class ZoneDefinitionParserState { public: - explicit ZoneDefinitionParserState(std::string targetName); + ZoneDefinitionParserState(std::string targetName, ISearchPath& searchPath, IParserLineStream& underlyingStream); void SetGame(GameId game); @@ -18,6 +22,10 @@ public: void Finalize(); + ISearchPath& m_search_path; + IParserLineStream& m_underlying_stream; + std::unordered_set m_inclusions; + const IAssetNameResolver* m_asset_name_resolver; std::optional m_current_ipak; diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserValue.cpp b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserValue.cpp similarity index 100% rename from src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserValue.cpp rename to src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserValue.cpp diff --git a/src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserValue.h b/src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserValue.h similarity index 100% rename from src/ZoneCommon/Parsing/ZoneDefinition/ZoneDefinitionParserValue.h rename to src/ZoneCommon/Zone/Definition/Parsing/ZoneDefinitionParserValue.h diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefinition.cpp b/src/ZoneCommon/Zone/Definition/ZoneDefinition.cpp index a4a90f4c..58774642 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefinition.cpp +++ b/src/ZoneCommon/Zone/Definition/ZoneDefinition.cpp @@ -32,20 +32,3 @@ ZoneDefinition::ZoneDefinition() : m_game(GameId::COUNT) { } - -void ZoneDefinition::Include(const AssetList& assetListToInclude) -{ - for (const auto& entry : assetListToInclude.m_entries) - m_assets.emplace_back(entry.m_type, entry.m_name, false); -} - -void ZoneDefinition::Include(const ZoneDefinition& definitionToInclude) -{ - m_properties.Include(definitionToInclude.m_properties); - - for (const auto& ignore : definitionToInclude.m_ignores) - m_ignores.emplace_back(ignore); - - for (const auto& asset : definitionToInclude.m_assets) - m_assets.emplace_back(asset); -} diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefinition.h b/src/ZoneCommon/Zone/Definition/ZoneDefinition.h index d0c06946..a00a5b57 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefinition.h +++ b/src/ZoneCommon/Zone/Definition/ZoneDefinition.h @@ -60,14 +60,9 @@ class ZoneDefinition public: ZoneDefinition(); - void Include(const AssetList& assetListToInclude); - void Include(const ZoneDefinition& definitionToInclude); - std::string m_name; GameId m_game; ZoneDefinitionProperties m_properties; - std::vector m_includes; - std::vector m_asset_lists; std::vector m_ignores; std::vector m_targets_to_build; std::vector m_gdts; diff --git a/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.cpp b/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.cpp index 2ebc6cee..4b54c7cc 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.cpp +++ b/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.cpp @@ -2,17 +2,18 @@ #include "Parsing/Impl/CommentRemovingStreamProxy.h" #include "Parsing/Impl/DefinesStreamProxy.h" +#include "Parsing/Impl/IncludingStreamProxy.h" #include "Parsing/Impl/ParserSingleInputStream.h" -#include "Parsing/ZoneDefinition/ZoneDefinitionLexer.h" -#include "Parsing/ZoneDefinition/ZoneDefinitionParser.h" +#include "Zone/Definition/Parsing/ZoneDefinitionLexer.h" +#include "Zone/Definition/Parsing/ZoneDefinitionParser.h" #include #include -ZoneDefinitionInputStream::ZoneDefinitionInputStream(std::istream& stream, std::string targetName, std::string fileName, const bool verbose) - : m_target_name(std::move(targetName)), +ZoneDefinitionInputStream::ZoneDefinitionInputStream(std::istream& stream, std::string targetName, std::string fileName, ISearchPath& searchPath) + : SearchPathMultiInputStream(searchPath), + m_target_name(std::move(targetName)), m_file_name(std::move(fileName)), - m_verbose(verbose), m_stream(nullptr), m_previously_set_game(std::nullopt) { @@ -23,15 +24,15 @@ ZoneDefinitionInputStream::ZoneDefinitionInputStream(std::istream& stream, std:: bool ZoneDefinitionInputStream::OpenBaseStream(std::istream& stream) { - m_open_streams.emplace_back(std::make_unique(stream, m_file_name)); + m_open_streams.emplace_back(std::make_unique(stream, m_file_name, *this)); return true; } 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()); - m_open_streams.emplace_back(std::move(definesProxy)); + m_open_streams.emplace_back(std::make_unique(m_open_streams.back().get())); + m_open_streams.emplace_back(std::make_unique(m_open_streams.back().get())); m_stream = m_open_streams.back().get(); } @@ -43,11 +44,10 @@ void ZoneDefinitionInputStream::SetPreviouslySetGame(GameId game) std::unique_ptr ZoneDefinitionInputStream::ReadDefinition() { - if (m_verbose) - std::cout << std::format("Reading zone definition file: {}\n", m_file_name); + 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(), m_target_name, m_previously_set_game); + const auto parser = std::make_unique(lexer.get(), m_target_name, m_search_path, *m_stream, m_previously_set_game); const auto start = std::chrono::steady_clock::now(); std::unique_ptr definition; @@ -55,8 +55,7 @@ std::unique_ptr ZoneDefinitionInputStream::ReadDefinition() definition = parser->GetParsedValue(); const auto end = std::chrono::steady_clock::now(); - if (m_verbose) - std::cout << std::format("Processing zone definition took {}ms\n", std::chrono::duration_cast(end - start).count()); + 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 d4e6b6e2..96f2f734 100644 --- a/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.h +++ b/src/ZoneCommon/Zone/Definition/ZoneDefinitionStream.h @@ -2,16 +2,18 @@ #include "Game/IGame.h" #include "Parsing/IParserLineStream.h" +#include "SearchPath/ISearchPath.h" +#include "SearchPath/SearchPathMultiInputStream.h" #include "ZoneDefinition.h" #include #include #include -class ZoneDefinitionInputStream +class ZoneDefinitionInputStream : public SearchPathMultiInputStream { public: - ZoneDefinitionInputStream(std::istream& stream, std::string targetName, std::string fileName, bool verbose); + ZoneDefinitionInputStream(std::istream& stream, std::string targetName, std::string fileName, ISearchPath& searchPath); void SetPreviouslySetGame(GameId game); std::unique_ptr ReadDefinition(); @@ -22,7 +24,6 @@ private: std::string m_target_name; std::string m_file_name; - bool m_verbose; IParserLineStream* m_stream; std::vector> m_open_streams; std::optional m_previously_set_game; diff --git a/test/ObjCommonTestUtils.lua b/test/ObjCommonTestUtils.lua new file mode 100644 index 00000000..b889470d --- /dev/null +++ b/test/ObjCommonTestUtils.lua @@ -0,0 +1,53 @@ +ObjCommonTestUtils = {} + +function ObjCommonTestUtils:include(includes) + if includes:handle(self:name()) then + includedirs { + path.join(TestFolder(), "ObjCommonTestUtils") + } + end +end + +function ObjCommonTestUtils:link(links) + links:add(self:name()) + links:linkto(ObjCommon) +end + +function ObjCommonTestUtils:use() + +end + +function ObjCommonTestUtils:name() + return "ObjCommonTestUtils" +end + +function ObjCommonTestUtils:project() + local folder = TestFolder() + local includes = Includes:create() + local links = Links:create() + + project(self:name()) + targetdir(TargetDirectoryTest) + location "%{wks.location}/test/%{prj.name}" + kind "StaticLib" + language "C++" + + files { + path.join(folder, "ObjCommonTestUtils/**.h"), + path.join(folder, "ObjCommonTestUtils/**.cpp") + } + + vpaths { + ["*"] = { + path.join(folder, "ObjCommonTestUtils") + } + } + + self:include(includes) + ObjCommon:include(includes) + catch2:include(includes) + + links:linkto(ObjCommon) + links:linkto(catch2) + links:linkall() +end diff --git a/test/ObjLoadingTests/Mock/MockSearchPath.cpp b/test/ObjCommonTestUtils/SearchPath/MockSearchPath.cpp similarity index 100% rename from test/ObjLoadingTests/Mock/MockSearchPath.cpp rename to test/ObjCommonTestUtils/SearchPath/MockSearchPath.cpp diff --git a/test/ObjLoadingTests/Mock/MockSearchPath.h b/test/ObjCommonTestUtils/SearchPath/MockSearchPath.h similarity index 80% rename from test/ObjLoadingTests/Mock/MockSearchPath.h rename to test/ObjCommonTestUtils/SearchPath/MockSearchPath.h index 4fb877fc..62631e9e 100644 --- a/test/ObjLoadingTests/Mock/MockSearchPath.h +++ b/test/ObjCommonTestUtils/SearchPath/MockSearchPath.h @@ -1,16 +1,18 @@ #pragma once + #include "SearchPath/ISearchPath.h" -#include +#include class MockSearchPath final : public ISearchPath { - std::map m_file_data_map; - public: void AddFileData(std::string fileName, std::string fileData); SearchPathOpenFile Open(const std::string& fileName) override; const std::string& GetPath() override; void Find(const SearchPathSearchOptions& options, const std::function& callback) override; + +private: + std::unordered_map m_file_data_map; }; diff --git a/test/ObjLoadingTests.lua b/test/ObjLoadingTests.lua index e50dec2b..2fc39089 100644 --- a/test/ObjLoadingTests.lua +++ b/test/ObjLoadingTests.lua @@ -43,10 +43,12 @@ function ObjLoadingTests:project() } self:include(includes) + ObjCommonTestUtils:include(includes) ParserTestUtils:include(includes) ObjLoading:include(includes) catch2:include(includes) + links:linkto(ObjCommonTestUtils) links:linkto(ParserTestUtils) links:linkto(ObjLoading) links:linkto(catch2) diff --git a/test/ObjLoadingTests/Game/IW3/StringTable/AssetLoaderStringTableIW3Test.cpp b/test/ObjLoadingTests/Game/IW3/StringTable/AssetLoaderStringTableIW3Test.cpp index bbe77a44..fb567095 100644 --- a/test/ObjLoadingTests/Game/IW3/StringTable/AssetLoaderStringTableIW3Test.cpp +++ b/test/ObjLoadingTests/Game/IW3/StringTable/AssetLoaderStringTableIW3Test.cpp @@ -1,8 +1,8 @@ #include "Game/IW3/StringTable/AssetLoaderStringTableIW3.h" #include "Game/IW3/GameIW3.h" -#include "Mock/MockSearchPath.h" #include "Pool/ZoneAssetPools.h" +#include "SearchPath/MockSearchPath.h" #include "Utils/MemoryManager.h" #include diff --git a/test/ObjLoadingTests/Game/IW4/AssetLoaders/LoaderStringTableIW4Test.cpp b/test/ObjLoadingTests/Game/IW4/AssetLoaders/LoaderStringTableIW4Test.cpp index 8a9250a4..fec3a8a1 100644 --- a/test/ObjLoadingTests/Game/IW4/AssetLoaders/LoaderStringTableIW4Test.cpp +++ b/test/ObjLoadingTests/Game/IW4/AssetLoaders/LoaderStringTableIW4Test.cpp @@ -2,7 +2,7 @@ #include "Game/IW4/CommonIW4.h" #include "Game/IW4/GameIW4.h" -#include "Mock/MockSearchPath.h" +#include "SearchPath/MockSearchPath.h" #include "Utils/MemoryManager.h" #include diff --git a/test/ObjLoadingTests/Game/IW4/Menu/LoaderMenuListIW4Test.cpp b/test/ObjLoadingTests/Game/IW4/Menu/LoaderMenuListIW4Test.cpp index 00633356..28ca0639 100644 --- a/test/ObjLoadingTests/Game/IW4/Menu/LoaderMenuListIW4Test.cpp +++ b/test/ObjLoadingTests/Game/IW4/Menu/LoaderMenuListIW4Test.cpp @@ -1,8 +1,8 @@ #include "Game/IW4/Menu/LoaderMenuListIW4.h" #include "Game/IW4/GameIW4.h" -#include "Mock/MockSearchPath.h" #include "Parsing/Menu/MenuFileReader.h" +#include "SearchPath/MockSearchPath.h" #include "Utils/MemoryManager.h" #include diff --git a/test/ObjLoadingTests/Game/IW5/AssetLoaders/LoaderStringTableIW5Test.cpp b/test/ObjLoadingTests/Game/IW5/AssetLoaders/LoaderStringTableIW5Test.cpp index ed43222e..e4b1072b 100644 --- a/test/ObjLoadingTests/Game/IW5/AssetLoaders/LoaderStringTableIW5Test.cpp +++ b/test/ObjLoadingTests/Game/IW5/AssetLoaders/LoaderStringTableIW5Test.cpp @@ -1,7 +1,7 @@ #include "Game/IW5/StringTable/LoaderStringTableIW5.h" #include "Game/IW5/GameIW5.h" -#include "Mock/MockSearchPath.h" +#include "SearchPath/MockSearchPath.h" #include "Utils/MemoryManager.h" #include diff --git a/test/ObjLoadingTests/Game/T5/AssetLoaders/LoaderStringTableT5Test.cpp b/test/ObjLoadingTests/Game/T5/AssetLoaders/LoaderStringTableT5Test.cpp index 257ac167..2e78deca 100644 --- a/test/ObjLoadingTests/Game/T5/AssetLoaders/LoaderStringTableT5Test.cpp +++ b/test/ObjLoadingTests/Game/T5/AssetLoaders/LoaderStringTableT5Test.cpp @@ -1,7 +1,7 @@ #include "Game/T5/StringTable/LoaderStringTableT5.h" #include "Game/T5/GameT5.h" -#include "Mock/MockSearchPath.h" +#include "SearchPath/MockSearchPath.h" #include "Utils/MemoryManager.h" #include diff --git a/test/ObjLoadingTests/Game/T6/AssetLoaders/LoaderStringTableT6Test.cpp b/test/ObjLoadingTests/Game/T6/AssetLoaders/LoaderStringTableT6Test.cpp index a39faa58..3d7ee81f 100644 --- a/test/ObjLoadingTests/Game/T6/AssetLoaders/LoaderStringTableT6Test.cpp +++ b/test/ObjLoadingTests/Game/T6/AssetLoaders/LoaderStringTableT6Test.cpp @@ -1,7 +1,7 @@ #include "Game/T6/StringTable/LoaderStringTableT6.h" #include "Game/T6/GameT6.h" -#include "Mock/MockSearchPath.h" +#include "SearchPath/MockSearchPath.h" #include "Utils/MemoryManager.h" #include diff --git a/test/ZoneCommonTests.lua b/test/ZoneCommonTests.lua index 43af18ab..cec3edd9 100644 --- a/test/ZoneCommonTests.lua +++ b/test/ZoneCommonTests.lua @@ -45,9 +45,11 @@ function ZoneCommonTests:project() } self:include(includes) + ObjCommonTestUtils:include(includes) ZoneCommon:include(includes) catch2:include(includes) + links:linkto(ObjCommonTestUtils) links:linkto(ZoneCommon) links:linkto(catch2) links:linkall() diff --git a/test/ZoneCommonTests/Zone/Definition/ZoneDefinitionStreamTests.cpp b/test/ZoneCommonTests/Zone/Definition/ZoneDefinitionStreamTests.cpp index 15638c64..06089e5a 100644 --- a/test/ZoneCommonTests/Zone/Definition/ZoneDefinitionStreamTests.cpp +++ b/test/ZoneCommonTests/Zone/Definition/ZoneDefinitionStreamTests.cpp @@ -1,4 +1,5 @@ #include "Game/T6/T6.h" +#include "SearchPath/MockSearchPath.h" #include "Zone/Definition/ZoneDefinitionStream.h" #include @@ -19,7 +20,8 @@ material,gradient_top menu,demo_ingame )sampledata"); - ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", true); + MockSearchPath mockSearchPath; + ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", mockSearchPath); const auto result = inputStream.ReadDefinition(); REQUIRE(result); @@ -50,7 +52,8 @@ menu,demo_ingame material,demo_material )sampledata"); - ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", true); + MockSearchPath mockSearchPath; + ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", mockSearchPath); const auto result = inputStream.ReadDefinition(); REQUIRE(result); @@ -68,19 +71,34 @@ material,demo_material >name,test_mod include,demo_gun +material,asdf include,demo_scripts )sampledata"); - ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", true); + MockSearchPath mockSearchPath; + + mockSearchPath.AddFileData("demo_gun.zone", R"sampledata( +material,demo_gun_material +)sampledata"); + + mockSearchPath.AddFileData("demo_scripts.zone", R"sampledata( +rawfile,demo_gun_script.gsc +)sampledata"); + + ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", mockSearchPath); const auto result = inputStream.ReadDefinition(); REQUIRE(result); + REQUIRE(result->m_assets.size() == 3); - REQUIRE(result->m_assets.empty()); - REQUIRE(result->m_includes.size() == 2); + REQUIRE(result->m_assets[0].m_asset_name == "demo_gun_material"); + REQUIRE(result->m_assets[0].m_asset_type == T6::ASSET_TYPE_MATERIAL); - REQUIRE(result->m_includes[0] == "demo_gun"); - REQUIRE(result->m_includes[1] == "demo_scripts"); + REQUIRE(result->m_assets[1].m_asset_name == "asdf"); + REQUIRE(result->m_assets[1].m_asset_type == T6::ASSET_TYPE_MATERIAL); + + REQUIRE(result->m_assets[2].m_asset_name == "demo_gun_script.gsc"); + REQUIRE(result->m_assets[2].m_asset_type == T6::ASSET_TYPE_RAWFILE); } TEST_CASE("ZoneDefinitionInputStream: Ensure can include assetlists", "[zonedefinition]") @@ -91,21 +109,47 @@ include,demo_scripts >name,test_mod assetlist,code_post_gfx_mp +material,asdf assetlist,common_mp material,test_material )sampledata"); - ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", true); + MockSearchPath mockSearchPath; + + mockSearchPath.AddFileData("assetlist/code_post_gfx_mp.csv", R"sampledata( +material,post_fx_mat +rawfile,code_post_gfx_mp +)sampledata"); + + mockSearchPath.AddFileData("assetlist/common_mp.csv", R"sampledata( +material,common_mat +rawfile,common_mp +)sampledata"); + + ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", mockSearchPath); const auto result = inputStream.ReadDefinition(); REQUIRE(result); + REQUIRE(result->m_assets.size() == 6); - REQUIRE(result->m_assets.size() == 1); - REQUIRE(result->m_asset_lists.size() == 2); + REQUIRE(result->m_assets[0].m_asset_name == "post_fx_mat"); + REQUIRE(result->m_assets[0].m_asset_type == T6::ASSET_TYPE_MATERIAL); - REQUIRE(result->m_asset_lists[0] == "code_post_gfx_mp"); - REQUIRE(result->m_asset_lists[1] == "common_mp"); + REQUIRE(result->m_assets[1].m_asset_name == "code_post_gfx_mp"); + REQUIRE(result->m_assets[1].m_asset_type == T6::ASSET_TYPE_RAWFILE); + + REQUIRE(result->m_assets[2].m_asset_name == "asdf"); + REQUIRE(result->m_assets[2].m_asset_type == T6::ASSET_TYPE_MATERIAL); + + REQUIRE(result->m_assets[3].m_asset_name == "common_mat"); + REQUIRE(result->m_assets[3].m_asset_type == T6::ASSET_TYPE_MATERIAL); + + REQUIRE(result->m_assets[4].m_asset_name == "common_mp"); + REQUIRE(result->m_assets[4].m_asset_type == T6::ASSET_TYPE_RAWFILE); + + REQUIRE(result->m_assets[5].m_asset_name == "test_material"); + REQUIRE(result->m_assets[5].m_asset_type == T6::ASSET_TYPE_MATERIAL); } TEST_CASE("ZoneDefinitionInputStream: Ensure can define other build targets", "[zonedefinition]") @@ -122,7 +166,8 @@ material,test_material build,more_mods )sampledata"); - ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", true); + MockSearchPath mockSearchPath; + ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", mockSearchPath); const auto result = inputStream.ReadDefinition(); REQUIRE(result); @@ -147,7 +192,8 @@ ignore,common_mp material,test_material )sampledata"); - ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", true); + MockSearchPath mockSearchPath; + ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", mockSearchPath); const auto result = inputStream.ReadDefinition(); REQUIRE(result); @@ -171,7 +217,8 @@ material,test_material material,test_material )sampledata"); - ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", true); + MockSearchPath mockSearchPath; + ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", mockSearchPath); const auto result = inputStream.ReadDefinition(); REQUIRE(result); @@ -197,7 +244,8 @@ material,test_material >level.ipak_read,code_post_gfx )sampledata"); - ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", true); + MockSearchPath mockSearchPath; + ZoneDefinitionInputStream inputStream(inputData, "test", "test.zone", mockSearchPath); const auto result = inputStream.ReadDefinition(); REQUIRE(result);