summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crawl-ref/source/dgnevent.cc17
-rw-r--r--crawl-ref/source/dgnevent.h3
-rw-r--r--crawl-ref/source/misc.cc3
3 files changed, 22 insertions, 1 deletions
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);