diff options
author | dshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-07-21 12:17:29 +0000 |
---|---|---|
committer | dshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573> | 2007-07-21 12:17:29 +0000 |
commit | 9843737e73a47ef6f1da0554b7ca73018d52d345 (patch) | |
tree | 9381ef8b914bc801386f62ce2713c59c17b6a9e8 /crawl-ref/source/dgnevent.cc | |
parent | b27a757b68bf8a1dcbcb9b3a5cfea5c1278c9bb4 (diff) | |
download | crawl-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.cc | 133 |
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() +{ +} |