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())
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);
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";
}

View File

@ -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<ParserMultiInputStream>(stream, m_file_name, std::move(includeCallback)));
else
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;
}
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()
{
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<DefinesStreamProxy>(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<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())
return true;

View File

@ -13,16 +13,19 @@ public:
using include_callback_t = std::function<std::unique_ptr<std::istream>(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<std::unique_ptr<IParserLineStream>> 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();
};