The Battle for Wesnoth  1.17.21+dev
connect_engine.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2013 - 2023
3  by Andrius Silinskas <silinskas.andrius@gmail.com>
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 #pragma once
17 
18 #include "commandline_options.hpp"
19 #include "config.hpp"
20 #include "flg_manager.hpp"
21 #include "saved_game.hpp"
22 #include <set>
23 
24 namespace randomness { class mt_rng; }
25 struct mp_game_metadata;
26 class game_config_view;
27 
28 namespace ng {
29 
30 enum controller {
36 };
37 
38 class connect_engine;
39 class side_engine;
40 
41 typedef std::shared_ptr<side_engine> side_engine_ptr;
42 typedef std::pair<ng::controller, std::string> controller_option;
43 
45 {
46 public:
48  const bool first_scenario, mp_game_metadata* metadata);
49 
51 
52  void import_user(const std::string& name, const bool observer,
53  int side_taken = -1);
54  void import_user(const config& data, const bool observer,
55  int side_taken = -1);
56 
57  // Returns true if there are still sides available for this game.
58  bool sides_available() const;
59 
60  // Import all sides into the level.
61  void update_level();
62  // Updates the level and sends a diff to the clients.
63  void update_and_send_diff();
64 
65  bool can_start_game() const;
66  void start_game();
68 
69  void leave_game();
70 
71  // Return pair first element specifies whether to leave the game
72  // and second element whether to silently update UI.
73  std::pair<bool, bool> process_network_data(const config& data);
74 
75  // Returns the side which is taken by a given user,
76  // or -1 if none was found.
77  int find_user_side_index_by_id(const std::string& id) const;
78 
79 
80  /* Setters & Getters */
81 
82  const config& level() const { return level_; }
84  {
85  if(auto scenario = level_.optional_child("scenario"))
86  return *scenario;
87  else if(auto snapshot = level_.optional_child("snapshot"))
88  return *snapshot;
89  else
90  throw "No scenariodata found";
91  }
92  const std::set<std::string>& connected_users() const;
93 
95  {
96  std::string team_name;
97  std::string user_team_name; // TODO: use t_string?
98 
100  };
101 
102  const std::vector<team_data_pod>& team_data() const
103  {
104  return team_data_;
105  }
106 
107  std::vector<side_engine_ptr>& side_engines() { return side_engines_; }
108  const mp_game_settings& params() const { return params_; }
109  bool first_scenario() const { return first_scenario_; }
110  bool force_lock_settings() const { return force_lock_settings_; }
111 
112 private:
113  connect_engine(const connect_engine&) = delete;
115 
116  void send_level_data() const;
117 
120 
122 
123  friend class side_engine;
124 
127 
129 
132  const bool first_scenario_;
133 
135 
136  std::vector<side_engine_ptr> side_engines_;
137  std::vector<const config*> era_factions_;
138  std::vector<team_data_pod> team_data_;
139 
140  std::set<std::string>& connected_users_rw();
141 };
142 
144 {
145 public:
146  side_engine(const config& cfg, connect_engine& parent_engine,
147  const int index);
148 
149  // An untranslated user_description which is used by other clients
150  // An empty string means the other clients should generate the description on their own
151  // Used by new_config().
152  std::string user_description() const;
153 
154  // Creates a config representing this side.
155  config new_config() const;
156 
157  // Returns true, if the player has chosen his/her leader and this side
158  // is ready for the game to start.
159  bool ready_for_start() const;
160  // Returns true if this side is waiting for a network player and
161  // players are allowed.
162  bool available_for_user(const std::string& name = "") const;
163 
164  void resolve_random( randomness::mt_rng & rng, const std::vector<std::string> & avoid_faction_ids = std::vector<std::string>());
165 
166  // Resets this side to its default state.
167  void reset();
168 
169  // Place user into this side.
170  void place_user(const std::string& name);
171  void place_user(const config& data, bool contains_selection = false);
172 
175  bool controller_changed(const int selection);
177 
178  // Game set up from command line helpers.
179  void set_faction_commandline(const std::string& faction_name);
180  void set_controller_commandline(const std::string& controller_name);
181 
182  /* Setters & Getters */
183 
184  std::string save_id() const
185  { return (!cfg_["save_id"].empty()) ? cfg_["save_id"] : cfg_["id"]; }
186  // The id of the side of the previous scenario that should control this side.
187  std::string previous_save_id() const
188  { return (!cfg_["previous_save_id"].empty()) ? cfg_["previous_save_id"] : save_id(); }
189  const std::vector<controller_option>& controller_options() const
190  { return controller_options_; }
191  const config& cfg() const { return cfg_; }
193  unsigned current_controller_index() const
194  { return current_controller_index_; }
195  int index() const { return index_; }
196  void set_index(int index) { index_ = index; }
197  unsigned team() const { return team_; }
198  void set_team(unsigned team) { team_ = team; }
199  std::multimap<std::string, config> get_side_children();
200  void set_side_children(std::multimap<std::string, config> children);
201  int color() const { return color_; }
203  int gold() const { return gold_; }
204  void set_gold(int gold) { gold_ = gold; }
205  int income() const { return income_; }
206  void set_income(int income) { income_ = income; }
207  const std::string& player_id() const { return player_id_; }
208  const std::string& reserved_for() const { return reserved_for_; }
209  void set_reserved_for(const std::string& reserved_for)
211  const std::string& ai_algorithm() const { return ai_algorithm_; }
212  void set_ai_algorithm(const std::string& ai_algorithm)
214  bool allow_player() const { return allow_player_; }
215  bool allow_changes() const { return allow_changes_; }
218  bool allow_shuffle() const { return !disallow_shuffle_;}
219  flg_manager& flg() { return flg_; }
220 
221  const std::string color_id() const { return color_id_; }
222  const std::vector<std::string>& color_options() const { return color_options_; }
223 
224  const std::string team_name() const
225  {
226  return parent_.team_data_[team_].team_name;
227  }
228 
229  const std::string user_team_name() const
230  {
231  return t_string::from_serialized(parent_.team_data_[team_].user_team_name);
232  }
233 
234 private:
235  side_engine(const side_engine& engine) = delete;
236  side_engine& operator=(const side_engine&) = delete;
237 
238  friend class connect_engine;
239 
241  const std::string& name, const std::string& controller_value);
242 
245 
248  std::vector<controller_option> controller_options_;
249 
250  const bool allow_player_;
251  const bool controller_lock_;
252 
253  int index_;
254  unsigned team_;
255  int color_;
256  int gold_;
257  int income_;
258  // set during create_engines constructor never set after that.
259  // the name of the player who is preferred for this side,
260  // if controller_ == reserved only this player can take this side.
261  // can also be a number of a side if this side should be controlled
262  // by the player who controls that side
263  std::string reserved_for_;
264  std::string player_id_;
265  std::string ai_algorithm_;
266 
270  const bool allow_changes_;
272 
273  std::vector<std::string> color_options_;
274 
275  std::string color_id_;
276 };
277 
278 } // end namespace ng
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:161
optional_config_impl< config > optional_child(config_key_type key, int n=0)
Euivalent to mandatory_child, but returns an empty optional if the nth child was not found.
Definition: config.cpp:389
A class grating read only view to a vector of config objects, viewed as one config with all children ...
const config & level() const
const std::vector< team_data_pod > & team_data() const
std::vector< const config * > era_factions_
std::vector< team_data_pod > team_data_
std::vector< side_engine_ptr > & side_engines()
bool first_scenario() const
const ng::controller default_controller_
std::set< std::string > & connected_users_rw()
std::pair< bool, bool > process_network_data(const config &data)
void import_user(const std::string &name, const bool observer, int side_taken=-1)
bool sides_available() const
std::vector< side_engine_ptr > side_engines_
const bool first_scenario_
bool force_lock_settings() const
void save_reserved_sides_information()
const std::set< std::string > & connected_users() const
const mp_game_settings & params() const
const mp_game_settings & params_
void send_level_data() const
connect_engine & operator=(const connect_engine &)=delete
mp_game_metadata * mp_metadata_
void update_side_controller_options()
connect_engine(saved_game &state, const bool first_scenario, mp_game_metadata *metadata)
void start_game_commandline(const commandline_options &cmdline_opts, const game_config_view &game_config)
connect_engine(const connect_engine &)=delete
int find_user_side_index_by_id(const std::string &id) const
bool can_start_game() const
FLG stands for faction, leader and gender.
Definition: flg_manager.hpp:30
const std::string team_name() const
const config & cfg() const
void set_gold(int gold)
void set_team(unsigned team)
unsigned current_controller_index_
unsigned team() const
void update_controller_options()
flg_manager & flg()
bool waiting_to_choose_faction() const
std::string player_id_
std::string previous_save_id() const
const bool controller_lock_
const bool allow_changes_
void set_controller_commandline(const std::string &controller_name)
void set_income(int income)
void set_faction_commandline(const std::string &faction_name)
int income() const
void place_user(const std::string &name)
void add_controller_option(ng::controller controller, const std::string &name, const std::string &controller_value)
const std::vector< std::string > & color_options() const
void resolve_random(randomness::mt_rng &rng, const std::vector< std::string > &avoid_faction_ids=std::vector< std::string >())
void update_current_controller_index()
void set_side_children(std::multimap< std::string, config > children)
side_engine(const config &cfg, connect_engine &parent_engine, const int index)
std::vector< controller_option > controller_options_
const std::string user_team_name() const
std::string save_id() const
connect_engine & parent_
side_engine(const side_engine &engine)=delete
std::string ai_algorithm_
side_engine & operator=(const side_engine &)=delete
void set_reserved_for(const std::string &reserved_for)
bool allow_player() const
std::string reserved_for_
void set_index(int index)
std::vector< std::string > color_options_
void set_controller(ng::controller controller)
void set_waiting_to_choose_status(bool status)
void set_color(int color)
bool controller_changed(const int selection)
std::string color_id_
std::string user_description() const
ng::controller controller_
const std::string & ai_algorithm() const
bool allow_shuffle() const
std::multimap< std::string, config > get_side_children()
const std::string color_id() const
bool ready_for_start() const
void set_ai_algorithm(const std::string &ai_algorithm)
config new_config() const
bool allow_changes() const
const std::vector< controller_option > & controller_options() const
const std::string & player_id() const
const std::string & reserved_for() const
ng::controller controller() const
bool available_for_user(const std::string &name="") const
unsigned current_controller_index() const
const bool allow_player_
static t_string from_serialized(const std::string &string)
Definition: tstring.hpp:154
This class stores all the data for a single 'side' (in game nomenclature).
Definition: team.hpp:76
std::string observer
Game configuration data as global variables.
Definition: build_info.cpp:63
static std::string controller_name(const team &t)
Definition: game_stats.cpp:69
@ CNTR_RESERVED
@ CNTR_NETWORK
@ CNTR_COMPUTER
@ CNTR_EMPTY
@ CNTR_LOCAL
std::pair< ng::controller, std::string > controller_option
std::shared_ptr< side_engine > side_engine_ptr
std::string_view data
Definition: picture.cpp:199