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]);elselua_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 dolocal place = { x = c.x + range(-30, 30), y = c.y + range(-30, 30) }if (dgn.grid(place.x, place.y) == floor) thenreturn placeend
local map, vplace = dgn.resolve_map(dgn.map_by_tag("ziggurat_pillar"))if not map thenreturnendlocal 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 thenif good_place(c) thenreturn dgn.place_map(map, false, true, c.x, c.y)endelsefor i = 1, 100 dolocal 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 thendgn.place_map(map, false, true, p.x, p.y)
offsets = util.map(function (o)return o + cend, offsets)if util.forall(offsets, good_place) thenlocal function replace(at, hflip, vflip)dgn.reuse_map(vplace, at.x, at.y, hflip, vflip)endreplace(offsets[1], false, false)replace(offsets[2], false, true)replace(offsets[3], true, false)replace(offsets[4], false, true)return trueendend
---------------------------------------------------------------------------- point.lua--------------------------------------------------------------------------local point_metatable = { }function dgn.point(x, y)local pt = { x = x, y = y }setmetatable(pt, point_metatable)return ptendpoint_metatable.__add = function (a, b)if type(b) == "number" thenreturn dgn.point(a.x + b, a.y + b)elsereturn dgn.point(a.x + b.x, a.y + b.y)endendpoint_metatable.__sub = function (a, b)if type(b) == "number" thenreturn dgn.point(a.x - b, a.y - b)elsereturn dgn.point(a.x - b.x, a.y - b.y)endendpoint_metatable.__div = function (a, b)if type(b) ~= "number" thenerror("Can only divide by numbers.")endreturn dgn.point(math.floor(a.x / b),math.floor(a.y / b))endpoint_metatable.__mul = function (a, b)if type(b) ~= "number" thenerror("Can only multiply by numbers.")endreturn dgn.point(a.x * b, a.y * b)endpoint_metatable.__unm = function (a)return dgn.point(-a.x, -a.y)endpoint_metatable.__concat = function (pre, post)local function pstr(p)return "(" .. p.x .. "," .. p.y .. ")"endif getmetatable(pre) == point_metatable thenreturn pstr(pre) .. postelsereturn pre .. pstr(post)endend
endendendend-- 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 dofor y = tl.y, br.y doif not fpred(dgn.point(x, y)) thenreturn false