aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation/pop
diff options
context:
space:
mode:
Diffstat (limited to 'src/openvic-simulation/pop')
-rw-r--r--src/openvic-simulation/pop/Pop.cpp84
-rw-r--r--src/openvic-simulation/pop/Pop.hpp21
2 files changed, 104 insertions, 1 deletions
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 =
+ []<typename T, std::derived_from<T> U>(
+ fixed_point_map_t<T const*>& 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<Ideology const*> PROPERTY(ideologies);
+ fixed_point_map_t<Issue const*> PROPERTY(issues);
+ fixed_point_map_t<CountryParty const*> 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 {