aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation/politics/Issue.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/openvic-simulation/politics/Issue.hpp')
-rw-r--r--src/openvic-simulation/politics/Issue.hpp89
1 files changed, 89 insertions, 0 deletions
diff --git a/src/openvic-simulation/politics/Issue.hpp b/src/openvic-simulation/politics/Issue.hpp
new file mode 100644
index 0000000..546b3ea
--- /dev/null
+++ b/src/openvic-simulation/politics/Issue.hpp
@@ -0,0 +1,89 @@
+#pragma once
+
+#include <cstddef>
+#include <string_view>
+#include "types/IdentifierRegistry.hpp"
+#include "dataloader/NodeTools.hpp"
+
+namespace OpenVic {
+ struct IssueManager;
+
+ //Issue type (i.e. political_issues)
+ struct IssueType : HasIdentifier {
+ friend struct IssueManager;
+
+ private:
+ IssueType(const std::string_view new_identifier);
+
+ public:
+ IssueType(IssueType&&) = default;
+ };
+
+ //Issue group (i.e. slavery)
+ struct IssueGroup : HasIdentifier {
+ friend struct IssueManager;
+
+ private:
+ IssueType const& type;
+ const bool ordered;
+
+ IssueGroup(const std::string_view new_identifier, IssueType const& new_type, bool ordered);
+
+ public:
+ IssueGroup(IssueGroup&&) = default;
+ IssueType const& get_type() const;
+ bool is_ordered() const;
+ };
+
+ //Issue type (i.e. yes_slavery)
+ struct Issue : HasIdentifier {
+ friend struct IssueManager;
+
+ private:
+ IssueGroup const& group;
+ const size_t ordinal; //assigned by the parser to allow policy sorting
+
+ //TODO: conditions to allow, policy modifiers, policy rule changes
+
+ Issue(const std::string_view new_identifier, IssueGroup const& new_group, size_t ordinal);
+
+ public:
+ Issue(Issue&&) = default;
+ IssueType const& get_type() const;
+ IssueGroup const& get_group() const;
+ size_t get_ordinal() const;
+ };
+
+ //Issue manager - holds the registries
+ struct IssueManager {
+ private:
+ IdentifierRegistry<IssueType> issue_types;
+ IdentifierRegistry<IssueGroup> issue_groups;
+ IdentifierRegistry<Issue> issues;
+
+ bool _load_issue_group(size_t& expected_issues, const std::string_view identifier, IssueType const* type, ast::NodeCPtr node);
+ bool _load_issue(size_t& ordinal, const std::string_view identifier, IssueGroup const* group, ast::NodeCPtr node);
+
+ public:
+ IssueManager();
+
+ bool add_issue_type(const std::string_view identifier);
+ IDENTIFIER_REGISTRY_ACCESSORS(IssueType, issue_type)
+
+ bool add_issue_group(const std::string_view identifier, IssueType const* type, bool ordered);
+ IDENTIFIER_REGISTRY_ACCESSORS(IssueGroup, issue_group)
+
+ bool add_issue(const std::string_view identifier, IssueGroup const* group, size_t ordinal);
+ IDENTIFIER_REGISTRY_ACCESSORS(Issue, issue)
+
+ bool load_issues_file(ast::NodeCPtr root);
+ };
+}
+
+/* A NOTE ON PARTY ISSUES
+ * It's worth noting that party_issues is a special type of issue, of similar structure but used in a different
+ * way. Party issues can never have an "allow" condition and are always unordered. Even if a mod was to specify
+ * those clauses, OV2's behaviour should be to simply disregard them, as they are meaningless to the context of
+ * party issues.
+ * Conversely, every attempt to read the list of reform types should skip over "party_issues".
+*/ \ No newline at end of file