Add menu defines for feature levels

This commit is contained in:
Jan 2021-10-31 16:45:49 +01:00
parent 9816d01ac2
commit e79376eb3e
3 changed files with 42 additions and 16 deletions

View File

@ -28,7 +28,7 @@ bool AssetLoaderMenuList::LoadFromRaw(const std::string& assetName, ISearchPath*
if (!file.IsOpen()) if (!file.IsOpen())
return false; return false;
MenuFileReader reader(*file.m_stream, assetName, [searchPath](const std::string& filename) -> std::unique_ptr<std::istream> MenuFileReader reader(*file.m_stream, assetName, MenuFeatureLevel::IW4, [searchPath](const std::string& filename) -> std::unique_ptr<std::istream>
{ {
auto foundFileToInclude = searchPath->Open(filename); auto foundFileToInclude = searchPath->Open(filename);
if (!foundFileToInclude.IsOpen() || !foundFileToInclude.m_stream) if (!foundFileToInclude.IsOpen() || !foundFileToInclude.m_stream)
@ -37,7 +37,7 @@ bool AssetLoaderMenuList::LoadFromRaw(const std::string& assetName, ISearchPath*
return std::move(foundFileToInclude.m_stream); return std::move(foundFileToInclude.m_stream);
}); });
if(!reader.ReadMenuFile(MenuFeatureLevel::IW4)) if(!reader.ReadMenuFile())
{ {
std::cout << "Could not read menu list \"" << assetName << "\"\n"; std::cout << "Could not read menu list \"" << assetName << "\"\n";
} }

View File

@ -8,8 +8,9 @@
#include "Parsing/Impl/ParserSingleInputStream.h" #include "Parsing/Impl/ParserSingleInputStream.h"
#include "Parsing/Simple/SimpleLexer.h" #include "Parsing/Simple/SimpleLexer.h"
MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName, include_callback_t includeCallback) MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName, MenuFeatureLevel featureLevel, include_callback_t includeCallback)
: m_file_name(std::move(fileName)), : m_feature_level(featureLevel),
m_file_name(std::move(fileName)),
m_stream(nullptr) m_stream(nullptr)
{ {
OpenBaseStream(stream, std::move(includeCallback)); OpenBaseStream(stream, std::move(includeCallback));
@ -17,8 +18,9 @@ MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName, inclu
m_stream = m_open_streams.back().get(); m_stream = m_open_streams.back().get();
} }
MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName) MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName, MenuFeatureLevel featureLevel)
: m_file_name(std::move(fileName)), : m_feature_level(featureLevel),
m_file_name(std::move(fileName)),
m_stream(nullptr) m_stream(nullptr)
{ {
OpenBaseStream(stream, nullptr); OpenBaseStream(stream, nullptr);
@ -28,7 +30,7 @@ MenuFileReader::MenuFileReader(std::istream& stream, std::string fileName)
bool MenuFileReader::OpenBaseStream(std::istream& stream, include_callback_t includeCallback) bool MenuFileReader::OpenBaseStream(std::istream& stream, include_callback_t includeCallback)
{ {
if(includeCallback) if (includeCallback)
m_open_streams.emplace_back(std::make_unique<ParserMultiInputStream>(stream, m_file_name, std::move(includeCallback))); m_open_streams.emplace_back(std::make_unique<ParserMultiInputStream>(stream, m_file_name, std::move(includeCallback)));
else else
m_open_streams.emplace_back(std::make_unique<ParserSingleInputStream>(stream, m_file_name)); m_open_streams.emplace_back(std::make_unique<ParserSingleInputStream>(stream, m_file_name));
@ -36,19 +38,40 @@ bool MenuFileReader::OpenBaseStream(std::istream& stream, include_callback_t inc
return true; return true;
} }
void MenuFileReader::SetupDefinesProxy()
{
auto defines = std::make_unique<DefinesStreamProxy>(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() void MenuFileReader::SetupStreamProxies()
{ {
m_open_streams.emplace_back(std::make_unique<CommentRemovingStreamProxy>(m_open_streams.back().get())); m_open_streams.emplace_back(std::make_unique<CommentRemovingStreamProxy>(m_open_streams.back().get()));
m_open_streams.emplace_back(std::make_unique<IncludingStreamProxy>(m_open_streams.back().get())); m_open_streams.emplace_back(std::make_unique<IncludingStreamProxy>(m_open_streams.back().get()));
m_open_streams.emplace_back(std::make_unique<DefinesStreamProxy>(m_open_streams.back().get())); SetupDefinesProxy();
m_stream = m_open_streams.back().get(); m_stream = m_open_streams.back().get();
} }
bool MenuFileReader::ReadMenuFile(MenuFeatureLevel featureLevel) bool MenuFileReader::ReadMenuFile()
{ {
const auto lexer = std::make_unique<SimpleLexer>(m_stream, SimpleLexer::Config{false, true, false}); const auto lexer = std::make_unique<SimpleLexer>(m_stream, SimpleLexer::Config{false, true, false});
const auto parser = std::make_unique<MenuFileParser>(lexer.get(), featureLevel); const auto parser = std::make_unique<MenuFileParser>(lexer.get(), m_feature_level);
if (parser->Parse()) if (parser->Parse())
return true; return true;

View File

@ -13,16 +13,19 @@ public:
using include_callback_t = std::function<std::unique_ptr<std::istream>(const std::string& filename)>; using include_callback_t = std::function<std::unique_ptr<std::istream>(const std::string& filename)>;
private: private:
std::string m_file_name; const MenuFeatureLevel m_feature_level;
const std::string m_file_name;
IParserLineStream* m_stream; IParserLineStream* m_stream;
std::vector<std::unique_ptr<IParserLineStream>> m_open_streams; std::vector<std::unique_ptr<IParserLineStream>> m_open_streams;
bool OpenBaseStream(std::istream& stream, include_callback_t includeCallback); bool OpenBaseStream(std::istream& stream, include_callback_t includeCallback);
void SetupDefinesProxy();
void SetupStreamProxies(); void SetupStreamProxies();
public: public:
MenuFileReader(std::istream& stream, std::string fileName); MenuFileReader(std::istream& stream, std::string fileName, MenuFeatureLevel featureLevel);
MenuFileReader(std::istream& stream, std::string fileName, include_callback_t includeCallback); MenuFileReader(std::istream& stream, std::string fileName, MenuFeatureLevel featureLevel, include_callback_t includeCallback);
bool ReadMenuFile(MenuFeatureLevel featureLevel); bool ReadMenuFile();
}; };