only really works for non-encompass vaults, and dungeon fixups are not applied (so random deep water -> shallow water conversion, auto-placement of water creatures, etc. will not happen).
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1942 c06c8d41-db1a-0410-9941-cceddc491573
FSD7GIK3YLZXWLEH37BU6KV3IUCFGXPQL6IZ7H65YWNRBEKDBX5AC
T2AYVN57EFJQLFUFLAZDXKDAFDGTDLQIEQWQZNYFWJZBYSTYH4QQC
PISXY4NKSKL5KDJWAHD7CTXWTQDH3NFWQSFAHUAI3VVATWKXRODQC
XBSRV4LDUNTV7IYWAUCE7SW3ILWWJUB5ZQCHACLLWBZK5M2WUPDAC
TLO257LZSB6ZO36STDUEWJBO2LETXFKTFGXELA6Y4BZBVAEIIINAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
RC6L3CIBLJEH4GWRFD7UQNGI6PZT74FRUVOYHSAN2XCC74NZUASQC
PL6I2CMSTHY5ZHWVMIQE5YTM5S5VPKBNZM6QJVHZSSKOJGIJ5W4AC
KCHX2F3JFEWOZT3WMJVZAAQUU2QSZ5Q7RDCD7WUJ7VE65J52JFUQC
ZVK4J5HTKFNOOIVCI62ZWEYGXEE5TYJ65DLYYZAZWTADFSXE62ZAC
ANBVGN4RZOMY5LI4QSHOV2477FN55H353ZYLSVCPTXC7AWWSQZBAC
IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC
ZJLJGSB2XSBQU42OFQMXL3EG4CXAQGOYAU6YTV2SAWZEJIPFH2CAC
JR4ZZK4HOXQIG3WXBGTPZAPPNF7HHBCUZ3TE7RBCS64NHCOX7B2QC
3PY3L3A4QRW3Z5Y7SHO4TMVOOP2VNCO27X2MX4DTOP2SADLBQUOAC
OYTCBRC7LE44EUVRZVYTOOVKQWJ6P6YE3FXTOGUTNKEMLNWPHKSQC
XY77S75KH5KV54MZVAPMUC64TVRE2QM2KVJAAGJGCIBGQEC5GUTQC
WLX2RQMMOMP2PYPAGJRM4VFD2WTLJTOAZZPPY3MV76FU2EGEJ54QC
C22455VGUQOSUX2OORA32LROFQ7NNYDMD2ZDTTUZSAQLXK4AD6QAC
2WRXQTGYDBLV46WRNVIUKGNA5QS563XZNNW3N2L6PVOCHIP2YGHQC
MSQI3TH6T62JAXQGLL52QZCWAMC372TGB6ZNNRDGUGMJKBNNV2VAC
SCWXQW5H65OXUP2MEJ2MEEAVPSRJDT3RQGKYCMKVTORS2334PQSQC
HZK3YN3SAISTDS5JI4COBYFG7YB4ABDVENXWZZEYLFA2LDI232VAC
CUNNC574MESEMTTONZ6YB6CJ2S5P6VA3V7Z3OODESWAK37GYOBPAC
QUYSD2DWCIKAAQJGI43EENAWWPA5W33UT3I5WFRSHU6FPSSXTX2AC
QFWQG7G6KTZX3GP52K3N4BDWLMNH7A3A5ILJLXDIK6PYYLF3KO3AC
AOLWOUIFBQDQTCMSVB7N7GAKFUY5J5LH7CJZAY3HEY3WEUSLADZAC
56C44YMFHZ62GXAAOLYSLLGBVGRWXB53W2VI37Q26ZECEK2XG5SQC
UOW2X5KTUHYCM73SWNOSJPHUKWVLF3OJTNSISSSENEURBX2XWHVQC
CREW3VTGN2BV622ZXHCPHUEZWBAGEQMNUELDLTHLEKG4VBXGMRPQC
4RFKVDJKTCRBZU6WPJ2E5OVI5IRPY3UTRPOBLC5QHY4CQJJTLZKQC
34C4U6EQWERY75GZJKUCM5KVGU2OUICETS5LGZF6RMKMZT4R5SQAC
K6ELQ4HEZYDROC7CJFLPJS64AAJQ4G6RVLL4GBRUG6FJMKSBDDIQC
W5WCC5J7PL6IXZ5LPSUWGY3IVQBCTK3FKOD5ADYRWWH2N425NEAAC
FMBJCM5LJKCG326YRJGOOJU6QNWONXAHK2AB4CP4SAOHKJ5CORXQC
DBGS3HXMW24VO5GBITT3UI2ZNIISUXUHAEAYUI52QPUT7IO46ITQC
&& grd[i][j] == DNGN_EXIT_PANDEMONIUM)
#ifdef WIZARD
|| (map_radius == 1000 && you.wizard)
#endif
)
&& grd[i][j] == DNGN_EXIT_PANDEMONIUM)
|| wizard_map)
bool builder(int level_number, int level_type);
void level_welcome_messages();
void define_zombie(int mid, int ztype, int cs, int power);
bool is_wall(int feature);
bool place_specific_trap(int spec_x, int spec_y, trap_type spec_type);
void place_spec_shop(int level_number, int shop_x, int shop_y,
int force_s_type, bool representative = false);
bool unforbidden(const coord_def &c, unsigned mask);
coord_def dgn_find_nearby_stair(int stair_to_find, bool find_closest);
bool builder(int level_number, int level_type);
bool dgn_place_map(int map, bool generating_level, bool clobber);
void level_clear_vault_memory();
void level_welcome_messages();
void define_zombie(int mid, int ztype, int cs, int power);
bool is_wall(int feature);
bool place_specific_trap(int spec_x, int spec_y, trap_type spec_type);
void place_spec_shop(int level_number, int shop_x, int shop_y,
int force_s_type, bool representative = false);
bool unforbidden(const coord_def &c, unsigned mask);
coord_def dgn_find_nearby_stair(int stair_to_find, bool find_closest);
if ((grd[vx][vy] != DNGN_FLOOR
&& grd[vx][vy] != DNGN_ROCK_WALL
&& grd[vx][vy] != DNGN_CLOSED_DOOR
&& grd[vx][vy] != DNGN_SECRET_DOOR
&& (!water_ok ||
(grd[vx][vy] != DNGN_DEEP_WATER
&& grd[vx][vy] != DNGN_SHALLOW_WATER)))
|| igrd[vx][vy] != NON_ITEM
|| mgrd[vx][vy] != NON_MONSTER)
if ((dfeat != DNGN_FLOOR
&& dfeat != DNGN_ROCK_WALL
&& dfeat != DNGN_CLOSED_DOOR
&& dfeat != DNGN_SECRET_DOOR
&& (!water_ok
|| (dfeat != DNGN_DEEP_WATER
&& dfeat != DNGN_SHALLOW_WATER))
&& (!clobber
|| (!grid_is_solid(dfeat) && dfeat != DNGN_LAVA
&& !grid_is_watery(dfeat))))
|| (!clobber
&& (igrd[vx][vy] != NON_ITEM
|| mgrd[vx][vy] != NON_MONSTER)))
}
}
static dungeon_feature_type dgn_find_rune_subst(const std::string &tag)
{
const std::string suffix("_entry");
const std::string::size_type psuffix = tag.find(suffix);
if (psuffix == std::string::npos)
return (DNGN_FLOOR);
const std::string key = tag.substr(0, psuffix);
if (key == "bzr")
return (DNGN_ENTER_PORTAL_VAULT);
else if (key == "lab")
return (DNGN_ENTER_LABYRINTH);
else if (key == "hell")
return (DNGN_ENTER_HELL);
else if (key == "pan")
return (DNGN_ENTER_PANDEMONIUM);
else if (key == "abyss")
return (DNGN_ENTER_ABYSS);
else
{
for (int i = 0; i < NUM_BRANCHES; ++i)
{
if (branches[i].entry_stairs != NUM_FEATURES
&& !strcasecmp(branches[i].abbrevname, key.c_str()))
{
return (branches[i].entry_stairs);
}
}
}
return (DNGN_FLOOR);
}
static dungeon_feature_type dgn_find_rune_subst_tags(const std::string &tags)
{
std::vector<std::string> words = split_string(" ", tags);
for (int i = 0, size = words.size(); i < size; ++i)
{
const dungeon_feature_type feat = dgn_find_rune_subst(words[i]);
if (feat != DNGN_FLOOR)
return (feat);
bool dgn_place_map(int map, bool generating_level, bool clobber)
{
const map_def *mdef = map_by_index(map);
bool did_map = false;
if (mdef->is_minivault())
did_map =
build_minivaults(you.your_level, map, generating_level, clobber);
else
{
dungeon_feature_type rune_subst = DNGN_FLOOR;
if (mdef->has_tag_suffix("_entry"))
rune_subst = dgn_find_rune_subst_tags(mdef->tags);
did_map = build_secondary_vault(you.your_level, map, rune_subst,
generating_level, clobber);
}
// Activate any markers within the map.
if (did_map)
{
const vault_placement &vp = level_vaults[level_vaults.size() - 1];
for (int y = vp.y; y < vp.y + vp.height; ++y)
{
for (int x = vp.x; x < vp.x + vp.width; ++x)
{
std::vector<map_marker *> markers =
env_get_markers(coord_def(x, y));
for (int i = 0, size = markers.size(); i < size; ++i)
markers[i]->activate();
if (!see_grid(x, y))
set_terrain_changed(x, y);
}
}
}
return (did_map);
}
if (!generating_level)
{
// Have to link items each square at a time, or
// dungeon_terrain_changed could blow up.
link_items();
const dungeon_feature_type newgrid = grd[vx][vy];
grd[vx][vy] = oldgrid;
dungeon_terrain_changed(coord_def(vx, vy), newgrid);
env_remove_markers_at(coord_def(vx, vy), MAT_ANY);
}
}
static void debug_load_map_by_name(const std::string &name)
{
level_clear_vault_memory();
const int map = find_map_by_name(name);
if (map == -1)
{
mprf("Can't find map named '%s'.", name.c_str());
return;
}
if (dgn_place_map(map, false, true))
mprf("Successfully placed %s.", map_by_index(map)->name.c_str());
else
mprf("Failed to place %s.", map_by_index(map)->name.c_str());
}
void debug_place_map()
{
char what_to_make[100];
mesclr();
mprf(MSGCH_PROMPT, "Enter map name: ");
if (cancelable_get_line(what_to_make, sizeof what_to_make))
{
canned_msg(MSG_OK);
return;
}
std::string what = what_to_make;
trim_string(what);
if (what.empty())
{
canned_msg(MSG_OK);
return;
}
debug_load_map_by_name(what);