The Battle for Wesnoth  1.15.0-dev
undo.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 - 2018 by David White <dave@whitevine.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  * Various functions that implement the undoing (and redoing) of in-game commands.
18  */
19 
20 #pragma once
21 
22 #include "vision.hpp"
23 #include "map/location.hpp"
24 #include "units/ptr.hpp"
25 #include "undo_action.hpp"
26 
27 #include <boost/ptr_container/ptr_vector.hpp>
28 
29 #include <vector>
30 
31 namespace actions {
32 
33 
34 /// Class to store the actions that a player can undo and redo.
35 class undo_list {
36 
37  typedef std::unique_ptr<undo_action_base> action_ptr_t;
38  typedef std::vector<action_ptr_t> action_list;
39  typedef std::vector<std::unique_ptr<config>> redos_list;
40 
41 public:
42  undo_list(const undo_list&) = delete;
43  undo_list& operator=(const undo_list&) = delete;
44 
45  explicit undo_list(const config & cfg);
46  ~undo_list();
47 
48  /// Creates an undo_action based on a config.
49  /// Throws bad_lexical_cast or config::error if it cannot parse the config properly.
50  static undo_action_base * create_action(const config & cfg);
51 
52  // Functions related to managing the undo stack:
53 
54  /// Adds an auto-shroud toggle to the undo stack.
55  void add_auto_shroud(bool turned_on);
56  /// Adds an auto-shroud toggle to the undo stack.
57  void add_dummy();
58  /// Adds a dismissal to the undo stack.
59  void add_dismissal(const unit_const_ptr u);
60  /// Adds a move to the undo stack.
61  void add_move(const unit_const_ptr u,
62  const std::vector<map_location>::const_iterator & begin,
63  const std::vector<map_location>::const_iterator & end,
64  int start_moves, int timebonus=0, int village_owner=-1,
66  /// Adds a recall to the undo stack.
67  void add_recall(const unit_const_ptr u, const map_location& loc,
68  const map_location& from, int orig_village_owner, bool time_bonus);
69  /// Adds a recruit to the undo stack.
70  void add_recruit(const unit_const_ptr u, const map_location& loc,
71  const map_location& from, int orig_village_owner, bool time_bonus);
72  /// Adds a shroud update to the undo stack.
73  void add_update_shroud();
74 private:
75 public:
76  /// Clears the stack of undoable (and redoable) actions.
77  void clear();
78  /// Updates fog/shroud based on the undo stack, then updates stack as needed.
79  void commit_vision();
80  /// Performs some initializations and error checks when starting a new
81  /// side-turn.
82  void new_side_turn(int side);
83  /// Returns true if the player has performed any actions this turn.
84  bool player_acted() const { return committed_actions_ || !undos_.empty(); }
85  /// Read the undo_list from the provided config.
86  void read(const config & cfg);
87  /// Write the undo_list into the provided config.
88  void write(config & cfg) const;
89 
90  // Functions related to using the undo stack:
91 
92  /// True if there are actions that can be undone.
93  bool can_undo() const { return !undos_.empty(); }
94  /// True if there are actions that can be redone.
95  bool can_redo() const { return !redos_.empty(); }
96  /// Undoes the top action on the undo stack.
97  void undo();
98  /// Redoes the top action on the redo stack.
99  void redo();
100 
101 private: // functions
102  /// Adds an action to the undo stack.
103  void add(undo_action_base * action)
104  { undos_.emplace_back(action); redos_.clear(); }
105  /// Applies the pending fog/shroud changes from the undo stack.
106  bool apply_shroud_changes() const;
107 
108 private: // data
109  action_list undos_;
110  redos_list redos_;
111 
112  /// Tracks the current side.
113  int side_;
114  /// Tracks if actions have been cleared from the stack since the turn began.
116 };
117 
118 
119 }//namespace actions
void clear()
Clears the stack of undoable (and redoable) actions.
Definition: undo.cpp:219
boost::intrusive_ptr< const unit > unit_const_ptr
Definition: ptr.hpp:30
bool committed_actions_
Tracks if actions have been cleared from the stack since the turn began.
Definition: undo.hpp:115
bool apply_shroud_changes() const
Applies the pending fog/shroud changes from the undo stack.
Definition: undo.cpp:432
Various functions implementing vision (through fog of war and shroud).
std::vector< action_ptr_t > action_list
Definition: undo.hpp:38
action_list undos_
Definition: undo.hpp:109
std::vector< std::unique_ptr< config > > redos_list
Definition: undo.hpp:39
void undo()
Undoes the top action on the undo stack.
Definition: undo.cpp:347
void add(undo_action_base *action)
Adds an action to the undo stack.
Definition: undo.hpp:103
std::unique_ptr< undo_action_base > action_ptr_t
Definition: undo.hpp:37
int side_
Tracks the current side.
Definition: undo.hpp:113
void new_side_turn(int side)
Performs some initializations and error checks when starting a new side-turn.
Definition: undo.cpp:261
Records information to be able to undo an action.
Definition: undo_action.hpp:38
void read(const config &cfg)
Read the undo_list from the provided config.
Definition: undo.cpp:287
undo_list(const undo_list &)=delete
bool can_redo() const
True if there are actions that can be redone.
Definition: undo.hpp:95
undo_list & operator=(const undo_list &)=delete
void commit_vision()
Updates fog/shroud based on the undo stack, then updates stack as needed.
Definition: undo.cpp:242
Encapsulates the map of the game.
Definition: location.hpp:42
void add_recruit(const unit_const_ptr u, const map_location &loc, const map_location &from, int orig_village_owner, bool time_bonus)
Adds a recruit to the undo stack.
Definition: undo.cpp:193
void add_dismissal(const unit_const_ptr u)
Adds a dismissal to the undo stack.
Definition: undo.cpp:164
static undo_action_base * create_action(const config &cfg)
Creates an undo_action based on a config.
Definition: undo.cpp:70
void redo()
Redoes the top action on the redo stack.
Definition: undo.cpp:396
redos_list redos_
Definition: undo.hpp:110
void add_recall(const unit_const_ptr u, const map_location &loc, const map_location &from, int orig_village_owner, bool time_bonus)
Adds a recall to the undo stack.
Definition: undo.cpp:184
void add_move(const unit_const_ptr u, const std::vector< map_location >::const_iterator &begin, const std::vector< map_location >::const_iterator &end, int start_moves, int timebonus=0, int village_owner=-1, const map_location::DIRECTION dir=map_location::NDIRECTIONS)
Adds a move to the undo stack.
Definition: undo.cpp:172
DIRECTION
Valid directions which can be moved in our hexagonal world.
Definition: location.hpp:44
void add_update_shroud()
Adds a shroud update to the undo stack.
Definition: undo.cpp:204
Class to store the actions that a player can undo and redo.
Definition: undo.hpp:35
void add_dummy()
Adds an auto-shroud toggle to the undo stack.
Definition: undo.cpp:153
void add_auto_shroud(bool turned_on)
Adds an auto-shroud toggle to the undo stack.
Definition: undo.cpp:145
bool player_acted() const
Returns true if the player has performed any actions this turn.
Definition: undo.hpp:84
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:68
bool can_undo() const
True if there are actions that can be undone.
Definition: undo.hpp:93
void write(config &cfg) const
Write the undo_list into the provided config.
Definition: undo.cpp:331
~undo_list()
Destructor.
Definition: undo.cpp:135