#include "ItemPropertySequences.h" #include #include #include "GenericColorPropertySequence.h" #include "GenericFloatingPointPropertySequence.h" #include "GenericIntPropertySequence.h" #include "GenericKeywordPropertySequence.h" #include "GenericStringPropertySequence.h" #include "Parsing/Menu/Matcher/MenuMatcherFactory.h" using namespace menu; namespace menu::item_properties { class SequenceRect final : public MenuFileParser::sequence_t { static constexpr auto CAPTURE_X = 1; static constexpr auto CAPTURE_Y = 2; static constexpr auto CAPTURE_W = 3; static constexpr auto CAPTURE_H = 4; static constexpr auto CAPTURE_ALIGN_HORIZONTAL = 5; static constexpr auto CAPTURE_ALIGN_VERTICAL = 6; public: SequenceRect() { const MenuMatcherFactory create(this); AddMatchers({ create.KeywordIgnoreCase("rect"), create.Numeric().Capture(CAPTURE_X), create.Numeric().Capture(CAPTURE_Y), create.Numeric().Capture(CAPTURE_W), create.Numeric().Capture(CAPTURE_H), create.Optional(create.And({ create.Integer().Capture(CAPTURE_ALIGN_HORIZONTAL), create.Integer().Capture(CAPTURE_ALIGN_VERTICAL) })) }); } protected: void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override { assert(state->m_current_item); CommonRect rect { MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_X)), MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_Y)), MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_W)), MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_H)), 0, 0 }; if (result.HasNextCapture(CAPTURE_ALIGN_HORIZONTAL) && result.HasNextCapture(CAPTURE_ALIGN_VERTICAL)) { rect.horizontalAlign = result.NextCapture(CAPTURE_ALIGN_HORIZONTAL).IntegerValue(); rect.verticalAlign = result.NextCapture(CAPTURE_ALIGN_VERTICAL).IntegerValue(); } state->m_current_item->m_rect = rect; } }; class SequenceDecodeEffect final : public MenuFileParser::sequence_t { static constexpr auto CAPTURE_LETTER_TIME = 1; static constexpr auto CAPTURE_DECAY_START_TIME = 2; static constexpr auto CAPTURE_DECAY_DURATION = 3; public: SequenceDecodeEffect() { const MenuMatcherFactory create(this); AddMatchers({ create.KeywordIgnoreCase("decodeEffect"), create.Integer().Capture(CAPTURE_LETTER_TIME), create.Integer().Capture(CAPTURE_DECAY_START_TIME), create.Integer().Capture(CAPTURE_DECAY_DURATION), }); } protected: void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override { assert(state->m_current_item); state->m_current_item->m_fx_letter_time = result.NextCapture(CAPTURE_LETTER_TIME).IntegerValue(); state->m_current_item->m_fx_decay_start_time = result.NextCapture(CAPTURE_DECAY_START_TIME).IntegerValue(); 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; ItemPropertySequences::ItemPropertySequences(std::vector>& allSequences, std::vector& scopeSequences) : AbstractPropertySequenceHolder(allSequences, scopeSequences) { } void ItemPropertySequences::AddSequences(FeatureLevel featureLevel) { AddSequence(std::make_unique("name", [](const MenuFileParserState* state, const std::string& value) { state->m_current_item->m_name = value; })); AddSequence(std::make_unique("text", [](const MenuFileParserState* state, const std::string& value) { state->m_current_item->m_text = value; })); AddSequence(std::make_unique("textsavegame", [](const MenuFileParserState* state) { state->m_current_item->m_text_save_game = true; })); AddSequence(std::make_unique("textcinematicsubtitle", [](const MenuFileParserState* state) { state->m_current_item->m_text_cinematic_subtitle = true; })); AddSequence(std::make_unique("group", [](const MenuFileParserState* state, const std::string& value) { state->m_current_item->m_group = value; })); AddSequence(std::make_unique()); AddSequence(std::make_unique("style", [](const MenuFileParserState* state, const int value) { state->m_current_item->m_style = value; })); AddSequence(std::make_unique("decoration", [](const MenuFileParserState* state) { state->m_current_item->m_decoration = true; })); AddSequence(std::make_unique("autowrapped", [](const MenuFileParserState* state) { state->m_current_item->m_auto_wrapped = true; })); AddSequence(std::make_unique("horizontalscroll", [](const MenuFileParserState* state) { state->m_current_item->m_horizontal_scroll = true; })); AddSequence(std::make_unique("type", [](const MenuFileParserState* state, const int value) { state->m_current_item->m_type = value; })); AddSequence(std::make_unique("border", [](const MenuFileParserState* state, const int value) { state->m_current_item->m_border = value; })); AddSequence(std::make_unique("borderSize", [](const MenuFileParserState* state, const double value) { state->m_current_item->m_border_size = value; })); AddSequence(std::make_unique("ownerdraw", [](const MenuFileParserState* state, const int value) { state->m_current_item->m_owner_draw = value; })); AddSequence(std::make_unique("align", [](const MenuFileParserState* state, const int value) { state->m_current_item->m_align = value; })); AddSequence(std::make_unique("textalign", [](const MenuFileParserState* state, const int value) { state->m_current_item->m_text_align = value; })); AddSequence(std::make_unique("textalignx", [](const MenuFileParserState* state, const double value) { state->m_current_item->m_text_align_x = value; })); AddSequence(std::make_unique("textaligny", [](const MenuFileParserState* state, const double value) { state->m_current_item->m_text_align_y = value; })); AddSequence(std::make_unique("textscale", [](const MenuFileParserState* state, const double value) { state->m_current_item->m_text_scale = value; })); AddSequence(std::make_unique("textstyle", [](const MenuFileParserState* state, const int value) { state->m_current_item->m_text_style = value; })); AddSequence(std::make_unique("textfont", [](const MenuFileParserState* state, const int value) { state->m_current_item->m_text_font = value; })); AddSequence(std::make_unique("backcolor", [](const MenuFileParserState* state, const CommonColor value) { state->m_current_item->m_back_color = value; })); AddSequence(std::make_unique("forecolor", [](const MenuFileParserState* state, const CommonColor value) { state->m_current_item->m_fore_color = value; })); AddSequence(std::make_unique("bordercolor", [](const MenuFileParserState* state, const CommonColor value) { state->m_current_item->m_border_color = value; })); AddSequence(std::make_unique("outlinecolor", [](const MenuFileParserState* state, const CommonColor value) { state->m_current_item->m_outline_color = value; })); AddSequence(std::make_unique("disablecolor", [](const MenuFileParserState* state, const CommonColor value) { state->m_current_item->m_disable_color = value; })); AddSequence(std::make_unique("glowcolor", [](const MenuFileParserState* state, const CommonColor value) { state->m_current_item->m_glow_color = value; })); AddSequence(std::make_unique("background", [](const MenuFileParserState* state, const std::string& value) { state->m_current_item->m_background = value; })); AddSequence(std::make_unique("focusSound", [](const MenuFileParserState* state, const std::string& value) { state->m_current_item->m_focus_sound = value; })); AddSequence(std::make_unique("ownerdrawFlag", [](const MenuFileParserState* state, const int value) { state->m_current_item->m_owner_draw_flags |= value; })); AddSequence(std::make_unique("dvarTest", [](const MenuFileParserState* state, const std::string& value) { 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; })); AddSequence(std::make_unique("gamemsgwindowmode", [](const MenuFileParserState* state, const int value) { state->m_current_item->m_game_message_window_mode = value; })); AddSequence(std::make_unique()); }