git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@2887 c06c8d41-db1a-0410-9941-cceddc491573
E5JKWMBVQQGVSCAX4UOGHI6QW5RFOX6PJB77LHL3UI2NJ427BFFQC
}
}
}
}
}
static void fixup_duplicate_stairs()
{
// This function ensures that there is no more than one of each up and down
// stone stairs I, II, and III. More than three stairs will result in
// turning additional stairs into rock stairs (with an attempt to keep
// level connectivity).
const unsigned int max_stairs = 20;
FixedVector<coord_def, max_stairs> up_stairs;
FixedVector<coord_def, max_stairs> down_stairs;
unsigned int num_up_stairs = 0;
unsigned int num_down_stairs = 0;
for (int x = 1; x < GXM; x++)
{
for (int y = 1; y < GYM; y++)
{
const coord_def c(x,y);
if (grd(c) >= DNGN_STONE_STAIRS_DOWN_I &&
grd(c) <= DNGN_STONE_STAIRS_DOWN_III &&
num_down_stairs < max_stairs)
{
down_stairs[num_down_stairs++] = c;
}
else if (grd(c) >= DNGN_STONE_STAIRS_UP_I &&
grd(c) <= DNGN_STONE_STAIRS_UP_III &&
num_up_stairs < max_stairs)
{
up_stairs[num_up_stairs++] = c;
}
}
}
for (unsigned int i = 0; i < 2; i++)
{
FixedVector<coord_def, max_stairs>& stair_list = (i == 0) ?
up_stairs : down_stairs;
unsigned int num_stairs;
dungeon_feature_type base;
dungeon_feature_type replace;
if (i == 0)
{
num_stairs = num_up_stairs;
replace = DNGN_ROCK_STAIRS_UP;
base = DNGN_STONE_STAIRS_UP_I;
}
else
{
num_stairs = num_down_stairs;
replace = DNGN_ROCK_STAIRS_DOWN;
base = DNGN_STONE_STAIRS_DOWN_I;
}
if (num_stairs > 3)
{
// Find pairwise stairs that are connected and turn one of them
// into a rock stairs of the appropriate type.
for (unsigned int s1 = 0; s1 < num_stairs; s1++)
{
if (num_stairs <= 3)
break;
for (unsigned int s2 = s1 + 1; s2 < num_stairs; s2++)
{
if (num_stairs <= 3)
break;
flood_find<feature_grid, coord_predicate> ff(env.grid,
in_bounds);
ff.add_feat(grd(stair_list[s2]));
// Ensure we're not searching for the feature at s1.
dungeon_feature_type save = grd(stair_list[s1]);
grd(stair_list[s1]) = DNGN_FLOOR;
coord_def where = ff.find_first_from(stair_list[s1],
dgn_map_mask);
if (where.x)
{
grd(stair_list[s2]) = replace;
num_stairs--;
stair_list[s2] = stair_list[num_stairs];
s2--;
}
grd(stair_list[s1]) = save;
ASSERT(num_stairs <= 3);
if (num_stairs <= 1)
continue;
// At this point, up_stairs and down_stairs contain no more than
// three stairs. Ensure that they are unique.
for (int s = 0; s < (num_stairs == 3 ? 4 : 1); s++)
{
int s1 = s % num_stairs;
int s2 = (s1 + 1) % num_stairs;
ASSERT(grd(stair_list[s2]) >= base &&
grd(stair_list[s2]) <= base + 3);
if (grd(stair_list[s1]) == grd(stair_list[s2]))
{
grd(stair_list[s2]) = (dungeon_feature_type)(base +
(grd(stair_list[s2])-base+1) % 3);
}
}