summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/dungeon.cc
diff options
context:
space:
mode:
Diffstat (limited to 'crawl-ref/source/dungeon.cc')
-rw-r--r--crawl-ref/source/dungeon.cc26
1 files changed, 17 insertions, 9 deletions
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index 5403924f7d..f4b43a957d 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -819,15 +819,23 @@ void dgn_register_place(const vault_placement &place, bool register_vault)
#endif
}
-static bool _ensure_vault_placed(bool vault_success)
+static bool _ensure_vault_placed(bool vault_success,
+ bool disable_further_vaults)
{
if (!vault_success)
dgn_level_vetoed = true;
- else
+ else if (disable_further_vaults)
can_create_vault = false;
return (vault_success);
}
+static bool _ensure_vault_placed_ex( bool vault_success, const map_def *vault )
+{
+ return _ensure_vault_placed( vault_success,
+ (!vault->has_tag("extra")
+ && vault->orient == MAP_ENCOMPASS) );
+}
+
static coord_def _find_level_feature(int feat)
{
for (int y = 1; y < GYM; ++y)
@@ -2302,7 +2310,7 @@ static builder_rc_type _builder_by_type(int level_number, char level_type)
end(1, false, "Failed to find Pandemonium level %s!\n",
pandemon_level_names[which_demon]);
- _ensure_vault_placed( _build_vaults(level_number, vault) );
+ _ensure_vault_placed( _build_vaults(level_number, vault), true );
}
else
{
@@ -2373,7 +2381,7 @@ static void _portal_vault_level(int level_number)
vault = random_map_for_tag(level_name, false);
if (vault)
- _ensure_vault_placed( _build_vaults(level_number, vault) );
+ _ensure_vault_placed( _build_vaults(level_number, vault), true );
else
{
_plan_main(level_number, 0);
@@ -2439,7 +2447,7 @@ static builder_rc_type _builder_by_branch(int level_number)
if (vault)
{
dgn_Build_Method += " random_map_for_place";
- _ensure_vault_placed( _build_vaults(level_number, vault) );
+ _ensure_vault_placed_ex( _build_vaults(level_number, vault), vault );
return BUILD_SKIP;
}
@@ -2532,7 +2540,7 @@ static builder_rc_type _builder_normal(int level_number, char level_type,
if (vault)
{
dgn_Build_Method += " normal_random_map_for_place";
- _ensure_vault_placed( _build_vaults(level_number, vault) );
+ _ensure_vault_placed_ex( _build_vaults(level_number, vault), vault );
return BUILD_SKIP;
}
@@ -5926,7 +5934,7 @@ static char _plan_1(int level_number)
ASSERT(vault);
bool success = _build_vaults(level_number, vault);
- _ensure_vault_placed(success);
+ _ensure_vault_placed(success, false);
return 0;
}
@@ -5940,7 +5948,7 @@ static char _plan_2(int level_number)
ASSERT(vault);
bool success = _build_vaults(level_number, vault);
- _ensure_vault_placed(success);
+ _ensure_vault_placed(success, false);
return 0;
}
@@ -6174,7 +6182,7 @@ static char _plan_6(int level_number)
ASSERT(vault);
bool success = _build_vaults(level_number, vault);
- _ensure_vault_placed(success);
+ _ensure_vault_placed(success, false);
// This "back door" is often one of the easier ways to get out of
// pandemonium... the easiest is to use the banish spell.