summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dat/clua/lm_timed.lua
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-07-26 11:06:09 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2007-07-26 11:06:09 +0000
commitf2a19d9971bb076f4a80a9e41ba601bc862d0fdf (patch)
treebe553fe84132e1f25d5f33fb98f703378096b961 /crawl-ref/source/dat/clua/lm_timed.lua
parentbc1a54904787e2f4779a99f2be1f72f6fd87679b (diff)
downloadcrawl-ref-f2a19d9971bb076f4a80a9e41ba601bc862d0fdf.tar.gz
crawl-ref-f2a19d9971bb076f4a80a9e41ba601bc862d0fdf.zip
Replaced timed markers with Lua markers. Breaks save compatibility.
KFEAT: feature names are now as in the dungeon_feature_type enum. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1930 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/dat/clua/lm_timed.lua')
-rw-r--r--crawl-ref/source/dat/clua/lm_timed.lua105
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