diff options
Diffstat (limited to 'src/openvic-simulation/modifier/StaticModifierCache.cpp')
-rw-r--r-- | src/openvic-simulation/modifier/StaticModifierCache.cpp | 238 |
1 files changed, 147 insertions, 91 deletions
diff --git a/src/openvic-simulation/modifier/StaticModifierCache.cpp b/src/openvic-simulation/modifier/StaticModifierCache.cpp index b03d827..953b49b 100644 --- a/src/openvic-simulation/modifier/StaticModifierCache.cpp +++ b/src/openvic-simulation/modifier/StaticModifierCache.cpp @@ -1,115 +1,171 @@ #include "StaticModifierCache.hpp" +#include <string_view> + +#include "openvic-simulation/dataloader/NodeTools.hpp" +#include "openvic-simulation/modifier/Modifier.hpp" #include "openvic-simulation/modifier/ModifierManager.hpp" using namespace OpenVic; +using namespace OpenVic::NodeTools; +using enum Modifier::modifier_type_t; StaticModifierCache::StaticModifierCache() : // Country modifiers - very_easy_player { nullptr }, - easy_player { nullptr }, - hard_player { nullptr }, - very_hard_player { nullptr }, - very_easy_ai { nullptr }, - easy_ai { nullptr }, - hard_ai { nullptr }, - very_hard_ai { nullptr }, - base_modifier { nullptr }, - war { nullptr }, - peace { nullptr }, - disarming { nullptr }, - war_exhaustion { nullptr }, - infamy { nullptr }, - debt_default_to { nullptr }, - bad_debter { nullptr }, - great_power { nullptr }, - secondary_power { nullptr }, - civilised { nullptr }, - uncivilised { nullptr }, - literacy { nullptr }, - plurality { nullptr }, - generalised_debt_default { nullptr }, - total_occupation { nullptr }, - total_blockaded { nullptr }, + very_easy_player { "very_easy_player", {}, STATIC }, + easy_player { "easy_player", {}, STATIC }, + hard_player { "hard_player", {}, STATIC }, + very_hard_player { "very_hard_player", {}, STATIC }, + very_easy_ai { "very_easy_ai", {}, STATIC }, + easy_ai { "easy_ai", {}, STATIC }, + hard_ai { "hard_ai", {}, STATIC }, + very_hard_ai { "very_hard_ai", {}, STATIC }, + base_modifier { "base_values", {}, STATIC }, + war { "war", {}, STATIC }, + peace { "peace", {}, STATIC }, + disarming { "disarming", {}, STATIC }, + war_exhaustion { "war_exhaustion", {}, STATIC }, + infamy { "badboy", {}, STATIC }, + debt_default_to { "debt_default_to", {}, STATIC }, + great_power { "great_power", {}, STATIC }, + secondary_power { "second_power", {}, STATIC }, + civilised { "civ_nation", {}, STATIC }, + uncivilised { "unciv_nation", {}, STATIC }, + literacy { "average_literacy", {}, STATIC }, + plurality { "plurality", {}, STATIC }, + total_occupation { "total_occupation", {}, STATIC }, + total_blockaded { "total_blockaded", {}, STATIC }, in_bankruptcy { nullptr }, + bad_debtor { nullptr }, + generalised_debt_default { nullptr }, // Province modifiers - overseas { nullptr }, - coastal { nullptr }, - non_coastal { nullptr }, - coastal_sea { nullptr }, - sea_zone { nullptr }, - land_province { nullptr }, - blockaded { nullptr }, - no_adjacent_controlled { nullptr }, - core { nullptr }, - has_siege { nullptr }, - occupied { nullptr }, - nationalism { nullptr }, - infrastructure { nullptr } {} - -bool StaticModifierCache::load_static_modifiers(ModifierManager& modifier_manager) { + overseas { "overseas", {}, STATIC }, + coastal { "coastal", {}, STATIC }, + non_coastal { "non_coastal", {}, STATIC }, + coastal_sea { "coastal_sea", {}, STATIC }, + sea_zone { "sea_zone", {}, STATIC }, + land_province { "land_province", {}, STATIC }, + blockaded { "blockaded", {}, STATIC }, + no_adjacent_controlled { "no_adjacent_controlled", {}, STATIC }, + core { "core", {}, STATIC }, + has_siege { "has_siege", {}, STATIC }, + occupied { "occupied", {}, STATIC }, + nationalism { "nationalism", {}, STATIC }, + infrastructure { "infrastructure", {}, STATIC } {} + +bool StaticModifierCache::load_static_modifiers(ModifierManager& modifier_manager, const ast::NodeCPtr root) { bool ret = true; + key_map_t key_map {}; - const auto set_static_modifier = [&modifier_manager, &ret]( - Modifier const*& modifier, std::string_view name, fixed_point_t multiplier = 1 + const auto set_static_country_modifier = [&key_map, &modifier_manager, &ret]( + Modifier& modifier ) -> void { - Modifier* mutable_modifier = modifier_manager.static_modifiers.get_item_by_identifier(name); + ret &= add_key_map_entry( + key_map, modifier.get_identifier(), ONE_EXACTLY, + expect_dictionary(modifier_manager.expect_base_country_modifier(modifier)) + ); + }; + + const auto set_country_event_modifier = [&key_map, &modifier_manager, &ret]( + const std::string_view identifier, const IconModifier::icon_t icon + ) -> void { + ret &= add_key_map_entry( + key_map, identifier, ONE_EXACTLY, + [&modifier_manager, identifier, icon](const ast::NodeCPtr value) -> bool { + if (modifier_manager.get_event_modifier_by_identifier(identifier) != nullptr) { + return true; //an event modifier overrides a static modifier with the same identifier. + } - if (mutable_modifier != nullptr) { - if (multiplier != fixed_point_t::_1()) { - *mutable_modifier *= multiplier; + ModifierValue modifier_value {}; + bool has_parsed_modifier = expect_dictionary(modifier_manager.expect_base_country_modifier(modifier_value))(value); + has_parsed_modifier &= modifier_manager.add_event_modifier(identifier, std::move(modifier_value), icon, STATIC); + return has_parsed_modifier; } + ); + + }; - modifier = mutable_modifier; - } else { - Logger::error("Failed to set static modifier: ", name); - ret = false; - } + const auto set_static_province_modifier = [&key_map, &modifier_manager, &ret]( + Modifier& modifier + ) -> void { + ret &= add_key_map_entry( + key_map, modifier.get_identifier(), ONE_EXACTLY, + expect_dictionary(modifier_manager.expect_base_province_modifier(modifier)) + ); }; // Country modifiers - set_static_modifier(very_easy_player, "very_easy_player"); - set_static_modifier(easy_player, "easy_player"); - set_static_modifier(hard_player, "hard_player"); - set_static_modifier(very_hard_player, "very_hard_player"); - set_static_modifier(very_easy_ai, "very_easy_ai"); - set_static_modifier(easy_ai, "easy_ai"); - set_static_modifier(hard_ai, "hard_ai"); - set_static_modifier(very_hard_ai, "very_hard_ai"); - - set_static_modifier(base_modifier, "base_values"); - set_static_modifier(war, "war"); - set_static_modifier(peace, "peace"); - set_static_modifier(disarming, "disarming"); - set_static_modifier(war_exhaustion, "war_exhaustion"); - set_static_modifier(infamy, "badboy"); - set_static_modifier(debt_default_to, "debt_default_to"); - set_static_modifier(bad_debter, "bad_debter"); - set_static_modifier(great_power, "great_power"); - set_static_modifier(secondary_power, "second_power"); - set_static_modifier(civilised, "civ_nation"); - set_static_modifier(uncivilised, "unciv_nation"); - set_static_modifier(literacy, "average_literacy"); - set_static_modifier(plurality, "plurality"); - set_static_modifier(generalised_debt_default, "generalised_debt_default"); - set_static_modifier(total_occupation, "total_occupation", 100); - set_static_modifier(total_blockaded, "total_blockaded"); - set_static_modifier(in_bankruptcy, "in_bankrupcy"); + set_static_country_modifier(very_easy_player); + set_static_country_modifier(easy_player); + set_static_country_modifier(hard_player); + set_static_country_modifier(very_hard_player); + set_static_country_modifier(very_easy_ai); + set_static_country_modifier(easy_ai); + set_static_country_modifier(hard_ai); + set_static_country_modifier(very_hard_ai); + + ret &= add_key_map_entry( + key_map, base_modifier.get_identifier(), ONE_EXACTLY, + expect_dictionary_keys_and_default( + modifier_manager.expect_base_country_modifier(base_modifier), + "supply_limit", ZERO_OR_ONE, [this, &modifier_manager](const ast::NodeCPtr value) -> bool { + return modifier_manager._add_modifier_cb( + base_modifier, + modifier_manager.get_modifier_effect_cache().get_supply_limit_global_base(), + value + ); + } + ) + ); + + set_static_country_modifier(war); + set_static_country_modifier(peace); + set_static_country_modifier(disarming); + set_static_country_modifier(war_exhaustion); + set_static_country_modifier(infamy); + set_static_country_modifier(debt_default_to); + set_static_country_modifier(great_power); + set_static_country_modifier(secondary_power); + set_static_country_modifier(civilised); + set_static_country_modifier(uncivilised); + set_static_country_modifier(literacy); + set_static_country_modifier(plurality); + set_static_country_modifier(total_occupation); + set_static_country_modifier(total_blockaded); + + // Country Event modifiers + static constexpr IconModifier::icon_t default_icon = 0; + static constexpr std::string_view bad_debtor_id = "bad_debter"; //paradox typo + static constexpr std::string_view in_bankruptcy_id = "in_bankrupcy"; //paradox typo + static constexpr std::string_view generalised_debt_default_id = "generalised_debt_default"; + set_country_event_modifier(bad_debtor_id, default_icon); + set_country_event_modifier(in_bankruptcy_id, default_icon); + set_country_event_modifier(generalised_debt_default_id, default_icon); // Province modifiers - set_static_modifier(overseas, "overseas"); - set_static_modifier(coastal, "coastal"); - set_static_modifier(non_coastal, "non_coastal"); - set_static_modifier(coastal_sea, "coastal_sea"); - set_static_modifier(sea_zone, "sea_zone"); - set_static_modifier(land_province, "land_province"); - set_static_modifier(blockaded, "blockaded"); - set_static_modifier(no_adjacent_controlled, "no_adjacent_controlled"); - set_static_modifier(core, "core"); - set_static_modifier(has_siege, "has_siege"); - set_static_modifier(occupied, "occupied"); - set_static_modifier(nationalism, "nationalism"); - set_static_modifier(infrastructure, "infrastructure"); + set_static_province_modifier(overseas); + set_static_province_modifier(coastal); + set_static_province_modifier(non_coastal); + set_static_province_modifier(coastal_sea); + set_static_province_modifier(sea_zone); + set_static_province_modifier(land_province); + set_static_province_modifier(blockaded); + set_static_province_modifier(no_adjacent_controlled); + set_static_province_modifier(core); + set_static_province_modifier(has_siege); + set_static_province_modifier(occupied); + set_static_province_modifier(nationalism); + set_static_province_modifier(infrastructure); + + + ret &= expect_dictionary_key_map_and_default(key_map, key_value_invalid_callback)(root); + + if (ret) { + bad_debtor = modifier_manager.get_event_modifier_by_identifier(bad_debtor_id); + in_bankruptcy = modifier_manager.get_event_modifier_by_identifier(in_bankruptcy_id); + generalised_debt_default = modifier_manager.get_event_modifier_by_identifier(generalised_debt_default_id); + total_occupation *= 100; + } return ret; } |