summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dat/clua
diff options
context:
space:
mode:
authorMatthew Cline <zelgadis@sourceforge.net>2009-11-08 19:53:23 -0800
committerMatthew Cline <zelgadis@sourceforge.net>2009-11-08 19:54:11 -0800
commit0d3adcf82d1206b1dbffbf205bead9d36100fa96 (patch)
tree60c93bd753c076e9240daa849a201450390eb983 /crawl-ref/source/dat/clua
parent356b0c4c2ffa3f32632d90fcdbf817be45097814 (diff)
downloadcrawl-ref-0d3adcf82d1206b1dbffbf205bead9d36100fa96.tar.gz
crawl-ref-0d3adcf82d1206b1dbffbf205bead9d36100fa96.zip
lm_trig.lua: Master markers can listen to slaves
Master markers can now listen to events happening at slave markers by setting the property "listen_to_slaves", and can only trigger at the slave marker which had the event by also setting "only_at_slave".
Diffstat (limited to 'crawl-ref/source/dat/clua')
-rw-r--r--crawl-ref/source/dat/clua/lm_trig.lua56
1 files changed, 50 insertions, 6 deletions
diff --git a/crawl-ref/source/dat/clua/lm_trig.lua b/crawl-ref/source/dat/clua/lm_trig.lua
index 58ae2d4934..65faafb3ea 100644
--- a/crawl-ref/source/dat/clua/lm_trig.lua
+++ b/crawl-ref/source/dat/clua/lm_trig.lua
@@ -27,6 +27,15 @@
-- on each triggering only a single, randomly chosen slave will have
-- on_trigger() called.
--
+-- Ordinarily, a master marker which listens to position-dependant events will
+-- only be triggered by events which happen at the master's position. To make
+-- the master marker also listen to events which happen at the locations of the
+-- slave markers, set the property "listen_to_slaves" to anything but the empty
+-- strign true. This will cause all of the slave markers to be triggered
+-- whenever any of the slave markers are triggered. To only trigger the slave
+-- where the event happened, also set the property "only_at_slave" to anything
+-- but the empty string.
+--
-- on_trigger() shouldn't have to worry about the master/slave business,
-- and should have the same code regardless of whether or not it's a
-- master or just a plain triggerable. If on_trigger() calls
@@ -172,6 +181,10 @@ function Triggerable:activate(marker)
error("Can't activate, trigerrable removed")
end
+ if #self.triggerers == 0 then
+ error("Triggerable has no triggerers")
+ end
+
if self.activating then
error("Triggerable already activating")
end
@@ -181,8 +194,25 @@ function Triggerable:activate(marker)
end
self.activating = true
+
+ -- NOTE: The master marker can be slaved to itself.
+ local listen_to_slaves = self:property(marker, "listen_to_slaves")
+ local master_name = self:property(marker, "master_name")
+
+ local slaves
+ if listen_to_slaves ~= "" and master_name ~= "" then
+ slaves = dgn.find_markers_by_prop("slaved_to", master_name)
+ if #slaves == 0 then
+ error("Triggerable has no slaves to listen to")
+ end
+ else
+ slaves = { marker }
+ end
+
for _, trig in ipairs(self.triggerers) do
- trig:activate(self, marker)
+ for _, slave_marker in ipairs(slaves) do
+ trig:activate(self, marker, slave_marker:pos())
+ end
end
self.activating = false
self.activated = true
@@ -228,8 +258,18 @@ function Triggerable:do_trigger(triggerer, marker, ev)
end
-- NOTE: The master marker can be slaved to itself.
- local slaves =
+ local slaves
+
+ if self:property(marker, "only_at_slave") ~= '' then
+ local slave_marker = dgn.marker_at_pos(ev:pos())
+ if not slave_marker then
+ error("No slave marker at event position")
+ end
+
+ slaves = { slave_marker }
+ else
dgn.find_markers_by_prop("slaved_to", master_name)
+ end
-- If all slaves are gone, we're done.
if #slaves == 0 then
@@ -364,9 +404,9 @@ function TriggerableFunction:new(pars)
local tf = self.super.new(self)
if not pars.func then
- error("Must provide func to TriggerableMessage")
+ error("Must provide func to TriggerableFunction")
elseif type(pars.func) ~= "function" then
- error("TriggerableMessage func must be function, not " .. type(pars.msg))
+ error("TriggerableFunction func must be function, not " .. type(pars.msg))
end
tf.func = pars.func
@@ -578,7 +618,7 @@ function DgnTriggerer:added(triggerable)
end
end
-function DgnTriggerer:activate(triggerable, marker)
+function DgnTriggerer:activate(triggerable, marker, x, y)
if not (triggerable.activated or triggerable.activating) then
error("DgnTriggerer:activate(): triggerable is not activated")
end
@@ -586,7 +626,11 @@ function DgnTriggerer:activate(triggerable, marker)
local et = dgn.dgn_event_type(self.type)
if (dgn.dgn_event_is_position(et)) then
- dgn.register_listener(et, marker, marker:pos())
+ if not x or not y then
+ x, y = marker:pos()
+ end
+
+ dgn.register_listener(et, marker, x, y)
else
dgn.register_listener(et, marker)
end