git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@6961 c06c8d41-db1a-0410-9941-cceddc491573
YMKHC3DZYD4GAQRPZHOZ6RPPNX7ZIEMHBZJ4OKF7HJEHO4SQR7LAC
S7T5CO7QMCIK6QSVVB76GNOAQ6QNJOOINGMLFWRC26VK276R3QCAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
6QWZDCP5HGYLTJO3WWYJJGRRT7QFY6IG64TC7TUB553Z7GAA2HIQC
KKNUX66ORZWWQH4ARKCHPHNDOYCI65STE3A27LKA3FWUKIX7MAXQC
B7MSPF6X2RLGWN4M6ZZF3WSOPKGYPTTD7LIJVST7DXN27DG6JHNAC
6LWF2Q64D2FHZHSODMJ2OEXQXKUI3X5BIWWUQIFS3I4GULWBI4SQC
3XZOL3FFQZITUJIGDD6B6V6ZYMBN524JKNN6ZPJAXEC7RY433I3QC
3UKFCWWS5BLFQWZRB5FUA46CE2XGX5VRCEWC3K3XH5RCGQK64N2AC
WWR4IDWLXP4XLBWDZBA5GFG7CRKUJQNRK7FFUFOISK6OJTMYQPFQC
W45PMU4HNPSAMMEBJ4XH4MTHLPVIASZT4FXTBPID5LFXKIMNUBKAC
TZ55IZNANEJO2WDTKYWVLY2W2VV6BR7WKIN7XLNISAMMFT6LG2WQC
AOLWOUIFBQDQTCMSVB7N7GAKFUY5J5LH7CJZAY3HEY3WEUSLADZAC
4FQAKUKUO6PCAZ3N4HUR5XL6E4VA5UQUZ3AEDGRBLVY7W2LMWI7QC
O7S3ILRELHICJXXTDGMF7KPPZWYHPYCNDPV2I77FZXXH4I454B4QC
KA5FM5FELFEKHCCICIQCKVKOLHOYXOCODGK4NFJWRSPJ4UXULC2AC
HZK3YN3SAISTDS5JI4COBYFG7YB4ABDVENXWZZEYLFA2LDI232VAC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC
}
}
typedef std::pair<coord_def, dungeon_feature_type> located_feature;
typedef std::list<located_feature> located_feature_list;
bool _is_critical_feature(dungeon_feature_type feat)
{
return (feat == DNGN_ENTER_PORTAL_VAULT
|| feat == DNGN_ENTER_LABYRINTH
|| feat == DNGN_ENTER_SHOP);
}
static located_feature_list _save_critical_features()
{
located_feature_list result;
for (rectangle_iterator ri(1); ri; ++ri)
if (_is_critical_feature(grd(*ri)))
result.push_back(located_feature(*ri, grd(*ri)));
return result;
}
static void _restore_critical_features(const located_feature_list& lfl)
{
for (located_feature_list::const_iterator ci = lfl.begin();
ci != lfl.end(); ++ci)
{
grd(ci->first) = ci->second;
// Find an island to place the stairs up on.
int j;
const coord_def d1(1,0), d2(-1,0);
for ( j = 0; j < num_islands; ++j )
{
if (!_is_critical_feature(grd(centres[j]))
&& !_is_critical_feature(grd(centres[j] + d1))
&& !_is_critical_feature(grd(centres[j] + d2)))
{
break;
}
}
if (j == num_islands)
{
// Oh well.
j = 0;
mprf(MSGCH_ERROR, "Clobbering critical features: %d %d %d.",
grd(centres[j]), grd(centres[j] + d1), grd(centres[j] + d2));
}
grd[centres[0].x ][centres[0].y] = DNGN_STONE_STAIRS_UP_I;
grd[centres[0].x+1][centres[0].y] = DNGN_STONE_STAIRS_UP_II;
grd[centres[0].x-1][centres[0].y] = DNGN_STONE_STAIRS_UP_III;
grd[centres[j].x ][centres[j].y] = DNGN_STONE_STAIRS_UP_I;
grd[centres[j].x+1][centres[j].y] = DNGN_STONE_STAIRS_UP_II;
grd[centres[j].x-1][centres[j].y] = DNGN_STONE_STAIRS_UP_III;
mons_place(
mgen_data::sleeper_at(
one_chance_in(7) ? MONS_KILLER_BEE_LARVA
: MONS_KILLER_BEE,
*ri, MG_PATROLLING));
mons_place(mgen_data::sleeper_at(
one_chance_in(7) ? MONS_KILLER_BEE_LARVA
: MONS_KILLER_BEE,
*ri, MG_PATROLLING));