#pragma once #include #include #include #include #include #include #include "openvic-dataloader/NodeLocation.hpp" #include "SimpleGrammar.hpp" #include "detail/InternalConcepts.hpp" #include "detail/dsl.hpp" #include "v2script/AiBehaviorGrammar.hpp" #include "v2script/EffectGrammar.hpp" #include "v2script/ModifierGrammar.hpp" // Event Grammar Definitions // namespace ovdl::v2script::grammar { static constexpr auto event_symbols = lexy::symbol_table // .map(false) .map(true); struct EventMtthStatement { struct MonthValue { static constexpr auto rule = lexy::dsl::p>; static constexpr auto value = dsl::callback( [](detail::IsParseState auto& state, ast::IdentifierValue* value) { bool is_number = true; for (auto* current = value->value().c_str(); *current; current++) { is_number = is_number && std::isdigit(*current); if (!is_number) break; } if (!is_number) { state.logger().warning("month is not an integer") // .primary(state.ast().location_of(value), "here") .finish(); } return value; }); }; using months = keyword_rule<"months", lexy::dsl::p>; static constexpr auto rule = dsl::curly_bracketed(lexy::dsl::p | lexy::dsl::p); static constexpr auto value = lexy::as_list >> construct_list; }; static constexpr auto str_or_id = lexy::dsl::p::ValueExpression>; struct EventOptionList { using name = fkeyword_rule<"name", str_or_id>; using ai_chance = fkeyword_rule<"ai_chance", lexy::dsl::p>; static constexpr auto rule = [] { using helper = dsl::rule_helper; return dsl::curly_bracketed(helper::flags + lexy::dsl::list(helper::p | lexy::dsl::p)); }(); static constexpr auto value = lexy::as_list >> construct_list; }; struct EventStatement { using id = fkeyword_rule<"id", str_or_id>; using title = fkeyword_rule<"title", str_or_id>; using desc = fkeyword_rule<"desc", str_or_id>; using picture = fkeyword_rule<"picture", str_or_id>; using is_triggered_only = fkeyword_rule<"is_triggered_only", str_or_id>; using fire_only_once = fkeyword_rule<"fire_only_once", str_or_id>; using immediate = fkeyword_rule<"immediate", lexy::dsl::p>; using mean_time_to_happen = fkeyword_rule<"mean_time_to_happen", lexy::dsl::p>; using trigger = keyword_rule<"trigger", lexy::dsl::p>; using option = keyword_rule<"option", lexy::dsl::p>; struct EventList { static constexpr auto rule = [] { using helper = dsl::rule_helper; return helper::flags + dsl::curly_bracketed.opt_list( helper::p | lexy::dsl::p | lexy::dsl::p