The Battle for Wesnoth  1.19.13+dev
ai.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2009 - 2025
3  by Yurii Chernyi <terraninfo@terraninfo.net>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 /**
17  * Composite AI with turn sequence which is a vector of stages
18  * @file
19  */
20 
21 #include "ai/composite/ai.hpp"
22 #include "ai/composite/aspect.hpp"
23 #include "ai/composite/engine.hpp"
24 #include "ai/composite/goal.hpp"
26 #include "ai/composite/stage.hpp"
27 #include "ai/configuration.hpp"
28 #include "actions/attack.hpp"
29 #include "log.hpp"
30 
31 #include <functional>
32 
33 namespace ai {
34 
35 static lg::log_domain log_ai_composite("ai/composite");
36 #define DBG_AI_COMPOSITE LOG_STREAM(debug, log_ai_composite)
37 #define LOG_AI_COMPOSITE LOG_STREAM(info, log_ai_composite)
38 #define ERR_AI_COMPOSITE LOG_STREAM(err, log_ai_composite)
39 
40 // =======================================================================
41 // COMPOSITE AI
42 // =======================================================================
43 std::string ai_composite::describe_self() const
44 {
45  return "[composite_ai]";
46 }
47 
49  : cfg_(cfg),stages_(),recursion_counter_(context.get_recursion_count())
50 {
52 }
53 
55 {
56  LOG_AI_COMPOSITE << "side "<< get_side() << " : "<<" created AI with id=["<<
57  cfg_["id"]<<"]";
58 
59  // init the composite ai stages
60  for (const config &cfg_element : cfg_.child_range("stage")) {
61  add_stage(cfg_element);
62  }
63 
65  [this](auto&&... args) { create_engine(args...); });
66 
68  [this](auto&&... args) { create_goal(args...); });
69 
71  [this](auto&&... args) { create_stage(args...); });
72 
74  [this](auto&&... args) { replace_aspect(args...); });
75 }
76 
77 void ai_composite::create_stage(std::vector<stage_ptr> &stages, const config &cfg)
78 {
79  engine::parse_stage_from_config(*this,cfg,std::back_inserter(stages));
80 }
81 
82 void ai_composite::create_goal(std::vector<goal_ptr> &goals, const config &cfg)
83 {
84  engine::parse_goal_from_config(*this,cfg,std::back_inserter(goals));
85 }
86 
87 void ai_composite::create_engine(std::vector<engine_ptr> &engines, const config &cfg)
88 {
89  engine::parse_engine_from_config(*this,cfg,std::back_inserter(engines));
90 }
91 
92 void ai_composite::replace_aspect(std::map<std::string,aspect_ptr> &aspects, const config &cfg, const std::string& id)
93 {
94  std::vector<aspect_ptr> temp_aspects;
95  engine::parse_aspect_from_config(*this,cfg,id,std::back_inserter(temp_aspects));
96  aspects[id] = temp_aspects.back();
97 }
98 
100 {
101 }
102 
104 {
105  std::vector< stage_ptr > stages;
106  create_stage(stages,cfg);
107  int j=0;
108  for (stage_ptr b : stages) {
109  stages_.push_back(b);
110  j++;
111  }
112  return (j>0);
113 }
114 
116 {
117  std::vector< goal_ptr > goals;
118  create_goal(goals,cfg);
119  int j=0;
120  for (goal_ptr b : goals) {
121  get_goals().push_back(b);
122  j++;
123  }
124  return (j>0);
125 }
126 
128  for (stage_ptr &s : stages_) {
129  s->play_stage();
130  }
131 }
132 
133 std::string ai_composite::get_id() const
134 {
135  return cfg_["id"];
136 }
137 
138 
139 std::string ai_composite::get_name() const
140 {
141  return cfg_["name"];
142 }
143 
144 std::string ai_composite::get_engine() const
145 {
146  return cfg_["engine"];
147 }
148 
150 {
155  unit_stats_cache().clear();
156 }
157 
159 {
160  return recursion_counter_.get_count();
161 }
162 
164 {
165  set_side(side);
166 }
167 
169 {
170  return *this;
171 }
172 
174 {
175  config cfg;
176 
177  //serialize the composite ai stages
178  for (const stage_ptr &s : stages_) {
179  cfg.add_child("stage",s->to_config());
180  }
181 
182  return cfg;
183 }
184 
186 {
187  config temp_cfg, parsed_cfg;
188  temp_cfg.add_child("ai", cfg);
189  configuration::parse_side_config(ctx.get_side(), temp_cfg, parsed_cfg);
190  return parsed_cfg;
191 }
192 
193 } //end of namespace ai
Various functions that implement attacks and attack calculations.
#define LOG_AI_COMPOSITE
Definition: ai.cpp:37
Composite AI with turn sequence which is a vector of stages.
virtual void new_turn()
On new turn.
Definition: ai.cpp:149
void replace_aspect(std::map< std::string, aspect_ptr > &aspects, const config &cfg, const std::string &id)
Definition: ai.cpp:92
void create_goal(std::vector< goal_ptr > &goals, const config &cfg)
Definition: ai.cpp:82
virtual bool add_goal(const config &cfg)
Definition: ai.cpp:115
int get_recursion_count() const
Get the value of the recursion counter.
Definition: ai.cpp:158
void create_stage(std::vector< stage_ptr > &stages, const config &cfg)
Definition: ai.cpp:77
void switch_side(side_number side)
Definition: ai.cpp:163
virtual std::string get_id() const
Definition: ai.cpp:133
std::vector< stage_ptr > stages_
Stages of the composite AI.
Definition: ai.hpp:98
static config preparse_cfg(ai_context &ctx, const config &cfg)
Definition: ai.cpp:185
virtual std::string get_name() const
Definition: ai.cpp:139
virtual ai_context & get_ai_context()
unwrap
Definition: ai.cpp:168
recursion_counter recursion_counter_
Recursion counter.
Definition: ai.hpp:103
const config & cfg_
Config of the AI.
Definition: ai.hpp:93
void on_create()
Definition: ai.cpp:54
virtual ~ai_composite()
Destructor.
Definition: ai.cpp:99
void create_engine(std::vector< engine_ptr > &engines, const config &cfg)
Definition: ai.cpp:87
virtual bool add_stage(const config &cfg)
Definition: ai.cpp:103
ai_composite(default_ai_context &context, const config &cfg)
Constructor.
Definition: ai.cpp:48
virtual config to_config() const
serialize
Definition: ai.cpp:173
void play_turn()
Play the turn.
Definition: ai.cpp:127
std::string describe_self() const
Definition: ai.cpp:43
virtual std::string get_engine() const
Definition: ai.cpp:144
property_handler_map & property_handlers()
Definition: component.cpp:116
static bool parse_side_config(side_number side, const config &original_cfg, config &cfg)
virtual void clear_additional_targets() const
Definition: contexts.hpp:171
void init_default_ai_context_proxy(default_ai_context &target)
Definition: contexts.cpp:57
static void parse_goal_from_config(readonly_context &context, const config &cfg, std::back_insert_iterator< std::vector< goal_ptr >> b)
Definition: engine.cpp:79
static void parse_aspect_from_config(readonly_context &context, const config &cfg, const std::string &id, std::back_insert_iterator< std::vector< aspect_ptr >> b)
Definition: engine.cpp:52
static void parse_stage_from_config(ai_context &context, const config &cfg, std::back_insert_iterator< std::vector< stage_ptr >> b)
Definition: engine.cpp:88
static void parse_engine_from_config(readonly_context &context, const config &cfg, std::back_insert_iterator< std::vector< engine_ptr >> b)
Definition: engine.cpp:70
virtual void invalidate_keeps_cache() const override
Definition: contexts.hpp:798
virtual const aspect_map & get_aspects() const override
Definition: contexts.hpp:553
virtual void recalculate_move_maps() const override
Definition: contexts.hpp:818
virtual const std::vector< goal_ptr > & get_goals() const override
Definition: contexts.hpp:628
virtual void invalidate_defensive_position_cache() const override
Definition: contexts.hpp:788
virtual const std::vector< engine_ptr > & get_engines() const override
Definition: contexts.hpp:613
virtual unit_stats_cache_t & unit_stats_cache() const override
Definition: contexts.hpp:858
int get_count() const
Get the current value of the recursion counter.
Definition: contexts.hpp:65
virtual void set_side(side_number side) override
Set the side number.
Definition: contexts.hpp:398
virtual side_number get_side() const override
Get the side number.
Definition: contexts.hpp:393
virtual side_number get_side() const =0
Get the side number.
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:158
child_itors child_range(config_key_type key)
Definition: config.cpp:268
config & add_child(config_key_type key)
Definition: config.cpp:436
Managing the AIs configuration - headers.
AI Support engine - creating specific ai components from config.
const config * cfg
std::string id
Text to match against addon_info.tags()
Definition: manager.cpp:199
Standard logging facilities (interface).
A small explanation about what's going on here: Each action has access to two game_info objects First...
Definition: actions.cpp:59
static lg::log_domain log_ai_composite("ai/composite")
std::shared_ptr< goal > goal_ptr
Definition: game_info.hpp:100
std::shared_ptr< stage > stage_ptr
Definition: game_info.hpp:102
static void register_vector_property(property_handler_map &property_handlers, const std::string &property, std::vector< std::shared_ptr< X >> &values, Factory &&construction_factory)
int side_number
Definition: game_info.hpp:40
static void register_aspect_property(property_handler_map &property_handlers, const std::string &property, std::map< std::string, std::shared_ptr< X >> &aspects, Factory &&construction_factory)
Composite AI component.
Composite AI stages.
static map_location::direction s
#define b