diff --git a/data/ai/utils/default_config.cfg b/data/ai/utils/default_config.cfg index c2a414e14a1..9f150270d50 100644 --- a/data/ai/utils/default_config.cfg +++ b/data/ai/utils/default_config.cfg @@ -77,9 +77,41 @@ [/value] [/default] [/aspect] +{DEFAULT_ASPECT_VALUE recruitment_diversity 1.0} {DEFAULT_ASPECT_VALUE recruitment_ignore_bad_combat no} {DEFAULT_ASPECT_VALUE recruitment_ignore_bad_movement no} +[aspect] + id=recruitment_instructions + engine=cpp + name=composite_aspect + [default] + engine=cpp + name=standard_aspect + [value] + [recruit] + importance=0 + [/recruit] + [/value] + [/default] +[/aspect] +{DEFAULT_ASPECT_EMPTY recruitment_more} {DEFAULT_ASPECT_EMPTY recruitment_pattern} +{DEFAULT_ASPECT_VALUE recruitment_randomness 15} +[aspect] + id=recruitment_save_gold + engine=cpp + name=composite_aspect + [default] + engine=cpp + name=standard_aspect + [value] + active=yes + begin=1.0 + end=0.7 + spend_all_gold=-1 + [/value] + [/default] +[/aspect] {DEFAULT_ASPECT_VALUE scout_village_targeting 3} {DEFAULT_ASPECT_VALUE simple_targeting no} {DEFAULT_ASPECT_VALUE support_villages no} diff --git a/src/ai/configuration.cpp b/src/ai/configuration.cpp index 7b12ec200e3..0a3a82ff69d 100644 --- a/src/ai/configuration.cpp +++ b/src/ai/configuration.cpp @@ -76,9 +76,14 @@ void configuration::init(const config &game_config) well_known_aspects.push_back(well_known_aspect("passive_leader")); well_known_aspects.push_back(well_known_aspect("passive_leader_shares_keep")); well_known_aspects.push_back(well_known_aspect("recruitment")); + well_known_aspects.push_back(well_known_aspect("recruitment_diversity")); well_known_aspects.push_back(well_known_aspect("recruitment_ignore_bad_combat")); well_known_aspects.push_back(well_known_aspect("recruitment_ignore_bad_movement")); + well_known_aspects.push_back(well_known_aspect("recruitment_instructions")); + well_known_aspects.push_back(well_known_aspect("recruitment_more")); well_known_aspects.push_back(well_known_aspect("recruitment_pattern")); + well_known_aspects.push_back(well_known_aspect("recruitment_randomness")); + well_known_aspects.push_back(well_known_aspect("recruitment_save_gold")); well_known_aspects.push_back(well_known_aspect("scout_village_targeting")); well_known_aspects.push_back(well_known_aspect("simple_targeting")); well_known_aspects.push_back(well_known_aspect("support_villages")); diff --git a/src/ai/contexts.cpp b/src/ai/contexts.cpp index 0795fea4c5b..541995cdea1 100644 --- a/src/ai/contexts.cpp +++ b/src/ai/contexts.cpp @@ -183,9 +183,14 @@ readonly_context_impl::readonly_context_impl(side_context &context, const config passive_leader_shares_keep_(), possible_moves_(), recruitment_(), + recruitment_diversity_(), recruitment_ignore_bad_combat_(), recruitment_ignore_bad_movement_(), + recruitment_instructions_(), + recruitment_more_(), recruitment_pattern_(), + recruitment_randomness_(), + recruitment_save_gold_(), recursion_counter_(context.get_recursion_count()), scout_village_targeting_(), simple_targeting_(), @@ -213,9 +218,14 @@ readonly_context_impl::readonly_context_impl(side_context &context, const config add_known_aspect("passive_leader",passive_leader_); add_known_aspect("passive_leader_shares_keep",passive_leader_shares_keep_); add_known_aspect("recruitment",recruitment_); + add_known_aspect("recruitment_diversity",recruitment_diversity_); add_known_aspect("recruitment_ignore_bad_combat",recruitment_ignore_bad_combat_); add_known_aspect("recruitment_ignore_bad_movement",recruitment_ignore_bad_movement_); + add_known_aspect("recruitment_instructions",recruitment_instructions_); + add_known_aspect("recruitment_more",recruitment_more_); add_known_aspect("recruitment_pattern",recruitment_pattern_); + add_known_aspect("recruitment_randomness",recruitment_randomness_); + add_known_aspect("recruitment_save_gold",recruitment_save_gold_); add_known_aspect("scout_village_targeting",scout_village_targeting_); add_known_aspect("simple_targeting",simple_targeting_); add_known_aspect("support_villages",support_villages_); @@ -777,6 +787,15 @@ stage_ptr readonly_context_impl::get_recruitment(ai_context &context) const } +double readonly_context_impl::get_recruitment_diversity() const +{ + if (recruitment_diversity_) { + return recruitment_diversity_->get(); + } + return 0.; +} + + bool readonly_context_impl::get_recruitment_ignore_bad_combat() const { if (recruitment_ignore_bad_combat_) { @@ -795,6 +814,24 @@ bool readonly_context_impl::get_recruitment_ignore_bad_movement() const } +const config readonly_context_impl::get_recruitment_instructions() const +{ + if (recruitment_instructions_) { + return recruitment_instructions_->get(); + } + return config(); +} + + +const std::vector readonly_context_impl::get_recruitment_more() const +{ + if (recruitment_more_) { + return recruitment_more_->get(); + } + return std::vector(); +} + + const std::vector readonly_context_impl::get_recruitment_pattern() const { if (recruitment_pattern_) { @@ -804,6 +841,24 @@ const std::vector readonly_context_impl::get_recruitment_pattern() } +int readonly_context_impl::get_recruitment_randomness() const +{ + if (recruitment_randomness_) { + return recruitment_randomness_->get(); + } + return 0; +} + + +const config readonly_context_impl::get_recruitment_save_gold() const +{ + if (recruitment_save_gold_) { + return recruitment_save_gold_->get(); + } + return config(); +} + + double readonly_context_impl::get_scout_village_targeting() const { if (scout_village_targeting_) { diff --git a/src/ai/contexts.hpp b/src/ai/contexts.hpp index 39660fb60d6..566ee267b77 100644 --- a/src/ai/contexts.hpp +++ b/src/ai/contexts.hpp @@ -303,15 +303,30 @@ public: virtual stage_ptr get_recruitment(ai_context &context) const = 0; + virtual double get_recruitment_diversity() const = 0; + + virtual bool get_recruitment_ignore_bad_combat() const = 0; virtual bool get_recruitment_ignore_bad_movement() const = 0; + virtual const config get_recruitment_instructions() const = 0; + + + virtual const std::vector get_recruitment_more() const = 0; + + virtual const std::vector get_recruitment_pattern() const = 0; + virtual int get_recruitment_randomness() const = 0; + + + virtual const config get_recruitment_save_gold() const = 0; + + virtual double get_scout_village_targeting() const = 0; @@ -807,6 +822,12 @@ public: } + virtual double get_recruitment_diversity() const + { + return target_->get_recruitment_diversity(); + } + + virtual bool get_recruitment_ignore_bad_combat() const { return target_->get_recruitment_ignore_bad_combat(); @@ -819,12 +840,36 @@ public: } + virtual const config get_recruitment_instructions() const + { + return target_->get_recruitment_instructions(); + } + + + virtual const std::vector get_recruitment_more() const + { + return target_->get_recruitment_more(); + } + + virtual const std::vector get_recruitment_pattern() const { return target_->get_recruitment_pattern(); } + virtual int get_recruitment_randomness() const + { + return target_->get_recruitment_randomness(); + } + + + virtual const config get_recruitment_save_gold() const + { + return target_->get_recruitment_save_gold(); + } + + virtual const move_map& get_srcdst() const { return target_->get_srcdst(); @@ -1362,15 +1407,30 @@ public: virtual stage_ptr get_recruitment(ai_context &context) const; + virtual double get_recruitment_diversity() const; + + virtual bool get_recruitment_ignore_bad_combat() const; virtual bool get_recruitment_ignore_bad_movement() const; + virtual const config get_recruitment_instructions() const; + + + virtual const std::vector get_recruitment_more() const; + + virtual const std::vector get_recruitment_pattern() const; + virtual int get_recruitment_randomness() const; + + + virtual const config get_recruitment_save_gold() const; + + virtual double get_scout_village_targeting() const; @@ -1493,9 +1553,14 @@ private: aspect_type::typesafe_ptr passive_leader_shares_keep_; mutable moves_map possible_moves_; aspect_type< ministage >::typesafe_ptr recruitment_; + aspect_type< double >::typesafe_ptr recruitment_diversity_; aspect_type< bool >::typesafe_ptr recruitment_ignore_bad_combat_; aspect_type< bool >::typesafe_ptr recruitment_ignore_bad_movement_; + aspect_type< config >::typesafe_ptr recruitment_instructions_; + aspect_type< std::vector >::typesafe_ptr recruitment_more_; aspect_type< std::vector >::typesafe_ptr recruitment_pattern_; + aspect_type< int >::typesafe_ptr recruitment_randomness_; + aspect_type< config >::typesafe_ptr recruitment_save_gold_; recursion_counter recursion_counter_; aspect_type< double >::typesafe_ptr scout_village_targeting_; aspect_type< bool >::typesafe_ptr simple_targeting_; diff --git a/src/ai/manager.cpp b/src/ai/manager.cpp index 801f93dcb25..dea1dc9000d 100644 --- a/src/ai/manager.cpp +++ b/src/ai/manager.cpp @@ -245,16 +245,16 @@ const std::string holder::get_ai_overview() 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; s << "passive_leader_shares_keep: " << this->ai_->get_passive_leader_shares_keep() << std::endl; + s << "recruitment_diversity: " << this->ai_->get_recruitment_diversity() << std::endl; s << "recruitment_ignore_bad_combat: " << this->ai_->get_recruitment_ignore_bad_combat() << std::endl; s << "recruitment_ignore_bad_movement: " << this->ai_->get_recruitment_ignore_bad_movement() << std::endl; -// s << "recruitment_pattern: "; -// for(std::vector::const_iterator i = this->ai_->get_recruitment_pattern().begin(); i != this->ai_->get_recruitment_pattern().end(); ++i) { -// if(i != this->ai_->get_recruitment_pattern().begin()) -// s << ","; -// -// s << *i; -// } -// s << std::endl; + s << "recruitment_instructions: " << std::endl << "----config begin----" << std::endl; + s << this->ai_->get_recruitment_instructions() << "-----config end-----" << std::endl; + s << "recruitment_more: " << utils::join(this->ai_->get_recruitment_more()) << std::endl; + s << "recruitment_pattern: " << utils::join(this->ai_->get_recruitment_pattern()) << std::endl; + s << "recruitment_randomness: " << this->ai_->get_recruitment_randomness() << std::endl; + s << "recruitment_save_gold: " << std::endl << "----config begin----" << std::endl; + s << this->ai_->get_recruitment_save_gold() << "-----config end-----" << std::endl; s << "scout_village_targeting: " << this->ai_->get_scout_village_targeting() << std::endl; s << "simple_targeting: " << this->ai_->get_simple_targeting() << std::endl; s << "support_villages: " << this->ai_->get_support_villages() << std::endl; diff --git a/src/ai/registry.cpp b/src/ai/registry.cpp index 96dfab8681e..35518148cac 100644 --- a/src/ai/registry.cpp +++ b/src/ai/registry.cpp @@ -269,7 +269,10 @@ static register_aspect_factory< composite_aspect > passive_leader_shares_keep__composite_aspect_factory("passive_leader_shares_keep*composite_aspect"); static register_aspect_factory< composite_aspect > - recruitment__composite_aspect_factory("recruitment*composite_aspect"); + recruitment__composite_aspect_factory("recruitment*composite_aspect"); + +static register_aspect_factory< composite_aspect > + recruitment_diversity__composite_aspect_factory("recruitment_diversity*composite_aspect"); static register_aspect_factory< composite_aspect > recruitment_ignore_bad_combat__composite_aspect_factory("recruitment_ignore_bad_combat*composite_aspect"); @@ -277,9 +280,21 @@ static register_aspect_factory< composite_aspect > static register_aspect_factory< composite_aspect > recruitment_ignore_bad_movement__composite_aspect_factory("recruitment_ignore_bad_movement*composite_aspect"); +static register_aspect_factory< composite_aspect > + recruitment_instructions__composite_aspect_factory("recruitment_instructions*composite_aspect"); + +static register_aspect_factory< composite_aspect< std::vector > > + recruitment_more__composite_aspect_factory("recruitment_more*composite_aspect"); + static register_aspect_factory< composite_aspect< std::vector > > recruitment_pattern__composite_aspect_factory("recruitment_pattern*composite_aspect"); +static register_aspect_factory< composite_aspect > + recruitment_randomness__composite_aspect_factory("recruitment_randomness*composite_aspect"); + +static register_aspect_factory< composite_aspect > + recruitment_save_gold__composite_aspect_factory("recruitment_save_gold*composite_aspect"); + static register_aspect_factory< composite_aspect > scout_village_targeting__composite_aspect_factory("scout_village_targeting*composite_aspect"); @@ -340,7 +355,10 @@ static register_aspect_factory< standard_aspect > passive_leader_shares_keep__standard_aspect_factory("passive_leader_shares_keep*standard_aspect"); static register_aspect_factory< standard_aspect > - recruitment__standard_aspect_factory("recruitment*standard_aspect"); + recruitment__standard_aspect_factory("recruitment*standard_aspect"); + +static register_aspect_factory< standard_aspect > + recruitment_diversity__standard_aspect_factory("recruitment_diversity*standard_aspect"); static register_aspect_factory< standard_aspect > recruitment_ignore_bad_combat__standard_aspect_factory("recruitment_ignore_bad_combat*standard_aspect"); @@ -348,9 +366,21 @@ static register_aspect_factory< standard_aspect > static register_aspect_factory< standard_aspect > recruitment_ignore_bad_movement__standard_aspect_factory("recruitment_ignore_bad_movement*standard_aspect"); +static register_aspect_factory< standard_aspect > + recruitment_instructions__standard_aspect_factory("recruitment_instructions*standard_aspect"); + +static register_aspect_factory< standard_aspect< std::vector > > + recruitment_more__standard_aspect_factory("recruitment_more*standard_aspect"); + static register_aspect_factory< standard_aspect< std::vector > > recruitment_pattern__standard_aspect_factory("recruitment_pattern*standard_aspect"); +static register_aspect_factory< standard_aspect > + recruitment_randomness__standard_aspect_factory("recruitment_randomness*standard_aspect"); + +static register_aspect_factory< standard_aspect > + recruitment_save_gold__standard_aspect_factory("recruitment_save_gold*standard_aspect"); + static register_aspect_factory< standard_aspect > scout_village_targeting__standard_aspect_factory("scout_village_targeting*standard_aspect"); @@ -415,7 +445,10 @@ static register_aspect_factory< standard_aspect > passive_leader_shares_keep__standard_aspect_factory2("passive_leader_shares_keep*"); static register_aspect_factory< standard_aspect > - recruitment__standard_aspect_factory2("recruitment*"); + recruitment__standard_aspect_factory2("recruitment*"); + +static register_aspect_factory< standard_aspect > + recruitment_diversity__standard_aspect_factory2("recruitment_diversity*"); static register_aspect_factory< standard_aspect > recruitment_ignore_bad_combat__standard_aspect_factory2("recruitment_ignore_bad_combat*"); @@ -423,9 +456,21 @@ static register_aspect_factory< standard_aspect > static register_aspect_factory< standard_aspect > recruitment_ignore_bad_movement__standard_aspect_factory2("recruitment_ignore_bad_movement*"); +static register_aspect_factory< standard_aspect > + recruitment_instructions__standard_aspect_factory2("recruitment_instructions*"); + +static register_aspect_factory< standard_aspect< std::vector > > + recruitment_more__standard_aspect_factory2("recruitment_more*"); + static register_aspect_factory< standard_aspect< std::vector > > recruitment_pattern__standard_aspect_factory2("recruitment_pattern*"); +static register_aspect_factory< standard_aspect > + recruitment_randomness__standard_aspect_factory2("recruitment_randomness*"); + +static register_aspect_factory< standard_aspect > + recruitment_save_gold__standard_aspect_factory2("recruitment_save_gold*"); + static register_aspect_factory< standard_aspect > scout_village_targeting__standard_aspect_factory2("scout_village_targeting*");