Add new AI aspect allow_ally_villages

This commit is contained in:
mattsc 2022-06-22 08:00:50 -07:00
parent 2b3824f44c
commit ce9ba142bc
10 changed files with 43 additions and 2 deletions

View file

@ -42,6 +42,7 @@
{DEFAULT_ASPECT_EMPTY advancements}
{DEFAULT_ASPECT_VALUE aggression 0.4}
{DEFAULT_ASPECT_VALUE allow_ally_villages no}
[aspect]
id=attacks
engine=cpp

View file

@ -64,7 +64,7 @@
super="{BASE}~real"
[/case]
[case]
value=leader_ignores_keep,passive_leader,passive_leader_shares_keep,simple_targeting,support_villages
value=allow_ally_villages,leader_ignores_keep,passive_leader,passive_leader_shares_keep,simple_targeting,support_villages
super="{BASE}~bool"
[/case]
[case]

View file

@ -39,6 +39,7 @@
{SIMPLE_KEY engine string}
# Simple scalar aspects
{AI_ASPECT_KEY aggression s_real}
{AI_ASPECT_KEY allow_ally_villages s_bool}
{AI_ASPECT_KEY caution s_real}
{AI_ASPECT_KEY grouping ai_grouping}
{AI_ASPECT_KEY leader_aggression s_real}

View file

@ -151,6 +151,7 @@
[/elseif]
# Okay, now the hard part. Basically need two entries for every possible type of aspect!
{AI_MODIFY_MATCH_ASPECT aggression real}
{AI_MODIFY_MATCH_ASPECT allow_ally_villages bool}
{AI_MODIFY_MATCH_ASPECT caution real}
{AI_MODIFY_MATCH_ASPECT leader_aggression real}
{AI_MODIFY_MATCH_ASPECT leader_value real}

View file

@ -76,7 +76,7 @@
("rulebase"))
("ai"
("team_formula" "register_candidate_action" "candidate_action" "not" "protect_area" "aspect" "leader_goal" "avoid" "vars" "modify_ai" "engine" "goal" "stage")
("priority" "formula" "eval_list" "_stage" "_aspect" "leader" "loop_formula" "y" "x" "passive_leader_shares_keep" "leader_aggression" "number_of_possible_recruits_to_force_recruit" "time_of_day" "ai_algorithm" "retreat_enemy_weight" "retreat_factor" "scout_village_targeting" "turns" "attack_depth" "grouping" "villages_per_scout" "leader_value" "village_value" "leader_shares_keep" "passive_leader" "recruitment_pattern" "simple_targeting" "recruitment_ignore_bad_combat" "recruitment_ignore_bad_movement" "caution" "aggression" "version" "description" "id"))
("priority" "formula" "eval_list" "_stage" "_aspect" "leader" "loop_formula" "y" "x" "passive_leader_shares_keep" "leader_aggression" "number_of_possible_recruits_to_force_recruit" "time_of_day" "ai_algorithm" "retreat_enemy_weight" "retreat_factor" "scout_village_targeting" "turns" "attack_depth" "grouping" "villages_per_scout" "leader_value" "village_value" "leader_shares_keep" "passive_leader" "recruitment_pattern" "simple_targeting" "recruitment_ignore_bad_combat" "recruitment_ignore_bad_movement" "caution" "allow_ally_villages" "aggression" "version" "description" "id"))
("side"
("leader" "variables" "goal" "village" "unit" "ai" "modifications")
("recall_cost" "village_support" "gold_lock" "faction_from_recruit" "income_lock" "team_lock" "disallow_observers" "variation" "ai_special" "hitpoints" "overlays" "ai_algorithm" "generate_name" "random_traits" "extra_recruit" "y" "x" "allow_player" "faction" "image" "experience" "race" "facing" "moves" "color" "share_maps" "share_view" "shroud" "fog" "profile" "scroll_to_leader" "village_gold" "unrenamable" "gender" "save_id" "income" "no_leader" "gold" "recruit" "canrecruit" "user_team_name" "team_name" "persistent" "max_moves" "type" "id" "name" "hidden" "controller" "side"))

View file

