The Battle for Wesnoth  1.15.0-dev
aspect.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2009 - 2018 by Yurii Chernyi <terraninfo@terraninfo.net>
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  */
18 
19 #include "ai/composite/aspect.hpp"
20 #include "ai/manager.hpp"
21 #include "log.hpp"
22 
23 namespace ai {
24 
25 static lg::log_domain log_ai_aspect("ai/aspect");
26 #define DBG_AI_ASPECT LOG_STREAM(debug, log_ai_aspect)
27 #define LOG_AI_ASPECT LOG_STREAM(info, log_ai_aspect)
28 #define WRN_AI_ASPECT LOG_STREAM(warn, log_ai_aspect)
29 #define ERR_AI_ASPECT LOG_STREAM(err, log_ai_aspect)
30 
31 aspect::aspect(readonly_context &context, const config &cfg, const std::string &id):
32  time_of_day_(cfg["time_of_day"]),turns_(cfg["turns"]),
33  valid_(false), valid_variant_(false), valid_lua_(false), cfg_(cfg),
34  invalidate_on_turn_start_(cfg["invalidate_on_turn_start"].to_bool(true)),
35  invalidate_on_tod_change_(cfg["invalidate_on_tod_change"].to_bool(true)),
36  invalidate_on_gamestate_change_(cfg["invalidate_on_gamestate_change"].to_bool()),
37  invalidate_on_minor_gamestate_change_(cfg["invalidate_on_minor_gamestate_change"].to_bool()),
38  engine_(cfg["engine"]), name_(cfg["name"]), id_(id)
39  {
40  DBG_AI_ASPECT << "creating new aspect: engine=["<<engine_<<"], name=["<<name_<<"], id=["<<id_<<"]"<< std::endl;
42  redeploy(cfg,id);
43  DBG_AI_ASPECT << "aspect has time_of_day=["<<time_of_day_<<"], turns=["<<turns_<<"]" << std::endl;
44  }
45 
46 
48  {
51  manager.remove_turn_started_observer(this);
52  }
54  manager.remove_tod_changed_observer(this);
55  }
57  manager.remove_gamestate_observer(this);
58  }
60  ///@todo 1.9 add minor_gamestate_change_observer
61  //manager::remove_minor_gamestate_observer(this);
62  }
63  }
64 
66 {
67  return log_ai_aspect;
68 }
69 
71 {
72 }
73 
74 bool aspect::redeploy(const config &cfg, const std::string& /*id*/)
75 {
77 
79  manager.remove_turn_started_observer(this);
80  }
82  manager.remove_tod_changed_observer(this);
83  }
85  manager.remove_gamestate_observer(this);
86  }
88  ///@todo 1.9 add minor_gamestate_change_observer
89  //manager::remove_minor_gamestate_observer(this);
90  }
91 
92  valid_ = false;
93  valid_variant_ =false;
94  valid_lua_ = false;
95  cfg_ = cfg;
96  invalidate_on_turn_start_ = cfg["invalidate_on_turn_start"].to_bool(true);
97  invalidate_on_tod_change_ = cfg["invalidate_on_tod_change"].to_bool(true);
98  invalidate_on_gamestate_change_ = cfg["invalidate_on_gamestate_change"].to_bool();
99  invalidate_on_minor_gamestate_change_ = cfg["invalidate_on_minor_gamestate_change"].to_bool();
100  engine_ = cfg["engine"].str();
101  name_ = cfg["name"].str();
102  id_ = cfg["id"].str();
103  DBG_AI_ASPECT << "redeploying aspect: engine=["<<engine_<<"], name=["<<name_<<"], id=["<<id_<<"]"<< std::endl;
105  manager.add_turn_started_observer(this);
106  }
108  manager.add_tod_changed_observer(this);
109  }
111  manager.add_gamestate_observer(this);
112  }
114  ///@todo 1.9 add minor_gamestate_change_observer
115  //manager::add_minor_gamestate_observer(this);
116  }
117  return true;
118 }
119 
121 {
122  config cfg;
123  cfg["invalidate_on_turn_start"] = invalidate_on_turn_start_;
124  cfg["invalidate_on_tod_change"] = invalidate_on_tod_change_;
125  cfg["invalidate_on_gamestate_change"] = invalidate_on_gamestate_change_;
126  cfg["invalidate_on_minor_gamestate_change"] = invalidate_on_minor_gamestate_change_;
127  if (!time_of_day_.empty()) {
128  cfg["time_of_day"] = time_of_day_;
129  }
130  if (!turns_.empty()) {
131  cfg["turns"] = turns_;
132  }
133  cfg["engine"] = engine_;
134  cfg["name"] = name_;
135  cfg["id"] = id_;
136  return cfg;
137 }
138 
139 bool aspect::active() const
140 {
141  return this->is_active(time_of_day_,turns_);
142 }
143 
145 {
146  return false;
147 }
148 
149 known_aspect::known_aspect(const std::string &name)
150  : name_(name)
151 {
152 }
153 
154 const std::string& known_aspect::get_name() const
155 {
156  return name_;
157 }
158 
160 {
161 }
162 
163 std::string lua_aspect_visitor::quote_string(const std::string& s)
164 {
165  if (s.find_first_of('"') == std::string::npos) {
166  return '"' + s + '"';
167  } else if (s.find_first_of("'") == std::string::npos) {
168  return "'" + s + "'";
169  } else {
170  return "[=====[" + s + "]=====]";
171  }
172 }
173 
174 // This is defined in the source file so that it can easily access the logger
175 bool aspect_factory::is_duplicate(const std::string& name)
176 {
177  if (get_list().find(name) != get_list().end()) {
178  ERR_AI_ASPECT << "Error: Attempt to double-register aspect " << name << std::endl;
179  return true;
180  }
181  return false;
182 }
183 
184 } //end of namespace ai
bool invalidate_on_tod_change_
Definition: aspect.hpp:99
static lg::log_domain log_ai_aspect("ai/aspect")
bool valid_variant_
Definition: aspect.hpp:94
virtual bool is_active(const std::string &time_of_day, const std::string &turns) const override
Definition: contexts.hpp:882
std::string turns_
Definition: aspect.hpp:91
static manager & get_singleton()
Definition: manager.hpp:151
bool is_duplicate(const std::string &name)
Definition: aspect.cpp:175
virtual ~aspect()
Definition: aspect.cpp:47
bool invalidate_on_minor_gamestate_change_
Definition: aspect.hpp:101
void add_turn_started_observer(events::observer *event_observer)
Adds an observer of &#39;ai_turn_started&#39; event.
Definition: manager.cpp:380
virtual bool redeploy(const config &cfg, const std::string &id)
Definition: aspect.cpp:74
Class that manages AIs for all sides and manages AI redeployment.
Definition: manager.hpp:118
std::string time_of_day_
Definition: aspect.hpp:90
bool valid_lua_
Definition: aspect.hpp:95
void add_tod_changed_observer(events::observer *event_observer)
Adds an observer of &#39;ai_tod_changed&#39; event.
Definition: manager.cpp:357
virtual bool delete_all_facets()
Definition: aspect.cpp:144
static const char * name(const std::vector< SDL_Joystick *> &joysticks, const std::size_t index)
Definition: joystick.cpp:48
A small explanation about what&#39;s going on here: Each action has access to two game_info objects First...
Definition: actions.cpp:58
void remove_gamestate_observer(events::observer *event_observer)
Removes an observer of game events except ai_user_interact event and ai_sync_network event...
Definition: manager.cpp:350
std::string name_
Definition: aspect.hpp:103
void remove_turn_started_observer(events::observer *event_observer)
Deletes an observer of &#39;ai_turn_started&#39; event.
Definition: manager.cpp:398
static lg::log_domain & log()
Definition: aspect.cpp:65
static std::string quote_string(const std::string &s)
Definition: aspect.cpp:163
known_aspect(const std::string &name)
Definition: aspect.cpp:149
const std::string name_
Definition: aspect.hpp:205
Managing the AIs lifecycle - headers.
virtual config to_config() const
Definition: aspect.cpp:120
std::string id_
Definition: aspect.hpp:104
aspect(readonly_context &context, const config &cfg, const std::string &id)
Definition: aspect.cpp:31
bool invalidate_on_turn_start_
Definition: aspect.hpp:98
const std::string & get_name() const
Definition: aspect.cpp:154
static map_location::DIRECTION s
virtual void on_create()
Definition: aspect.cpp:70
void remove_tod_changed_observer(events::observer *event_observer)
Deletes an observer of &#39;ai_tod_changed&#39; event.
Definition: manager.cpp:362
virtual bool active() const
Definition: aspect.cpp:139
bool valid_
Definition: aspect.hpp:93
#define ERR_AI_ASPECT
Definition: aspect.cpp:29
#define DBG_AI_ASPECT
Definition: aspect.cpp:26
bool find(E event, F functor)
Tests whether an event handler is available.
void add_gamestate_observer(events::observer *event_observer)
Adds observer of game events except ai_user_interact event and ai_sync_network event.
Definition: manager.cpp:343
Standard logging facilities (interface).
config cfg_
Definition: aspect.hpp:97
std::string engine_
Definition: aspect.hpp:102
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:92
virtual ~known_aspect()
Definition: aspect.cpp:159
bool invalidate_on_gamestate_change_
Definition: aspect.hpp:100
void init_readonly_context_proxy(readonly_context &target)
Definition: contexts.hpp:512