diff options
author | Matthew Cline <zelgadis@sourceforge.net> | 2009-11-01 18:04:33 -0800 |
---|---|---|
committer | Matthew Cline <zelgadis@sourceforge.net> | 2009-11-01 18:04:33 -0800 |
commit | aa7e103e5803699429c084534409e32d9fe9c78c (patch) | |
tree | 5de537ff2111f76cdda06cb69e30064783085539 /crawl-ref/source/dat/clua | |
parent | f3283fc23719fad278fc4c9f3d6d47ef0aec694b (diff) | |
download | crawl-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.lua | 89 |
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 |