The Battle for Wesnoth  1.15.2+dev
mouse_events.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2006 - 2018 by Joerg Hinrichs <joerg.hinrichs@alice-dsl.de>
3  wesnoth playturn Copyright (C) 2003 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 #include "game_display.hpp" // for game_display -> display conversion.
19 #include "map/location.hpp" // for map_location
20 #include "mouse_handler_base.hpp" // for mouse_handler_base
21 #include "pathfind/pathfind.hpp" // for marked_route, paths
22 #include "units/map.hpp" // for unit_map, etc
23 
24 #include <set> // for set
25 #include <vector> // for vector
26 #include <SDL2/SDL_events.h> // for SDL_MouseButtonEvent
27 
28 class game_display;
29 class battle_context; // lines 23-23
30 class play_controller;
31 class team;
32 class unit;
33 
34 namespace events{
35 
37 public:
40  static mouse_handler* get_singleton() { return singleton_ ;}
41  void set_side(int side_number);
42  void cycle_units(const bool browse, const bool reverse = false);
43  void cycle_back_units(const bool browse) { cycle_units(browse, true); }
44 
45  int get_path_turns() const { return path_turns_; }
46 
47  /**
48  * @param loc the location occupied by the enemy
49  * @returns the location from which the selected unit can attack the enemy
50  */
52  const pathfind::paths& current_paths() const { return current_paths_; }
53 
54  const map_location& get_last_hex() const { return last_hex_; }
56  void set_path_turns(const int path_turns) { path_turns_ = path_turns; }
57  void set_current_paths(const pathfind::paths & new_paths);
58  void deselect_hex();
60 
61  void set_gui(game_display* gui) { gui_ = gui; }
62 
64 
65  pathfind::marked_route get_route(const unit* un, map_location go_to, team &team) const;
66 
68 
69  //get visible adjacent enemies of 1-based side around location loc
70  std::set<map_location> get_adj_enemies(const map_location& loc, int side) const;
71 
72  // show the attack dialog and return the choice made
73  // which can be invalid if 'cancel' was used
74  int show_attack_dialog(const map_location& attacker_loc, const map_location& defender_loc);
75  // wrapper to catch bad_alloc so this should be called
76  void attack_enemy(const map_location& attacker_loc, const map_location& defender_loc, int choice);
77 
78  /// Moves a unit across the board for a player.
79  std::size_t move_unit_along_route(const std::vector<map_location> & steps, bool & interrupted);
80 
81  void select_hex(const map_location& hex, const bool browse,
82  const bool highlight = true,
83  const bool fire_event = true);
84 
85  void move_action(bool browse);
86 
87  void touch_action(const map_location hex, bool browse);
88 
89  void select_or_action(bool browse);
90 
91  /**
92  * Uses SDL and @ref game_display::hex_clicked_on
93  * to fetch the hex the mouse is hovering, if applicable.
94  */
95  const map_location hovered_hex() const;
96 
97  /** Unit exists on the hex, no matter if friend or foe. */
98  bool hex_hosts_unit(const map_location& hex) const;
99 
100  /**
101  * Use this to disable hovering an unit from highlighting its movement
102  * range.
103  *
104  * @see enable_units_highlight()
105  */
107 
108  /**
109  * When unit highlighting is disabled, call this when the mouse no
110  * longer hovers any unit to enable highlighting again.
111  *
112  * @see disable_units_highlight()
113  */
114  void enable_units_highlight();
115 
116 protected:
117  /**
118  * Due to the way this class is constructed we can assume that the
119  * display* gui_ member actually points to a game_display (derived class)
120  */
121  game_display& gui() { return *gui_; }
122  /** Const version */
123  const game_display& gui() const { return *gui_; }
124 
125  int drag_threshold() const;
126  /**
127  * Use update to force an update of the mouse state.
128  */
129  void mouse_motion(int x, int y, const bool browse, bool update=false, map_location loc = map_location::null_location());
130  bool right_click_show_menu(int x, int y, const bool browse);
131 // bool left_click(int x, int y, const bool browse);
133 
134  void touch_motion(int x, int y, const bool browse, bool update=false, map_location loc = map_location::null_location());
135 
136  void save_whiteboard_attack(const map_location& attacker_loc, const map_location& defender_loc, int weapon_choice);
137 
138  // fill weapon choices into bc_vector
139  // return the best weapon choice
140  int fill_weapon_choices(std::vector<battle_context>& bc_vector, unit_map::iterator attacker, unit_map::iterator defender);
141  // the real function but can throw bad_alloc
142  // choice is the attack chosen in the attack dialog
143  void attack_enemy_(const map_location& attacker_loc
144  , const map_location& defender_loc
145  , int choice);
146 
150  /*
151  * These return raw pointers instead of smart pointers.
152  * Useful if you don't want to increase the unit reference count.
153  */
155  const unit* find_unit_nonowning(const map_location& hex) const;
157 private:
158  team& viewing_team();
159  const team& viewing_team() const;
160  team &current_team();
161 
164 
165  // previous highlighted hexes
166  // the hex of the selected unit and empty hex are "free"
177 
181 
183 
185 };
186 
187 }
pathfind::marked_route get_route(const unit *un, map_location go_to, team &team) const
void set_current_paths(const pathfind::paths &new_paths)
int fill_weapon_choices(std::vector< battle_context > &bc_vector, unit_map::iterator attacker, unit_map::iterator defender)
This class represents a single unit of a specific type.
Definition: unit.hpp:99
unit_map::const_iterator find_unit(const map_location &hex) const
const pathfind::marked_route & get_current_route() const
map_location selected_hex_
pathfind::paths current_paths_
const map_location hovered_hex() const
Uses SDL and game_display::hex_clicked_on to fetch the hex the mouse is hovering, if applicable...
const pathfind::paths & current_paths() const
General purpose widgets.
bool move_unit_along_current_route()
Moves a unit along the currently cached route.
bool unit_in_cycle(unit_map::const_iterator it)
void touch_motion(int x, int y, const bool browse, bool update=false, map_location loc=map_location::null_location())
map_location previous_hex_
void mouse_motion(int x, int y, const bool browse, bool update=false, map_location loc=map_location::null_location())
Use update to force an update of the mouse state.
void select_hex(const map_location &hex, const bool browse, const bool highlight=true, const bool fire_event=true)
static mouse_handler * singleton_
void touch_action(const map_location hex, bool browse)
map_location get_selected_hex() const
const map_location & get_last_hex() const
This class stores all the data for a single &#39;side&#39; (in game nomenclature).
Definition: team.hpp:44
static mouse_handler * get_singleton()
bool hex_hosts_unit(const map_location &hex) const
Unit exists on the hex, no matter if friend or foe.
void disable_units_highlight()
Use this to disable hovering an unit from highlighting its movement range.
int drag_threshold() const
Minimum dragging distance to fire the drag&drop.
std::size_t move_unit_along_route(const std::vector< map_location > &steps, bool &interrupted)
Moves a unit across the board for a player.
void set_path_turns(const int path_turns)
Computes the statistics of a battle between an attacker and a defender unit.
Definition: attack.hpp:171
std::set< map_location > get_adj_enemies(const map_location &loc, int side) const
void set_gui(game_display *gui)
Structure which holds a single route and marks for special events.
Definition: pathfind.hpp:140
bool right_click_show_menu(int x, int y, const bool browse)
Called in the default right_click when the context menu is about to be shown, can be used for preproc...
const game_display & gui() const
Const version.
Encapsulates the map of the game.
Definition: location.hpp:42
void cycle_back_units(const bool browse)
void enable_units_highlight()
When unit highlighting is disabled, call this when the mouse no longer hovers any unit to enable high...
bool fire_event(const ui_event event, std::vector< std::pair< widget *, ui_event >> &event_chain, widget *dispatcher, widget *w, F &&... params)
Helper function for fire_event.
int get_path_turns() const
map_location current_unit_attacks_from(const map_location &loc) const
void attack_enemy(const map_location &attacker_loc, const map_location &defender_loc, int choice)
unit_map::iterator selected_unit()
void save_whiteboard_attack(const map_location &attacker_loc, const map_location &defender_loc, int weapon_choice)
map_location previous_free_hex_
mouse_handler(game_display *gui, play_controller &pc)
void cycle_units(const bool browse, const bool reverse=false)
play_controller & pc_
Handling of system events.
Definition: manager.hpp:42
map_location last_hex_
last highlighted hex
void show_attack_options(const unit_map::const_iterator &u)
Causes attackable hexes to be highlighted.
pathfind::marked_route current_route_
Object which contains all the possible locations a unit can move to, with associated best routes to t...
Definition: pathfind.hpp:70
static const map_location & null_location()
Definition: location.hpp:85
unit * find_unit_nonowning(const map_location &hex)
int side_number
Definition: game_info.hpp:39
static void reverse(lua_State *L, StkId from, StkId to)
Definition: lapi.cpp:193
void set_side(int side_number)
void attack_enemy_(const map_location &attacker_loc, const map_location &defender_loc, int choice)
game_display & gui()
Due to the way this class is constructed we can assume that the display* gui_ member actually points ...
This module contains various pathfinding functions and utilities.
int show_attack_dialog(const map_location &attacker_loc, const map_location &defender_loc)
void move_action(bool browse)
Overridden in derived class.
void select_or_action(bool browse)