27 #define ERR_AI LOG_STREAM(err, log_formula_ai) 36 eval_(new
formula(cfg[
"evaluation"], function_table)),
37 action_(new
formula(cfg[
"action"], function_table)),
52 ERR_AI <<
"formula type error while evaluating candidate action: " << e.
message << std::endl;
59 const std::string& name,
const std::string&
type,
70 new formula(filter_param.second, function_table));
80 callable.
add(
"input", input);
97 candidate_action_filters::const_iterator me_filter =
filter_map_.find(
"me");
99 std::vector<variant> unit_vector;
103 if (
i->side() == ai->
get_side() &&
i->movement_left() > 0) {
104 unit_vector.emplace_back(std::make_shared<unit_callable>(*
i));
113 filtered_units =
do_filtering(ai, my_units, me_filter->second);
115 filtered_units=my_units;
125 callable.
add(
"me", *
i);
153 candidate_action_filters::const_iterator me_filter =
filter_map_.find(
"me");
154 candidate_action_filters::const_iterator target_filter =
filter_map_.find(
"target");
156 std::vector<variant> my_res, enemy_res;
162 if (
i->attacks_left()) {
163 my_res.emplace_back(std::make_shared<unit_callable>(*
i));
168 enemy_res.emplace_back(std::make_shared<unit_callable>(*
i));
173 variant enemy_units(enemy_res);
175 variant filtered_my_units, filtered_enemy_units;
178 filtered_my_units =
do_filtering(ai, my_units, me_filter->second);
180 filtered_my_units = my_units;
183 filtered_enemy_units =
do_filtering(ai, enemy_units, target_filter->second);
185 filtered_enemy_units = enemy_units;
197 ERR_AI <<
"Error while executing filter formulas for '" +
get_name() +
"' Candidate Action: " << e.
message << std::endl;
201 std::vector<variant> my_units_flt;
202 std::vector<variant> enemy_units_flt;
207 ERR_AI <<
"ERROR in "<<
get_name() <<
"Candidate Action: Filter formula returned table that does not contain units" << std::endl;
210 my_units_flt.emplace_back(u_callable);
216 ERR_AI <<
"ERROR in "<<
get_name() <<
"Candidate Action: Filter formula returned table that does not contain units" << std::endl;
219 enemy_units_flt.emplace_back(u_callable);
222 for( std::size_t my_unit = 0 ; my_unit < my_units_flt.size() ; ++my_unit){
223 auto my_unit_callable = my_units_flt[my_unit].convert_to<
unit_callable>();
224 for( std::size_t enemy_unit = 0 ; enemy_unit < enemy_units_flt.size() ; ++enemy_unit){
225 auto enemy_unit_callable = enemy_units_flt[enemy_unit].convert_to<
unit_callable>();
226 if(ai->
can_reach_unit(my_unit_callable->get_location(), enemy_unit_callable->get_location())) {
229 callable.
add(
"me", filtered_my_units[my_unit]);
230 callable.
add(
"target", filtered_enemy_units[enemy_unit]);
236 my_unit_ = filtered_my_units[my_unit];
config & child(config_key_type key, int n=0)
Returns the nth child with the given key, or a reference to an invalid config if there is none...
Defines formula ai candidate actions - headers.
const std::string & get_name() const
virtual void evaluate(ai::formula_ai *ai, unit_map &units)
attribute_map::value_type attribute
candidate_action_with_filters(const std::string &name, const std::string &type, const config &cfg, function_symbol_table *function_table)
static lg::log_domain log_formula_ai("ai/engine/fai")
const_attr_itors attribute_range() const
virtual void update_callable_map(map_formula_callable &callable)
A small explanation about what's going on here: Each action has access to two game_info objects First...
move_candidate_action(const std::string &name, const std::string &type, const config &cfg, function_symbol_table *function_table)
variant do_filtering(ai::formula_ai *ai, variant &input, const_formula_ptr formula)
virtual void evaluate(ai::formula_ai *ai, unit_map &units)
bool is_enemy(int n) const
variant_iterator end() const
virtual const team & current_team() const override
virtual side_number get_side() const override
Get the side number.
std::shared_ptr< const formula > const_formula_ptr
virtual void update_callable_map(map_formula_callable &callable)
variant_iterator begin() const
Standard logging facilities (interface).
Container associating units to locations.
candidate_action_filters filter_map_
std::size_t num_elements() const
attack_candidate_action(const std::string &name, const std::string &type, const config &cfg, function_symbol_table *function_table)
Iterator class for the variant.
A config object defines a single node in a WML file, with access to child nodes.
base_candidate_action(const std::string &name, const std::string &type, const config &cfg, function_symbol_table *function_table)
int execute_formula(const const_formula_ptr &formula, const formula_callable &callable, const ai::formula_ai *ai)