The Battle for Wesnoth  1.17.0-dev
saved_game.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 - 2021
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 #pragma once
16 
17 #include "config.hpp"
18 #include "game_classification.hpp"
19 #include "mp_game_settings.hpp"
20 #include "replay_recorder_base.hpp"
21 
22 class config_writer;
23 
25 {
26  enum class starting_point {
27  /** There is no scenario stating pos data (start-of-scenario). */
28  NONE,
29  /** We have a [snapshot] (mid-game-savefile). */
30  SNAPSHOT,
31  /** We have a [scenario] (start-of-scenario) savefile. */
32  SCENARIO,
33  /** We failed to get a starting pos in expand_scenario. */
34  INVALID
35  };
36 
37 public:
38  saved_game();
39  saved_game(const saved_game& state);
40  explicit saved_game(config cfg);
42 
43  saved_game& operator=(const saved_game& other) = delete;
45  void swap(saved_game& other);
46  /** destroys the passed config. */
47  void set_data(config& cfg);
48  void clear();
49  /** writes the config information into a stream (file) */
50  void write_config(config_writer& out) const;
51  void write_general_info(config_writer& out) const;
52  void write_carryover(config_writer& out) const;
53  void write_starting_point(config_writer& out) const;
54  config to_config() const;
57 
58  /** Multiplayer parameters for this game */
60  const mp_game_settings& mp_settings() const { return mp_settings_; }
61 
62  void set_carryover_sides_start(config carryover_sides_start);
63 
64  /**
65  * copies the content of a [scenario] with the correct id attribute from the game config into this object.
66  * reloads the game config from disk if necessary.
67  */
68  void expand_scenario();
69  /**
70  * merges [carryover_sides_start] into [scenario] and saves the rest into [carryover_sides]
71  * Removes [carryover_sides_start] afterwards
72  */
73  void expand_carryover();
74  /**
75  * adds [event]s from [era] and [modification] into this scenario
76  * does NOT expand [option]s because variables are persitent anyway to we don't need it
77  * should be called after expand_scenario() but before expand_carryover()
78  */
79  void expand_mp_events();
80  /** helper for expand_mp_events(); */
81  void load_non_scenario(const std::string& type, const std::string& id, size_t pos);
82  /**
83  * adds values of [option]s into [carryover_sides_start][variables] so that they are applied in the next level.
84  * Note that since [variabels] are persistent we only use this once at the beginning
85  * of a campaign but calling it multiple times is no harm eigher
86  */
87  void expand_mp_options();
88  /**
89  * takes care of generate_map=, generate_scenario=, map= attributes
90  * This should be called before expanding carryover or mp_events because this might completely replace starting_point_.
91  */
93  /** copies attributes & tags from the 'outer' [scenario] to the scenario that is generated by scenario_generation= */
94  static void post_scenario_generation(const config& old_scenario, config& generated_scenario);
95  /** reads scenario["map_file"] */
96  static void expand_map_file(config& scenario);
97  /** Add addon_id information if needed. */
99  bool valid() const;
100  /** @return the snapshot in the savefile (get_starting_point) */
101  config& set_snapshot(config snapshot);
102  void set_scenario(config scenario);
103  void remove_snapshot();
104 
105  bool is_mid_game_save() const
106  {
108  }
109  /**
110  * converts a normal savegame form the end of a scenaio to a start-of-scenario savefile for the next scenaio,
111  * The saved_game must contain a [snapshot] made during the linger mode of the last scenaio.
112  */
113  void convert_to_start_save();
114  /** sets the random seed if that didn't already happen. */
115  void set_random_seed();
116  /** @return the starting pos for replays. Usually this is [replay_start] but it can also be a [scenario] if no [replay_start] is present */
118  /** @return the id of the currently played scenario or the id of the next scenario if this is a between-scenaios-save (also called start-of-scenario-save). */
119  std::string get_scenario_id() const;
120  /** @return the config from which the game will be started. (this is [scenario] or [snapshot] in the savefile) */
122  const config& get_starting_point() const { return starting_point_; }
124  const config& replay_start() const { return replay_start_; }
125 
126  bool not_corrupt() const;
127  /** sets classification().label to the correct value. */
128  void update_label();
129 
130  void cancel_orders();
131  /* removes network_ai and network controller types*/
132  void unify_controllers();
133  /** does some post loading stuff must be used before passing the data to connect_engine */
134  void set_defaults();
136  const replay_recorder_base& get_replay() const { return replay_data_; }
137 
138  /** Whether to play [story] tags */
139  bool skip_story() const { return skip_story_; }
141 
142 private:
144  /**
145  depends on has_carryover_expanded_:
146  if true: The carryover information for all sides from the previous scenario that aren't used in this scenario (to be carried over to the next scenario).
147  if false: The carryover information for all sides from the previous scenario.
148  */
150  /** snapshot made before the start event. To be used as a starting pos for replays */
152  /** some general information of the game that doesn't change during the game */
155 
157  /**
158  The starting pos where the (non replay) game will be started from.
159  This can eigher be a [scenario] for a fresh game or a [snapshot] if this is a reloaded game
160  */
162 
164 
166 };
167 
168 /** Implement non-member swap function for std::swap (calls @ref saved_game::swap). */
169 void swap(saved_game& lhs, saved_game& rhs);
void check_require_scenario()
Add addon_id information if needed.
Definition: saved_game.cpp:296
config replay_start_
snapshot made before the start event.
Definition: saved_game.hpp:151
void write_general_info(config_writer &out) const
Definition: saved_game.cpp:210
bool is_mid_game_save() const
Definition: saved_game.hpp:105
void expand_scenario()
copies the content of a [scenario] with the correct id attribute from the game config into this objec...
Definition: saved_game.cpp:268
config & replay_start()
Definition: saved_game.hpp:123
void set_scenario(config scenario)
Definition: saved_game.cpp:566
void write_starting_point(config_writer &out) const
Definition: saved_game.cpp:195
void set_defaults()
does some post loading stuff must be used before passing the data to connect_engine ...
Definition: saved_game.cpp:216
void write_config(config_writer &out) const
writes the config information into a stream (file)
Definition: saved_game.cpp:179
replay_recorder_base & get_replay()
Definition: saved_game.hpp:135
void write_carryover(config_writer &out) const
Definition: saved_game.cpp:204
void unify_controllers()
Definition: saved_game.cpp:702
void expand_random_scenario()
takes care of generate_map=, generate_scenario=, map= attributes This should be called before expandi...
Definition: saved_game.cpp:476
bool valid() const
Definition: saved_game.cpp:553
const config & replay_start() const
Definition: saved_game.hpp:124
void clear()
Definition: saved_game.cpp:792
config starting_point_
The starting pos where the (non replay) game will be started from.
Definition: saved_game.hpp:161
config & set_snapshot(config snapshot)
Definition: saved_game.cpp:558
static void post_scenario_generation(const config &old_scenario, config &generated_scenario)
copies attributes & tags from the 'outer' [scenario] to the scenario that is generated by scenario_genera...
Definition: saved_game.cpp:510
Definitions for the interface to Wesnoth Markup Language (WML).
bool skip_story() const
Whether to play [story] tags.
Definition: saved_game.hpp:139
std::string get_scenario_id() const
Definition: saved_game.cpp:648
We failed to get a starting pos in expand_scenario.
const game_classification & classification() const
Definition: saved_game.hpp:56
static void expand_map_file(config &scenario)
reads scenario["map_file"]
Definition: saved_game.cpp:460
void set_random_seed()
sets the random seed if that didn't already happen.
Definition: saved_game.cpp:167
void expand_mp_options()
adds values of [option]s into [carryover_sides_start][variables] so that they are applied in the next...
Definition: saved_game.cpp:412
Class for writing a config out to a file in pieces.
void update_label()
sets classification().label to the correct value.
Definition: saved_game.cpp:671
config carryover_
depends on has_carryover_expanded_: if true: The carryover information for all sides from the previou...
Definition: saved_game.hpp:149
config & get_starting_point()
Definition: saved_game.cpp:582
bool skip_story_
Definition: saved_game.hpp:165
void load_non_scenario(const std::string &type, const std::string &id, size_t pos)
helper for expand_mp_events();
Definition: saved_game.cpp:314
starting_point starting_point_type_
Definition: saved_game.hpp:156
void set_data(config &cfg)
destroys the passed config.
Definition: saved_game.cpp:738
bool not_corrupt() const
Definition: saved_game.cpp:666
const replay_recorder_base & get_replay() const
Definition: saved_game.hpp:136
game_classification classification_
some general information of the game that doesn't change during the game
Definition: saved_game.hpp:153
const config & get_starting_point() const
Definition: saved_game.hpp:122
const config & get_replay_starting_point()
Definition: saved_game.cpp:587
There is no scenario stating pos data (start-of-scenario).
We have a [scenario] (start-of-scenario) savefile.
mp_game_settings mp_settings_
Definition: saved_game.hpp:154
void expand_mp_events()
adds [event]s from [era] and [modification] into this scenario does NOT expand [option]s because vari...
Definition: saved_game.cpp:371
void expand_carryover()
merges [carryover_sides_start] into [scenario] and saves the rest into [carryover_sides] Removes [car...
Definition: saved_game.cpp:537
void swap(saved_game &other)
Definition: saved_game.cpp:723
void cancel_orders()
Definition: saved_game.cpp:685
replay_recorder_base replay_data_
Definition: saved_game.hpp:163
game_classification & classification()
Definition: saved_game.hpp:55
void set_carryover_sides_start(config carryover_sides_start)
Definition: saved_game.cpp:161
saved_game & operator=(const saved_game &other)=delete
void set_skip_story(bool skip_story)
Definition: saved_game.hpp:140
void convert_to_start_save()
converts a normal savegame form the end of a scenaio to a start-of-scenario savefile for the next sce...
Definition: saved_game.cpp:606
config to_config() const
Definition: saved_game.cpp:625
We have a [snapshot] (mid-game-savefile).
const mp_game_settings & mp_settings() const
Definition: saved_game.hpp:60
void remove_snapshot()
Definition: saved_game.cpp:576
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:61
bool has_carryover_expanded_
Definition: saved_game.hpp:143
mp_game_settings & mp_settings()
Multiplayer parameters for this game.
Definition: saved_game.hpp:59