3 * Summary: General dungeon events.
4 * Created by: dshaligram on Sat Jul 21 12:17:29 2007 UTC
14 // Keep event names in l_dgnevt.cc in sync.
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
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
),
67 class dgn_event_listener
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() { }
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
)
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
101 dgn_event_dispatcher() : global_event_mask(0), grid_triggers()
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());
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
);
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
;