summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dat/clua
diff options
context:
space:
mode:
authorMatthew Cline <zelgadis@sourceforge.net>2009-11-01 18:04:33 -0800
committerMatthew Cline <zelgadis@sourceforge.net>2009-11-01 18:04:33 -0800
commitaa7e103e5803699429c084534409e32d9fe9c78c (patch)
tree5de537ff2111f76cdda06cb69e30064783085539 /crawl-ref/source/dat/clua
parentf3283fc23719fad278fc4c9f3d6d47ef0aec694b (diff)
downloadcrawl-ref-aa7e103e5803699429c084534409e32d9fe9c78c.tar.gz
crawl-ref-aa7e103e5803699429c084534409e32d9fe9c78c.zip
lm_trig.lua: event() uses method dispatch
Use a method-dispatch type mechanism to deal with the different types of dungeon events, rather than a long series of "elseif"s.
Diffstat (limited to 'crawl-ref/source/dat/clua')
-rw-r--r--crawl-ref/source/dat/clua/lm_trig.lua89
1 files changed, 50 insertions, 39 deletions
diff --git a/crawl-ref/source/dat/clua/lm_trig.lua b/crawl-ref/source/dat/clua/lm_trig.lua
index f435fd2424..7e72b80397 100644
--- a/crawl-ref/source/dat/clua/lm_trig.lua
+++ b/crawl-ref/source/dat/clua/lm_trig.lua
@@ -218,6 +218,11 @@ function DgnTriggerer:new(pars)
error("DgnTriggerer must have a type")
end
+ -- Check for method name identical to event name.
+ if not DgnTriggerer[pars.type] then
+ error("DgnTriggerer can't handle event type '" .. pars.type .. "'")
+ end
+
if pars.type == "monster_dies" or pars.type == "item_moved"
or pars.type == "item_pickup"
then
@@ -281,56 +286,62 @@ function DgnTriggerer:remove(triggerable, marker)
end
function DgnTriggerer:event(triggerable, marker, ev)
- if self.type == "monster_dies" then
- local midx = ev:arg1()
- local mons = dgn.mons_from_index(midx)
+ -- Use a method-dispatch type mechanism, rather than a series
+ -- of "elseif"s.
+ DgnTriggerer[self.type](self, triggerable, marker, ev)
+end
- if not mons then
- error("DgnTriggerer:event() didn't get a valid monster index")
- end
+function DgnTriggerer:monster_dies(triggerable, marker, ev)
+ local midx = ev:arg1()
+ local mons = dgn.mons_from_index(midx)
- if mons.name == self.target then
- triggerable:on_trigger(self, marker, ev)
- end
- elseif self.type == "feat_change" then
- if self.target and self.target ~= "" then
- local feat = dgn.feature_name(dgn.grid(ev:pos()))
- if not string.find(feat, self.target) then
- return
- end
- end
+ if not mons then
+ error("DgnTriggerer:monster_dies() didn't get a valid monster index")
+ end
+
+ if mons.name == self.target then
triggerable:on_trigger(self, marker, ev)
- elseif self.type == "item_moved" then
- local obj_idx = ev:arg1()
- local it = dgn.item_from_index(obj_idx)
+ end
+end
- if not it then
- error("DgnTriggerer:event() didn't get a valid item index")
+function DgnTriggerer:feat_change(triggerable, marker, ev)
+ if self.target and self.target ~= "" then
+ local feat = dgn.feature_name(dgn.grid(ev:pos()))
+ if not string.find(feat, self.target) then
+ return
end
+ end
+ triggerable:on_trigger(self, marker, ev)
+end
- if item.name(it) == self.target then
- if self.marker_mover then
- -- We only exist to move the triggerable if the item moves
- triggerable:move(marker, ev:dest())
- else
- triggerable:on_trigger(self, marker, ev)
- end
- end
- elseif self.type == "item_pickup" then
- local obj_idx = ev:arg1()
- local it = dgn.item_from_index(obj_idx)
+function DgnTriggerer:item_moved(triggerable, marker, ev)
+ local obj_idx = ev:arg1()
+ local it = dgn.item_from_index(obj_idx)
- if not it then
- error("DgnTriggerer:event() didn't get a valid item index")
- end
+ if not it then
+ error("DgnTriggerer:item_moved() didn't get a valid item index")
+ end
- if item.name(it) == self.target then
+ if item.name(it) == self.target then
+ if self.marker_mover then
+ -- We only exist to move the triggerable if the item moves
+ triggerable:move(marker, ev:dest())
+ else
triggerable:on_trigger(self, marker, ev)
end
- else
- local e_type = dgn.dgn_event_type(et)
+ end
+end
+
+function DgnTriggerer:item_pickup(triggerable, marker, ev)
+ local obj_idx = ev:arg1()
+ local it = dgn.item_from_index(obj_idx)
- error("DgnTriggerer can't handle events of type " .. e_type)
+ if not it then
+ error("DgnTriggerer:item_pickup() didn't get a valid item index")
+ end
+
+ if item.name(it) == self.target then
+ triggerable:on_trigger(self, marker, ev)
end
end