summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/mapmark.cc
diff options
context:
space:
mode:
authorDarshan Shaligram <dshaligram@users.sourceforge.net>2010-07-21 23:48:32 +0530
committerDarshan Shaligram <dshaligram@users.sourceforge.net>2010-07-21 23:51:01 +0530
commit7e5f8c4843a7715af6df26a51f90b67b286592c0 (patch)
treee317f7a5aa3bf93f7525b8fab7a2daf6016232be /crawl-ref/source/mapmark.cc
parent5420269c75e19f5e4b253c8b85dd57ca0d721270 (diff)
downloadcrawl-ref-7e5f8c4843a7715af6df26a51f90b67b286592c0.tar.gz
crawl-ref-7e5f8c4843a7715af6df26a51f90b67b286592c0.zip
Add remove_markers_and_listeners_at to safely remove Lua markers and dungeon listeners from a square.
Diffstat (limited to 'crawl-ref/source/mapmark.cc')
-rw-r--r--crawl-ref/source/mapmark.cc21
1 files changed, 21 insertions, 0 deletions
diff --git a/crawl-ref/source/mapmark.cc b/crawl-ref/source/mapmark.cc
index bccec53e69..c1c390394e 100644
--- a/crawl-ref/source/mapmark.cc
+++ b/crawl-ref/source/mapmark.cc
@@ -941,3 +941,24 @@ std::vector<map_marker*> find_markers_by_prop(
}
return (markers);
}
+
+///////////////////////////////////////////////////////////////////
+
+// Safely remove all markers and dungeon listeners at the given square.
+void remove_markers_and_listeners_at(coord_def p)
+{
+ // Look for Lua markers on this square that are listening for
+ // non-positional events, (such as bazaar portals listening for
+ // turncount changes) and detach them manually from the dungeon
+ // event dispatcher.
+ const std::vector<map_marker *> markers = env.markers.get_markers_at(p);
+ for (int i = 0, size = markers.size(); i < size; ++i)
+ {
+ if (markers[i]->get_type() == MAT_LUA_MARKER)
+ dungeon_events.remove_listener(
+ dynamic_cast<map_lua_marker*>(markers[i]));
+ }
+
+ env.markers.remove_markers_at(p);
+ dungeon_events.clear_listeners_at(p);
+}