aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author hop311 <hop3114@gmail.com>2023-12-13 23:05:43 +0100
committer hop311 <hop3114@gmail.com>2023-12-13 23:09:20 +0100
commit35e07b57aed9177be1bfeb7732ed8f17c71f2354 (patch)
treeb23cb0f222167fb0a095fa4a8b9408caf1657da8
parent2e4110b26281605dde3e10f2183572d22bf773fc (diff)
Made pop type strata moddable
-rw-r--r--src/openvic-simulation/dataloader/Dataloader.cpp21
-rw-r--r--src/openvic-simulation/dataloader/Dataloader.hpp6
-rw-r--r--src/openvic-simulation/misc/Modifier.cpp15
-rw-r--r--src/openvic-simulation/pop/Pop.cpp66
-rw-r--r--src/openvic-simulation/pop/Pop.hpp24
5 files changed, 89 insertions, 43 deletions
diff --git a/src/openvic-simulation/dataloader/Dataloader.cpp b/src/openvic-simulation/dataloader/Dataloader.cpp
index 4687925..c23a09b 100644
--- a/src/openvic-simulation/dataloader/Dataloader.cpp
+++ b/src/openvic-simulation/dataloader/Dataloader.cpp
@@ -303,19 +303,25 @@ bool Dataloader::_load_interface_files(UIManager& ui_manager) const {
return ret;
}
-bool Dataloader::_load_pop_types(
- PopManager& pop_manager, UnitManager const& unit_manager, GoodManager const& good_manager
-) const {
+bool Dataloader::_load_pop_types(GameManager& game_manager) const {
+ PopManager& pop_manager = game_manager.get_pop_manager();
+ UnitManager const& unit_manager = game_manager.get_military_manager().get_unit_manager();
+ GoodManager const& good_manager = game_manager.get_economy_manager().get_good_manager();
+
static constexpr std::string_view pop_type_directory = "poptypes";
- const bool ret = apply_to_files(
- lookup_files_in_dir(pop_type_directory, ".txt"),
+ const path_vector_t pop_type_files = lookup_files_in_dir(pop_type_directory, ".txt");
+ pop_manager.reserve_pop_types(pop_type_files.size());
+ bool ret = apply_to_files(
+ pop_type_files,
[&pop_manager, &unit_manager, &good_manager](fs::path const& file) -> bool {
return pop_manager.load_pop_type_file(
file.stem().string(), unit_manager, good_manager, parse_defines(file).get_file_node()
);
}
);
+ pop_manager.lock_stratas();
pop_manager.lock_pop_types();
+ ret &= pop_manager.generate_modifiers(game_manager.get_modifier_manager());
return ret;
}
@@ -726,10 +732,7 @@ bool Dataloader::load_defines(GameManager& game_manager) const {
Logger::error("Failed to load units!");
ret = false;
}
- if (!_load_pop_types(
- game_manager.get_pop_manager(), game_manager.get_military_manager().get_unit_manager(),
- game_manager.get_economy_manager().get_good_manager()
- )) {
+ if (!_load_pop_types(game_manager)) {
Logger::error("Failed to load pop types!");
ret = false;
}
diff --git a/src/openvic-simulation/dataloader/Dataloader.hpp b/src/openvic-simulation/dataloader/Dataloader.hpp
index 3512e59..107c93a 100644
--- a/src/openvic-simulation/dataloader/Dataloader.hpp
+++ b/src/openvic-simulation/dataloader/Dataloader.hpp
@@ -11,10 +11,6 @@ namespace OpenVic {
struct GameManager;
class UIManager;
- struct PopManager;
- struct UnitManager;
- struct GoodManager;
- struct EventManager;
class Dataloader {
public:
@@ -24,7 +20,7 @@ namespace OpenVic {
path_vector_t roots;
bool _load_interface_files(UIManager& ui_manager) const;
- bool _load_pop_types(PopManager& pop_manager, UnitManager const& unit_manager, GoodManager const& good_manager) const;
+ bool _load_pop_types(GameManager& game_manager) const;
bool _load_units(GameManager& game_manager) const;
bool _load_goods(GameManager& game_manager) const;
bool _load_rebel_types(GameManager& game_manager) const;
diff --git a/src/openvic-simulation/misc/Modifier.cpp b/src/openvic-simulation/misc/Modifier.cpp
index ac052c2..2e9232b 100644
--- a/src/openvic-simulation/misc/Modifier.cpp
+++ b/src/openvic-simulation/misc/Modifier.cpp
@@ -132,11 +132,6 @@ bool ModifierManager::setup_modifier_effects() {
ret &= add_modifier_effect("max_tariff", true);
ret &= add_modifier_effect("max_tax", true);
ret &= add_modifier_effect("max_war_exhaustion", true, PERCENTAGE_DECIMAL);
- ret &= add_modifier_effect("middle_income_modifier", true);
- ret &= add_modifier_effect("middle_life_needs", true);
- ret &= add_modifier_effect("middle_everyday_needs", true);
- ret &= add_modifier_effect("middle_luxury_needs", true);
- ret &= add_modifier_effect("middle_vote", true);
ret &= add_modifier_effect("min_military_spending", true);
ret &= add_modifier_effect("min_social_spending", true);
ret &= add_modifier_effect("min_tariff", true);
@@ -150,11 +145,6 @@ bool ModifierManager::setup_modifier_effects() {
ret &= add_modifier_effect("non_accepted_pop_militancy_modifier", false, RAW_DECIMAL);
ret &= add_modifier_effect("org_regain", true);
ret &= add_modifier_effect("political_reform_desire", false);
- ret &= add_modifier_effect("poor_income_modifier", true);
- ret &= add_modifier_effect("poor_life_needs", true);
- ret &= add_modifier_effect("poor_everyday_needs", true);
- ret &= add_modifier_effect("poor_luxury_needs", true);
- ret &= add_modifier_effect("poor_vote", true);
ret &= add_modifier_effect("prestige", true, RAW_DECIMAL);
ret &= add_modifier_effect("research_points", true, RAW_DECIMAL);
ret &= add_modifier_effect("research_points_modifier", true);
@@ -163,11 +153,6 @@ bool ModifierManager::setup_modifier_effects() {
ret &= add_modifier_effect("RGO_output", true);
ret &= add_modifier_effect("rgo_throughput", true);
ret &= add_modifier_effect("RGO_throughput", true);
- ret &= add_modifier_effect("rich_income_modifier", true);
- ret &= add_modifier_effect("rich_life_needs", true);
- ret &= add_modifier_effect("rich_everyday_needs", true);
- ret &= add_modifier_effect("rich_luxury_needs", true);
- ret &= add_modifier_effect("rich_vote", true);
ret &= add_modifier_effect("ruling_party_support", true);
ret &= add_modifier_effect("social_reform_desire", false);
ret &= add_modifier_effect("supply_consumption", false);
diff --git a/src/openvic-simulation/pop/Pop.cpp b/src/openvic-simulation/pop/Pop.cpp
index 2d85dce..88ea69a 100644
--- a/src/openvic-simulation/pop/Pop.cpp
+++ b/src/openvic-simulation/pop/Pop.cpp
@@ -23,8 +23,10 @@ Pop::pop_size_t Pop::get_pop_daily_change() const {
return Pop::get_num_promoted() - (Pop::get_num_demoted() + Pop::get_num_migrated());
}
+Strata::Strata(std::string_view new_identifier) : HasIdentifier { new_identifier } {}
+
PopType::PopType(
- std::string_view new_identifier, colour_t new_colour, strata_t new_strata, sprite_t new_sprite,
+ std::string_view new_identifier, colour_t new_colour, Strata const& new_strata, sprite_t new_sprite,
Good::good_map_t&& new_life_needs, Good::good_map_t&& new_everyday_needs, Good::good_map_t&& new_luxury_needs,
rebel_units_t&& new_rebel_units, Pop::pop_size_t new_max_size, Pop::pop_size_t new_merge_max_size,
bool new_state_capital_only, bool new_demote_migrant, bool new_is_artisan, bool new_allowed_to_vote, bool new_is_slave,
@@ -46,8 +48,16 @@ PopType::PopType(
PopManager::PopManager() : slave_sprite { 0 }, administrative_sprite { 0 } {}
+bool PopManager::add_strata(std::string_view identifier) {
+ if (identifier.empty()) {
+ Logger::error("Invalid strata identifier - empty!");
+ return false;
+ }
+ return stratas.add_item({ identifier });
+}
+
bool PopManager::add_pop_type(
- std::string_view identifier, colour_t colour, PopType::strata_t strata, PopType::sprite_t sprite,
+ std::string_view identifier, colour_t colour, Strata const* strata, PopType::sprite_t sprite,
Good::good_map_t&& life_needs, Good::good_map_t&& everyday_needs, Good::good_map_t&& luxury_needs,
PopType::rebel_units_t&& rebel_units, Pop::pop_size_t max_size, Pop::pop_size_t merge_max_size, bool state_capital_only,
bool demote_migrant, bool is_artisan, bool allowed_to_vote, bool is_slave, bool can_be_recruited,
@@ -62,6 +72,10 @@ bool PopManager::add_pop_type(
Logger::error("Invalid pop type colour for ", identifier, ": ", colour_to_hex_string(colour));
return false;
}
+ if (strata == nullptr) {
+ Logger::error("Invalid pop type strata for ", identifier, " - null!");
+ return false;
+ }
if (sprite <= 0) {
Logger::error("Invalid pop type sprite index for ", identifier, ": ", sprite);
return false;
@@ -75,7 +89,7 @@ bool PopManager::add_pop_type(
return false;
}
const bool ret = pop_types.add_item({
- identifier, colour, strata, sprite, std::move(life_needs), std::move(everyday_needs),
+ identifier, colour, *strata, sprite, std::move(life_needs), std::move(everyday_needs),
std::move(luxury_needs), std::move(rebel_units), max_size, merge_max_size, state_capital_only,
demote_migrant, is_artisan, allowed_to_vote, is_slave, can_be_recruited, can_reduce_consciousness,
administrative_efficiency, can_build, factory, can_work_factory, unemployment
@@ -91,20 +105,19 @@ bool PopManager::add_pop_type(
return ret;
}
+void PopManager::reserve_pop_types(size_t count) {
+ stratas.reserve(stratas.size() + count);
+ pop_types.reserve(pop_types.size() + count);
+}
+
/* REQUIREMENTS:
* POP-3, POP-4, POP-5, POP-6, POP-7, POP-8, POP-9, POP-10, POP-11, POP-12, POP-13, POP-14
*/
bool PopManager::load_pop_type_file(
std::string_view filestem, UnitManager const& unit_manager, GoodManager const& good_manager, ast::NodeCPtr root
) {
- static const string_map_t<PopType::strata_t> strata_map = {
- { "poor", PopType::strata_t::POOR },
- { "middle", PopType::strata_t::MIDDLE },
- { "rich", PopType::strata_t::RICH }
- };
-
colour_t colour = NULL_COLOUR;
- PopType::strata_t strata = PopType::strata_t::POOR;
+ Strata const* strata = nullptr;
PopType::sprite_t sprite = 0;
Good::good_map_t life_needs, everyday_needs, luxury_needs;
PopType::rebel_units_t rebel_units;
@@ -118,7 +131,19 @@ bool PopManager::load_pop_type_file(
"is_artisan", ZERO_OR_ONE, expect_bool(assign_variable_callback(is_artisan)),
"max_size", ZERO_OR_ONE, expect_uint(assign_variable_callback(max_size)),
"merge_max_size", ZERO_OR_ONE, expect_uint(assign_variable_callback(merge_max_size)),
- "strata", ONE_EXACTLY, expect_identifier(expect_mapped_string(strata_map, assign_variable_callback(strata))),
+ "strata", ONE_EXACTLY, expect_identifier(
+ [this, &strata](std::string_view identifier) -> bool {
+ strata = get_strata_by_identifier(identifier);
+ if (strata != nullptr) {
+ return true;
+ }
+ if (add_strata(identifier)) {
+ strata = &get_stratas().back();
+ return true;
+ }
+ return false;
+ }
+ ),
"state_capital_only", ZERO_OR_ONE, expect_bool(assign_variable_callback(state_capital_only)),
"research_points", ZERO_OR_ONE, success_callback, // TODO - research points generation
"research_optimum", ZERO_OR_ONE, success_callback, // TODO - bonus research points generation
@@ -193,3 +218,22 @@ bool PopManager::load_pop_into_vector(
}
return ret;
}
+
+#define STRATA_MODIFIER(name, positive_good) \
+ ret &= modifier_manager.add_modifier_effect(StringUtils::append_string_views(strata.get_identifier(), name), positive_good)
+
+bool PopManager::generate_modifiers(ModifierManager& modifier_manager) {
+ bool ret = true;
+ for (Strata const& strata : get_stratas()) {
+ STRATA_MODIFIER("_income_modifier", true);
+ STRATA_MODIFIER("_savings_modifier", true);
+ STRATA_MODIFIER("_vote", true);
+
+ STRATA_MODIFIER("_life_needs", false);
+ STRATA_MODIFIER("_everyday_needs", false);
+ STRATA_MODIFIER("_luxury_needs", false);
+ }
+ return ret;
+}
+
+#undef STRATA_MODIFIER
diff --git a/src/openvic-simulation/pop/Pop.hpp b/src/openvic-simulation/pop/Pop.hpp
index 6302a58..3d52362 100644
--- a/src/openvic-simulation/pop/Pop.hpp
+++ b/src/openvic-simulation/pop/Pop.hpp
@@ -47,6 +47,16 @@ namespace OpenVic {
pop_size_t get_pop_daily_change() const;
};
+ struct Strata : HasIdentifier {
+ friend struct PopManager;
+
+ private:
+ Strata(std::string_view new_identifier);
+
+ public:
+ Strata(Strata&&) = default;
+ };
+
/* REQUIREMENTS:
* POP-15, POP-16, POP-17, POP-26
*/
@@ -57,7 +67,7 @@ namespace OpenVic {
using rebel_units_t = fixed_point_map_t<Unit const*>;
private:
- const enum class strata_t { POOR, MIDDLE, RICH } PROPERTY(strata);
+ Strata const& PROPERTY(strata);
const sprite_t PROPERTY(sprite);
const Good::good_map_t PROPERTY(life_needs);
const Good::good_map_t PROPERTY(everyday_needs);
@@ -81,7 +91,7 @@ namespace OpenVic {
// TODO - country and province migration targets, promote_to targets, ideologies and issues
PopType(
- std::string_view new_identifier, colour_t new_colour, strata_t new_strata, sprite_t new_sprite,
+ std::string_view new_identifier, colour_t new_colour, Strata const& new_strata, sprite_t new_sprite,
Good::good_map_t&& new_life_needs, Good::good_map_t&& new_everyday_needs, Good::good_map_t&& new_luxury_needs,
rebel_units_t&& new_rebel_units, Pop::pop_size_t new_max_size, Pop::pop_size_t new_merge_max_size,
bool new_state_capital_only, bool new_demote_migrant, bool new_is_artisan, bool new_allowed_to_vote,
@@ -98,6 +108,8 @@ namespace OpenVic {
struct PopManager {
private:
+ /* Using strata/stratas instead of stratum/strata to avoid confusion. */
+ IdentifierRegistry<Strata> IDENTIFIER_REGISTRY(strata);
IdentifierRegistry<PopType> IDENTIFIER_REGISTRY(pop_type);
PopType::sprite_t PROPERTY(slave_sprite);
PopType::sprite_t PROPERTY(administrative_sprite);
@@ -108,8 +120,10 @@ namespace OpenVic {
public:
PopManager();
+ bool add_strata(std::string_view identifier);
+
bool add_pop_type(
- std::string_view identifier, colour_t new_colour, PopType::strata_t strata, PopType::sprite_t sprite,
+ std::string_view identifier, colour_t new_colour, Strata const* strata, PopType::sprite_t sprite,
Good::good_map_t&& life_needs, Good::good_map_t&& everyday_needs, Good::good_map_t&& luxury_needs,
PopType::rebel_units_t&& rebel_units, Pop::pop_size_t max_size, Pop::pop_size_t merge_max_size,
bool state_capital_only, bool demote_migrant, bool is_artisan, bool allowed_to_vote, bool is_slave,
@@ -117,6 +131,8 @@ namespace OpenVic {
bool can_work_factory, bool unemployment
);
+ void reserve_pop_types(size_t count);
+
bool load_pop_type_file(
std::string_view filestem, UnitManager const& unit_manager, GoodManager const& good_manager, ast::NodeCPtr root
);
@@ -124,5 +140,7 @@ namespace OpenVic {
RebelManager const& rebel_manager, std::vector<Pop>& vec, PopType const& type, ast::NodeCPtr pop_node,
bool *non_integer_size
) const;
+
+ bool generate_modifiers(ModifierManager& modifier_manager);
};
}