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