The Battle for Wesnoth  1.13.10+dev
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
undo.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 - 2017 by David White <dave@whitevine.net>
3  Part of the Battle for Wesnoth Project http://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 boost::ptr_vector<undo_action_base> action_list;
38  typedef boost::ptr_vector<config> redos_list;
39 
40 public:
41  undo_list(const undo_list&) = delete;
42  undo_list& operator=(const undo_list&) = delete;
43 
44  explicit undo_list(const config & cfg);
45  ~undo_list();
46 
47  /// Creates an undo_action based on a config.
48  /// Throws bad_lexical_cast or config::error if it cannot parse the config properly.
49  static undo_action_base * create_action(const config & cfg);
50 
51  // Functions related to managing the undo stack:
52 
53  /// Adds an auto-shroud toggle to the undo stack.
54  void add_auto_shroud(bool turned_on);
55  /// Adds an auto-shroud toggle to the undo stack.
56  void add_dummy();
57  /// Adds a dismissal to the undo stack.
58  void add_dismissal(const unit_const_ptr u);
59  /// Adds a move to the undo stack.
60  void add_move(const unit_const_ptr u,
61  const std::vector<map_location>::const_iterator & begin,
62  const std::vector<map_location>::const_iterator & end,
63  int start_moves, int timebonus=0, int village_owner=-1,
65  /// Adds a recall to the undo stack.
66  void add_recall(const unit_const_ptr u, const map_location& loc,
67  const map_location& from, int orig_village_owner, bool time_bonus);
68  /// Adds a recruit to the undo stack.
69  void add_recruit(const unit_const_ptr u, const map_location& loc,
70  const map_location& from, int orig_village_owner, bool time_bonus);
71  /// Adds a shroud update to the undo stack.
72  void add_update_shroud();
73 private:
74 public:
75  /// Clears the stack of undoable (and redoable) actions.
76  void clear();
77  /// Updates fog/shroud based on the undo stack, then updates stack as needed.
78  void commit_vision();
79  /// Performs some initializations and error checks when starting a new
80  /// side-turn.
81  void new_side_turn(int side);
82  /// Returns true if the player has performed any actions this turn.
83  bool player_acted() const { return committed_actions_ || !undos_.empty(); }
84  /// Read the undo_list from the provided config.
85  void read(const config & cfg);
86  /// Write the undo_list into the provided config.
87  void write(config & cfg) const;
88 
89  // Functions related to using the undo stack:
90 
91  /// True if there are actions that can be undone.
92  bool can_undo() const { return !undos_.empty(); }
93  /// True if there are actions that can be redone.
94  bool can_redo() const { return !redos_.empty(); }
95  /// Undoes the top action on the undo stack.
96  void undo();
97  /// Redoes the top action on the redo stack.
98  void redo();
99 
100 private: // functions
101  /// Adds an action to the undo stack.
102  void add(undo_action_base * action)
103  { undos_.push_back(action); redos_.clear(); }
104  /// Applies the pending fog/shroud changes from the undo stack.
105  bool apply_shroud_changes() const;
106 
107 private: // data
108  action_list undos_;
109  redos_list redos_;
110 
111  /// Tracks the current side.
112  int side_;
113  /// Tracks if actions have been cleared from the stack since the turn began.
115 };
116 
117 
118 }//namespace actions
void clear()
Clears the stack of undoable (and redoable) actions.
Definition: undo.cpp:218
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:114
Various functions implementing vision (through fog of war and shroud).
action_list undos_
Definition: undo.hpp:108
void undo()
Undoes the top action on the undo stack.
Definition: undo.cpp:346
void add(undo_action_base *action)
Adds an action to the undo stack.
Definition: undo.hpp:102
int side_
Tracks the current side.
Definition: undo.hpp:112
void new_side_turn(int side)
Performs some initializations and error checks when starting a new side-turn.
Definition: undo.cpp:260
bool apply_shroud_changes() const
Applies the pending fog/shroud changes from the undo stack.
Definition: undo.cpp:440
bool can_undo() const
True if there are actions that can be undone.
Definition: undo.hpp:92
boost::ptr_vector< undo_action_base > action_list
Definition: undo.hpp:37
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:286
undo_list(const undo_list &)=delete
boost::ptr_vector< config > redos_list
Definition: undo.hpp:38
undo_list & operator=(const undo_list &)=delete
bool can_redo() const
True if there are actions that can be redone.
Definition: undo.hpp:94
void commit_vision()
Updates fog/shroud based on the undo stack, then updates stack as needed.
Definition: undo.cpp:241
Encapsulates the map of the game.
Definition: location.hpp:40
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:192
void add_dismissal(const unit_const_ptr u)
Adds a dismissal to the undo stack.
Definition: undo.cpp:163
static undo_action_base * create_action(const config &cfg)
Creates an undo_action based on a config.
Definition: undo.cpp:71
void redo()
Redoes the top action on the redo stack.
Definition: undo.cpp:397
redos_list redos_
Definition: undo.hpp:109
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:183
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:171
DIRECTION
Valid directions which can be moved in our hexagonal world.
Definition: location.hpp:42
void add_update_shroud()
Adds a shroud update to the undo stack.
Definition: undo.cpp:203
Class to store the actions that a player can undo and redo.
Definition: undo.hpp:35
bool player_acted() const
Returns true if the player has performed any actions this turn.
Definition: undo.hpp:83
void add_dummy()
Adds an auto-shroud toggle to the undo stack.
Definition: undo.cpp:152
void add_auto_shroud(bool turned_on)
Adds an auto-shroud toggle to the undo stack.
Definition: undo.cpp:144
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:93
~undo_list()
Destructor.
Definition: undo.cpp:134
void write(config &cfg) const
Write the undo_list into the provided config.
Definition: undo.cpp:330