From 6a99bd8237fa61bd740ba482b59ff428a7e2f123 Mon Sep 17 00:00:00 2001 From: hop311 Date: Tue, 19 Mar 2024 23:23:58 +0000 Subject: Add Pop attributes + generate test values --- src/openvic-simulation/GameManager.cpp | 5 +- src/openvic-simulation/map/Map.cpp | 13 ++++- src/openvic-simulation/map/Map.hpp | 5 +- src/openvic-simulation/map/Province.cpp | 19 ++++++-- src/openvic-simulation/map/Province.hpp | 6 +++ src/openvic-simulation/pop/Pop.cpp | 84 ++++++++++++++++++++++++++++++++- src/openvic-simulation/pop/Pop.hpp | 21 +++++++++ 7 files changed, 146 insertions(+), 7 deletions(-) (limited to 'src/openvic-simulation') diff --git a/src/openvic-simulation/GameManager.cpp b/src/openvic-simulation/GameManager.cpp index a4cb5f4..bb807c9 100644 --- a/src/openvic-simulation/GameManager.cpp +++ b/src/openvic-simulation/GameManager.cpp @@ -63,7 +63,10 @@ bool GameManager::load_bookmark(Bookmark const* new_bookmark) { Logger::warning("Bookmark date ", bookmark->get_date(), " is not in the game's time period!"); } today = bookmark->get_date(); - ret &= map.apply_history_to_provinces(history_manager.get_province_manager(), today); + ret &= map.apply_history_to_provinces( + history_manager.get_province_manager(), today, politics_manager.get_ideology_manager(), + politics_manager.get_issue_manager(), *country_manager.get_country_by_identifier("ENG") + ); map.get_state_manager().generate_states(map); // TODO - apply country history return ret; diff --git a/src/openvic-simulation/map/Map.cpp b/src/openvic-simulation/map/Map.cpp index f87246f..81a599e 100644 --- a/src/openvic-simulation/map/Map.cpp +++ b/src/openvic-simulation/map/Map.cpp @@ -446,25 +446,36 @@ bool Map::reset(BuildingTypeManager const& building_type_manager) { return ret; } -bool Map::apply_history_to_provinces(ProvinceHistoryManager const& history_manager, Date date) { +bool Map::apply_history_to_provinces( + ProvinceHistoryManager const& history_manager, Date date, IdeologyManager const& ideology_manager, + IssueManager const& issue_manager, Country const& country +) { bool ret = true; + for (Province& province : provinces.get_items()) { if (!province.is_water()) { ProvinceHistoryMap const* history_map = history_manager.get_province_history(&province); + if (history_map != nullptr) { ProvinceHistoryEntry const* pop_history_entry = nullptr; + for (ProvinceHistoryEntry const* entry : history_map->get_entries_up_to(date)) { province.apply_history_to_province(entry); + if (!entry->get_pops().empty()) { pop_history_entry = entry; } } + if (pop_history_entry != nullptr) { province.add_pop_vec(pop_history_entry->get_pops()); + + province.setup_pop_test_values(ideology_manager, issue_manager, country); } } } } + return ret; } diff --git a/src/openvic-simulation/map/Map.hpp b/src/openvic-simulation/map/Map.hpp index e2c4bd6..807945a 100644 --- a/src/openvic-simulation/map/Map.hpp +++ b/src/openvic-simulation/map/Map.hpp @@ -128,7 +128,10 @@ namespace OpenVic { bool generate_mapmode_colours(Mapmode::index_t index, uint8_t* target) const; bool reset(BuildingTypeManager const& building_type_manager); - bool apply_history_to_provinces(ProvinceHistoryManager const& history_manager, Date date); + bool apply_history_to_provinces( + ProvinceHistoryManager const& history_manager, Date date, IdeologyManager const& ideology_manager, + IssueManager const& issue_manager, Country const& country + ); void update_highest_province_population(); void update_total_map_population(); diff --git a/src/openvic-simulation/map/Province.cpp b/src/openvic-simulation/map/Province.cpp index 94c8dcb..d1183f5 100644 --- a/src/openvic-simulation/map/Province.cpp +++ b/src/openvic-simulation/map/Province.cpp @@ -65,9 +65,14 @@ bool Province::expand_building(size_t building_index) { return building->expand(); } +void Province::_add_pop(Pop pop) { + pop.set_location(this); + pops.push_back(std::move(pop)); +} + bool Province::add_pop(Pop&& pop) { if (!is_water()) { - pops.push_back(std::move(pop)); + _add_pop(std::move(pop)); return true; } else { Logger::error("Trying to add pop to water province ", get_identifier()); @@ -79,7 +84,7 @@ bool Province::add_pop_vec(std::vector const& pop_vec) { if (!is_water()) { reserve_more(pops, pop_vec.size()); for (Pop const& pop : pop_vec) { - pops.push_back(pop); + _add_pop(pop); } return true; } else { @@ -104,7 +109,7 @@ void Province::update_pops() { for (Pop const& pop : pops) { total_population += pop.get_size(); pop_type_distribution[&pop.get_type()] += pop.get_size(); - //ideology_distribution[&pop.get_???()] += pop.get_size(); + ideology_distribution += pop.get_ideologies(); culture_distribution[&pop.get_culture()] += pop.get_size(); religion_distribution[&pop.get_religion()] += pop.get_size(); } @@ -257,3 +262,11 @@ bool Province::apply_history_to_province(ProvinceHistoryEntry const* entry) { // TODO: party loyalties for each POP when implemented on POP side return ret; } + +void Province::setup_pop_test_values( + IdeologyManager const& ideology_manager, IssueManager const& issue_manager, Country const& country +) { + for (Pop& pop : pops) { + pop.setup_pop_test_values(ideology_manager, issue_manager, country); + } +} diff --git a/src/openvic-simulation/map/Province.hpp b/src/openvic-simulation/map/Province.hpp index 1df5676..476ecc9 100644 --- a/src/openvic-simulation/map/Province.hpp +++ b/src/openvic-simulation/map/Province.hpp @@ -128,6 +128,8 @@ namespace OpenVic { Province(std::string_view new_identifier, colour_t new_colour, index_t new_index); + void _add_pop(Pop pop); + public: Province(Province&&) = default; @@ -155,5 +157,9 @@ namespace OpenVic { bool reset(BuildingTypeManager const& building_type_manager); bool apply_history_to_province(ProvinceHistoryEntry const* entry); + + void setup_pop_test_values( + IdeologyManager const& ideology_manager, IssueManager const& issue_manager, Country const& country + ); }; } diff --git a/src/openvic-simulation/pop/Pop.cpp b/src/openvic-simulation/pop/Pop.cpp index 21aede8..2490ef9 100644 --- a/src/openvic-simulation/pop/Pop.cpp +++ b/src/openvic-simulation/pop/Pop.cpp @@ -1,5 +1,6 @@ #include "Pop.hpp" +#include "openvic-simulation/country/Country.hpp" #include "openvic-simulation/military/UnitType.hpp" #include "openvic-simulation/politics/Ideology.hpp" #include "openvic-simulation/politics/Issue.hpp" @@ -23,6 +24,8 @@ Pop::Pop( culture { new_culture }, religion { new_religion }, size { new_size }, + location { nullptr }, + total_change { 0 }, num_grown { 0 }, num_promoted { 0 }, num_demoted { 0 }, @@ -31,10 +34,89 @@ Pop::Pop( num_migrated_colonial { 0 }, militancy { new_militancy }, consciousness { new_consciousness }, - rebel_type { new_rebel_type } { + rebel_type { new_rebel_type }, + ideologies {}, + issues {}, + votes {}, + unemployment { 0 }, + cash { 0 }, + income { 0 }, + expenses { 0 }, + savings { 0 }, + life_needs_fulfilled { 0 }, + everyday_needs_fulfilled { 0 }, + luxury_needs_fulfilled { 0 } { assert(size > 0); } +void Pop::setup_pop_test_values( + IdeologyManager const& ideology_manager, IssueManager const& issue_manager, Country const& country +) { + /* Returns +/- range% of size. */ + const auto test_size = [this](int32_t range) -> pop_size_t { + return size * ((rand() % (2 * range + 1)) - range) / 100; + }; + + num_grown = test_size(5); + num_promoted = test_size(1); + num_demoted = test_size(1); + num_migrated_internal = test_size(3); + num_migrated_external = test_size(1); + num_migrated_colonial = test_size(2); + + total_change = + num_grown + num_promoted + num_demoted + num_migrated_internal + num_migrated_external + num_migrated_colonial; + + /* Generates a number between 0 and max (inclusive) and sets map[&key] to it if it's at least min. */ + auto test_weight = + [] U>( + fixed_point_map_t& map, U const& key, int32_t min, int32_t max + ) -> void { + const int32_t value = rand() % (max + 1); + if (value >= min) { + map.emplace(&key, value); + } + }; + + /* All entries equally weighted for testing. */ + ideologies.clear(); + for (Ideology const& ideology : ideology_manager.get_ideologies()) { + test_weight(ideologies, ideology, 1, 5); + } + normalise_fixed_point_map(ideologies); + + issues.clear(); + for (Issue const& issue : issue_manager.get_issues()) { + test_weight(issues, issue, 3, 6); + } + for (Reform const& reform : issue_manager.get_reforms()) { + if (!reform.get_reform_group().get_type().is_uncivilised()) { + test_weight(issues, reform, 3, 6); + } + } + normalise_fixed_point_map(issues); + + votes.clear(); + for (CountryParty const& party : country.get_parties()) { + test_weight(votes, party, 4, 10); + } + normalise_fixed_point_map(votes); + + /* Returns a fixed point between 0 and max. */ + const auto test_range = [](fixed_point_t max = 1) -> fixed_point_t { + return (rand() % 256) * max / 256; + }; + + unemployment = test_range(); + cash = test_range(20); + income = test_range(5); + expenses = test_range(5); + savings = test_range(15); + life_needs_fulfilled = test_range(); + everyday_needs_fulfilled = test_range(); + luxury_needs_fulfilled = test_range(); +} + Strata::Strata(std::string_view new_identifier) : HasIdentifier { new_identifier } {} PopType::PopType( diff --git a/src/openvic-simulation/pop/Pop.hpp b/src/openvic-simulation/pop/Pop.hpp index c4e369f..fe1867f 100644 --- a/src/openvic-simulation/pop/Pop.hpp +++ b/src/openvic-simulation/pop/Pop.hpp @@ -23,6 +23,8 @@ namespace OpenVic { struct IdeologyManager; struct Issue; struct IssueManager; + struct Province; + struct CountryParty; /* REQUIREMENTS: * POP-18, POP-19, POP-20, POP-21, POP-34, POP-35, POP-36, POP-37 @@ -39,8 +41,10 @@ namespace OpenVic { Culture const& PROPERTY(culture); Religion const& PROPERTY(religion); pop_size_t PROPERTY(size); + Province const* PROPERTY_RW(location); /* Last day's size change by source. */ + pop_size_t PROPERTY(total_change); pop_size_t PROPERTY(num_grown); pop_size_t PROPERTY(num_promoted); // TODO - detailed promotion/demotion info (what to) pop_size_t PROPERTY(num_demoted); @@ -53,6 +57,19 @@ namespace OpenVic { fixed_point_t PROPERTY(literacy); RebelType const* PROPERTY(rebel_type); + fixed_point_map_t PROPERTY(ideologies); + fixed_point_map_t PROPERTY(issues); + fixed_point_map_t PROPERTY(votes); + + fixed_point_t PROPERTY(unemployment); + fixed_point_t PROPERTY(cash); + fixed_point_t PROPERTY(income); + fixed_point_t PROPERTY(expenses); + fixed_point_t PROPERTY(savings); + fixed_point_t PROPERTY(life_needs_fulfilled); + fixed_point_t PROPERTY(everyday_needs_fulfilled); + fixed_point_t PROPERTY(luxury_needs_fulfilled); + Pop( PopType const& new_type, Culture const& new_culture, @@ -68,6 +85,10 @@ namespace OpenVic { Pop(Pop&&) = default; Pop& operator=(Pop const&) = delete; Pop& operator=(Pop&&) = delete; + + void setup_pop_test_values( + IdeologyManager const& ideology_manager, IssueManager const& issue_manager, Country const& country + ); }; struct Strata : HasIdentifier { -- cgit v1.2.3-56-ga3b1