From af4758d399a75485b9adfeb3058a526eec3c8a4d Mon Sep 17 00:00:00 2001 From: Joel Machens Date: Sun, 15 Oct 2023 12:39:11 -0500 Subject: Implement Leader Trait Loading --- src/openvic-simulation/Modifier.cpp | 13 +++- src/openvic-simulation/dataloader/Dataloader.cpp | 7 ++- src/openvic-simulation/military/LeaderTrait.cpp | 60 ++++++++++++++++++ src/openvic-simulation/military/LeaderTrait.hpp | 72 ++++++++++++++++++++++ .../military/MilitaryManager.hpp | 3 + 5 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 src/openvic-simulation/military/LeaderTrait.cpp create mode 100644 src/openvic-simulation/military/LeaderTrait.hpp diff --git a/src/openvic-simulation/Modifier.cpp b/src/openvic-simulation/Modifier.cpp index fc5dcaf..97ddd8f 100644 --- a/src/openvic-simulation/Modifier.cpp +++ b/src/openvic-simulation/Modifier.cpp @@ -123,6 +123,17 @@ bool ModifierManager::setup_modifier_effects() { using enum ModifierEffect::format_t; + /* LEADER TRAIT MODIFIERS */ + ret &= add_modifier_effect("attack", true, INT); + ret &= add_modifier_effect("defence", true, INT); + ret &= add_modifier_effect("reliability", true, RAW_DECIMAL); + ret &= add_modifier_effect("morale", true); + ret &= add_modifier_effect("organisation", true); + ret &= add_modifier_effect("speed", true); + ret &= add_modifier_effect("reconnaissance", true); + ret &= add_modifier_effect("experience", true); + ret &= add_modifier_effect("attrition", false, RAW_DECIMAL); + /* MISCELLANEOUS MODIFIERS */ ret &= add_modifier_effect("movement_cost", false); ret &= add_modifier_effect("farm_rgo_size", true); ret &= add_modifier_effect("farm_rgo_eff", true); @@ -130,11 +141,9 @@ bool ModifierManager::setup_modifier_effects() { ret &= add_modifier_effect("mine_rgo_eff", true); ret &= add_modifier_effect("supply_limit", true, RAW_DECIMAL); ret &= add_modifier_effect("combat_width", false); - ret &= add_modifier_effect("defence", true, RAW_DECIMAL); ret &= add_modifier_effect("local_ship_build", false); ret &= add_modifier_effect("research_points_modifier", true); ret &= add_modifier_effect("local_rgo_output", true); - ret &= add_modifier_effect("attrition", false, RAW_DECIMAL); ret &= add_modifier_effect("immigrant_push", false); ret &= add_modifier_effect("population_growth", true); ret &= add_modifier_effect("local_RGO_throughput", true); diff --git a/src/openvic-simulation/dataloader/Dataloader.cpp b/src/openvic-simulation/dataloader/Dataloader.cpp index 72e3113..15c7ce7 100644 --- a/src/openvic-simulation/dataloader/Dataloader.cpp +++ b/src/openvic-simulation/dataloader/Dataloader.cpp @@ -587,6 +587,7 @@ bool Dataloader::load_defines(GameManager& game_manager) const { static const fs::path units_directory = "units"; static const fs::path buildings_file = "common/buildings.txt"; + static const fs::path bookmark_file = "common/bookmarks.txt"; static const fs::path culture_file = "common/cultures.txt"; static const fs::path goods_file = "common/goods.txt"; static const fs::path governments_file = "common/governments.txt"; @@ -595,7 +596,7 @@ bool Dataloader::load_defines(GameManager& game_manager) const { static const fs::path issues_file = "common/issues.txt"; static const fs::path production_types_file = "common/production_types.txt"; static const fs::path religion_file = "common/religion.txt"; - static const fs::path bookmark_file = "common/bookmarks.txt"; + static const fs::path leader_traits_file = "common/traits.txt"; bool ret = true; @@ -663,6 +664,10 @@ bool Dataloader::load_defines(GameManager& game_manager) const { Logger::error("Failed to load units!"); ret = false; } + if (!game_manager.get_military_manager().get_leader_trait_manager().load_leader_traits_file(game_manager.get_modifier_manager(), parse_defines(lookup_file(leader_traits_file)).get_file_node())) { + Logger::error("Failed to load leader traits!"); + ret = false; + } if (!game_manager.get_history_manager().load_bookmark_file(parse_defines(lookup_file(bookmark_file)).get_file_node())) { Logger::error("Failed to load bookmarks!"); ret = false; diff --git a/src/openvic-simulation/military/LeaderTrait.cpp b/src/openvic-simulation/military/LeaderTrait.cpp new file mode 100644 index 0000000..27f81c5 --- /dev/null +++ b/src/openvic-simulation/military/LeaderTrait.cpp @@ -0,0 +1,60 @@ +#include "LeaderTrait.hpp" + +using namespace OpenVic; +using namespace OpenVic::NodeTools; + +LeaderTrait::LeaderTrait(std::string_view new_identifier, trait_type_t new_type, ModifierValue new_modifiers) + : HasIdentifier { new_identifier }, type { new_type }, modifiers { new_modifiers } {} + +trait_type_t LeaderTrait::get_trait_type() const { + return type; +} + +bool LeaderTrait::is_personality_trait() const { + return type == trait_type_t::PERSONALITY; +} + +bool LeaderTrait::is_background_trait() const { + return type == trait_type_t::BACKGROUND; +} + +ModifierValue LeaderTrait::get_modifiers() const { + return modifiers; +} + +LeaderTraitManager::LeaderTraitManager() : leader_traits { "leader_traits" } {} + +bool LeaderTraitManager::add_leader_trait(std::string_view identifier, trait_type_t type, ModifierValue modifiers) { + if (identifier.empty()) { + Logger::error("Invalid leader trait identifier - empty!"); + return false; + } + + return leader_traits.add_item({ identifier, type, modifiers }); +} + +bool LeaderTraitManager::load_leader_traits_file(ModifierManager& modifier_manager, ast::NodeCPtr root) { + bool ret = expect_dictionary_keys( + "personality", ONE_EXACTLY, expect_dictionary( + [this, &modifier_manager](std::string_view trait_identifier, ast::NodeCPtr value) -> bool { + ModifierValue modifiers; + + bool ret = modifier_manager.expect_whitelisted_modifier_value(move_variable_callback(modifiers), allowed_modifiers)(value); + ret &= add_leader_trait(trait_identifier, trait_type_t::PERSONALITY, modifiers); + return ret; + } + ), + "background", ONE_EXACTLY, expect_dictionary( + [this, &modifier_manager](std::string_view trait_identifier, ast::NodeCPtr value) -> bool { + ModifierValue modifiers; + + bool ret = modifier_manager.expect_whitelisted_modifier_value(move_variable_callback(modifiers), allowed_modifiers)(value); + ret &= add_leader_trait(trait_identifier, trait_type_t::BACKGROUND, modifiers); + return ret; + } + ) + )(root); + lock_leader_traits(); + + return ret; +} \ No newline at end of file diff --git a/src/openvic-simulation/military/LeaderTrait.hpp b/src/openvic-simulation/military/LeaderTrait.hpp new file mode 100644 index 0000000..f4445f6 --- /dev/null +++ b/src/openvic-simulation/military/LeaderTrait.hpp @@ -0,0 +1,72 @@ +#pragma once + +#include +#include +#include "openvic-simulation/types/IdentifierRegistry.hpp" +#include "openvic-simulation/types/fixed_point/FixedPoint.hpp" +#include "openvic-simulation/dataloader/NodeTools.hpp" +#include "openvic-simulation/Modifier.hpp" + +namespace OpenVic { + struct LeaderTraitManager; + + enum class trait_type_t { + PERSONALITY, + BACKGROUND + }; + + struct LeaderTrait : HasIdentifier { + friend struct LeaderTraitManager; + + private: + + const trait_type_t type; + /* + * Allowed modifiers for leaders: + * attack - integer + * defence - integer + * morale - % + * organisation - % + * reconnaissance - % + * speed - % + * attrition - %, negative is good + * experience - % + * reliability - decimal, mil gain or loss for associated POPs + */ + const ModifierValue modifiers; + + LeaderTrait(std::string_view new_identifier, trait_type_t new_type, ModifierValue new_modifiers); + + public: + LeaderTrait(LeaderTrait&&) = default; + + trait_type_t get_trait_type() const; + bool is_personality_trait() const; + bool is_background_trait() const; + ModifierValue get_modifiers() const; + }; + + struct LeaderTraitManager { + private: + IdentifierRegistry leader_traits; + const std::set> allowed_modifiers = { + "attack", + "defence", + "morale", + "organisation", + "reconnaissance", + "speed", + "attrition", + "experience", + "reliability" + }; + + public: + LeaderTraitManager(); + + bool add_leader_trait(std::string_view identifier, trait_type_t type, ModifierValue modifiers); + IDENTIFIER_REGISTRY_ACCESSORS(leader_trait) + + bool load_leader_traits_file(ModifierManager& modifier_manager, ast::NodeCPtr root); + }; +} // namespace OpenVic diff --git a/src/openvic-simulation/military/MilitaryManager.hpp b/src/openvic-simulation/military/MilitaryManager.hpp index 36b5010..fd8135d 100644 --- a/src/openvic-simulation/military/MilitaryManager.hpp +++ b/src/openvic-simulation/military/MilitaryManager.hpp @@ -1,12 +1,15 @@ #pragma once #include "openvic-simulation/military/Unit.hpp" +#include "openvic-simulation/military/LeaderTrait.hpp" namespace OpenVic { struct MilitaryManager { private: UnitManager unit_manager; + LeaderTraitManager leader_trait_manager; public: REF_GETTERS(unit_manager) + REF_GETTERS(leader_trait_manager) }; } -- cgit v1.2.3-56-ga3b1