diff options
Diffstat (limited to 'src/openvic-simulation/history/CountryHistory.cpp')
-rw-r--r-- | src/openvic-simulation/history/CountryHistory.cpp | 168 |
1 files changed, 117 insertions, 51 deletions
diff --git a/src/openvic-simulation/history/CountryHistory.cpp b/src/openvic-simulation/history/CountryHistory.cpp index 5e91a85..9ed271b 100644 --- a/src/openvic-simulation/history/CountryHistory.cpp +++ b/src/openvic-simulation/history/CountryHistory.cpp @@ -20,7 +20,11 @@ CountryHistory::CountryHistory( fixed_point_t new_prestige, std::vector<Reform const*>&& new_reforms, Deployment const* new_inital_oob -) : primary_culture { new_primary_culture }, accepted_cultures { std::move(new_accepted_cultures) }, religion { new_religion }, ruling_party { new_ruling_party }, last_election { new_last_election }, upper_house { std::move(new_upper_house) }, capital { new_capital }, government_type { new_government_type }, plurality { new_plurality }, national_value { new_national_value }, civilised { new_civilised }, prestige { new_prestige }, reforms { std::move(new_reforms) }, inital_oob { new_inital_oob } {} +) : primary_culture { new_primary_culture }, accepted_cultures { std::move(new_accepted_cultures) }, + religion { new_religion }, ruling_party { new_ruling_party }, last_election { new_last_election }, + upper_house { std::move(new_upper_house) }, capital { new_capital }, government_type { new_government_type }, + plurality { new_plurality }, national_value { new_national_value }, civilised { new_civilised }, + prestige { new_prestige }, reforms { std::move(new_reforms) }, inital_oob { new_inital_oob } {} Culture const* CountryHistory::get_primary_culture() const { return primary_culture; @@ -107,22 +111,50 @@ bool CountryHistoryManager::add_country_history_entry( /* combine duplicate histories, priority to current (defined later) */ auto& country_registry = country_histories[country]; const auto existing_entry = country_registry.find(date); - + if (existing_entry != country_registry.end()) { - if (primary_culture != nullptr) existing_entry->second.primary_culture = primary_culture; - if (updated_accepted_cultures) existing_entry->second.accepted_cultures = std::move(accepted_cultures); - if (religion != nullptr) existing_entry->second.religion = religion; - if (ruling_party != nullptr) existing_entry->second.ruling_party = ruling_party; - if (last_election != Date(0)) existing_entry->second.last_election = last_election; - if (updated_upper_house) existing_entry->second.upper_house = std::move(upper_house); - if (capital != nullptr) existing_entry->second.capital = capital; - if (government_type != nullptr) existing_entry->second.government_type = government_type; - if (plurality >= 0) existing_entry->second.plurality = plurality; - if (national_value != nullptr) existing_entry->second.national_value = national_value; - if (civilised) existing_entry->second.civilised = true; - if (prestige >= 0) existing_entry->second.prestige = prestige; - if (updated_reforms) existing_entry->second.reforms = std::move(reforms); - if (initial_oob != nullptr) existing_entry->second.inital_oob = initial_oob; + if (primary_culture != nullptr) { + existing_entry->second.primary_culture = primary_culture; + } + if (updated_accepted_cultures) { + existing_entry->second.accepted_cultures = std::move(accepted_cultures); + } + if (religion != nullptr) { + existing_entry->second.religion = religion; + } + if (ruling_party != nullptr) { + existing_entry->second.ruling_party = ruling_party; + } + if (last_election != Date(0)) { + existing_entry->second.last_election = last_election; + } + if (updated_upper_house) { + existing_entry->second.upper_house = std::move(upper_house); + } + if (capital != nullptr) { + existing_entry->second.capital = capital; + } + if (government_type != nullptr) { + existing_entry->second.government_type = government_type; + } + if (plurality >= 0) { + existing_entry->second.plurality = plurality; + } + if (national_value != nullptr) { + existing_entry->second.national_value = national_value; + } + if (civilised) { + existing_entry->second.civilised = true; + } + if (prestige >= 0) { + existing_entry->second.prestige = prestige; + } + if (updated_reforms) { + existing_entry->second.reforms = std::move(reforms); + } + if (initial_oob != nullptr) { + existing_entry->second.inital_oob = initial_oob; + } } else { country_registry.emplace(date, CountryHistory { primary_culture, @@ -147,7 +179,8 @@ bool CountryHistoryManager::add_country_history_entry( void CountryHistoryManager::lock_country_histories() { for (const auto& entry : country_histories) { if (entry.second.size() == 0) { - Logger::error("Attempted to lock country histories - country ", entry.first->get_identifier(), " has no history entries!"); + Logger::error("Attempted to lock country histories - country ", + entry.first->get_identifier(), " has no history entries!"); } } Logger::info("Locked country history registry after registering ", country_histories.size(), " items"); @@ -166,11 +199,17 @@ CountryHistory const* CountryHistoryManager::get_country_history(Country const* Logger::error("Attempted to access history of undefined country ", country->get_identifier()); return nullptr; } - + for (const auto& current : country_registry->second) { - if (current.first == entry) return ¤t.second; - if (current.first > entry) continue; - if (current.first > closest_entry && current.first < entry) closest_entry = current.first; + if (current.first == entry) { + return ¤t.second; + } + if (current.first > entry) { + continue; + } + if (current.first > closest_entry && current.first < entry) { + closest_entry = current.first; + } } auto entry_registry = country_registry->second.find(closest_entry); @@ -185,7 +224,8 @@ inline CountryHistory const* CountryHistoryManager::get_country_history(Country return get_country_history(country, entry->get_date()); } -inline bool CountryHistoryManager::_load_country_history_entry(GameManager& game_manager, std::string_view name, Date const& date, ast::NodeCPtr root) { +inline bool CountryHistoryManager::_load_country_history_entry(GameManager& game_manager, + std::string_view name, Date const& date, ast::NodeCPtr root) { Province const* capital = nullptr; Culture const* primary_culture = nullptr; Religion const* religion = nullptr; @@ -209,7 +249,8 @@ inline bool CountryHistoryManager::_load_country_history_entry(GameManager& game Reform const* reform; - bool ret = game_manager.get_politics_manager().get_issue_manager().expect_reform_identifier(assign_variable_callback_pointer(reform))(value); + bool ret = game_manager.get_politics_manager().get_issue_manager() + .expect_reform_identifier(assign_variable_callback_pointer(reform))(value); if (std::find(reforms.begin(), reforms.end(), reform) != reforms.end()) { Logger::error("Redefinition of reform ", reform->get_identifier(), " in history of ", name); return false; @@ -221,24 +262,32 @@ inline bool CountryHistoryManager::_load_country_history_entry(GameManager& game // TODO: technologies & inventions return true; }, - /* we have to use a lambda, assign_variable_callback_pointer apparently doesn't play nice with const & non-const accessors */ + /* we have to use a lambda, assign_variable_callback_pointer + * apparently doesn't play nice with const & non-const accessors */ "capital", ZERO_OR_ONE, game_manager.get_map().expect_province_identifier([&capital](Province const& province) -> bool { capital = &province; return true; }), - "primary_culture", ZERO_OR_ONE, game_manager.get_pop_manager().get_culture_manager().expect_culture_identifier(assign_variable_callback_pointer(primary_culture)), - "culture", ZERO_OR_MORE, game_manager.get_pop_manager().get_culture_manager().expect_culture_identifier([&game_manager, &accepted_cultures, &updated_accepted_cultures](Culture const& culture) -> bool { - updated_accepted_cultures = true; - accepted_cultures.push_back(&culture); - return true; - }), - "religion", ZERO_OR_ONE, game_manager.get_pop_manager().get_religion_manager().expect_religion_identifier(assign_variable_callback_pointer(religion)), - "government", ZERO_OR_ONE, game_manager.get_politics_manager().get_government_type_manager().expect_government_type_identifier(assign_variable_callback_pointer(government_type)), + "primary_culture", ZERO_OR_ONE, game_manager.get_pop_manager().get_culture_manager() + .expect_culture_identifier(assign_variable_callback_pointer(primary_culture)), + "culture", ZERO_OR_MORE, game_manager.get_pop_manager().get_culture_manager().expect_culture_identifier( + [&game_manager, &accepted_cultures, &updated_accepted_cultures](Culture const & culture) -> bool { + updated_accepted_cultures = true; + accepted_cultures.push_back(&culture); + return true; + } + ), + "religion", ZERO_OR_ONE, game_manager.get_pop_manager().get_religion_manager() + .expect_religion_identifier(assign_variable_callback_pointer(religion)), + "government", ZERO_OR_ONE, game_manager.get_politics_manager().get_government_type_manager() + .expect_government_type_identifier(assign_variable_callback_pointer(government_type)), "plurality", ZERO_OR_ONE, expect_fixed_point(assign_variable_callback(plurality)), - "nationalvalue", ZERO_OR_ONE, game_manager.get_politics_manager().get_national_value_manager().expect_national_value_identifier(assign_variable_callback_pointer(national_value)), + "nationalvalue", ZERO_OR_ONE, game_manager.get_politics_manager().get_national_value_manager() + .expect_national_value_identifier(assign_variable_callback_pointer(national_value)), "civilized", ZERO_OR_ONE, expect_bool(assign_variable_callback(civilised)), "prestige", ZERO_OR_ONE, expect_fixed_point(assign_variable_callback(prestige)), - "ruling_party", ZERO_OR_ONE, expect_identifier([this, &game_manager, &ruling_party, &name, &date](std::string_view identifier) -> bool { + "ruling_party", ZERO_OR_ONE, expect_identifier([this, &game_manager, + &ruling_party, &name, &date](std::string_view identifier) -> bool { const std::vector<CountryParty>* parties = &game_manager.get_country_manager().get_country_by_identifier(name)->get_parties(); for (auto& party : *parties) { if (party.get_name() == identifier) { @@ -246,8 +295,14 @@ inline bool CountryHistoryManager::_load_country_history_entry(GameManager& game ruling_party = &party; return true; } else { - if (party.get_start_date() > date) Logger::warning("Ruling party ", identifier, " of country ", name, " has invalid start date ", party.get_start_date(), " for bookmark: ", date.to_string()); - if (party.get_end_date() < date) Logger::warning("Ruling party ", identifier, " of country ", name, " has invalid end date ", party.get_end_date(), " for bookmark: ", date.to_string()); + if (party.get_start_date() > date) { + Logger::warning("Ruling party ", identifier, " of country ", name, " has invalid start date ", + party.get_start_date(), " for bookmark: ", date.to_string()); + } + if (party.get_end_date() < date) { + Logger::warning("Ruling party ", identifier, " of country ", name, " has invalid end date ", + party.get_end_date(), " for bookmark: ", date.to_string()); + } ruling_party = &party; return true; } @@ -257,42 +312,52 @@ inline bool CountryHistoryManager::_load_country_history_entry(GameManager& game return false; }), "last_election", ZERO_OR_ONE, expect_date(assign_variable_callback(last_election)), - "upper_house", ZERO_OR_ONE, game_manager.get_politics_manager().get_ideology_manager().expect_ideology_dictionary([&upper_house, &updated_upper_house](Ideology const& ideology, ast::NodeCPtr value) -> bool { - fixed_point_t popularity; + "upper_house", ZERO_OR_ONE, game_manager.get_politics_manager().get_ideology_manager().expect_ideology_dictionary( + [&upper_house, &updated_upper_house](Ideology const& ideology, ast::NodeCPtr value) -> bool { + fixed_point_t popularity; - updated_upper_house = true; - bool ret = expect_fixed_point(assign_variable_callback(popularity))(value); - upper_house.emplace(&ideology, popularity); - return ret; - }), + updated_upper_house = true; + bool ret = expect_fixed_point(assign_variable_callback(popularity))(value); + upper_house.emplace(&ideology, popularity); + return ret; + } + ), "oob", ZERO_OR_ONE, [&game_manager, &initial_oob](ast::NodeCPtr node) -> bool { std::string_view string; expect_string(assign_variable_callback(string))(node); if (string.starts_with('/')) { - if (game_manager.get_military_manager().get_deployment_manager().has_deployment_identifier(string.substr(1))) { - initial_oob = game_manager.get_military_manager().get_deployment_manager().get_deployment_by_identifier(string.substr(1)); + if (game_manager.get_military_manager().get_deployment_manager() + .has_deployment_identifier(string.substr(1))) { + initial_oob = game_manager.get_military_manager().get_deployment_manager() + .get_deployment_by_identifier(string.substr(1)); return true; } } else { if (game_manager.get_military_manager().get_deployment_manager().has_deployment_identifier(string)) { - initial_oob = game_manager.get_military_manager().get_deployment_manager().get_deployment_by_identifier(string); + initial_oob = game_manager.get_military_manager().get_deployment_manager() + .get_deployment_by_identifier(string); } } initial_oob = game_manager.get_military_manager().get_deployment_manager().get_deployment_by_identifier("NULL"); return true; }, - "schools", ZERO_OR_ONE, success_callback, // TODO: technology school + "schools", ZERO_OR_ONE, success_callback, // TODO: technology school "foreign_investment", ZERO_OR_ONE, success_callback // TODO: foreign investment )(root); - ret &= add_country_history_entry(game_manager.get_country_manager().get_country_by_identifier(name), date, primary_culture, std::move(accepted_cultures), religion, ruling_party, last_election, std::move(upper_house), capital, government_type, plurality, national_value, civilised, prestige, std::move(reforms), initial_oob, updated_accepted_cultures, updated_upper_house, updated_reforms); + ret &= add_country_history_entry(game_manager.get_country_manager().get_country_by_identifier(name), date, + primary_culture, std::move(accepted_cultures), religion, ruling_party, last_election, std::move(upper_house), + capital, government_type, plurality, national_value, civilised, prestige, std::move(reforms), initial_oob, + updated_accepted_cultures, updated_upper_house, updated_reforms); return ret; } bool CountryHistoryManager::load_country_history_file(GameManager& game_manager, std::string_view name, ast::NodeCPtr root) { - if (game_manager.get_country_manager().get_country_by_identifier(name)->is_dynamic_tag()) return true; /* as far as I can tell dynamic countries are hardcoded, broken, and unused */ + if (game_manager.get_country_manager().get_country_by_identifier(name)->is_dynamic_tag()) { + return true; /* as far as I can tell dynamic countries are hardcoded, broken, and unused */ + } bool ret = _load_country_history_entry(game_manager, name, game_manager.get_define_manager().get_start_date(), root); @@ -304,10 +369,11 @@ bool CountryHistoryManager::load_country_history_file(GameManager& game_manager, Date const& end_date = game_manager.get_define_manager().get_end_date(); if (entry > end_date) { - Logger::error("History entry ", entry.to_string(), " of country ", name, " defined after defined end date ", end_date.to_string()); + Logger::error("History entry ", entry.to_string(), " of country ", name, + " defined after defined end date ", end_date.to_string()); return false; } - + return _load_country_history_entry(game_manager, name, entry, value); } )(root); |