git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7560 c06c8d41-db1a-0410-9941-cceddc491573
KIDHPMZSLUVK3TF4565MH7SJ57C45SORJXR274VJTOULNOTGHQ4AC
5H5CMQX57I2C4IBRQJWKGJBTNOG7FX4HFXZTWYAGLJJZPIHQ5PNAC
BW6QCGQDWZ6G2UGDD4EXI5VVDZHM5S53MJIC5CKG3Q3VQ4IDQ2VQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
SVY2PTCLXR3KNPQAWXVXTTGCC5DR334HOAKHYO3VDDRWM2BWMALAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
A3CO4KBFTFU3ZSHWRY2OPPX3MMTFV7OUCZGL7Q4Y2FU7JO4AP7MAC
AO3KHGKGSX2ZR24KJVIOTUY7EHYHMMI5W4HN3CAG4YGQHBOHLGDQC
MSQI3TH6T62JAXQGLL52QZCWAMC372TGB6ZNNRDGUGMJKBNNV2VAC
KCHX2F3JFEWOZT3WMJVZAAQUU2QSZ5Q7RDCD7WUJ7VE65J52JFUQC
KTRWLM6WDL4GAAJZNLQEEA3TGY2OKYZZUAAT4TCAVKRTR2NQBWUQC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
3UKFCWWS5BLFQWZRB5FUA46CE2XGX5VRCEWC3K3XH5RCGQK64N2AC
IVVTHLTTLOP5TSULXJWUSSXHOKYWVU3OWKYVK45A7RIB6V34MYQAC
ZJLJGSB2XSBQU42OFQMXL3EG4CXAQGOYAU6YTV2SAWZEJIPFH2CAC
J7GPW2YXLT6FGSKJ24FGQ24GTRZ6A2BDYM6CIXV4R6YBEHP6BGPAC
DTO3EUKWHZ5RJNGNCFYXSOVTIPVXPP637F2W7WFGYKJ7JK7VNKNQC
VS246W2SVNBUAI5SZE3RS5WPQWLEYXHHJHFXP45BZO76CB56NI6QC
OYTCBRC7LE44EUVRZVYTOOVKQWJ6P6YE3FXTOGUTNKEMLNWPHKSQC
FSD7GIK3YLZXWLEH37BU6KV3IUCFGXPQL6IZ7H65YWNRBEKDBX5AC
W45PMU4HNPSAMMEBJ4XH4MTHLPVIASZT4FXTBPID5LFXKIMNUBKAC
6ZCKL3LCJ2QYYRI6CVK7CU4VXZMIZ6RIOTFUDEM2QTM4EHKVUKMAC
2YSMM7QMFZOPD5NXAD2OAMDJEY5LOZO4NCYBC7UCQVANKINJRNBAC
6CHNAAPWNROCQNX6EWPLXZOWX5HHKL5ZOHO24XRMNQTQF3CWB3VQC
SCWXQW5H65OXUP2MEJ2MEEAVPSRJDT3RQGKYCMKVTORS2334PQSQC
K6ELQ4HEZYDROC7CJFLPJS64AAJQ4G6RVLL4GBRUG6FJMKSBDDIQC
S7T5CO7QMCIK6QSVVB76GNOAQ6QNJOOINGMLFWRC26VK276R3QCAC
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC
HZK3YN3SAISTDS5JI4COBYFG7YB4ABDVENXWZZEYLFA2LDI232VAC
34C4U6EQWERY75GZJKUCM5KVGU2OUICETS5LGZF6RMKMZT4R5SQAC
56C44YMFHZ62GXAAOLYSLLGBVGRWXB53W2VI37Q26ZECEK2XG5SQC
AF7VAKCSGEYCXRTITS2WAW7VTM3OEQOECMNXR6YMOQLBCVZZFAVQC
X7MFMKQTNZ2IWBFVGS6WQV7NRNKJ3DWQAW2X7IQMFQQXW24AHPZQC
B7MSPF6X2RLGWN4M6ZZF3WSOPKGYPTTD7LIJVST7DXN27DG6JHNAC
XAFFD52IHN6FWFR2TT5F2KCUS7HAVCBI5CWTFMKPQG77GGTGAHLAC
6ZQY6HMQHBIQP6RPQZTK4KJ6YGCW2SJJUYHGI6UVATES5GKJRP7QC
JDM27QE4HR52AYFSQE763BFF57ANOTF5MXKMO377PP5EXMN7SAOAC
XJUQANMY7JJTA3KDICDXEOBE22YQTMZQSDPP4PFBTTGJJDK4X5KAC
XPTDBTPHD5CIPPOHIPMI7HBOTQIGGJPYKDOJCHWG2ZTI7SLUHTEAC
26HVORSNY267C3BZQ4RZD5NINMTJPDOAXBVPJX5HWMTOEINNBY3QC
int orient;
map_def map;
std::vector<coord_def> exits;
int level_number, altar_count, num_runes;
// If we're not placing runes, this is the substitute feature.
int rune_subst;
vault_placement()
: pos(-1, -1), size(0, 0), orient(0), map(),
exits(), level_number(0), altar_count(0), num_runes(0),
rune_subst(-1)
{
}
};
int vault_main(map_type vgrid,
vault_placement &vp,
int vault_main(vault_placement &vp,
// First, fill in entirely with walls and null-terminate {dlb}:
for (int vx = 0; vx < MAP_SIDE; vx++)
{
for (int vy = 0; vy < MAP_SIDE; vy++)
vgrid[vx][vy] = 'x';
vgrid[MAP_SIDE][vx] = 0;
vgrid[vx][MAP_SIDE] = 0;
}
const std::vector<std::string> &lines = ml.get_lines();
#ifdef DEBUG_DIAGNOSTICS
mprf(MSGCH_DIAGNOSTICS, "Applying %s at (%d,%d), dimensions (%d,%d)",
def.name.c_str(), start.x, start.y, size.x, size.y);
#endif
for (int y = start.y; y < start.y + size.y; ++y)
{
const std::string &s = lines[y - start.y];
strncpy(&map[y][start.x], s.c_str(), s.length());
}
int orient;
map_def map;
std::vector<coord_def> exits;
int level_number, altar_count, num_runes;
// If we're not placing runes, this is the substitute feature.
int rune_subst;
public:
vault_placement()
: pos(-1, -1), size(0, 0), orient(0), map(),
exits(), level_number(0), altar_count(0), num_runes(0),
rune_subst(-1)
{
}
void reset();
void apply_grid();
void draw_at(const coord_def &c);
};
// This is a throwaway.
std::vector<coord_def> &target_connections = place.exits;
// Paint the minivault onto the grid.
for (rectangle_iterator ri(v1, v1 + place.size - 1); ri; ++ri)
{
const coord_def vdelta = *ri - v1;
// FIXME: why the y and x swap?
const int feat = vgrid[vdelta.y][vdelta.x];
if (feat == ' ')
continue;
const dungeon_feature_type oldgrid = grd(*ri);
_vault_grid( place, feat, *ri, target_connections );
if (!Generating_Level)
{
link_items();
const dungeon_feature_type newgrid = grd(*ri);
grd(*ri) = oldgrid;
dungeon_terrain_changed(*ri, newgrid, true, true);
env.markers.remove_markers_at(*ri, MAT_ANY);
}
env.map(*ri).property |= FPROP_VAULT;
}
place.map.map.apply_overlays(v1);
place.apply_grid();
dgn_region this_vault(place.pos, place.size);
if (!place.size.zero())
{
// NOTE: assumes *no* previous item (I think) or monster (definitely)
// placement.
for ( rectangle_iterator ri(place.pos, place.pos + place.size - 1);
ri; ++ri )
{
if (vgrid[ri->y][ri->x] == ' ')
continue;
const dungeon_feature_type oldgrid = grd(*ri);
_vault_grid( place, vgrid[ri->y][ri->x], *ri,
target_connections );
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(*ri);
grd(*ri) = oldgrid;
dungeon_terrain_changed(*ri, newgrid, true, true);
env.markers.remove_markers_at(*ri, MAT_ANY);
}
env.map(*ri).property |= FPROP_VAULT;
}
}
place.map.map.apply_overlays(place.pos);
place.apply_grid();
//////////////////////////////////////////////////////////////////////////
// vault_placement
void vault_placement::reset()
{
altar_count = 0;
}
void vault_placement::apply_grid()
{
if (!size.zero())
{
// NOTE: assumes *no* previous item (I think) or monster (definitely)
// placement.
for ( rectangle_iterator ri(pos, pos + size - 1); ri; ++ri )
{
const coord_def &rp(*ri);
const coord_def dp = rp - pos;
const int feat = map.map.glyph(dp);
if (feat == ' ')
continue;
const dungeon_feature_type oldgrid = grd(*ri);
_vault_grid( *this, feat, *ri );
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(*ri);
grd(*ri) = oldgrid;
dungeon_terrain_changed(*ri, newgrid, true, true);
env.markers.remove_markers_at(*ri, MAT_ANY);
}
env.map(*ri).property |= FPROP_VAULT;
}
map.map.apply_overlays(pos);
}
}
void vault_placement::draw_at(const coord_def &c)
{
pos = c;
apply_grid();
}