Apply the new ground_level method.
[crawl.git] / crawl-ref / source / dgnevent.h
blobf9c5731b1d0b79d1e124b3604cd7ede45989ad4b
1 /*
2 * File: dgnevent.h
3 * Summary: General dungeon events.
4 * Created by: dshaligram on Sat Jul 21 12:17:29 2007 UTC
5 */
7 #ifndef __DGNEVENT_H__
8 #define __DGNEVENT_H__
10 #include "externs.h"
11 #include "player.h"
12 #include <list>
14 // Keep event names in l_dgnevt.cc in sync.
15 enum dgn_event_type
17 DET_NONE = 0x0000,
19 DET_TURN_ELAPSED = 0x0001,
20 DET_MONSTER_MOVED = 0x0002,
21 DET_PLAYER_MOVED = 0x0004,
22 DET_LEAVING_LEVEL = 0x0008,
23 DET_ENTERING_LEVEL = 0x0010,
24 DET_ENTERED_LEVEL = 0x0020,
25 DET_PLAYER_IN_LOS = 0x0040, // Player just entered LOS.
26 DET_PLAYER_CLIMBS = 0x0080, // Player climbing stairs.
27 DET_MONSTER_DIED = 0x0100,
28 DET_ITEM_PICKUP = 0x0200,
29 DET_ITEM_MOVED = 0x0400,
30 DET_FEAT_CHANGE = 0x0800,
31 DET_WALL_HIT = 0x1000,
32 DET_DOOR_OPENED = 0x2000,
33 DET_DOOR_CLOSED = 0x4000,
34 DET_HP_WARNING = 0x8000,
35 DET_PRESSURE_PLATE = 0x10000,
37 DET_GLOBAL_MASK = DET_TURN_ELAPSED | DET_LEAVING_LEVEL
38 | DET_ENTERING_LEVEL | DET_ENTERED_LEVEL
39 | DET_MONSTER_DIED | DET_HP_WARNING,
41 DET_POSITION_MASK = DET_MONSTER_MOVED | DET_PLAYER_MOVED
42 | DET_PLAYER_IN_LOS | DET_ITEM_PICKUP
43 | DET_ITEM_MOVED | DET_FEAT_CHANGE | DET_WALL_HIT
44 | DET_DOOR_OPENED | DET_DOOR_CLOSED
45 | DET_PRESSURE_PLATE,
48 class dgn_event
50 public:
51 dgn_event_type type;
52 coord_def place;
53 int elapsed_ticks;
54 int arg1, arg2;
55 coord_def dest;
57 public:
58 dgn_event(dgn_event_type t, const coord_def &p = coord_def(),
59 int ticks = you.time_taken, int a1 = 0, int a2 = 0,
60 const coord_def &d = coord_def())
61 : type(t), place(p), elapsed_ticks(ticks), arg1(a1),
62 arg2(a2), dest(d)
67 class dgn_event_listener
69 public:
70 virtual ~dgn_event_listener();
71 // For vetoable events, return false to veto.
72 virtual bool notify_dgn_event(const dgn_event &e) = 0;
75 // Alarm goes off when something enters this square.
76 struct dgn_square_alarm
78 dgn_square_alarm() : eventmask(0), listeners() { }
80 unsigned eventmask;
81 std::list<dgn_event_listener*> listeners;
84 struct dgn_listener_def
86 dgn_listener_def(unsigned mask, dgn_event_listener *l)
87 : eventmask(mask), listener(l)
91 unsigned eventmask;
92 dgn_event_listener *listener;
95 // Listeners are not saved here. Map markers have their own
96 // persistence and activation mechanisms. Other listeners must make
97 // their own persistence arrangements.
98 class dgn_event_dispatcher
100 public:
101 dgn_event_dispatcher() : global_event_mask(0), grid_triggers()
105 void clear();
106 void clear_listeners_at(const coord_def &pos);
107 bool has_listeners_at(const coord_def &pos) const;
108 void move_listeners(const coord_def &from, const coord_def &to);
110 // Returns false if the event is vetoed.
111 bool fire_vetoable_position_event(const dgn_event &e,
112 const coord_def &pos);
114 bool fire_vetoable_position_event(dgn_event_type et,
115 const coord_def &pos);
117 void fire_position_event(dgn_event_type et, const coord_def &pos);
118 void fire_position_event(const dgn_event &e, const coord_def &pos);
119 void fire_event(dgn_event_type et);
120 void fire_event(const dgn_event &e);
122 void register_listener(unsigned evmask, dgn_event_listener *,
123 const coord_def &pos = coord_def());
124 void remove_listener(dgn_event_listener *,
125 const coord_def &pos = coord_def());
126 private:
127 void register_listener_at(unsigned mask, const coord_def &pos,
128 dgn_event_listener *l);
129 void remove_listener_at(const coord_def &pos, dgn_event_listener *l);
131 private:
132 unsigned global_event_mask;
133 std::auto_ptr<dgn_square_alarm> grid_triggers[GXM][GYM];
134 std::list<dgn_listener_def> listeners;
137 extern dgn_event_dispatcher dungeon_events;
139 #endif