summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dgnevent.cc
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.cc
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.cc')
-rw-r--r--crawl-ref/source/dgnevent.cc133
1 files changed, 133 insertions, 0 deletions
diff --git a/crawl-ref/source/dgnevent.cc b/crawl-ref/source/dgnevent.cc
new file mode 100644
index 0000000000..0109c0090a
--- /dev/null
+++ b/crawl-ref/source/dgnevent.cc
@@ -0,0 +1,133 @@
+/*
+ * File: dgnevent.cc
+ * Summary: General dungeon events.
+ *
+ * Modified for Crawl Reference by $Author: dshaligram $ on $Date: 2007-07-20T11:40:25.964128Z $
+ *
+ */
+
+#include "AppHdr.h"
+#include "dgnevent.h"
+#include "stuff.h"
+
+dgn_event_dispatcher dungeon_events;
+
+void dgn_event_dispatcher::clear()
+{
+ global_event_mask = 0;
+ listeners.clear();
+ for (int y = 0; y < GYM; ++y)
+ for (int x = 0; x < GXM; ++x)
+ grid_triggers[x][y].reset(NULL);
+}
+
+void dgn_event_dispatcher::fire_position_event(
+ dgn_event_type event, const coord_def &pos)
+{
+ dgn_square_alarm *alarm = grid_triggers[pos.x][pos.y].get();
+ if (alarm && (alarm->eventmask & event))
+ {
+ dgn_square_alarm alcopy = *alarm;
+ const dgn_event et(event, pos);
+ for (std::list<dgn_event_listener*>::iterator
+ i = alcopy.listeners.begin();
+ i != alcopy.listeners.end(); ++i)
+ {
+ (*i)->notify_dgn_event(et);
+ }
+ }
+}
+
+void dgn_event_dispatcher::fire_event(const dgn_event &e)
+{
+ if (global_event_mask & e.type)
+ {
+ std::list<dgn_listener_def> lcopy = listeners;
+ for (std::list<dgn_listener_def>::iterator i = lcopy.begin();
+ i != lcopy.end(); ++i)
+ {
+ if (i->eventmask & e.type)
+ i->listener->notify_dgn_event(e);
+ }
+ }
+}
+
+void dgn_event_dispatcher::fire_event(dgn_event_type et)
+{
+ fire_event(dgn_event(et));
+}
+
+void dgn_event_dispatcher::register_listener(unsigned mask,
+ dgn_event_listener *listener,
+ const coord_def &pos)
+{
+ if (in_bounds(pos))
+ register_listener_at(mask, pos, listener);
+ else
+ {
+ global_event_mask |= mask;
+ for (std::list<dgn_listener_def>::iterator i = listeners.begin();
+ i != listeners.end(); ++i)
+ {
+ if (i->listener == listener)
+ {
+ i->eventmask |= mask;
+ return;
+ }
+ }
+ listeners.push_back(dgn_listener_def(mask, listener));
+ }
+}
+
+void dgn_event_dispatcher::register_listener_at(unsigned mask,
+ const coord_def &c,
+ dgn_event_listener *listener)
+{
+ if (!grid_triggers[c.x][c.y].get())
+ grid_triggers[c.x][c.y].reset(new dgn_square_alarm);
+
+ dgn_square_alarm *alarm = grid_triggers[c.x][c.y].get();
+ alarm->eventmask |= mask;
+ if (std::find(alarm->listeners.begin(), alarm->listeners.end(),
+ listener) == alarm->listeners.end())
+ alarm->listeners.push_back(listener);
+}
+
+void dgn_event_dispatcher::remove_listener(dgn_event_listener *listener,
+ const coord_def &pos)
+{
+ if (in_bounds(pos))
+ remove_listener_at(pos, listener);
+ else
+ {
+ for (std::list<dgn_listener_def>::iterator i = listeners.begin();
+ i != listeners.end(); ++i)
+ {
+ if (i->listener == listener)
+ {
+ listeners.erase(i);
+ return;
+ }
+ }
+ }
+}
+
+void dgn_event_dispatcher::remove_listener_at(const coord_def &pos,
+ dgn_event_listener *listener)
+{
+ if (dgn_square_alarm *alarm = grid_triggers[pos.x][pos.y].get())
+ {
+ std::list<dgn_event_listener*>::iterator i =
+ std::find(alarm->listeners.begin(), alarm->listeners.end(),
+ listener);
+ if (i != alarm->listeners.end())
+ alarm->listeners.erase(i);
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// dgn_event_listener
+
+dgn_event_listener::~dgn_event_listener()
+{
+}