#pragma once #include "openvic-simulation/types/IdentifierRegistry.hpp" #include "openvic-simulation/utility/Getters.hpp" #include "openvic-simulation/misc/Modifier.hpp" #include "openvic-simulation/pop/Pop.hpp" #include "openvic-simulation/politics/Ideology.hpp" #include "openvic-simulation/economy/Good.hpp" #include namespace OpenVic { struct NationalFocusManager; struct NationalFocusGroup : HasIdentifier { friend struct NationalFocusManager; private: NationalFocusGroup(std::string_view new_identifier); }; struct NationalFocus : HasIdentifier { friend struct NationalFocusManager; public: using pop_promotion_map_t = fixed_point_map_t; using party_loyalty_map_t = fixed_point_map_t; using production_map_t = fixed_point_map_t; private: uint8_t PROPERTY(icon); NationalFocusGroup const& PROPERTY(group); ModifierValue PROPERTY(modifiers); pop_promotion_map_t PROPERTY(encouraged_promotion); party_loyalty_map_t PROPERTY(encouraged_loyalty); production_map_t PROPERTY(encouraged_production); NationalFocus( std::string_view new_identifier, uint8_t new_icon, NationalFocusGroup const& new_group, ModifierValue&& new_modifiers, pop_promotion_map_t&& new_encouraged_promotion, party_loyalty_map_t&& new_encouraged_loyalty, production_map_t&& new_encouraged_production ); public: NationalFocus(NationalFocus&&) = default; }; struct NationalFocusManager { private: IdentifierRegistry IDENTIFIER_REGISTRY(national_focus_group); IdentifierRegistry IDENTIFIER_REGISTRY_CUSTOM_PLURAL(national_focus, national_foci); public: inline bool add_national_focus_group(std::string_view identifier); inline bool add_national_focus( std::string_view identifier, uint8_t icon, NationalFocusGroup const& group, ModifierValue&& modifiers, NationalFocus::pop_promotion_map_t&& encouraged_promotion, NationalFocus::party_loyalty_map_t&& encouraged_loyalty, NationalFocus::production_map_t&& encouraged_production ); bool load_national_foci_file(PopManager const& pop_manager, IdeologyManager const& ideology_manager, GoodManager const& good_manager, ModifierManager const& modifier_manager, ast::NodeCPtr root); }; } // namespace OpenVic