From 27d6b0f59b420b9f47989b36c63349b3a6667a7c Mon Sep 17 00:00:00 2001 From: Iurii Chernyi Date: Thu, 8 Oct 2009 00:01:17 +0000 Subject: [PATCH] new aspect, leader_aggression, to control the aggression of the leader... ...separately. Default value is -4.0 - that's old implicit default --- data/ai/utils/default_config.cfg | 1 + src/ai/configuration.cpp | 1 + src/ai/contexts.cpp | 10 ++++++++++ src/ai/contexts.hpp | 14 ++++++++++++++ src/ai/default/attack.cpp | 8 ++------ src/ai/manager.cpp | 1 + src/ai/registry.cpp | 9 +++++++++ 7 files changed, 38 insertions(+), 6 deletions(-) diff --git a/data/ai/utils/default_config.cfg b/data/ai/utils/default_config.cfg index 5de8ec86a8e..02a7d3fa6d7 100644 --- a/data/ai/utils/default_config.cfg +++ b/data/ai/utils/default_config.cfg @@ -56,6 +56,7 @@ {DEFAULT_ASPECT_EMPTY_SLF avoid} {DEFAULT_ASPECT_VALUE caution 0.25} {DEFAULT_ASPECT_VALUE grouping offensive} +{DEFAULT_ASPECT_VALUE leader_aggression -4.0} {DEFAULT_ASPECT_EMPTY leader_goal} {DEFAULT_ASPECT_VALUE leader_value 3.0} {DEFAULT_ASPECT_VALUE number_of_possible_recruits_to_force_recruit 3.1} diff --git a/src/ai/configuration.cpp b/src/ai/configuration.cpp index 7d31c07da6f..984f957168c 100644 --- a/src/ai/configuration.cpp +++ b/src/ai/configuration.cpp @@ -64,6 +64,7 @@ void configuration::init(const config &game_config) well_known_aspects.push_back(well_known_aspect("avoid",false)); well_known_aspects.push_back(well_known_aspect("caution")); well_known_aspects.push_back(well_known_aspect("grouping")); + well_known_aspects.push_back(well_known_aspect("leader_aggression")); well_known_aspects.push_back(well_known_aspect("leader_goal",false)); well_known_aspects.push_back(well_known_aspect("leader_value")); well_known_aspects.push_back(well_known_aspect("number_of_possible_recruits_to_force_recruit")); diff --git a/src/ai/contexts.cpp b/src/ai/contexts.cpp index 87961a3082d..a6916190fe3 100644 --- a/src/ai/contexts.cpp +++ b/src/ai/contexts.cpp @@ -158,6 +158,7 @@ readonly_context_impl::readonly_context_impl(side_context &context, const config grouping_(), goals_(), keeps_(), + leader_aggression_(), leader_goal_(), leader_value_(), move_maps_enemy_valid_(false), @@ -188,6 +189,7 @@ readonly_context_impl::readonly_context_impl(side_context &context, const config add_known_aspect("avoid",avoid_); add_known_aspect("caution",caution_); add_known_aspect("grouping",grouping_); + add_known_aspect("leader_aggression",leader_aggression_); add_known_aspect("leader_goal",leader_goal_); add_known_aspect("leader_value",leader_value_); add_known_aspect("number_of_possible_recruits_to_force_recruit",number_of_possible_recruits_to_force_recruit_); @@ -609,6 +611,14 @@ std::vector& readonly_context_impl::get_goals() +double readonly_context_impl::get_leader_aggression() const +{ + if (leader_aggression_) { + return leader_aggression_->get(); + } + return 0; +} + config readonly_context_impl::get_leader_goal() const { diff --git a/src/ai/contexts.hpp b/src/ai/contexts.hpp index a01d4481416..9dc5a3aed2c 100644 --- a/src/ai/contexts.hpp +++ b/src/ai/contexts.hpp @@ -237,6 +237,9 @@ public: virtual std::vector& get_goals() = 0; + virtual double get_leader_aggression() const = 0; + + virtual config get_leader_goal() const = 0; @@ -657,6 +660,13 @@ public: } + virtual double get_leader_aggression() const + { + return target_->get_leader_aggression(); + } + + + virtual config get_leader_goal() const { return target_->get_leader_goal(); @@ -1188,6 +1198,9 @@ public: virtual double get_number_of_possible_recruits_to_force_recruit() const; + virtual double get_leader_aggression() const; + + virtual config get_leader_goal() const; @@ -1311,6 +1324,7 @@ private: aspect_type< std::string >::typesafe_ptr grouping_; std::vector< goal_ptr > goals_; mutable std::set keeps_; + aspect_type::typesafe_ptr leader_aggression_; aspect_type< config >::typesafe_ptr leader_goal_; aspect_type< double >::typesafe_ptr leader_value_; mutable bool move_maps_enemy_valid_; diff --git a/src/ai/default/attack.cpp b/src/ai/default/attack.cpp index b13988b0b30..b753c24d99a 100644 --- a/src/ai/default/attack.cpp +++ b/src/ai/default/attack.cpp @@ -265,12 +265,8 @@ double attack_analysis::rating(double aggression, const readonly_context& ai_obj aggression = 1.0; } - //FIXME: One of suokko's reverted changes removed this. Should it be gone? - // Only use the leader if we do a serious amount of damage, - // compared to how much they do to us. - if(uses_leader && aggression > -4.0) { - LOG_AI << "uses leader..\n"; - aggression = -4.0; + if(uses_leader) { + aggression = ai_obj.get_leader_aggression(); } double value = chance_to_kill*target_value - avg_losses*(1.0-aggression); diff --git a/src/ai/manager.cpp b/src/ai/manager.cpp index 890bf37dba5..e8129c47a94 100644 --- a/src/ai/manager.cpp +++ b/src/ai/manager.cpp @@ -225,6 +225,7 @@ const std::string holder::get_ai_overview() s << "attack_depth: " << this->ai_->get_attack_depth() << std::endl; s << "caution: " << this->ai_->get_caution() << std::endl; s << "grouping: " << this->ai_->get_grouping() << std::endl; + s << "leader_aggression: " << this->ai_->get_leader_aggression() << std::endl; s << "leader_value: " << this->ai_->get_leader_value() << std::endl; s << "number_of_possible_recruits_to_force_recruit: " << this->ai_->get_number_of_possible_recruits_to_force_recruit() << std::endl; s << "passive_leader: " << this->ai_->get_passive_leader() << std::endl; diff --git a/src/ai/registry.cpp b/src/ai/registry.cpp index 313b1e83e4f..7e0cf9a378a 100644 --- a/src/ai/registry.cpp +++ b/src/ai/registry.cpp @@ -137,6 +137,9 @@ static register_aspect_factory< composite_aspect > static register_aspect_factory< composite_aspect > grouping__composite_aspect_factory("grouping*composite_aspect"); +static register_aspect_factory< composite_aspect > + leader_aggression__composite_aspect_factory("leader_aggression*composite_aspect"); + static register_aspect_factory< composite_aspect > leader_goal__composite_aspect_factory("leader_goal*composite_aspect"); @@ -199,6 +202,9 @@ static register_aspect_factory< standard_aspect > static register_aspect_factory< standard_aspect > grouping__standard_aspect_factory("grouping*standard_aspect"); +static register_aspect_factory< standard_aspect > + leader_aggression__standard_aspect_factory("leader_aggression*standard_aspect"); + static register_aspect_factory< standard_aspect > leader_goal__standard_aspect_factory("leader_goal*standard_aspect"); @@ -261,6 +267,9 @@ static register_aspect_factory< standard_aspect > static register_aspect_factory< standard_aspect > grouping__standard_aspect_factory2("grouping*"); +static register_aspect_factory< standard_aspect > + leader_aggression__standard_aspect_factory2("leader_aggression*"); + static register_aspect_factory< standard_aspect > leader_goal__standard_aspect_factory2("leader_goal*");