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