From e1eaf149bf86f69dbdc8afa9ef28e94640c2c124 Mon Sep 17 00:00:00 2001 From: dshaligram Date: Sun, 29 Jul 2007 17:19:00 +0000 Subject: Handle dungeon event listeners correctly when shifting terrain. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1948 c06c8d41-db1a-0410-9941-cceddc491573 --- crawl-ref/source/dgnevent.cc | 17 +++++++++++++++++ crawl-ref/source/dgnevent.h | 3 +++ crawl-ref/source/misc.cc | 3 ++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/crawl-ref/source/dgnevent.cc b/crawl-ref/source/dgnevent.cc index 0109c0090a..b0c24c5fb1 100644 --- a/crawl-ref/source/dgnevent.cc +++ b/crawl-ref/source/dgnevent.cc @@ -21,6 +21,23 @@ void dgn_event_dispatcher::clear() grid_triggers[x][y].reset(NULL); } +void dgn_event_dispatcher::clear_listeners_at(const coord_def &pos) +{ + grid_triggers[pos.x][pos.y].reset(NULL); +} + +void dgn_event_dispatcher::move_listeners( + const coord_def &from, const coord_def &to) +{ + // Any existing listeners at to will be discarded. YHBW. + grid_triggers[to.x][to.y] = grid_triggers[from.x][from.y]; +} + +bool dgn_event_dispatcher::has_listeners_at(const coord_def &pos) const +{ + return (grid_triggers[pos.x][pos.y].get()); +} + void dgn_event_dispatcher::fire_position_event( dgn_event_type event, const coord_def &pos) { diff --git a/crawl-ref/source/dgnevent.h b/crawl-ref/source/dgnevent.h index efc5cdd59a..61134966b7 100644 --- a/crawl-ref/source/dgnevent.h +++ b/crawl-ref/source/dgnevent.h @@ -83,6 +83,9 @@ public: } void clear(); + void clear_listeners_at(const coord_def &pos); + bool has_listeners_at(const coord_def &pos) const; + void move_listeners(const coord_def &from, const coord_def &to); void fire_position_event(dgn_event_type et, const coord_def &pos); void fire_event(dgn_event_type et); diff --git a/crawl-ref/source/misc.cc b/crawl-ref/source/misc.cc index 372dbebb84..d929e2b449 100644 --- a/crawl-ref/source/misc.cc +++ b/crawl-ref/source/misc.cc @@ -526,7 +526,7 @@ static bool is_critical_feature(dungeon_feature_type feat) static bool is_feature_shift_target(const coord_def &pos) { - return (grd(pos) == DNGN_FLOOR); + return (grd(pos) == DNGN_FLOOR && !dungeon_events.has_listeners_at(pos)); } static bool dgn_shift_feature(const coord_def &pos) @@ -550,6 +550,7 @@ static bool dgn_shift_feature(const coord_def &pos) } } env_move_markers(pos, dest); + dungeon_events.move_listeners(pos, dest); if (see_grid(dest) && is_notable_terrain(dfeat)) seen_notable_thing(dfeat, dest.x, dest.y); -- cgit v1.2.3-54-g00ecf