git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7591 c06c8d41-db1a-0410-9941-cceddc491573
CPBVQFT7NWEYLYD34D5VYZIEOZ32YADXYTSFMS635YNXX4OFIZVAC
KIDHPMZSLUVK3TF4565MH7SJ57C45SORJXR274VJTOULNOTGHQ4AC
4N5PW5S3OV25HFN634NNWMMYX26NA2TB6TVFG4UMYSZ2VBJWKE4QC
ZLQAAP55CJ77XIJN3DZVPT4GTTVLIBFJLIJJKI6L5UBSHX7VUK6AC
RGHXFBNIULRVRYLBGG5JZDMYVM2E2JJ2Y5KQPMU6PUS3V26G6ZXQC
AUXHSGS4EFOPZ6TVZYWNVOUDO7NYKUKE3HBKGQQWTALSVFOE3HAAC
NCDWWDJQLAU5ORSAQGZKJJ5E22VTDGGPJMVVBWQFHQ2B3U3UFHDQC
TLA5UN6LZPXGKERI27EFY4HKIIU3VU5Y7ZU54WXL6ANBUV2VOTMQC
NKONHW4JNY6HP2M63MNPM3H64ZWSUNUT5FX2STW4KTS4AMXJXXVQC
RN242L3YZK35BFY7JRTCSYWD6FWDCRFUFDI7PKYFUCA2UPX6ZEAQC
ED62QWGKBPORWVKDFOQRKJXEIWZVNGR3O4KWQBDSRNPT36AYOQYAC
ASLW3Z5PAVZSWJEMMMVZT226P44EKSAD47QS72JIFJESAI3RPN3AC
C22455VGUQOSUX2OORA32LROFQ7NNYDMD2ZDTTUZSAQLXK4AD6QAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
W45PMU4HNPSAMMEBJ4XH4MTHLPVIASZT4FXTBPID5LFXKIMNUBKAC
6ZCKL3LCJ2QYYRI6CVK7CU4VXZMIZ6RIOTFUDEM2QTM4EHKVUKMAC
KSCU43RIVSEIHTN6BRAKXENI66L3IRDZQHUBT5VS4NJBBCQQPHUQC
IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC
2YSMM7QMFZOPD5NXAD2OAMDJEY5LOZO4NCYBC7UCQVANKINJRNBAC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
ZJLJGSB2XSBQU42OFQMXL3EG4CXAQGOYAU6YTV2SAWZEJIPFH2CAC
B7MSPF6X2RLGWN4M6ZZF3WSOPKGYPTTD7LIJVST7DXN27DG6JHNAC
SCWXQW5H65OXUP2MEJ2MEEAVPSRJDT3RQGKYCMKVTORS2334PQSQC
AO3KHGKGSX2ZR24KJVIOTUY7EHYHMMI5W4HN3CAG4YGQHBOHLGDQC
XAFFD52IHN6FWFR2TT5F2KCUS7HAVCBI5CWTFMKPQG77GGTGAHLAC
X7MFMKQTNZ2IWBFVGS6WQV7NRNKJ3DWQAW2X7IQMFQQXW24AHPZQC
HNXKX6ZDQJV33E7UKZOLBYWJMRZ4QLEMXVXJZNRCTOIG2KVRTIEAC
W52PCSHX72WAMWKG6L4BPUBVMO6E72KYYBNKAA7554KNOTY6V7WQC
44YRMW5JNVUBYX3M6UFQOPENNHGO7G2CRZ7SGPIIUTQGYWTRWENAC
UEI5JAVCMN7Y2SACTEZPZSNFJWOJTC55G24Q6LKQCT4XNDH5ZQIAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
YE7M665QKDGI7Y5WMERCWJNDZ4FUZ6GRUCK4E6GZH4SWCUM6RWLAC
lua_pushboolean(ls, dgn_place_map(map, clobber, no_exits, where));
if (dgn_place_map(map, clobber, no_exits, where) && !Level_Vaults.empty())
lua_pushlightuserdata(ls, &Level_Vaults[Level_Vaults.size() - 1]);
else
lua_pushnil(ls);
return (1);
}
LUAFN(_dgn_in_vault)
{
GETCOORD(c, 1, 2, map_bounds);
const int mask = lua_isnone(ls, 3) ? MMT_VAULT : lua_tointeger(ls, 3);
lua_pushboolean(ls, dgn_Map_Mask(c) & mask);
MAP(ls, 1, map);
const bool check_collisions = _lua_boolean(ls, 2, true);
// Save the vault_placement into Temp_Vaults because the map_def
// will need to be alive through to the end of dungeon gen.
Temp_Vaults.push_back(vault_placement());
vault_placement &place(Temp_Vaults[Temp_Vaults.size() - 1]);
if (vault_main(place, map, check_collisions) != MAP_NONE)
{
clua_push_map(ls, &place.map);
lua_pushlightuserdata(ls, &place);
}
else
{
lua_pushnil(ls);
lua_pushnil(ls);
}
return (2);
}
LUAFN(_dgn_reuse_map)
{
if (!lua_isuserdata(ls, 1))
luaL_argerror(ls, 1, "Expected vault_placement");
vault_placement &vp(
*static_cast<vault_placement*>(lua_touserdata(ls, 1)));
COORDS(place, 2, 3);
const bool flip_horiz = _lua_boolean(ls, 4, false);
const bool flip_vert = _lua_boolean(ls, 5, false);
// 1 for clockwise, -1 for anticlockwise, 0 for no rotation.
const int rotate_dir = lua_isnone(ls, 6) ? 0 : luaL_checkint(ls, 6);
const bool register_place = _lua_boolean(ls, 7, true);
const bool register_vault = register_place && _lua_boolean(ls, 8, false);
if (flip_horiz)
vp.map.hmirror();
if (flip_vert)
vp.map.vmirror();
if (rotate_dir)
vp.map.rotate(rotate_dir == 1);
vp.size = vp.map.map.size();
// draw_at changes vault_placement.
vp.draw_at(place);
if (register_place)
dgn_register_place(vp, register_vault);
return (0);
}
extern map_mask dgn_Map_Mask;
extern bool Generating_Level;
extern std::string dgn_Layout_Type;
extern std::set<std::string> Level_Unique_Maps;
extern std::set<std::string> Level_Unique_Tags;
extern map_mask dgn_Map_Mask;
extern bool Generating_Level;
extern std::string dgn_Layout_Type;
extern std::set<std::string> Level_Unique_Maps;
extern std::set<std::string> Level_Unique_Tags;
extern std::vector<vault_placement> Level_Vaults;
extern std::vector<vault_placement> Temp_Vaults;
local function pillar_spot()
local floor = dgn.fnum("floor")
for i = 1, 100 do
local place = { x = c.x + range(-30, 30), y = c.y + range(-30, 30) }
if (dgn.grid(place.x, place.y) == floor) then
return place
end
local map, vplace = dgn.resolve_map(dgn.map_by_tag("ziggurat_pillar"))
if not map then
return
end
local name = dgn.name(map)
local size = dgn.point(dgn.mapsize(map))
-- Does the pillar want to be centered?
local centered = string.find(dgn.tags(map), " centered ")
local function good_place(p)
local function good_square(where)
return dgn.grid(where.x, where.y) == floor
local function place_pillar()
if centered then
if good_place(c) then
return dgn.place_map(map, false, true, c.x, c.y)
end
else
for i = 1, 100 do
local offset = range(-15, -size.x)
local offsets = {
dgn.point(offset, offset) - size + 1,
dgn.point(offset - size.x + 1, -offset),
dgn.point(-offset, -offset),
dgn.point(-offset, offset - size.y + 1)
}
local function place_pillar(p)
local map = dgn.map_by_tag("ziggurat_pillar")
if map then
dgn.place_map(map, false, true, p.x, p.y)
offsets = util.map(function (o)
return o + c
end, offsets)
if util.forall(offsets, good_place) then
local function replace(at, hflip, vflip)
dgn.reuse_map(vplace, at.x, at.y, hflip, vflip)
end
replace(offsets[1], false, false)
replace(offsets[2], false, true)
replace(offsets[3], true, false)
replace(offsets[4], false, true)
return true
end
end
--------------------------------------------------------------------------
-- point.lua
--------------------------------------------------------------------------
local point_metatable = { }
function dgn.point(x, y)
local pt = { x = x, y = y }
setmetatable(pt, point_metatable)
return pt
end
point_metatable.__add = function (a, b)
if type(b) == "number" then
return dgn.point(a.x + b, a.y + b)
else
return dgn.point(a.x + b.x, a.y + b.y)
end
end
point_metatable.__sub = function (a, b)
if type(b) == "number" then
return dgn.point(a.x - b, a.y - b)
else
return dgn.point(a.x - b.x, a.y - b.y)
end
end
point_metatable.__div = function (a, b)
if type(b) ~= "number" then
error("Can only divide by numbers.")
end
return dgn.point(math.floor(a.x / b),
math.floor(a.y / b))
end
point_metatable.__mul = function (a, b)
if type(b) ~= "number" then
error("Can only multiply by numbers.")
end
return dgn.point(a.x * b, a.y * b)
end
point_metatable.__unm = function (a)
return dgn.point(-a.x, -a.y)
end
point_metatable.__concat = function (pre, post)
local function pstr(p)
return "(" .. p.x .. "," .. p.y .. ")"
end
if getmetatable(pre) == point_metatable then
return pstr(pre) .. post
else
return pre .. pstr(post)
end
end
end
end
end
end
-- Returns true if fpred returns true for all squares in the rectangle
-- whose top-left corner is tl and bottom right corner is br (br.x >=
-- tl.x and br.y >= tl.y).
function dgn.rectangle_forall(tl, br, fpred)
for x = tl.x, br.x do
for y = tl.y, br.y do
if not fpred(dgn.point(x, y)) then
return false