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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
------------------------------------------------------------------------------
-- 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
--------------------------------------------------------------------
function dgn.places_connected(map, map_glyph, test_connect, ...)
local points = { }
for _, glyph in ipairs( { ... } ) do
local x, y = map_glyph(map, glyph)
if x and y then
table.insert(points, x)
table.insert(points, y)
else
error("Can't find coords for '" .. glyph .. "'")
end
end
return test_connect(map, unpack(points))
end
function dgn.glyphs_connected(map, ...)
return dgn.places_connected(map, dgn.gly_point, dgn.points_connected, ...)
end
function dgn.orig_glyphs_connected(map, ...)
return dgn.places_connected(map, dgn.orig_gly_point,
dgn.points_connected, ...)
end
function dgn.orig_fn(map, fnx, ...)
local original = dgn.original_map(map)
if not original then
error("Can't find original map for map '" .. dgn.name(map) .. "'")
end
return fnx(original, ...)
end
function dgn.orig_gly_point(map, glyph)
return dgn.orig_fn(map, dgn.gly_point, glyph)
end
function dgn.orig_gly_points(map, glyph)
return dgn.orig_fn(map, dgn.gly_points, glyph)
end
|