From 4d868d9b6de4d545e4128cdb764daccaf8e9f4cf Mon Sep 17 00:00:00 2001 From: Jan Date: Mon, 1 Nov 2021 17:19:51 +0100 Subject: [PATCH] Load menu item properties with common field types --- .../Parsing/Menu/Domain/CommonItemDef.h | 37 +++ .../Properties/ItemPropertySequences.cpp | 210 ++++++++++++++++++ 2 files changed, 247 insertions(+) diff --git a/src/ObjLoading/Parsing/Menu/Domain/CommonItemDef.h b/src/ObjLoading/Parsing/Menu/Domain/CommonItemDef.h index 1a2a04ec..c8b28f74 100644 --- a/src/ObjLoading/Parsing/Menu/Domain/CommonItemDef.h +++ b/src/ObjLoading/Parsing/Menu/Domain/CommonItemDef.h @@ -2,11 +2,48 @@ #include +#include "CommonMenuTypes.h" + namespace menu { class CommonItemDef { public: std::string m_name; + std::string m_text; + bool m_text_save_game; + bool m_text_cinematic_subtitle; + std::string m_group; + CommonRect m_rect; + int m_style; + bool m_decoration; + bool m_auto_wrapped; + bool m_horizontal_scroll; + int m_type; + int m_border; + double m_border_size; + int m_owner_draw; + int m_owner_draw_flags; + int m_align; + int m_text_align; + double m_text_align_x; + double m_text_align_y; + double m_text_scale; + int m_text_style; + int m_text_font; + CommonColor m_back_color; + CommonColor m_fore_color; + CommonColor m_border_color; + CommonColor m_outline_color; + CommonColor m_disable_color; + CommonColor m_glow_color; + std::string m_background; + std::string m_focus_sound; + std::string m_dvar_test; + int m_game_message_window_index; + int m_game_message_window_mode; + int m_fx_letter_time; + int m_fx_decay_start_time; + int m_fx_decay_duration; }; } diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp index 550e5da2..cef4ca21 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp @@ -1,5 +1,9 @@ #include "ItemPropertySequences.h" +#include "GenericColorPropertySequence.h" +#include "GenericFloatingPointPropertySequence.h" +#include "GenericIntPropertySequence.h" +#include "GenericKeywordPropertySequence.h" #include "GenericStringPropertySequence.h" #include "Parsing/Menu/MenuMatcherFactory.h" @@ -7,6 +11,86 @@ 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(); + } + }; } using namespace item_properties; @@ -22,4 +106,130 @@ void ItemPropertySequences::AddSequences(FeatureLevel featureLevel) { 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("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()); }