1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
------------------------------------------------------------------------------
-- dungeon.lua:
-- Dungeoneering functions.
------------------------------------------------------------------------------
-- Wraps a map_def into a Lua environment (a table) such that
-- functions run in the environment (with setfenv) can directly
-- address the map with function calls such as name(), tags(), etc.
--
-- This function caches the environments it creates, so that successive runs
-- of Lua chunks from the same map will use the same environment.
function dgn_map_meta_wrap(map, tab)
if not dgn._map_envs then
dgn._map_envs = { }
end
local name = dgn.name(map)
local meta = dgn._map_envs[name]
if not meta then
meta = { }
local meta_meta = { __index = _G }
setmetatable(meta, meta_meta)
dgn._map_envs[name] = meta
end
-- We must set this each time - the map may have the same name, but
-- be a different C++ object.
for fn, val in pairs(tab) do
meta[fn] = function (...)
return crawl.err_trace(val, map, ...)
end
end
meta.wrapped_instance = map
return meta
end
-- Discards accumulated map environments.
function dgn_flush_map_environments()
dgn._map_envs = nil
end
function dgn_set_map(map)
g_dgn_curr_map = map
end
function dgn_run_map(prelude, main)
if prelude or main then
local env = dgn_map_meta_wrap(g_dgn_curr_map, dgn)
if prelude then
local fn = setfenv(prelude, env)
if not main then
return fn()
end
fn()
end
if main then
return setfenv(main, env)()
end
end
end
|