aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation/politics
diff options
context:
space:
mode:
author BrickPi <49528459+BrickPi@users.noreply.github.com>2023-11-15 19:03:02 +0100
committer GitHub <noreply@github.com>2023-11-15 19:03:02 +0100
commita00b558a53edb40c9e6789790036f0b618e80ec1 (patch)
tree1100ec41f85e3030d553a3447c1688467c7a8214 /src/openvic-simulation/politics
parentf572664cbe1aa5ec2cb6907de3083f058c20af7e (diff)
parent4794eeedd9abc1393526a97253bf9d59b5ecd179 (diff)
Merge pull request #76 from OpenVicProject/national-foci
Diffstat (limited to 'src/openvic-simulation/politics')
-rw-r--r--src/openvic-simulation/politics/NationalFocus.cpp118
-rw-r--r--src/openvic-simulation/politics/NationalFocus.hpp76
-rw-r--r--src/openvic-simulation/politics/PoliticsManager.hpp6
3 files changed, 200 insertions, 0 deletions
diff --git a/src/openvic-simulation/politics/NationalFocus.cpp b/src/openvic-simulation/politics/NationalFocus.cpp
new file mode 100644
index 0000000..6f25c3e
--- /dev/null
+++ b/src/openvic-simulation/politics/NationalFocus.cpp
@@ -0,0 +1,118 @@
+#include "NationalFocus.hpp"
+
+#include "openvic-simulation/dataloader/NodeTools.hpp"
+
+using namespace OpenVic;
+using namespace OpenVic::NodeTools;
+
+NationalFocusGroup::NationalFocusGroup(std::string_view new_identifier) : HasIdentifier { new_identifier } {}
+
+NationalFocus::NationalFocus(
+ std::string_view new_identifier,
+ uint8_t new_icon,
+ NationalFocusGroup const& new_group,
+ ModifierValue&& new_modifiers,
+ pop_promotion_map_t&& new_encouraged_promotion,
+ party_loyalty_map_t&& new_encouraged_loyalty,
+ production_map_t&& new_encouraged_production
+) : HasIdentifier { new_identifier },
+ icon { new_icon },
+ group { new_group },
+ modifiers { std::move(new_modifiers) },
+ encouraged_promotion { std::move(new_encouraged_promotion) },
+ encouraged_loyalty { std::move(new_encouraged_loyalty) },
+ encouraged_production { std::move(new_encouraged_production) } {}
+
+NationalFocusManager::NationalFocusManager() : national_focus_groups { "national focus groups" }, national_foci { "national foci" } {}
+
+inline bool NationalFocusManager::add_national_focus_group(std::string_view identifier) {
+ if (identifier.empty()) {
+ Logger::error("No identifier for national focus group!");
+ return false;
+ }
+ return national_focus_groups.add_item({ identifier });
+}
+
+inline bool NationalFocusManager::add_national_focus(
+ std::string_view identifier,
+ uint8_t icon,
+ NationalFocusGroup const& group,
+ ModifierValue&& modifiers,
+ NationalFocus::pop_promotion_map_t&& encouraged_promotion,
+ NationalFocus::party_loyalty_map_t&& encouraged_loyalty,
+ NationalFocus::production_map_t&& encouraged_production
+) {
+ if (identifier.empty()) {
+ Logger::error("No identifier for national focus!");
+ return false;
+ }
+ if (icon < 1) {
+ Logger::error("Invalid icon ", icon, " for national focus ", identifier);
+ return false;
+ }
+ return national_foci.add_item({ identifier, icon, group, std::move(modifiers), std::move(encouraged_promotion), std::move(encouraged_loyalty), std::move(encouraged_production) });
+}
+
+bool NationalFocusManager::load_national_foci_file(PopManager const& pop_manager, IdeologyManager const& ideology_manager, GoodManager const& good_manager, ModifierManager const& modifier_manager, ast::NodeCPtr root) {
+ bool ret = expect_dictionary_reserve_length(national_focus_groups, [this](std::string_view identifier, ast::NodeCPtr node) -> bool {
+ return add_national_focus_group(identifier);
+ })(root);
+ lock_national_focus_groups();
+
+ ret &= expect_national_focus_group_dictionary([this, &pop_manager, &ideology_manager, &good_manager, &modifier_manager](NationalFocusGroup const& group, ast::NodeCPtr node) -> bool {
+ bool ret = expect_dictionary([this, &group, &pop_manager, &ideology_manager, &good_manager, &modifier_manager](std::string_view identifier, ast::NodeCPtr node) -> bool {
+ uint8_t icon;
+ ModifierValue modifiers;
+ NationalFocus::pop_promotion_map_t promotions;
+ NationalFocus::party_loyalty_map_t loyalties;
+ NationalFocus::production_map_t production;
+
+ Ideology const* last_specified_ideology = nullptr; // weird, I know
+
+ bool ret = modifier_manager.expect_modifier_value_and_keys_and_default(
+ move_variable_callback(modifiers),
+ [&promotions, &pop_manager, &production, &good_manager, &modifiers, &modifier_manager](std::string_view key, ast::NodeCPtr value) -> bool {
+ PopType const* pop_type = pop_manager.get_pop_type_by_identifier(key);
+ if (pop_type != nullptr) {
+ fixed_point_t boost;
+ bool ret = expect_fixed_point(assign_variable_callback(boost))(value);
+ promotions[pop_type] = boost;
+ return ret;
+ }
+ Good const* good = good_manager.get_good_by_identifier(key);
+ if (good != nullptr) {
+ fixed_point_t boost;
+ bool ret = expect_fixed_point(assign_variable_callback(boost))(value);
+ production[good] = boost;
+ return ret;
+ }
+ return key_value_invalid_callback(key, value);
+ },
+ "icon", ONE_EXACTLY, expect_uint(assign_variable_callback(icon)),
+ "ideology", ZERO_OR_MORE, ideology_manager.expect_ideology_identifier(assign_variable_callback_pointer(last_specified_ideology)),
+ "loyalty_value", ZERO_OR_MORE, [&identifier, &last_specified_ideology, &loyalties](ast::NodeCPtr value) -> bool {
+ if (last_specified_ideology == nullptr) {
+ Logger::error("In national focus ", identifier, ": No ideology selected for loyalty_value!");
+ return false;
+ }
+ fixed_point_t boost;
+ bool ret = expect_fixed_point(assign_variable_callback(boost))(value);
+ loyalties[last_specified_ideology] += boost;
+ return ret;
+ },
+ "limit", ZERO_OR_ONE, success_callback, // TODO: implement conditions
+ "has_flashpoint", ZERO_OR_ONE, success_callback, // special case, include in limit
+ "own_provinces", ZERO_OR_ONE, success_callback, // special case, include in limit
+ "outliner_show_as_percent", ZERO_OR_ONE, success_callback // special case
+ )(node);
+
+ add_national_focus(identifier, icon, group, std::move(modifiers), std::move(promotions), std::move(loyalties), std::move(production));
+
+ return ret;
+ })(node);
+ return ret;
+ })(root);
+ lock_national_foci();
+
+ return ret;
+}
diff --git a/src/openvic-simulation/politics/NationalFocus.hpp b/src/openvic-simulation/politics/NationalFocus.hpp
new file mode 100644
index 0000000..7c5e40a
--- /dev/null
+++ b/src/openvic-simulation/politics/NationalFocus.hpp
@@ -0,0 +1,76 @@
+#pragma once
+
+#include "openvic-simulation/types/IdentifierRegistry.hpp"
+#include "openvic-simulation/utility/Getters.hpp"
+#include "openvic-simulation/Modifier.hpp"
+#include "openvic-simulation/pop/Pop.hpp"
+#include "openvic-simulation/politics/Ideology.hpp"
+#include "openvic-simulation/economy/Good.hpp"
+
+#include <optional>
+
+namespace OpenVic {
+ struct NationalFocusManager;
+
+ struct NationalFocusGroup : HasIdentifier {
+ friend struct NationalFocusManager;
+
+ private:
+ NationalFocusGroup(std::string_view new_identifier);
+ };
+
+ struct NationalFocus : HasIdentifier {
+ friend struct NationalFocusManager;
+
+ public:
+ using pop_promotion_map_t = std::map<PopType const*, fixed_point_t>;
+ using party_loyalty_map_t = std::map<Ideology const*, fixed_point_t>;
+ using production_map_t = std::map<Good const*, fixed_point_t>;
+
+ private:
+ uint8_t PROPERTY(icon);
+ NationalFocusGroup const& PROPERTY(group);
+ ModifierValue PROPERTY(modifiers);
+ pop_promotion_map_t PROPERTY(encouraged_promotion);
+ party_loyalty_map_t PROPERTY(encouraged_loyalty);
+ production_map_t PROPERTY(encouraged_production);
+
+ NationalFocus(
+ std::string_view new_identifier,
+ uint8_t new_icon,
+ NationalFocusGroup const& new_group,
+ ModifierValue&& new_modifiers,
+ pop_promotion_map_t&& new_encouraged_promotion,
+ party_loyalty_map_t&& new_encouraged_loyalty,
+ production_map_t&& new_encouraged_production
+ );
+
+ public:
+ NationalFocus(NationalFocus&&) = default;
+ };
+
+ struct NationalFocusManager {
+ private:
+ IdentifierRegistry<NationalFocusGroup> national_focus_groups;
+ IdentifierRegistry<NationalFocus> national_foci;
+
+ public:
+ NationalFocusManager();
+
+ inline bool add_national_focus_group(std::string_view identifier);
+ IDENTIFIER_REGISTRY_ACCESSORS(national_focus_group)
+
+ inline bool add_national_focus(
+ std::string_view identifier,
+ uint8_t icon,
+ NationalFocusGroup const& group,
+ ModifierValue&& modifiers,
+ NationalFocus::pop_promotion_map_t&& encouraged_promotion,
+ NationalFocus::party_loyalty_map_t&& encouraged_loyalty,
+ NationalFocus::production_map_t&& encouraged_production
+ );
+ IDENTIFIER_REGISTRY_ACCESSORS_CUSTOM_PLURAL(national_focus, national_foci);
+
+ bool load_national_foci_file(PopManager const& pop_manager, IdeologyManager const& ideology_manager, GoodManager const& good_manager, ModifierManager const& modifier_manager, ast::NodeCPtr root);
+ };
+} // namespace OpenVic
diff --git a/src/openvic-simulation/politics/PoliticsManager.hpp b/src/openvic-simulation/politics/PoliticsManager.hpp
index 1423cf7..b30d1c0 100644
--- a/src/openvic-simulation/politics/PoliticsManager.hpp
+++ b/src/openvic-simulation/politics/PoliticsManager.hpp
@@ -4,6 +4,7 @@
#include "openvic-simulation/politics/Ideology.hpp"
#include "openvic-simulation/politics/Issue.hpp"
#include "openvic-simulation/politics/NationalValue.hpp"
+#include "openvic-simulation/politics/NationalFocus.hpp"
namespace OpenVic {
struct PoliticsManager {
@@ -12,15 +13,20 @@ namespace OpenVic {
IdeologyManager ideology_manager;
IssueManager issue_manager;
NationalValueManager national_value_manager;
+ NationalFocusManager national_focus_manager;
public:
REF_GETTERS(government_type_manager)
REF_GETTERS(ideology_manager)
REF_GETTERS(issue_manager)
REF_GETTERS(national_value_manager)
+ REF_GETTERS(national_focus_manager)
inline bool load_government_types_file(ast::NodeCPtr root) {
return government_type_manager.load_government_types_file(ideology_manager, root);
}
+ inline bool load_national_foci_file(PopManager const& pop_manager, GoodManager const& good_manager, ModifierManager const& modifier_manager, ast::NodeCPtr root) {
+ return national_focus_manager.load_national_foci_file(pop_manager, ideology_manager, good_manager, modifier_manager, root);
+ }
};
}