The Battle for Wesnoth 1.21.0-dev
 
Loading...
Searching...
No Matches
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"
24#include "ai/composite/goal.hpp"
27#include "ai/configuration.hpp"
28#include "actions/attack.hpp"
29#include "log.hpp"
30
31#include <functional>
32
33namespace ai {
34
35static 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// =======================================================================
43std::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
77void 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
82void 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
87void 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
92void 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
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
133std::string ai_composite::get_id() const
134{
135 return cfg_["id"];
136}
137
138
139std::string ai_composite::get_name() const
140{
141 return cfg_["name"];
142}
143
144std::string ai_composite::get_engine() const
145{
146 return cfg_["engine"];
147}
148
157
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()
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_engine_from_config(readonly_context &context, const config &cfg, std::back_insert_iterator< std::vector< engine_ptr > > b)
Definition engine.cpp:70
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_goal_from_config(readonly_context &context, const config &cfg, std::back_insert_iterator< std::vector< goal_ptr > > b)
Definition engine.cpp:79
virtual void invalidate_keeps_cache() const override
Definition contexts.hpp:798
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 unit_stats_cache_t & unit_stats_cache() const override
Definition contexts.hpp:858
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 const aspect_map & get_aspects() const override
Definition contexts.hpp:553
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:157
config & add_child(std::string_view key)
Definition config.cpp:436
child_itors child_range(std::string_view key)
Definition config.cpp:268
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 void register_vector_property(property_handler_map &property_handlers, const std::string &property, std::vector< std::shared_ptr< X > > &values, Factory &&construction_factory)
static lg::log_domain log_ai_composite("ai/composite")
std::shared_ptr< goal > goal_ptr
std::shared_ptr< stage > stage_ptr
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)
int side_number
Definition game_info.hpp:40
Composite AI component.
Composite AI stages.
static map_location::direction s
#define b