The Battle for Wesnoth  1.17.0-dev
action.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2010 - 2021
3  by Gabriel Morin <gabrielmorin (at) gmail (dot) 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 /**
17  * @file
18  */
19 
20 #pragma once
21 
22 #include "typedefs.hpp"
23 #include "map/location.hpp"
24 #include "game_errors.hpp"
25 
26 namespace wb {
27 
28 class visitor;
29 
30 /**
31  * Abstract base class for all the whiteboard planned actions.
32  */
33 class action : public std::enable_shared_from_this<action>
34 {
35 public:
36  action(std::size_t team_index, bool hidden);
37  action(const config&, bool hidden); // For deserialization
38  virtual ~action();
39 
40  virtual std::ostream& print(std::ostream& s) const = 0;
41 
42  virtual void accept(visitor& v) = 0;
43 
44  /**
45  * Output parameters:
46  * success: Whether or not to continue an execute-all after this execution
47  * complete: Whether or not to delete this action after execution
48  */
49  virtual void execute(bool& success, bool& complete) = 0;
50 
51  /** Applies temporarily the result of this action to the specified unit map. */
52  virtual void apply_temp_modifier(unit_map& unit_map) = 0;
53  /** Removes the result of this action from the specified unit map. */
54  virtual void remove_temp_modifier(unit_map& unit_map) = 0;
55 
56  /** Gets called by display when drawing a hex, to allow actions to draw to the screen. */
57  virtual void draw_hex(const map_location& hex) = 0;
58  /** Redrawing function, called each time the action situation might have changed. */
59  virtual void redraw(){}
60 
61  /** Sets whether or not the action should be drawn on the screen. */
62  void hide();
63  void show();
64  bool hidden() const {return hidden_;}
65 
66  /** Indicates whether this hex is the preferred hex to draw the numbering for this action. */
67  bool is_numbering_hex(const map_location& hex) const {return hex==get_numbering_hex();}
68  virtual map_location get_numbering_hex() const = 0;
69 
70  /** Return the unit targeted by this action. Null if unit doesn't exist. */
71  virtual unit_ptr get_unit() const = 0;
72 
73  /** Returns true for recall and recruit actions */
74  virtual bool places_new_unit() const { return false; };
75  /**
76  * Returns the id of the unit targeted by this action.
77  * @retval 0 no unit is targeted.
78  */
79  virtual std::size_t get_unit_id() const;
80 
81  /** @return pointer to the fake unit used only for visuals */
82  virtual fake_unit_ptr get_fake_unit() = 0;
83  /** Returns the index of the team that owns this action */
84  std::size_t team_index() const { return team_index_; }
85  /** Returns the number of the side that owns this action, i.e. the team index + 1. */
86  int side_number() const
87  {
88  return static_cast<int>(team_index_) + 1;
89  }
90 
91  /** Constructs and returns a config object representing this object. */
92  virtual config to_config() const;
93  /** Constructs an object of a subclass of wb::action using a config. Current behavior is to return a null pointer for unrecognized config. */
94  static action_ptr from_config(const config&, bool hidden);
95 
96  struct ctor_err : public game::error
97  {
98  ctor_err(const std::string& message) : game::error(message){}
99  };
100 
101  /**
102  * Possible errors.
103  *
104  * Returned by the @ref check function.
105  */
106  enum error
107  {
108  OK,
120  };
121 
122  /**
123  * Check the validity of the action.
124  *
125  * @return the error preventing the action from being executed.
126  * @retval OK if there isn't any error (the action can be executed.)
127  */
128  virtual error check_validity() const = 0;
129 
130  /**
131  * Returns whether this action is valid or not.
132  *
133  * @note This value is now calculated each time the function is called.
134  */
135  bool valid(){ return check_validity()==OK; }
136 
137 private:
138  /** Called by the non-virtual hide() and show(), respectively. */
139  virtual void do_hide() {}
140  virtual void do_show() {}
141 
142  std::size_t team_index_;
143  bool hidden_;
144 };
145 
146 std::ostream& operator<<(std::ostream& s, action_ptr action);
147 std::ostream& operator<<(std::ostream& s, action_const_ptr action);
148 
149 } // end namespace wb
bool hidden_
Definition: action.hpp:143
virtual error check_validity() const =0
Check the validity of the action.
static action_ptr from_config(const config &, bool hidden)
Constructs an object of a subclass of wb::action using a config.
Definition: action.cpp:60
std::shared_ptr< unit > unit_ptr
Definition: ptr.hpp:26
std::size_t team_index() const
Returns the index of the team that owns this action.
Definition: action.hpp:84
virtual fake_unit_ptr get_fake_unit()=0
bool is_numbering_hex(const map_location &hex) const
Indicates whether this hex is the preferred hex to draw the numbering for this action.
Definition: action.hpp:67
virtual void redraw()
Redrawing function, called each time the action situation might have changed.
Definition: action.hpp:59
bool valid()
Returns whether this action is valid or not.
Definition: action.hpp:135
virtual void draw_hex(const map_location &hex)=0
Gets called by display when drawing a hex, to allow actions to draw to the screen.
virtual void do_show()
Definition: action.hpp:140
error
Possible errors.
Definition: action.hpp:106
Contains typedefs for the whiteboard.
ctor_err(const std::string &message)
Definition: action.hpp:98
action(std::size_t team_index, bool hidden)
Definition: action.cpp:96
virtual void execute(bool &success, bool &complete)=0
Output parameters: success: Whether or not to continue an execute-all after this execution complete: ...
std::shared_ptr< action > action_ptr
Definition: typedefs.hpp:62
virtual std::ostream & print(std::ostream &s) const =0
Definition: action.cpp:46
virtual unit_ptr get_unit() const =0
Return the unit targeted by this action.
Encapsulates the map of the game.
Definition: location.hpp:38
virtual std::size_t get_unit_id() const
Returns the id of the unit targeted by this action.
Definition: action.cpp:118
static map_location::DIRECTION s
void hide()
Sets whether or not the action should be drawn on the screen.
Definition: action.cpp:80
virtual ~action()
Definition: action.cpp:114
bool hidden() const
Definition: action.hpp:64
void show()
Definition: action.cpp:88
Base class for all the errors encountered by the engine.
Definition: exceptions.hpp:28
std::string message
Definition: exceptions.hpp:30
Container associating units to locations.
Definition: map.hpp:98
std::ostream & operator<<(std::ostream &s, action_ptr action)
Definition: action.cpp:34
std::size_t team_index_
Definition: action.hpp:142
virtual void apply_temp_modifier(unit_map &unit_map)=0
Applies temporarily the result of this action to the specified unit map.
int side_number() const
Returns the number of the side that owns this action, i.e.
Definition: action.hpp:86
virtual void accept(visitor &v)=0
Abstract base class for all the whiteboard planned actions.
Definition: action.hpp:33
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:61
virtual void remove_temp_modifier(unit_map &unit_map)=0
Removes the result of this action from the specified unit map.
virtual config to_config() const
Constructs and returns a config object representing this object.
Definition: action.cpp:51
virtual bool places_new_unit() const
Returns true for recall and recruit actions.
Definition: action.hpp:74
Holds a temporary unit that can be drawn on the map without being placed in the unit_map.
virtual map_location get_numbering_hex() const =0
Definition: display.hpp:49
Abstract base class for all the visitors (cf GoF Visitor Design Pattern) the whiteboard uses...
Definition: visitor.hpp:32
virtual void do_hide()
Called by the non-virtual hide() and show(), respectively.
Definition: action.hpp:139
std::shared_ptr< action const > action_const_ptr
Definition: typedefs.hpp:63