The Battle for Wesnoth 1.21.0-dev
 
Loading...
Searching...
No Matches
engine.hpp
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 * AI Support engine - creating specific ai components from config
18 * @file
19 */
20
21#pragma once
22
24#include "ai/contexts.hpp"
25
26#include <iterator>
27
28//============================================================================
29
30namespace ai {
31
32class rca_context;
33
34class engine : public component {
35public:
36 engine( readonly_context &context, const config &cfg );
37
38 virtual ~engine();
39
40 virtual bool is_ok() const;
41
42 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 );
43
44 static void parse_goal_from_config( readonly_context &context, const config &cfg, std::back_insert_iterator<std::vector< goal_ptr >> b );
45
46 static void parse_candidate_action_from_config( rca_context &context, const config &cfg, std::back_insert_iterator<std::vector< candidate_action_ptr >> b );
47
48 static void parse_engine_from_config( readonly_context &context, const config &cfg, std::back_insert_iterator<std::vector< engine_ptr >> b );
49
50 static void parse_stage_from_config( ai_context &context, const config &cfg, std::back_insert_iterator<std::vector< stage_ptr >> b );
51
52 //do not override that method in subclasses which cannot create aspects
53 virtual void do_parse_aspect_from_config( const config &cfg, const std::string &id, std::back_insert_iterator< std::vector< aspect_ptr>> b );
54
55 //do not override that method in subclasses which cannot create candidate_actions
56 virtual void do_parse_candidate_action_from_config( rca_context &context, const config &cfg, std::back_insert_iterator<std::vector< candidate_action_ptr >> b );
57
58 //do not override that method in subclasses which cannot create goals
59 virtual void do_parse_goal_from_config( const config &cfg, std::back_insert_iterator<std::vector< goal_ptr >> b );
60
61 //do not override that method in subclasses which cannot create engines
62 virtual void do_parse_engine_from_config( const config &cfg, std::back_insert_iterator<std::vector< engine_ptr >> b );
63
64 //do not override that method in subclasses which cannot create stages
65 virtual void do_parse_stage_from_config( ai_context &context, const config &cfg, std::back_insert_iterator<std::vector< stage_ptr >> b );
66
68
69 /**
70 * set ai context (which is not available during early initialization)
71 */
72 virtual void set_ai_context(ai_context_ptr context);
73
75 /**
76 * serialize
77 */
78 virtual config to_config() const;
79
80 virtual std::string get_id() const
81 { return id_; }
82
83 virtual std::string get_engine() const
84 { return engine_; }
85
86 virtual std::string get_name() const
87 { return name_; }
88
89protected:
92
93 /** name of the engine which has created this engine*/
94 std::string engine_;
95 std::string id_;
96 std::string name_;
97};
98
99
101 bool is_duplicate(const std::string &name);
102public:
103 typedef std::shared_ptr< engine_factory > factory_ptr;
104 typedef std::map<std::string, factory_ptr> factory_map;
105 typedef std::pair<const std::string, factory_ptr> factory_map_pair;
106
108 static factory_map *engine_factories;
109 if (engine_factories==nullptr) {
110 engine_factories = new factory_map;
111 }
112 return *engine_factories;
113 }
114
116 virtual engine_ptr get_new_instance( readonly_context &ai, const std::string& name ) = 0;
117
118 engine_factory( const std::string &name )
119 {
120 if (is_duplicate(name)) {
121 return;
122 }
123 factory_ptr ptr_to_this(this);
124 get_list().emplace(name,ptr_to_this);
125 }
126
127 virtual ~engine_factory() {}
128};
129
130template<class ENGINE>
132public:
133 register_engine_factory( const std::string &name )
134 : engine_factory( name )
135 {
136 }
137
139 engine_ptr e = std::make_shared<ENGINE>(ai, cfg);
140 if (!e->is_ok()) {
141 return engine_ptr();
142 }
143 return e;
144 }
145
146 virtual engine_ptr get_new_instance( readonly_context &ai, const std::string& name ){
147 config cfg;
148 cfg["name"] = name;
149 cfg["engine"] = "cpp"; // @Crab: what is the purpose of this line(neph)
150 return std::make_shared<ENGINE>(ai, cfg);
151 }
152};
153
154} //end of namespace ai
virtual engine_ptr get_new_instance(readonly_context &ai, const std::string &name)=0
virtual engine_ptr get_new_instance(readonly_context &ai, const config &cfg)=0
engine_factory(const std::string &name)
Definition engine.hpp:118
static factory_map & get_list()
Definition engine.hpp:107
virtual ~engine_factory()
Definition engine.hpp:127
std::map< std::string, factory_ptr > factory_map
Definition engine.hpp:104
std::pair< const std::string, factory_ptr > factory_map_pair
Definition engine.hpp:105
std::shared_ptr< engine_factory > factory_ptr
Definition engine.hpp:103
bool is_duplicate(const std::string &name)
Definition engine.cpp:143
std::string engine_
name of the engine which has created this engine
Definition engine.hpp:94
virtual ai_context_ptr get_ai_context()
Definition engine.cpp:124
std::string name_
Definition engine.hpp:96
virtual void do_parse_engine_from_config(const config &cfg, std::back_insert_iterator< std::vector< engine_ptr > > b)
Definition engine.cpp:106
virtual std::string get_id() const
Definition engine.hpp:80
virtual void set_ai_context(ai_context_ptr context)
set ai context (which is not available during early initialization)
Definition engine.cpp:119
virtual ~engine()
Definition engine.cpp:43
virtual void do_parse_aspect_from_config(const config &cfg, const std::string &id, std::back_insert_iterator< std::vector< aspect_ptr > > b)
Definition engine.cpp:97
virtual config to_config() const
serialize
Definition engine.cpp:129
virtual std::string get_name() const
Definition engine.hpp:86
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
ai_context_ptr ai_context_
Definition engine.hpp:91
virtual void do_parse_goal_from_config(const config &cfg, std::back_insert_iterator< std::vector< goal_ptr > > b)
Definition engine.cpp:110
virtual void do_parse_stage_from_config(ai_context &context, const config &cfg, std::back_insert_iterator< std::vector< stage_ptr > > b)
Definition engine.cpp:114
virtual void do_parse_candidate_action_from_config(rca_context &context, const config &cfg, std::back_insert_iterator< std::vector< candidate_action_ptr > > b)
Definition engine.cpp:102
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
readonly_context & ai_
Definition engine.hpp:90
static void parse_candidate_action_from_config(rca_context &context, const config &cfg, std::back_insert_iterator< std::vector< candidate_action_ptr > > b)
Definition engine.cpp:61
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 bool is_ok() const
Definition engine.cpp:47
readonly_context & get_readonly_context()
Definition engine.cpp:137
virtual std::string get_engine() const
Definition engine.hpp:83
std::string id_
Definition engine.hpp:95
virtual engine_ptr get_new_instance(readonly_context &ai, const std::string &name)
Definition engine.hpp:146
register_engine_factory(const std::string &name)
Definition engine.hpp:133
virtual engine_ptr get_new_instance(readonly_context &ai, const config &cfg)
Definition engine.hpp:138
A config object defines a single node in a WML file, with access to child nodes.
Definition config.hpp:157
A component of the AI framework.
Helper functions for the object which operates in the context of AI for specific side this is part of...
const config * cfg
A small explanation about what's going on here: Each action has access to two game_info objects First...
Definition actions.cpp:59
std::shared_ptr< engine > engine_ptr
Definition game_info.hpp:99
#define e
#define b