summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dgnevent.h
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-07-21 12:17:29 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-07-21 12:17:29 +0000
commit9843737e73a47ef6f1da0554b7ca73018d52d345 (patch)
tree9381ef8b914bc801386f62ce2713c59c17b6a9e8 /crawl-ref/source/dgnevent.h
parentb27a757b68bf8a1dcbcb9b3a5cfea5c1278c9bb4 (diff)
downloadcrawl-ref-9843737e73a47ef6f1da0554b7ca73018d52d345.tar.gz
crawl-ref-9843737e73a47ef6f1da0554b7ca73018d52d345.zip
Updated level-design.txt.
Moved map markers to mapmark.cc. Added support for timer markers that remove a feature after a certain timeout. Need to hook up messaging to Lua. Added bazaars (need more bazaar layouts). git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1899 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/dgnevent.h')
-rw-r--r--crawl-ref/source/dgnevent.h105
1 files changed, 105 insertions, 0 deletions
diff --git a/crawl-ref/source/dgnevent.h b/crawl-ref/source/dgnevent.h
new file mode 100644
index 0000000000..9b22d8c477
--- /dev/null
+++ b/crawl-ref/source/dgnevent.h
@@ -0,0 +1,105 @@
+/*
+ * File: dgnevent.h
+ * Summary: General dungeon events.
+ *
+ * Modified for Crawl Reference by $Author: dshaligram $ on $Date: 2007-07-20T11:40:25.964128Z $
+ *
+ */
+
+#ifndef __DGNEVENT_H__
+#define __DGNEVENT_H__
+
+#include "externs.h"
+#include <list>
+
+enum dgn_event_type
+{
+ DET_NONE = 0x0000,
+
+ DET_TURN_ELAPSED = 0x0001,
+ DET_MONSTER_MOVED = 0x0002,
+ DET_PLAYER_MOVED = 0x0004,
+ DET_LEAVING_LEVEL = 0x0008,
+ DET_ENTERING_LEVEL = 0x0010
+};
+
+class dgn_event
+{
+public:
+ dgn_event_type type;
+ coord_def place;
+ int elapsed_ticks;
+
+public:
+ dgn_event(dgn_event_type t, const coord_def &p = coord_def(),
+ int ticks = you.time_taken)
+ : type(t), place(p), elapsed_ticks(ticks)
+ {
+ }
+};
+
+class dgn_event_listener
+{
+public:
+ virtual ~dgn_event_listener();
+ virtual void notify_dgn_event(const dgn_event &e) = 0;
+};
+
+// Alarm goes off when something enters this square.
+struct dgn_square_alarm
+{
+public:
+ dgn_square_alarm() : eventmask(0), listeners() { }
+
+public:
+ unsigned eventmask;
+ std::list<dgn_event_listener*> listeners;
+};
+
+struct dgn_listener_def
+{
+public:
+ dgn_listener_def(unsigned mask, dgn_event_listener *l)
+ : eventmask(mask), listener(l)
+ {
+ }
+
+public:
+ unsigned eventmask;
+ dgn_event_listener *listener;
+};
+
+// Listeners are not saved here. Map markers have their own
+// persistence and activation mechanisms. Other listeners must make
+// their own persistence arrangements.
+class dgn_event_dispatcher
+{
+public:
+ dgn_event_dispatcher() : global_event_mask(0), grid_triggers()
+ {
+ }
+
+ void clear();
+
+ void fire_position_event(dgn_event_type et, const coord_def &pos);
+ void fire_event(dgn_event_type et);
+ void fire_event(const dgn_event &e);
+
+ void register_listener(unsigned evmask, dgn_event_listener *,
+ const coord_def &pos = coord_def());
+ void remove_listener(dgn_event_listener *,
+ const coord_def &pos = coord_def());
+private:
+ void register_listener_at(unsigned mask, const coord_def &pos,
+ dgn_event_listener *l);
+ void remove_listener_at(const coord_def &pos, dgn_event_listener *l);
+
+private:
+ unsigned global_event_mask;
+ std::auto_ptr<dgn_square_alarm> grid_triggers[GXM][GYM];
+ std::list<dgn_listener_def> listeners;
+};
+
+extern dgn_event_dispatcher dungeon_events;
+
+#endif