1 /* 2 Copyright (C) 2009 - 2018 by Bartosz Waresiak <dragonking@o2.pl> 3 Part of the Battle for Wesnoth Project https://www.wesnoth.org/ 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2 of the License, or 8 (at your option) any later version. 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY. 11 12 See the COPYING file for more details. 13 */ 14 15 /** 16 * @file 17 * Defines formula ai candidate actions - headers 18 * */ 19 20 #pragma once 21 22 #include <set> 23 24 class unit_map; 25 class config; 26 27 namespace ai { 28 class formula_ai; 29 } 30 31 namespace wfl { 32 33 class base_candidate_action; 34 35 typedef std::map< std::string, const_formula_ptr > candidate_action_filters; 36 typedef std::shared_ptr<base_candidate_action> candidate_action_ptr; 37 38 //every new candidate action type should be derived from this class 39 //and should complete evaluate and update_callable_map methods 40 class base_candidate_action { 41 public: 42 base_candidate_action(const std::string& name, const std::string& type,const config& cfg, function_symbol_table* function_table); 43 ~base_candidate_action()44 virtual ~base_candidate_action() {} 45 46 //evaluate candidate action using eval_ formula evaluate(ai::formula_ai *,unit_map &)47 virtual void evaluate(ai::formula_ai* /*ai*/, unit_map& /*units*/) {} 48 49 //adds needed callable objects to callable map update_callable_map(map_formula_callable &)50 virtual void update_callable_map(map_formula_callable& /*callable*/) {} 51 52 53 //return score of last evaluation get_score() const54 int get_score() const {return score_;} 55 get_action()56 const_formula_ptr& get_action() {return action_;} 57 get_name() const58 const std::string& get_name() const { return name_;} get_type() const59 const std::string& get_type() const { return type_;} 60 61 protected: 62 int execute_formula(const const_formula_ptr& formula, 63 const formula_callable& callable, const ai::formula_ai* ai); 64 65 std::string name_; 66 std::string type_; 67 const_formula_ptr eval_; 68 const_formula_ptr action_; 69 int score_; 70 }; 71 72 73 class candidate_action_with_filters : public base_candidate_action { 74 public: 75 candidate_action_with_filters(const std::string& name, const std::string& type,const config& cfg, function_symbol_table* function_table); 76 protected: 77 variant do_filtering(ai::formula_ai* ai, variant& input, const_formula_ptr formula); 78 79 candidate_action_filters filter_map_; 80 }; 81 82 class move_candidate_action : public candidate_action_with_filters { 83 public: 84 move_candidate_action(const std::string& name, const std::string& type,const config& cfg, function_symbol_table* function_table); 85 86 virtual void evaluate(ai::formula_ai* ai, unit_map& units); 87 88 virtual void update_callable_map(map_formula_callable& callable); 89 90 protected: 91 variant my_unit_; 92 }; 93 94 class attack_candidate_action : public candidate_action_with_filters { 95 public: 96 attack_candidate_action(const std::string& name, const std::string& type,const config& cfg, function_symbol_table* function_table); 97 98 virtual void evaluate(ai::formula_ai* ai, unit_map& units); 99 100 virtual void update_callable_map(map_formula_callable& callable); 101 protected: 102 variant my_unit_; 103 variant enemy_unit_; 104 }; 105 106 } 107