The Battle for Wesnoth  1.17.10+dev
udisplay.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 - 2022
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  * Display units performing various actions: moving, attacking, and dying.
19  */
20 
21 #pragma once
22 
23 #include "fake_unit_ptr.hpp"
24 #include "map/location.hpp"
25 #include "units/animation.hpp"
26 
27 class attack_type;
28 class game_board;
29 class game_display;
30 class unit;
31 
32 /**
33  * Contains a number of free functions which display units
34  *
35  * performing various on-screen actions - moving, attacking, and dying.
36  */
37 namespace unit_display
38 {
39 
40 /**
41  * A class to encapsulate the steps of drawing a unit's move.
42  * If control over how far the unit moves is not needed, move_unit() may
43  * be a more convenient interface.
44  */
45 class unit_mover {
46 public:
47  unit_mover(const unit_mover&) = delete;
48  unit_mover& operator=(const unit_mover&) = delete;
49 
50  explicit unit_mover(const std::vector<map_location>& path, bool animate=true, bool force_scroll=false);
51  ~unit_mover();
52 
53  void start(unit_ptr u);
54  void proceed_to(unit_ptr u, std::size_t path_index, bool update=false, bool wait=true);
55  void wait_for_anims();
57 
58 private: // functions
60  void update_shown_unit();
61 
62 private: // data
64  const bool can_draw_;
65  const bool animate_;
66  const bool force_scroll_;
68  /** The animation potential to wait until. INT_MIN for no wait; INT_MAX to wait for end. */
70  /** The unit to be (re-)shown after an animation finishes. */
72  const std::vector<map_location>& path_;
73  std::size_t current_;
76  bool is_enemy_;
77 };
78 
79 
80 /**
81  * Display a unit moving along a given path.
82  */
83 void move_unit(const std::vector<map_location>& path, unit_ptr u,
84  bool animate=true,
86  bool force_scroll=false);
87 
88 /**
89  * Play a pre-fight animation
90  * First unit is the attacker, second unit the defender
91  */
92 void unit_draw_weapon( const map_location& loc, unit& u, const_attack_ptr attack=nullptr, const_attack_ptr secondary_attack=nullptr,const map_location& defender_loc = map_location::null_location(), unit_ptr defender=unit_ptr());
93 
94 /**
95  * Play a post-fight animation
96  * Both unit can be set to null, only valid units will play their animation
97  */
98 void unit_sheath_weapon( const map_location& loc, unit_ptr u=unit_ptr(), const_attack_ptr attack=nullptr, const_attack_ptr secondary_attack=nullptr,const map_location& defender_loc = map_location::null_location(), unit_ptr defender=unit_ptr());
99 
100 /**
101  * Show a unit fading out.
102  *
103  * Note: this only shows the effect, it doesn't actually kill the unit.
104  */
105  void unit_die( const map_location& loc, unit& u,
106  const_attack_ptr attack=nullptr, const_attack_ptr secondary_attack=nullptr,
107  const map_location& winner_loc=map_location::null_location(),
108  unit_ptr winner = unit_ptr());
109 
110 
111 /**
112  * Make the unit on tile 'a' attack the unit on tile 'b'.
113  *
114  * The 'damage' will be subtracted from the unit's hitpoints,
115  * and a die effect will be displayed if the unit dies.
116  *
117  * @retval true if the defending unit is dead, should be
118  * removed from the playing field.
119  */
120 void unit_attack(display * disp, game_board & board, //TODO: Would be nice if this could be purely a display function and defer damage dealing to its caller
121  const map_location& a, const map_location& b, int damage,
122  const attack_type& attack, const_attack_ptr secondary_attack,
123  int swing, const std::string& hit_text, int drain_amount, const std::string& att_text, const std::vector<std::string>* extra_hit_sounds=nullptr,
124  bool attacking=true);
125 
126 
127 void unit_recruited(const map_location& loc,
128  const map_location& leader_loc=map_location::null_location());
129 
130 /**
131  * This will use a poisoning anim if healing<0.
132  */
133 void unit_healing(unit &healed, const std::vector<unit *> &healers, int healing,
134  const std::string & extra_text="");
135 
136 }
Game board class.
Definition: game_board.hpp:52
void unit_draw_weapon(const map_location &loc, unit &attacker, const_attack_ptr attack, const_attack_ptr secondary_attack, const map_location &defender_loc, unit_ptr defender)
Play a pre-fight animation First unit is the attacker, second unit the defender.
Definition: udisplay.cpp:523
void unit_sheath_weapon(const map_location &primary_loc, unit_ptr primary_unit, const_attack_ptr primary_attack, const_attack_ptr secondary_attack, const map_location &secondary_loc, unit_ptr secondary_unit)
Play a post-fight animation Both unit can be set to null, only valid units will play their animation...
Definition: udisplay.cpp:543
game_display *const disp_
Definition: udisplay.hpp:63
This class represents a single unit of a specific type.
Definition: unit.hpp:133
#define a
unit_mover(const unit_mover &)=delete
std::shared_ptr< unit > unit_ptr
Definition: ptr.hpp:26
Contains a number of free functions which display units.
Definition: udisplay.cpp:39
#define b
unit_ptr shown_unit_
The unit to be (re-)shown after an animation finishes.
Definition: udisplay.hpp:71
void finish(unit_ptr u, map_location::DIRECTION dir=map_location::NDIRECTIONS)
Finishes the display of movement for the supplied unit.
Definition: udisplay.cpp:437
const bool force_scroll_
Definition: udisplay.hpp:66
unit_animator animator_
Definition: udisplay.hpp:67
void update_shown_unit()
Switches the display back to *shown_unit_ after animating.
Definition: udisplay.cpp:246
std::string path
Definition: game_config.cpp:39
A class to encapsulate the steps of drawing a unit&#39;s move.
Definition: udisplay.hpp:45
void unit_healing(unit &healed, const std::vector< unit *> &healers, int healing, const std::string &extra_text)
This will use a poisoning anim if healing<0.
Definition: udisplay.cpp:851
void unit_attack(display *disp, game_board &board, const map_location &a, const map_location &b, int damage, const attack_type &attack, const_attack_ptr secondary_attack, int swing, const std::string &hit_text, int drain_amount, const std::string &att_text, const std::vector< std::string > *extra_hit_sounds, bool attacking)
Make the unit on tile &#39;a&#39; attack the unit on tile &#39;b&#39;.
Definition: udisplay.cpp:599
const std::vector< map_location > & path_
Definition: udisplay.hpp:72
void wait_for_anims()
Waits for the final animation of the most recent proceed_to() to finish.
Definition: udisplay.cpp:397
int wait_until_
The animation potential to wait until.
Definition: udisplay.hpp:69
Encapsulates the map of the game.
Definition: location.hpp:38
void replace_temporary(unit_ptr u)
Makes the temporary unit used by this match the supplied unit.
Definition: udisplay.cpp:220
static void update()
unit_mover & operator=(const unit_mover &)=delete
void proceed_to(unit_ptr u, std::size_t path_index, bool update=false, bool wait=true)
Visually moves a unit from the last hex we drew to the one specified by path_index.
Definition: udisplay.cpp:318
void unit_die(const map_location &loc, unit &loser, const_attack_ptr attack, const_attack_ptr secondary_attack, const map_location &winner_loc, unit_ptr winner)
Show a unit fading out.
Definition: udisplay.cpp:573
void start(unit_ptr u)
Initiates the display of movement for the supplied unit.
Definition: udisplay.cpp:261
DIRECTION
Valid directions which can be moved in our hexagonal world.
Definition: location.hpp:40
void unit_recruited(const map_location &loc, const map_location &leader_loc)
Definition: udisplay.cpp:803
fake_unit_ptr temp_unit_ptr_
Definition: udisplay.hpp:74
static const map_location & null_location()
Definition: location.hpp:81
std::shared_ptr< const attack_type > const_attack_ptr
Definition: ptr.hpp:34
Holds a temporary unit that can be drawn on the map without being placed in the unit_map.
void move_unit(const std::vector< map_location > &path, unit_ptr u, bool animate, map_location::DIRECTION dir, bool force_scroll)
Display a unit moving along a given path.
Definition: udisplay.cpp:509