in the case of enclosed entry vaults.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@921 c06c8d41-db1a-0410-9941-cceddc491573
SCWXQW5H65OXUP2MEJ2MEEAVPSRJDT3RQGKYCMKVTORS2334PQSQC
YMNWB2JPFFAEHTFKXSKBILNBPH7MLI627QUXZS462VEZJDS263DQC
A3CO4KBFTFU3ZSHWRY2OPPX3MMTFV7OUCZGL7Q4Y2FU7JO4AP7MAC
RC6L3CIBLJEH4GWRFD7UQNGI6PZT74FRUVOYHSAN2XCC74NZUASQC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
3YK4G4IQBXW63HPGU5WRTV6L2FCMKAK4DOTCHFK2FNSB5B3Y3PVQC
V6S33CAMTUXXDETG654VX2K4DA25DI6KFBTKPM2EGFDIBMAU4TJAC
MSQI3TH6T62JAXQGLL52QZCWAMC372TGB6ZNNRDGUGMJKBNNV2VAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
XAFFD52IHN6FWFR2TT5F2KCUS7HAVCBI5CWTFMKPQG77GGTGAHLAC
void builder(int level_number, char level_type)
void builder(int level_number, int level_type)
{
do
build_dungeon_level(level_number, level_type);
while (!valid_dungeon_level(level_number, level_type));
}
static coord_def find_level_feature(int feat)
{
for (int y = 1; y < GYM; ++y)
{
for (int x = 1; x < GXM; ++x)
{
if (grd[x][y] == feat)
return coord_def(x, y);
}
}
return coord_def(0, 0);
}
class feature_find : public travel_pathfind
{
public:
feature_find();
void add_feat(int feat);
coord_def find_first_from(const coord_def &c);
bool did_leave_vault() const { return left_vault; }
protected:
bool path_flood(const coord_def &c, const coord_def &dc);
protected:
bool needed_features[NUM_FEATURES];
bool left_vault;
dgn_region_list vaults;
};
feature_find::feature_find()
: travel_pathfind(), needed_features(), left_vault(false), vaults()
{
memset(needed_features, false, sizeof needed_features);
}
void feature_find::add_feat(int feat)
{
if (feat >= 0 && feat < NUM_FEATURES)
needed_features[feat] = true;
}
coord_def feature_find::find_first_from(const coord_def &c)
{
set_floodseed(c);
for (int i = 0, size = level_vaults.size(); i < size; ++i)
{
const vault_placement &p = level_vaults[i];
vaults.push_back( dgn_region(p.x, p.y, p.width, p.height) );
}
return pathfind(RMODE_EXPLORE);
}
bool feature_find::path_flood(const coord_def &c, const coord_def &dc)
{
if (!in_bounds(dc))
return (false);
const int grid = grd(dc);
if (needed_features[ grid ])
{
unexplored_place = dc;
unexplored_dist = traveled_distance;
return (true);
}
if (!is_travelsafe_square(dc.x, dc.y, false, true)
&& grid != DNGN_SECRET_DOOR
&& !grid_is_trap(grid))
{
return (false);
}
if (unforbidden(dc, vaults))
left_vault = true;
good_square(dc);
return (false);
}
static bool has_connected_downstairs_from(const coord_def &c)
{
feature_find ff;
ff.add_feat(DNGN_STONE_STAIRS_DOWN_I);
ff.add_feat(DNGN_STONE_STAIRS_DOWN_II);
ff.add_feat(DNGN_STONE_STAIRS_DOWN_III);
ff.add_feat(DNGN_ROCK_STAIRS_DOWN);
coord_def where = ff.find_first_from(c);
return (where.x || !ff.did_leave_vault());
}
static bool is_level_stair_connected()
coord_def up = find_level_feature(DNGN_STONE_STAIRS_UP_I);
if (up.x && up.y)
return has_connected_downstairs_from(up);
return (false);
}
static bool valid_dungeon_level(int level_number, int level_type)
{
if (level_number == 0 && level_type == LEVEL_DUNGEON)
return is_level_stair_connected();
return (true);
}
static void build_dungeon_level(int level_number, int level_type)
{