@ -167,6 +167,7 @@ readonly_context_impl::readonly_context_impl(side_context &context, const config
known_aspects_(),
advancements_(),
aggression_(),
allow_ally_villages_(),
aspects_(),
attacks_(),
avoid_(),
@ -213,6 +214,7 @@ readonly_context_impl::readonly_context_impl(side_context &context, const config
add_known_aspect("advancements", advancements_);
add_known_aspect("aggression",aggression_);
add_known_aspect("allow_ally_villages",allow_ally_villages_);
add_known_aspect("attacks",attacks_);
add_known_aspect("avoid",avoid_);
add_known_aspect("caution",caution_);
@ -514,6 +516,14 @@ double readonly_context_impl::get_aggression() const
return 0;
}
bool readonly_context_impl::get_allow_ally_villages() const
{
if (allow_ally_villages_) {
return allow_ally_villages_->get();
}
return false;
}
const aspect_map& readonly_context_impl::get_aspects() const
{
return aspects_;

View file

@ -200,6 +200,8 @@ public:
virtual double get_aggression() const = 0;
virtual bool get_allow_ally_villages() const = 0;
virtual const aspect_map& get_aspects() const = 0;
virtual aspect_map& get_aspects() = 0;
@ -553,6 +555,11 @@ public:
return target_->get_aggression();
}
virtual bool get_allow_ally_villages() const override
{
return target_->get_allow_ally_villages();
}
virtual const aspect_map& get_aspects() const override
{
return target_->get_aspects();
@ -1137,6 +1144,8 @@ public:
virtual double get_aggression() const override;
virtual bool get_allow_ally_villages() const override;
virtual const aspect_map& get_aspects() const override;
virtual aspect_map& get_aspects() override;
@ -1282,6 +1291,7 @@ private:
typesafe_aspect_ptr<unit_advancements_aspect> advancements_;
typesafe_aspect_ptr<double> aggression_;
typesafe_aspect_ptr<bool> allow_ally_villages_;
aspect_map aspects_;
typesafe_aspect_ptr<attacks_vector> attacks_;
mutable typesafe_aspect_ptr<terrain_filter> avoid_;

View file

@ -304,6 +304,10 @@ variant formula_ai::get_value(const std::string& key) const
{
return variant(get_aggression()*1000,variant::DECIMAL_VARIANT);
} else if(key == "allow_ally_villages")
{
return visit_helper(get_allow_ally_villages());
} else if(key == "avoid")
{
std::set<map_location> av_locs;

View file

@ -265,11 +265,13 @@ const std::string holder::get_ai_overview()
auto plsk = this->ai_->get_passive_leader_shares_keep();
// In order to display booleans as yes/no rather than 1/0 or true/false
config cfg;
cfg["allow_ally_villages"] = this->ai_->get_allow_ally_villages();
cfg["simple_targeting"] = this->ai_->get_simple_targeting();
cfg["support_villages"] = this->ai_->get_support_villages();
std::stringstream s;
s << "advancements: " << this->ai_->get_advancements().get_value() << std::endl;
s << "aggression: " << this->ai_->get_aggression() << std::endl;
s << "allow_ally_villages: " << cfg["allow_ally_villages"] << 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;

View file

@ -189,6 +189,9 @@ static register_aspect_factory< composite_aspect< unit_advancements_aspect >>
static register_aspect_factory< composite_aspect<double>>
aggression__composite_aspect_factory("aggression*composite_aspect");
static register_aspect_factory< composite_aspect<bool>>
allow_ally_villages__composite_aspect_factory("allow_ally_villages*composite_aspect");
static register_aspect_factory< composite_aspect< attacks_vector >>
attacks__composite_aspect_factory("attacks*composite_aspect");
@ -266,6 +269,9 @@ static register_aspect_factory< standard_aspect< unit_advancements_aspect >>
static register_aspect_factory< standard_aspect<double>>
aggression__standard_aspect_factory("aggression*standard_aspect");
static register_aspect_factory< standard_aspect<bool>>
allow_ally_villages__standard_aspect_factory("allow_ally_villages*standard_aspect");
static register_aspect_factory< ai_default_rca::aspect_attacks >
attacks__testing_ai_default_aspect_attacks_factory("attacks*ai_default_rca::aspect_attacks");
@ -347,6 +353,9 @@ static register_aspect_factory< standard_aspect< unit_advancements_aspect >>
static register_aspect_factory< standard_aspect<double>>
aggression__standard_aspect_factory2("aggression*");
static register_aspect_factory< standard_aspect<bool>>
allow_ally_villages__standard_aspect_factory2("allow_ally_villages*");
static register_aspect_factory< ai_default_rca::aspect_attacks >
attacks__testing_ai_default_aspect_attacks_factory2("attacks*");
@ -424,6 +433,9 @@ static register_lua_aspect_factory< lua_aspect< unit_advancements_aspect >>
static register_lua_aspect_factory< lua_aspect<double>>
aggression__lua_aspect_factory("aggression*lua_aspect");
static register_lua_aspect_factory< lua_aspect<bool>>
allow_ally_villages__lua_aspect_factory("allow_ally_villages*lua_aspect");
static register_lua_aspect_factory< aspect_attacks_lua >
attacks__lua_aspect_factory("attacks*lua_aspect");