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