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){dobuild_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){