The Battle for Wesnoth  1.17.0-dev
game_display.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 - 2021
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 #pragma once
17 
18 class config;
19 class team;
20 class game_board;
21 
22 #include "chat_events.hpp"
23 #include "display.hpp"
24 #include "display_chat_manager.hpp"
25 #include "pathfind/pathfind.hpp"
26 
27 #include <deque>
28 
29 // This needs to be separate from display.h because of the static
30 // singleton member, which will otherwise trigger link failure
31 // when building the editor.
32 
33 class game_display : public display
34 {
35 public:
36  game_display(game_board& board,
37  std::weak_ptr<wb::manager> wb,
38  reports & reports_object,
39  const config& theme_cfg,
40  const config& level);
41 
42  ~game_display();
44  {
45  return static_cast<game_display*>(singleton_);
46  }
47 
48  /**
49  * Update lighting settings.
50  *
51  * Should be called on every new turn.
52  */
53  void new_turn();
54 
55  virtual const std::set<std::string>& observers() const override { return chat_man_->observers(); }
56  /**
57  * Scrolls to the leader of a certain side.
58  *
59  * This will normally be the playing team.
60  */
61  void scroll_to_leader(int side, SCROLL_TYPE scroll_type = ONSCREEN,bool force = true);
62 
63  /**
64  * Function to display a location as selected.
65  *
66  * If a unit is in the location, and there is no unit in the currently
67  * highlighted hex, the unit will be displayed in the sidebar.
68  */
69  virtual void select_hex(map_location hex) override;
70 
71  /**
72  * Function to highlight a location.
73  *
74  * If a unit is in the location, it will be displayed in the sidebar.
75  * Selection is used when a unit has been clicked on, while highlighting is
76  * used when a location has been moused over.
77  */
78  virtual void highlight_hex(map_location hex) override;
79 
80  /**
81  * Change the unit to be displayed in the sidebar.
82  *
83  * This is used when selecting or highlighting is not wanted.
84  */
86 
87  /**
88  * Sets the paths that are currently displayed as available
89  * for the unit to move along.
90  * All other paths will be grayed out.
91  */
92  void highlight_reach(const pathfind::paths &paths_list);
93 
94  /**
95  * Add more paths to highlight. Print numbers where they overlap.
96  * Used by Show Enemy Moves. If @a goal is not @c null_location, highlight
97  * enemy units that can reach @a goal.
98  */
99  void highlight_another_reach(const pathfind::paths &paths_list,
100  const map_location& goal = map_location::null_location());
101  /**
102  * Return the locations of units that can reach @a goal (@see highlight_another_reach()).
103  */
104  const std::set<map_location>& units_that_can_reach_goal() const { return units_that_can_reach_goal_; }
105 
106  /** Reset highlighting of paths. */
107  bool unhighlight_reach();
108 
109  /**
110  * Sets the route along which footsteps are drawn to show movement of a
111  * unit. If nullptr, no route is displayed. @a route does not have to remain
112  * valid after being set.
113  */
114  void set_route(const pathfind::marked_route *route);
115  /**
116  * Gets the route along which footsteps are drawn to show movement of a
117  * unit. If no route is currently being shown, the array get_route().steps
118  * will be empty.
119  */
121 
122  /** Function to float a label above a tile */
123  void float_label(const map_location& loc, const std::string& text, const color_t& color);
124 
125  /** Draws the movement info (turns available) for a given location. */
126  void draw_movement_info(const map_location& loc);
127 
128  /** Function to invalidate that unit status displayed on the sidebar. */
130 
131  /** Same as invalidate_unit() if moving the displayed unit. */
132  void invalidate_unit_after_move(const map_location& src, const map_location& dst);
133 
134  virtual const time_of_day& get_time_of_day(const map_location& loc) const override;
135 
136  virtual bool has_time_area() const override;
137 
138 protected:
139  /**
140  * game_display pre_draw does specific things related e.g. to unit rendering
141  * and calls the whiteboard pre-draw method.
142  */
143  virtual void pre_draw() override;
144  /**
145  * Calls the whiteboard's post-draw method.
146  */
147  virtual void post_draw() override;
148 
149  virtual void draw_invalidated() override;
150 
151  virtual void post_commit() override;
152 
153  virtual void draw_hex(const map_location& loc) override;
154 
155  /** Inherited from display. */
156  virtual overlay_map& get_overlays() override;
157 
158  std::set<map_location> units_that_can_reach_goal_;
159 
160 public:
161  /** Set the attack direction indicator. */
162  void set_attack_indicator(const map_location& src, const map_location& dst);
163  void clear_attack_indicator();
164  // TODO: compare reports::context::mhb()->current_unit_attacks_from()
166 
167  /** Function to get attack direction suffix. */
168  std::string attack_indicator_direction() const {
171  }
172 
173  // Functions used in the editor:
174 
175  //void draw_terrain_palette(int x, int y, terrain_type::TERRAIN selected);
176  t_translation::terrain_code get_terrain_on(int palx, int paly, int x, int y);
177 
178  virtual const map_location &displayed_unit_hex() const override { return displayedUnitHex_; }
179 
180  /**
181  * annotate hex with number, useful for debugging or UI prototype
182  */
183  static int& debug_highlight(const map_location& loc);
184  static void clear_debug_highlights() { debugHighlights_.clear(); }
185 
186  /** The playing team is the team whose turn it is. */
187  virtual int playing_side() const override { return activeTeam_ + 1; }
188 
189  std::string current_team_name() const;
190 
192 
193  void begin_game();
194 
195  virtual bool in_game() const override { return in_game_; }
196 
197  /**
198  * Sets the linger mode for the display.
199  * There have been some discussions on what to do with fog and shroud
200  * the extra variables make it easier to modify the behavior. There
201  * might even be a split between victory and defeat.
202  *
203  * @todo if the current implementation is wanted we can change
204  * the stuff back to a boolean
205  */
206  enum game_mode {
207  RUNNING, /**< no linger overlay, show fog and shroud. */
208  LINGER }; /**< linger overlay, show fog and shroud. */
209 
210  void set_game_mode(const game_mode mode);
211 
212  /** Sets whether the screen (map visuals) needs to be rebuilt. This is typically after the map has been changed by wml. */
213  void needs_rebuild(bool b);
214 
215  /** Rebuilds the screen if needs_rebuild(true) was previously called, and resets the flag. */
216  bool maybe_rebuild();
217 
218 private:
219  game_display(const game_display&);
220  void operator=(const game_display&);
221 
222  virtual void draw_sidebar() override;
223 
225 
226  // Locations of the attack direction indicator's parts
229 
231 
232  void invalidate_route();
233 
235 
236  bool in_game_;
237 
238  const std::unique_ptr<display_chat_manager> chat_man_;
239 
241 
242  // For debug mode
243  static std::map<map_location, int> debugHighlights_;
244 
246 
247 };
void invalidate_unit_after_move(const map_location &src, const map_location &dst)
Same as invalidate_unit() if moving the displayed unit.
Game board class.
Definition: game_board.hpp:51
void set_game_mode(const game_mode mode)
static int & debug_highlight(const map_location &loc)
annotate hex with number, useful for debugging or UI prototype
game_mode
Sets the linger mode for the display.
DIRECTION get_relative_dir(const map_location &loc, map_location::RELATIVE_DIR_MODE mode) const
Definition: location.cpp:227
virtual overlay_map & get_overlays() override
Inherited from display.
void invalidate_route()
virtual const map_location & displayed_unit_hex() const override
Virtual functions shadowed in game_display.
const std::set< map_location > & units_that_can_reach_goal() const
Return the locations of units that can reach goal (.
const map_location & get_attack_indicator_src()
map_location attack_indicator_src_
void invalidate_unit()
Function to invalidate that unit status displayed on the sidebar.
std::set< map_location > units_that_can_reach_goal_
A terrain string which is converted to a terrain is a string with 1 or 2 layers the layers are separa...
Definition: translation.hpp:50
game_mode mode_
map_location displayedUnitHex_
virtual void post_commit() override
Hook for actions to take right after draw() calls drawing_buffer_commit No action here by default...
static display * singleton_
Definition: display.hpp:1080
virtual int playing_side() const override
The playing team is the team whose turn it is.
void new_turn()
Update lighting settings.
static std::map< map_location, int > debugHighlights_
game_display(game_board &board, std::weak_ptr< wb::manager > wb, reports &reports_object, const config &theme_cfg, const config &level)
Unit and team statistics.
#define b
void highlight_another_reach(const pathfind::paths &paths_list, const map_location &goal=map_location::null_location())
Add more paths to highlight.
no linger overlay, show fog and shroud.
Object which defines a time of day with associated bonuses, image, sounds etc.
Definition: time_of_day.hpp:56
This class stores all the data for a single &#39;side&#39; (in game nomenclature).
Definition: team.hpp:72
void scroll_to_leader(int side, SCROLL_TYPE scroll_type=ONSCREEN, bool force=true)
Scrolls to the leader of a certain side.
virtual void draw_invalidated() override
Only called when there&#39;s actual redrawing to do.
std::map< map_location, std::vector< overlay > > overlay_map
Definition: display.hpp:1043
const pathfind::marked_route & get_route()
Gets the route along which footsteps are drawn to show movement of a unit.
virtual const time_of_day & get_time_of_day(const map_location &loc) const override
virtual const std::set< std::string > & observers() const override
bool invalidateGameStatus_
Definition: display.hpp:769
void highlight_reach(const pathfind::paths &paths_list)
Sets the paths that are currently displayed as available for the unit to move along.
map_display and display: classes which take care of displaying the map and game-data on the screen...
Structure which holds a single route and marks for special events.
Definition: pathfind.hpp:141
void needs_rebuild(bool b)
Sets whether the screen (map visuals) needs to be rebuilt.
virtual void draw_sidebar() override
Called near the end of a draw operation, derived classes can use this to render a specific sidebar...
pathfind::marked_route route_
virtual void draw_hex(const map_location &loc) override
Redraws a single gamemap location.
std::string attack_indicator_direction() const
Function to get attack direction suffix.
Encapsulates the map of the game.
Definition: location.hpp:38
void float_label(const map_location &loc, const std::string &text, const color_t &color)
Function to float a label above a tile.
virtual bool in_game() const override
std::string current_team_name() const
virtual void highlight_hex(map_location hex) override
Function to highlight a location.
std::size_t activeTeam_
Definition: display.hpp:895
static void clear_debug_highlights()
virtual void select_hex(map_location hex) override
Function to display a location as selected.
virtual bool has_time_area() const override
display_chat_manager & get_chat_manager()
overlay_map overlay_map_
bool unhighlight_reach()
Reset highlighting of paths.
Object which contains all the possible locations a unit can move to, with associated best routes to t...
Definition: pathfind.hpp:72
virtual void pre_draw() override
game_display pre_draw does specific things related e.g.
static const map_location & null_location()
Definition: location.hpp:81
virtual void post_draw() override
Calls the whiteboard&#39;s post-draw method.
map_location attack_indicator_dst_
void draw_movement_info(const map_location &loc)
Draws the movement info (turns available) for a given location.
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:61
void set_route(const pathfind::marked_route *route)
Sets the route along which footsteps are drawn to show movement of a unit.
void clear_attack_indicator()
This module contains various pathfinding functions and utilities.
t_translation::terrain_code get_terrain_on(int palx, int paly, int x, int y)
static std::string write_direction(DIRECTION dir)
Definition: location.cpp:141
void display_unit_hex(map_location hex)
Change the unit to be displayed in the sidebar.
void set_attack_indicator(const map_location &src, const map_location &dst)
Set the attack direction indicator.
Definition: display.hpp:49
static game_display * get_singleton()
const std::unique_ptr< display_chat_manager > chat_man_
bool maybe_rebuild()
Rebuilds the screen if needs_rebuild(true) was previously called, and resets the flag.
void operator=(const game_display &)