diff --git a/src/ObjLoading/Parsing/Menu/Domain/CommonItemDef.h b/src/ObjLoading/Parsing/Menu/Domain/CommonItemDef.h index c8b28f74..57723ae9 100644 --- a/src/ObjLoading/Parsing/Menu/Domain/CommonItemDef.h +++ b/src/ObjLoading/Parsing/Menu/Domain/CommonItemDef.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include "CommonMenuTypes.h" @@ -40,6 +41,11 @@ namespace menu std::string m_background; std::string m_focus_sound; std::string m_dvar_test; + std::vector m_enable_dvar; + std::vector m_disable_dvar; + std::vector m_show_dvar; + std::vector m_hide_dvar; + std::vector m_focus_dvar; int m_game_message_window_index; int m_game_message_window_mode; int m_fx_letter_time; diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp index cef4ca21..e547aaf2 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp @@ -1,5 +1,8 @@ #include "ItemPropertySequences.h" +#include +#include + #include "GenericColorPropertySequence.h" #include "GenericFloatingPointPropertySequence.h" #include "GenericIntPropertySequence.h" @@ -91,6 +94,52 @@ namespace menu::item_properties state->m_current_item->m_fx_decay_duration = result.NextCapture(CAPTURE_DECAY_DURATION).IntegerValue(); } }; + + class SequenceMultiTokenBlock final : public MenuFileParser::sequence_t + { + public: + using callback_t = std::function value)>; + + private: + static constexpr auto CAPTURE_VALUE = 1; + + callback_t m_set_callback; + + public: + SequenceMultiTokenBlock(std::string keyName, callback_t setCallback) + : m_set_callback(std::move(setCallback)) + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.KeywordIgnoreCase(std::move(keyName)), + create.Char('{'), + create.Optional(create.And({ + create.Text().Capture(CAPTURE_VALUE), + create.OptionalLoop(create.And({ + create.Char(';'), + create.Text().Capture(CAPTURE_VALUE) + })) + })), + create.Char('}'), + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + if (!m_set_callback) + return; + + std::vector values; + while (result.HasNextCapture(CAPTURE_VALUE)) + { + values.emplace_back(MenuMatcherFactory::TokenTextValue(result.NextCapture(CAPTURE_VALUE))); + } + + m_set_callback(state, std::move(values)); + } + }; } using namespace item_properties; @@ -223,6 +272,26 @@ void ItemPropertySequences::AddSequences(FeatureLevel featureLevel) { state->m_current_item->m_dvar_test = value; })); + AddSequence(std::make_unique("enableDvar", [](const MenuFileParserState* state, std::vector value) + { + state->m_current_item->m_enable_dvar = std::move(value); + })); + AddSequence(std::make_unique("disableDvar", [](const MenuFileParserState* state, std::vector value) + { + state->m_current_item->m_disable_dvar = std::move(value); + })); + AddSequence(std::make_unique("showDvar", [](const MenuFileParserState* state, std::vector value) + { + state->m_current_item->m_show_dvar = std::move(value); + })); + AddSequence(std::make_unique("hideDvar", [](const MenuFileParserState* state, std::vector value) + { + state->m_current_item->m_hide_dvar = std::move(value); + })); + AddSequence(std::make_unique("focusDvar", [](const MenuFileParserState* state, std::vector value) + { + state->m_current_item->m_focus_dvar = std::move(value); + })); AddSequence(std::make_unique("gamemsgwindowindex", [](const MenuFileParserState* state, const int value) { state->m_current_item->m_game_message_window_index = value;