diff options
-rw-r--r-- | crawl-ref/source/dat/rooms.des | 230 | ||||
-rw-r--r-- | crawl-ref/source/dungeon.cc | 62 |
2 files changed, 245 insertions, 47 deletions
diff --git a/crawl-ref/source/dat/rooms.des b/crawl-ref/source/dat/rooms.des index 960426f671..1c95a9d8d9 100644 --- a/crawl-ref/source/dat/rooms.des +++ b/crawl-ref/source/dat/rooms.des @@ -1,7 +1,6 @@ -NAME: special_room_test -TAGS: special_room allow_dup +lua {{ -{{ +function fill_special_room(mon) local level, tl_x, tl_y, br_x, br_y = dgn.get_special_room_info() -- Return early if we're being called during map validation. @@ -9,11 +8,234 @@ TAGS: special_room allow_dup return end + crawl.mpr("mon = " .. mon .. ", level = " .. level) + for x = tl_x, br_x do for y = tl_y, br_y do - dgn.create_monster(x, y, "rat") + dgn.create_monster(x, y, mon) end end +return +end + }} + +########################## + +NAME: special_room_kobold +DEPTH: 6-14, !Lair, !Crypt +TAGS: special_room allow_dup +WEIGHT: 11 +: fill_special_room("kobold") +MAP +ENDMAP + +NAME: special_room_orc_a +DEPTH: 8-14, !Lair, !Crypt +TAGS: special_room allow_dup +WEIGHT: 59 +: fill_special_room("orc") +MAP +ENDMAP + +NAME: special_room_bee_a +DEPTH: 8-14, !Crypt +TAGS: special_room allow_dup +WEIGHT: 30 +: fill_special_room("killer bee") +MAP +ENDMAP +################################ +NAME: special_room_orc_b +DEPTH: 15-16, !Lair, !Crypt +TAGS: special_room allow_dup +WEIGHT: 50 +: fill_special_room("orc") +MAP +ENDMAP + +NAME: special_room_bee_b +DEPTH: 15-16, !Crypt +TAGS: special_room allow_dup +WEIGHT: 25 +: fill_special_room("killer bee") +MAP +ENDMAP + +NAME: special_room_morgue_b +DEPTH: 15-16, !Lair +TAGS: special_room allow_dup +WEIGHT: 25 +: fill_special_room("rat zombie") +MAP +ENDMAP +################################# +NAME: special_room_orc_c +DEPTH: 17, !Lair, !Crypt +TAGS: special_room allow_dup +WEIGHT: 40 +: fill_special_room("orc") +MAP +ENDMAP + +NAME: special_room_bee_c +DEPTH: 17, !Crypt +TAGS: special_room allow_dup +WEIGHT: 25 +: fill_special_room("killer bee") +MAP +ENDMAP + +NAME: special_room_morgue_c +DEPTH: 17, !Lair +TAGS: special_room allow_dup +WEIGHT: 27 +: fill_special_room("rat zombie") +MAP +ENDMAP + +NAME: special_room_jelly_c +DEPTH: 17, !Crypt +TAGS: special_room allow_dup +WEIGHT: 9 +: fill_special_room("jelly") MAP ENDMAP +################################# +NAME: special_room_orc_d +DEPTH: 18-20, !Lair, !Crypt +TAGS: special_room allow_dup +WEIGHT: 25 +: fill_special_room("orc") +MAP +ENDMAP + +NAME: special_room_bee_d +DEPTH: 18-20, !Crypt +TAGS: special_room allow_dup +WEIGHT: 33 +: fill_special_room("killer bee") +MAP +ENDMAP + +NAME: special_room_morgue_d +DEPTH: 18-20, !Lair +TAGS: special_room allow_dup +WEIGHT: 29 +: fill_special_room("rat zombie") +MAP +ENDMAP + +NAME: special_room_jelly_d +DEPTH: 18-20, !Crypt +TAGS: special_room allow_dup +WEIGHT: 13 +: fill_special_room("jelly") +MAP +ENDMAP +################################# +NAME: special_room_orc_e +DEPTH: 21-, !Lair, !Crypt +TAGS: special_room allow_dup +WEIGHT: 15 +: fill_special_room("orc") +MAP +ENDMAP + +NAME: special_room_bee_e +DEPTH: 21-, !Crypt +TAGS: special_room allow_dup +WEIGHT: 8 +: fill_special_room("killer bee") +MAP +ENDMAP + +NAME: special_room_morgue_e +DEPTH: 21-, !Lair +TAGS: special_room allow_dup +WEIGHT: 32 +: fill_special_room("rat zombie") +MAP +ENDMAP + +NAME: special_room_jelly_e +DEPTH: 21-, !Crypt +TAGS: special_room allow_dup +WEIGHT: 45 +: fill_special_room("jelly") +MAP +ENDMAP + +######################################################################### +######################################################################### + +# 0.4 crawl C code for randomly determining which special room type to +# use + +# 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; +# } +# } +# + +#################################### + +# 0.4 crawl percentages for each room type generated per level (for 10,000 +# randomly generated vaults per level) + +# | K | O | B | M | J | +#----------------------------------------------- +# 0| 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +# 1| 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +# 2| 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +# 3| 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +# 4| 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +# 5| 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | +# 6|100.00 | 0.00 | 0.00 | 0.00 | 0.00 | +# 7| 11.39 | 59.25 | 29.36 | 0.00 | 0.00 | +# 8| 11.07 | 58.43 | 30.50 | 0.00 | 0.00 | +# 9| 11.23 | 57.98 | 30.79 | 0.00 | 0.00 | +#10| 11.46 | 58.39 | 30.15 | 0.00 | 0.00 | +#11| 11.30 | 58.78 | 29.92 | 0.00 | 0.00 | +#12| 11.21 | 58.65 | 30.14 | 0.00 | 0.00 | +#13| 10.92 | 58.96 | 30.12 | 0.00 | 0.00 | +#14| 0.00 | 49.58 | 24.99 | 25.43 | 0.00 | +#15| 0.00 | 49.74 | 24.56 | 25.70 | 0.00 | +#16| 0.00 | 39.51 | 24.77 | 27.04 | 8.68 | +#17| 0.00 | 24.23 | 33.07 | 29.57 | 13.13 | +#18| 0.00 | 25.31 | 32.99 | 29.06 | 12.64 | +#19| 0.00 | 24.52 | 32.53 | 31.09 | 11.86 | +#20| 0.00 | 11.63 | 15.84 | 25.52 | 47.01 | +#21| 0.00 | 12.06 | 17.33 | 25.60 | 45.01 | +#22| 0.00 | 12.12 | 15.97 | 25.50 | 46.41 | +#23| 0.00 | 14.94 | 8.64 | 27.63 | 48.79 | +#24| 0.00 | 15.20 | 7.29 | 32.14 | 45.37 | +#25| 0.00 | 14.82 | 7.88 | 33.04 | 44.26 | +#26| 0.00 | 14.99 | 7.91 | 31.94 | 45.16 | +#27| 0.00 | 14.96 | 7.28 | 32.06 | 45.70 | +#28| 0.00 | 15.12 | 7.88 | 32.11 | 44.89 | +#29| 0.00 | 15.48 | 7.40 | 33.17 | 43.95 | +#30| 0.00 | 15.08 | 7.84 | 31.97 | 45.11 | 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...) |