aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation/military/Wargoal.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/openvic-simulation/military/Wargoal.hpp')
-rw-r--r--src/openvic-simulation/military/Wargoal.hpp129
1 files changed, 129 insertions, 0 deletions
diff --git a/src/openvic-simulation/military/Wargoal.hpp b/src/openvic-simulation/military/Wargoal.hpp
new file mode 100644
index 0000000..dbb8d67
--- /dev/null
+++ b/src/openvic-simulation/military/Wargoal.hpp
@@ -0,0 +1,129 @@
+#pragma once
+
+#include "openvic-simulation/types/IdentifierRegistry.hpp"
+#include "openvic-simulation/types/EnumBitfield.hpp"
+#include "openvic-simulation/Modifier.hpp"
+
+namespace OpenVic {
+ struct WargoalTypeManager;
+
+ enum class peace_options_t : uint32_t {
+ PO_ANNEX = 0b100000000000000000,
+ PO_DEMAND_STATE = 0b010000000000000000,
+ PO_COLONY = 0b001000000000000000,
+ PO_ADD_TO_SPHERE = 0b000100000000000000,
+ PO_DISARMAMENT = 0b000010000000000000,
+ PO_REMOVE_FORTS = 0b000001000000000000,
+ PO_REMOVE_NAVAL_BASES = 0b000000100000000000,
+ PO_REPARATIONS = 0b000000010000000000,
+ PO_REPAY_DEBT = 0b000000001000000000,
+ PO_REMOVE_PRESTIGE = 0b000000000100000000,
+ PO_MAKE_PUPPET = 0b000000000010000000,
+ PO_RELEASE_PUPPET = 0b000000000001000000,
+ PO_STATUS_QUO = 0b000000000000100000,
+ PO_INSTALL_COMMUNISM = 0b000000000000010000,
+ PO_REMOVE_COMMUNISM = 0b000000000000001000,
+ PO_REMOVE_CORES = 0b000000000000000100, // only usable with ANNEX, DEMAND_STATE, or TRANSFER_PROVINCES
+ PO_TRANSFER_PROVINCES = 0b000000000000000010,
+ PO_CLEAR_UNION_SPHERE = 0b000000000000000001
+ };
+ template<> struct enable_bitfield<peace_options_t> : std::true_type{};
+
+ struct WargoalType : HasIdentifier {
+ friend struct WargoalTypeManager;
+
+ enum class PEACE_MODIFIERS {
+ BADBOY_FACTOR,
+ PRESTIGE_FACTOR,
+ PEACE_COST_FACTOR,
+ PENALTY_FACTOR,
+ BREAK_TRUCE_PRESTIGE_FACTOR,
+ BREAK_TRUCE_INFAMY_FACTOR,
+ BREAK_TRUCE_MILITANCY_FACTOR,
+ GOOD_RELATION_PRESTIGE_FACTOR,
+ GOOD_RELATION_INFAMY_FACTOR,
+ GOOD_RELATION_MILITANCY_FACTOR,
+ WAR_SCORE_BATTLE_FACTOR,
+ CONSTRUCTION_SPEED
+ };
+ using peace_modifiers_t = std::map<PEACE_MODIFIERS, fixed_point_t>;
+
+ private:
+ const std::string sprite;
+ const std::string war_name;
+ const Timespan available_length;
+ const Timespan truce_length;
+ const bool triggered_only; // only able to be added via effects (or within the code)
+ const bool civil_war;
+ const bool constructing; // can be added to existing wars or justified
+ const bool crisis; // able to be added to crises
+ const bool great_war; // automatically add to great wars
+ const bool mutual; // attacked and defender share wargoal
+ const peace_modifiers_t modifiers;
+ const peace_options_t peace_options;
+
+ // TODO: can_use, prerequisites, on_add, on_po_accepted
+
+ WargoalType(
+ std::string_view new_identifier,
+ std::string_view new_sprite,
+ std::string_view new_war_name,
+ Timespan new_available_length,
+ Timespan new_truce_length,
+ bool new_triggered_only,
+ bool new_civil_war,
+ bool new_constructing,
+ bool new_crisis,
+ bool new_great_war,
+ bool new_mutual,
+ const peace_modifiers_t&& new_modifiers,
+ peace_options_t new_peace_options
+ );
+
+ public:
+ WargoalType(WargoalType&&) = default;
+
+ std::string_view get_sprite() const;
+ std::string_view get_war_name() const;
+ const Timespan get_available_length() const;
+ const Timespan get_truce_length() const;
+ const bool is_triggered_only() const;
+ const bool is_civil_war() const;
+ const bool is_constructing() const;
+ const bool is_crisis() const;
+ const bool is_great_war() const;
+ const bool is_mutual() const;
+ peace_modifiers_t const& get_modifiers() const;
+ const peace_options_t get_peace_options() const;
+ };
+
+ struct WargoalTypeManager {
+ private:
+ IdentifierRegistry<WargoalType> wargoal_types;
+ std::vector<WargoalType const*> peace_priorities;
+
+ public:
+ WargoalTypeManager();
+
+ const std::vector<WargoalType const*>& get_peace_priority_list() const;
+
+ bool add_wargoal_type(
+ std::string_view identifier,
+ std::string_view sprite,
+ std::string_view war_name,
+ Timespan available_length,
+ Timespan truce_length,
+ bool triggered_only,
+ bool civil_war,
+ bool constructing,
+ bool crisis,
+ bool great_war,
+ bool mutual,
+ WargoalType::peace_modifiers_t&& modifiers,
+ peace_options_t peace_options
+ );
+ IDENTIFIER_REGISTRY_ACCESSORS(wargoal_type)
+
+ bool load_wargoal_file(ast::NodeCPtr root);
+ };
+} // namespace OpenVic \ No newline at end of file