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.cc62
1 files changed, 19 insertions, 43 deletions
diff --git a/crawl-ref/source/dungeon.cc b/crawl-ref/source/dungeon.cc
index 68e4bfd606..9fccc8fa7d 100644
--- a/crawl-ref/source/dungeon.cc
+++ b/crawl-ref/source/dungeon.cc
@@ -177,7 +177,8 @@ static bool _treasure_area(int level_number, unsigned char ta1_x,
unsigned char ta2_y);
// SPECIAL ROOM BUILDERS
-static void _special_room(int level_number, spec_room &sr);
+static void _special_room(int level_number, spec_room &sr,
+ const map_def *vault);
static void _specr_2(spec_room &sr);
static void _big_room(int level_number);
static void _chequerboard(spec_room &sr, dungeon_feature_type target,
@@ -2540,8 +2541,15 @@ static builder_rc_type _builder_normal(int level_number, char level_type,
// maybe create a special room, if roguey_level hasn't done it
// already.
- if (!sr.created && level_number > 5 && one_chance_in(5))
- _special_room(level_number, sr);
+ if (!sr.created && one_chance_in(5))
+ {
+ const map_def *sroom = random_map_for_tag("special_room", true, true);
+
+ // Might not be any special room definitions appropriate for
+ // this branch and depth.
+ if (sroom != NULL)
+ _special_room(level_number, sr, sroom);
+ }
return BUILD_CONTINUE;
}
@@ -3520,8 +3528,10 @@ static void _specr_2(spec_room &sr)
sr.hooked_up = true;
}
-static void _special_room(int level_number, spec_room &sr)
+static void _special_room(int level_number, spec_room &sr,
+ const map_def *vault)
{
+ ASSERT(vault);
#if 0 // MATT
char spec_room_type = SROOM_LAIR_KOBOLD;
int lev_mons;
@@ -3552,15 +3562,6 @@ static void _special_room(int level_number, spec_room &sr)
sr.tl.set(room_x1 + 1, room_y1 + 1);
sr.br.set(room_x2 - 1, room_y2 - 1);
- const map_def *vault = random_map_for_tag("special_room", true, true);
-
- ASSERT(vault);
- if (!vault)
- {
- mpr("ERROR: failed to create special room.", MSGCH_ERROR);
- return;
- }
-
lua_special_room_spec = sr;
lua_special_room_level = level_number;
@@ -3571,34 +3572,6 @@ static void _special_room(int level_number, spec_room &sr)
lua_special_room_level = -1;
#if 0 // MATT
- if (level_number < 7)
- spec_room_type = SROOM_LAIR_KOBOLD;
- else
- {
- spec_room_type = random2(NUM_SPECIAL_ROOMS);
-
- if (level_number < 23 && one_chance_in(4))
- spec_room_type = SROOM_BEEHIVE;
-
- // Replace overly dangerous special rooms with a room full of orcs.
- if (level_number > 13 && spec_room_type == SROOM_LAIR_KOBOLD
- || level_number < 16 && spec_room_type == SROOM_MORGUE
- || level_number < 14 && spec_room_type == SROOM_JELLY_PIT
- || level_number < 17 && one_chance_in(4))
- {
- spec_room_type = SROOM_LAIR_ORC;
- }
-
- if (level_number > 19 && coinflip())
- spec_room_type = SROOM_MORGUE;
-
- if (level_number > 13 &&
- one_chance_in(6 - (level_number > 23) - (level_number > 18)))
- {
- spec_room_type = SROOM_JELLY_PIT;
- }
- }
-
switch (spec_room_type)
{
case SROOM_LAIR_ORC:
@@ -7506,7 +7479,10 @@ static void _roguey_level(int level_number, spec_room &sr, bool make_stairs)
} // end "for bp, for i"
// Is one of them a special room?
- if (level_number > 8 && one_chance_in(10))
+ const map_def *sroom;
+
+ if (one_chance_in(10)
+ && (sroom = random_map_for_tag("special_room", true, true)) != NULL)
{
int spec_room_done = random2(25);
@@ -7514,7 +7490,7 @@ static void _roguey_level(int level_number, spec_room &sr, bool make_stairs)
sr.hooked_up = true;
sr.tl.set( rox1[spec_room_done], roy1[spec_room_done] );
sr.br.set( rox2[spec_room_done], roy2[spec_room_done] );
- _special_room( level_number, sr );
+ _special_room( level_number, sr, sroom );
// Make the room 'special' so it doesn't get overwritten
// by something else (or put monsters in walls, etc...)