diff options
Diffstat (limited to 'crawl-ref/source/dat/clua/lm_timed.lua')
-rw-r--r-- | crawl-ref/source/dat/clua/lm_timed.lua | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/crawl-ref/source/dat/clua/lm_timed.lua b/crawl-ref/source/dat/clua/lm_timed.lua new file mode 100644 index 0000000000..8b9f1aaf26 --- /dev/null +++ b/crawl-ref/source/dat/clua/lm_timed.lua @@ -0,0 +1,105 @@ +------------------------------------------------------------------------------ +-- lm_timed.lua: +-- Lua timed map feature markers. +------------------------------------------------------------------------------ + +dofile('clua/lm_tmsg.lua') + +TimedMarker = { } +TimedMarker.__index = TimedMarker + +function TimedMarker._new() + local marker = { } + setmetatable(marker, TimedMarker) + return marker +end + +function TimedMarker.new(pars) + pars = pars or { } + if not pars.msg then + error("No messaging object provided (msg = nil)") + end + pars.high = pars.high or pars.low or pars.turns or 1 + pars.low = pars.low or pars.high or pars.turns or 1 + local dur = crawl.random_range(pars.low, pars.high, pars.navg or 1) + local feat = pars.feat or 'floor' + local fnum = dgn.feature_number(feat) + if fnum == dgn.feature_number('unseen') then + error("Bad feature name: " .. feat) + end + + local tmarker = TimedMarker._new() + tmarker.dur = dur * 10 + tmarker.fnum = fnum + tmarker.feat = feat + tmarker.msg = pars.msg + return tmarker +end + +function TimedMarker:activate(marker) + self.msg:init(self, marker) + + dgn.register_listener(dgn.dgn_event_type('turn'), marker) + dgn.register_listener(dgn.dgn_event_type('player_climb'), + marker, marker:pos()) +end + +function TimedMarker:timeout(marker, verbose, affect_player) + local x, y = marker:pos() + if verbose then + if you.see_grid(marker:pos()) then + crawl.mpr(dgn.feature_desc(dgn.grid(x, y), "The") .. + " disappears!") + else + crawl.mpr("The walls and floor vibrate strangely for a moment.") + end + end + dgn.terrain_changed(x, y, self.fnum, affect_player) + dgn.remove_listener(marker) + dgn.remove_listener(marker, marker:pos()) + dgn.remove_marker(marker) +end + +function TimedMarker:event(marker, ev) + self.ticktype = self.ticktype or dgn.dgn_event_type('turn') + self.stairtype = self.stairtype or dgn.dgn_event_type('player_climb') + + if ev:type() == self.stairtype then + local mx, my = marker:pos() + local ex, ey = ev:pos() + if mx == ex and my == ey then + self:timeout(marker, false, false) + end + return + end + + if ev:type() ~= self.ticktype then + return + end + self.dur = self.dur - ev:ticks() + self.msg:event(self, marker, ev) + if self.dur <= 0 then + self:timeout(marker, true, true) + end +end + +function TimedMarker:describe(marker) + return self.feat .. "/" .. tostring(self.dur) +end + +function TimedMarker.read(marker, th) + local marker = TimedMarker._new() + marker.dur = file.unmarshall_number(th) + marker.fnum = file.unmarshall_number(th) + marker.feat = file.unmarshall_string(th) + marker.msg = file.unmarshall_fn(th)(th) + return marker +end + +function TimedMarker:write(marker, th) + file.marshall(th, self.dur) + file.marshall(th, self.fnum) + file.marshall(th, self.feat) + file.marshall(th, self.msg.read) + self.msg:write(th) +end |