diff options
Diffstat (limited to 'src/openvic-simulation/modifier/ModifierManager.hpp')
-rw-r--r-- | src/openvic-simulation/modifier/ModifierManager.hpp | 186 |
1 files changed, 90 insertions, 96 deletions
diff --git a/src/openvic-simulation/modifier/ModifierManager.hpp b/src/openvic-simulation/modifier/ModifierManager.hpp index 51f89ae..49e3559 100644 --- a/src/openvic-simulation/modifier/ModifierManager.hpp +++ b/src/openvic-simulation/modifier/ModifierManager.hpp @@ -1,15 +1,13 @@ #pragma once +#include <string_view> + #include "openvic-simulation/modifier/Modifier.hpp" #include "openvic-simulation/modifier/ModifierEffectCache.hpp" #include "openvic-simulation/modifier/StaticModifierCache.hpp" #include "openvic-simulation/types/IdentifierRegistry.hpp" namespace OpenVic { - - template<typename Fn> - concept ModifierEffectValidator = std::predicate<Fn, ModifierEffect const&>; - struct ModifierManager { friend struct StaticModifierCache; friend struct BuildingTypeManager; @@ -18,127 +16,123 @@ namespace OpenVic { friend struct RebelManager; friend struct PopManager; friend struct TechnologyManager; + friend struct TerrainTypeManager; - using effect_variant_map_t = ordered_map<Modifier::modifier_type_t, ModifierEffect const*>; + using modifier_effect_registry_t = CaseInsensitiveIdentifierRegistry<ModifierEffect, RegistryStorageInfoDeque>; /* Some ModifierEffects are generated mid-load, such as max/min count modifiers for each building, so * we can't lock it until loading is over. This means we can't rely on locking for pointer stability, * so instead we store the effects in a deque which doesn't invalidate pointers on insert. */ private: - CaseInsensitiveIdentifierRegistry<ModifierEffect, RegistryStorageInfoDeque> IDENTIFIER_REGISTRY(modifier_effect); + modifier_effect_registry_t IDENTIFIER_REGISTRY(leader_modifier_effect); + modifier_effect_registry_t IDENTIFIER_REGISTRY(unit_terrain_modifier_effect); + modifier_effect_registry_t IDENTIFIER_REGISTRY(shared_tech_country_modifier_effect); + modifier_effect_registry_t IDENTIFIER_REGISTRY(technology_modifier_effect); + modifier_effect_registry_t IDENTIFIER_REGISTRY(base_country_modifier_effect); + modifier_effect_registry_t IDENTIFIER_REGISTRY(base_province_modifier_effect); + modifier_effect_registry_t IDENTIFIER_REGISTRY(terrain_modifier_effect); case_insensitive_string_set_t complex_modifiers; - string_map_t<effect_variant_map_t> modifier_effect_variants; IdentifierRegistry<IconModifier> IDENTIFIER_REGISTRY(event_modifier); - IdentifierRegistry<Modifier> IDENTIFIER_REGISTRY(static_modifier); IdentifierRegistry<TriggeredModifier> IDENTIFIER_REGISTRY(triggered_modifier); ModifierEffectCache PROPERTY(modifier_effect_cache); StaticModifierCache PROPERTY(static_modifier_cache); - - /* effect_validator takes in ModifierEffect const& */ - NodeTools::key_value_callback_t _modifier_effect_callback( - ModifierValue& modifier, Modifier::modifier_type_t type, NodeTools::key_value_callback_t default_callback, - ModifierEffectValidator auto effect_validator - ) const; - - public: - bool add_modifier_effect( - ModifierEffect const*& effect_cache, - std::string_view identifier, - bool positive_good, - ModifierEffect::format_t format, + + bool _register_modifier_effect( + modifier_effect_registry_t& registry, ModifierEffect::target_t targets, - std::string_view localisation_key = {} + ModifierEffect const*& effect_cache, + const std::string_view identifier, + const bool is_positive_good, + const ModifierEffect::format_t format, + const std::string_view localisation_key, + const bool has_no_effect ); - bool register_complex_modifier(std::string_view identifier); - static std::string get_flat_identifier( - std::string_view complex_modifier_identifier, std::string_view variant_identifier + +#define REGISTER_MODIFIER_EFFECT_DEFINITION(MAPPING_TYPE) \ + bool register_##MAPPING_TYPE##_modifier_effect( \ + ModifierEffect const*& effect_cache, \ + std::string_view identifier, \ + bool is_positive_good, \ + ModifierEffect::format_t format, \ + std::string_view localisation_key = {}, \ + bool has_no_effect = false \ ); - bool register_modifier_effect_variants( - std::string const& identifier, ModifierEffect const* effect, std::vector<Modifier::modifier_type_t> const& types - ); + REGISTER_MODIFIER_EFFECT_DEFINITION(leader) + REGISTER_MODIFIER_EFFECT_DEFINITION(unit_terrain) + REGISTER_MODIFIER_EFFECT_DEFINITION(shared_tech_country) + REGISTER_MODIFIER_EFFECT_DEFINITION(technology) + REGISTER_MODIFIER_EFFECT_DEFINITION(base_country) + REGISTER_MODIFIER_EFFECT_DEFINITION(base_province) + REGISTER_MODIFIER_EFFECT_DEFINITION(terrain) +#undef REGISTER_MODIFIER_EFFECT_DEFINITION + + bool _add_flattened_modifier_cb( + ModifierValue& modifier_value, + const std::string_view prefix, + const std::string_view key, + const ast::NodeCPtr value + ) const; + + bool _add_modifier_cb( + ModifierValue& modifier_value, + ModifierEffect const* const effect, + const ast::NodeCPtr value + ) const; + + NodeTools::key_value_callback_t _expect_modifier_effect( + modifier_effect_registry_t const& registry, + ModifierValue& modifier_value + ) const; + + NodeTools::key_value_callback_t _expect_modifier_effect_with_fallback( + modifier_effect_registry_t const& registry, + ModifierValue& modifier_value, + const NodeTools::key_value_callback_t fallback + ) const; + + NodeTools::key_value_callback_t _expect_shared_tech_country_modifier_effect(ModifierValue& modifier_value) const; + public: + + bool register_complex_modifier(const std::string_view identifier); + static std::string get_flat_identifier(const std::string_view complex_modifier_identifier, const std::string_view variant_identifier); bool setup_modifier_effects(); - bool add_event_modifier(std::string_view identifier, ModifierValue&& values, IconModifier::icon_t icon); - bool load_event_modifiers(ast::NodeCPtr root); + bool add_event_modifier( + const std::string_view identifier, + ModifierValue&& values, + const IconModifier::icon_t icon, + const Modifier::modifier_type_t type = Modifier::modifier_type_t::EVENT + ); + bool load_event_modifiers(const ast::NodeCPtr root); - bool add_static_modifier(std::string_view identifier, ModifierValue&& values); - bool load_static_modifiers(ast::NodeCPtr root); + bool load_static_modifiers(const ast::NodeCPtr root); bool add_triggered_modifier( - std::string_view identifier, ModifierValue&& values, IconModifier::icon_t icon, ConditionScript&& trigger + const std::string_view identifier, + ModifierValue&& values, + const IconModifier::icon_t icon, + ConditionScript&& trigger ); - bool load_triggered_modifiers(ast::NodeCPtr root); + bool load_triggered_modifiers(const ast::NodeCPtr root); bool parse_scripts(DefinitionManager const& definition_manager); + void lock_all_modifier_except_base_country_effects(); - NodeTools::node_callback_t expect_validated_modifier_value_and_default( - NodeTools::callback_t<ModifierValue&&> modifier_callback, Modifier::modifier_type_t type, - NodeTools::key_value_callback_t default_callback, ModifierEffectValidator auto effect_validator - ) const; - NodeTools::node_callback_t expect_validated_modifier_value( - NodeTools::callback_t<ModifierValue&&> modifier_callback, Modifier::modifier_type_t type, - ModifierEffectValidator auto effect_validator - ) const; - - NodeTools::node_callback_t expect_modifier_value_and_default( - NodeTools::callback_t<ModifierValue&&> modifier_callback, Modifier::modifier_type_t type, - NodeTools::key_value_callback_t default_callback + NodeTools::key_value_callback_t expect_leader_modifier(ModifierValue& modifier_value) const; + NodeTools::key_value_callback_t expect_technology_modifier(ModifierValue& modifier_value) const; + NodeTools::key_value_callback_t expect_unit_terrain_modifier( + ModifierValue& modifier_value, + const std::string_view terrain_type_identifier ) const; - NodeTools::node_callback_t expect_modifier_value( - NodeTools::callback_t<ModifierValue&&> modifier_callback, Modifier::modifier_type_t type - ) const; - - NodeTools::node_callback_t expect_whitelisted_modifier_value_and_default( - NodeTools::callback_t<ModifierValue&&> modifier_callback, Modifier::modifier_type_t type, - string_set_t const& whitelist, NodeTools::key_value_callback_t default_callback - ) const; - NodeTools::node_callback_t expect_whitelisted_modifier_value( - NodeTools::callback_t<ModifierValue&&> modifier_callback, Modifier::modifier_type_t type, - string_set_t const& whitelist - ) const; - - // In the functions below, key_map refers to a map from identifier strings to NodeTools::dictionary_entry_t, - // allowing any non-modifier effect keys found to be parsed in a custom way, similar to expect_dictionary_keys. - NodeTools::node_callback_t expect_modifier_value_and_key_map_and_default( - NodeTools::callback_t<ModifierValue&&> modifier_callback, Modifier::modifier_type_t type, - NodeTools::key_value_callback_t default_callback, NodeTools::key_map_t&& key_map - ) const; - NodeTools::node_callback_t expect_modifier_value_and_key_map( - NodeTools::callback_t<ModifierValue&&> modifier_callback, Modifier::modifier_type_t type, - NodeTools::key_map_t&& key_map - ) const; - - template<typename... Args> - NodeTools::node_callback_t expect_modifier_value_and_key_map_and_default( - NodeTools::callback_t<ModifierValue&&> modifier_callback, Modifier::modifier_type_t type, - NodeTools::key_value_callback_t default_callback, NodeTools::key_map_t&& key_map, Args... args - ) const { - NodeTools::add_key_map_entries(key_map, args...); - return expect_modifier_value_and_key_map_and_default( - modifier_callback, type, default_callback, std::move(key_map) - ); - } - - template<typename... Args> - NodeTools::node_callback_t expect_modifier_value_and_keys_and_default( - NodeTools::callback_t<ModifierValue&&> modifier_callback, Modifier::modifier_type_t type, - NodeTools::key_value_callback_t default_callback, Args... args - ) const { - return expect_modifier_value_and_key_map_and_default(modifier_callback, type, default_callback, {}, args...); - } - template<typename... Args> - NodeTools::node_callback_t expect_modifier_value_and_keys( - NodeTools::callback_t<ModifierValue&&> modifier_callback, Modifier::modifier_type_t type, Args... args - ) const { - return expect_modifier_value_and_key_map_and_default( - modifier_callback, type, NodeTools::key_value_invalid_callback, {}, args... - ); - } + NodeTools::key_value_callback_t expect_base_country_modifier(ModifierValue& modifier_value) const; + NodeTools::key_value_callback_t expect_base_province_modifier(ModifierValue& modifier_value) const; + NodeTools::key_value_callback_t expect_province_event_modifier(ModifierValue& modifier_value) const; + NodeTools::key_value_callback_t expect_terrain_modifier(ModifierValue& modifier_value) const; }; } |