From e79376eb3e48b2a73ddc754fada92f4d15b35e99 Mon Sep 17 00:00:00 2001 From: Jan Date: Sun, 31 Oct 2021 16:45:49 +0100 Subject: [PATCH] Add menu defines for feature levels --- .../IW4/AssetLoaders/AssetLoaderMenuList.cpp | 4 +- .../Parsing/Menu/MenuFileReader.cpp | 43 ++++++++++++++----- src/ObjLoading/Parsing/Menu/MenuFileReader.h | 11 +++-- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMenuList.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMenuList.cpp index 2c68c4d4..5f10e461 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMenuList.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMenuList.cpp @@ -28,7 +28,7 @@ bool AssetLoaderMenuList::LoadFromRaw(const std::string& assetName, ISearchPath* if (!file.IsOpen()) return false; - MenuFileReader reader(*file.m_stream, assetName, [searchPath](const std::string& filename) -> std::unique_ptr + MenuFileReader reader(*file.m_stream, assetName, MenuFeatureLevel::IW4, [searchPath](const std::string& filename) -> std::unique_ptr { auto foundFileToInclude = searchPath->Open(filename); if (!foundFileToInclude.IsOpen() || !foundFileToInclude.m_stream) @@ -37,7 +37,7 @@ bool AssetLoaderMenuList::LoadFromRaw(const std::string& assetName, ISearchPath* return std::move(foundFileToInclude.m_stream); }); - if(!reader.ReadMenuFile(MenuFeatureLevel::IW4)) + if(!reader.ReadMenuFile()) { std::cout << "Could not read menu list \"" << assetName << "\"\n"; } diff --git a/src/ObjLoading/Parsing/Menu/MenuFileReader.cpp b/src/ObjLoading/Parsing/Menu/MenuFileReader.cpp index 6144a0c3..4b131f3e 100644 --- a/src/ObjLoading/Parsing/Menu/MenuFileReader.cpp +++ b/src/ObjLoading/Parsing/Menu/MenuFileReader.cpp @@ -8,18 +8,20 @@ #include "Parsing/Impl/ParserSingleInputStream.h" #include "Parsing/Simple/SimpleLexer.h" -MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName, include_callback_t includeCallback) - : m_file_name(std::move(fileName)), - m_stream(nullptr) +MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName, MenuFeatureLevel featureLevel, include_callback_t includeCallback) + : m_feature_level(featureLevel), + m_file_name(std::move(fileName)), + m_stream(nullptr) { OpenBaseStream(stream, std::move(includeCallback)); SetupStreamProxies(); m_stream = m_open_streams.back().get(); } -MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName) - : m_file_name(std::move(fileName)), - m_stream(nullptr) +MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName, MenuFeatureLevel featureLevel) + : m_feature_level(featureLevel), + m_file_name(std::move(fileName)), + m_stream(nullptr) { OpenBaseStream(stream, nullptr); SetupStreamProxies(); @@ -28,7 +30,7 @@ MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName) bool MenuFileReader::OpenBaseStream(std::istream& stream, include_callback_t includeCallback) { - if(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)); @@ -36,19 +38,40 @@ bool MenuFileReader::OpenBaseStream(std::istream& stream, include_callback_t inc return true; } +void MenuFileReader::SetupDefinesProxy() +{ + auto defines = std::make_unique(m_open_streams.back().get()); + + defines->AddDefine(DefinesStreamProxy::Define("PC", "1")); + switch(m_feature_level) + { + case MenuFeatureLevel::IW4: + defines->AddDefine(DefinesStreamProxy::Define("FEATURE_LEVEL_IW4", "1")); + break; + case MenuFeatureLevel::IW5: + defines->AddDefine(DefinesStreamProxy::Define("FEATURE_LEVEL_IW5", "1")); + break; + default: + assert(false); + break; + } + + m_open_streams.emplace_back(std::move(defines)); +} + void MenuFileReader::SetupStreamProxies() { 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_open_streams.emplace_back(std::make_unique(m_open_streams.back().get())); + SetupDefinesProxy(); m_stream = m_open_streams.back().get(); } -bool MenuFileReader::ReadMenuFile(MenuFeatureLevel featureLevel) +bool MenuFileReader::ReadMenuFile() { const auto lexer = std::make_unique(m_stream, SimpleLexer::Config{false, true, false}); - const auto parser = std::make_unique(lexer.get(), featureLevel); + const auto parser = std::make_unique(lexer.get(), m_feature_level); if (parser->Parse()) return true; diff --git a/src/ObjLoading/Parsing/Menu/MenuFileReader.h b/src/ObjLoading/Parsing/Menu/MenuFileReader.h index 276697a2..5e4abcde 100644 --- a/src/ObjLoading/Parsing/Menu/MenuFileReader.h +++ b/src/ObjLoading/Parsing/Menu/MenuFileReader.h @@ -13,16 +13,19 @@ public: using include_callback_t = std::function(const std::string& filename)>; private: - std::string m_file_name; + const MenuFeatureLevel m_feature_level; + const std::string m_file_name; + IParserLineStream* m_stream; std::vector> m_open_streams; bool OpenBaseStream(std::istream& stream, include_callback_t includeCallback); + void SetupDefinesProxy(); void SetupStreamProxies(); public: - MenuFileReader(std::istream& stream, std::string fileName); - MenuFileReader(std::istream& stream, std::string fileName, include_callback_t includeCallback); + MenuFileReader(std::istream& stream, std::string fileName, MenuFeatureLevel featureLevel); + MenuFileReader(std::istream& stream, std::string fileName, MenuFeatureLevel featureLevel, include_callback_t includeCallback); - bool ReadMenuFile(MenuFeatureLevel featureLevel); + bool ReadMenuFile(); };