Skip to content

Commit 458f617

Browse files
authoredJul 16, 2019
Dungeons: Make multiple large rooms possible (#8678)
Re-add the random size range for large rooms. Remove 'first_room_large' bool. Add 'large_room_chance' parameter that can disable large rooms, specify 1 large room, or specify a chance for large rooms. If 1 or a chance is specified, the first generated room is large, to take advantage of the intersection checks that are done for the 1st room only.
1 parent 4749238 commit 458f617

File tree

4 files changed

+51
-41
lines changed

4 files changed

+51
-41
lines changed
 

Diff for: ‎src/mapgen/dungeongen.cpp

+18-12
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,10 @@ DungeonGen::DungeonGen(const NodeDefManager *ndef,
6464
dp.corridor_len_max = 13;
6565
dp.room_size_min = v3s16(4, 4, 4);
6666
dp.room_size_max = v3s16(8, 6, 8);
67-
dp.room_size_large = v3s16(16, 16, 16);
68-
dp.first_room_large = true;
69-
dp.num_rooms = 16;
67+
dp.room_size_large_min = v3s16(8, 8, 8);
68+
dp.room_size_large_max = v3s16(16, 16, 16);
69+
dp.large_room_chance = 1;
70+
dp.num_rooms = 8;
7071
dp.num_dungeons = 1;
7172
dp.notifytype = GENNOTIFY_DUNGEON;
7273

@@ -152,11 +153,10 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
152153
*/
153154
bool fits = false;
154155
for (u32 i = 0; i < 100 && !fits; i++) {
155-
// Only the first room can be 'large'
156-
if (dp.first_room_large) {
157-
roomsize.Z = dp.room_size_large.Z;
158-
roomsize.Y = dp.room_size_large.Y;
159-
roomsize.X = dp.room_size_large.X;
156+
if (dp.large_room_chance >= 1) {
157+
roomsize.Z = random.range(dp.room_size_large_min.Z, dp.room_size_large_max.Z);
158+
roomsize.Y = random.range(dp.room_size_large_min.Y, dp.room_size_large_max.Y);
159+
roomsize.X = random.range(dp.room_size_large_min.X, dp.room_size_large_max.X);
160160
} else {
161161
roomsize.Z = random.range(dp.room_size_min.Z, dp.room_size_max.Z);
162162
roomsize.Y = random.range(dp.room_size_min.Y, dp.room_size_max.Y);
@@ -250,9 +250,16 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
250250
makeCorridor(doorplace, doordir, corridor_end, corridor_end_dir);
251251

252252
// Find a place for a random sized room
253-
roomsize.Z = random.range(dp.room_size_min.Z, dp.room_size_max.Z);
254-
roomsize.Y = random.range(dp.room_size_min.Y, dp.room_size_max.Y);
255-
roomsize.X = random.range(dp.room_size_min.X, dp.room_size_max.X);
253+
if (dp.large_room_chance > 1 && random.range(1, dp.large_room_chance) == 1) {
254+
// Large room
255+
roomsize.Z = random.range(dp.room_size_large_min.Z, dp.room_size_large_max.Z);
256+
roomsize.Y = random.range(dp.room_size_large_min.Y, dp.room_size_large_max.Y);
257+
roomsize.X = random.range(dp.room_size_large_min.X, dp.room_size_large_max.X);
258+
} else {
259+
roomsize.Z = random.range(dp.room_size_min.Z, dp.room_size_max.Z);
260+
roomsize.Y = random.range(dp.room_size_min.Y, dp.room_size_max.Y);
261+
roomsize.X = random.range(dp.room_size_min.X, dp.room_size_max.X);
262+
}
256263

257264
m_pos = corridor_end;
258265
m_dir = corridor_end_dir;
@@ -265,7 +272,6 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
265272
else
266273
// Don't actually make a door
267274
roomplace -= doordir;
268-
269275
}
270276
}
271277

Diff for: ‎src/mapgen/dungeongen.h

+8-4
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,14 @@ struct DungeonParams {
5858
// Room size random range. Includes walls / floor / ceilng
5959
v3s16 room_size_min;
6060
v3s16 room_size_max;
61-
// Large room size
62-
v3s16 room_size_large;
63-
// First generated room is large
64-
bool first_room_large;
61+
// Large room size random range. Includes walls / floor / ceilng
62+
v3s16 room_size_large_min;
63+
v3s16 room_size_large_max;
64+
// Value 0 disables large rooms.
65+
// Value 1 results in 1 large room, the first generated room.
66+
// Value > 1 makes the first generated room large, all other rooms have a
67+
// '1 in value' chance of being large.
68+
u16 large_room_chance;
6569
// Dimensions of 3D 'brush' that creates corridors.
6670
// Dimensions are of the empty space, not including walls / floor / ceilng.
6771
v3s16 holesize;

Diff for: ‎src/mapgen/mapgen.cpp

+14-14
Original file line numberDiff line numberDiff line change
@@ -877,20 +877,20 @@ void MapgenBasic::generateDungeons(s16 max_stone_y)
877877
dp.np_alt_wall =
878878
NoiseParams(-0.4, 1.0, v3f(40.0, 40.0, 40.0), 32474, 6, 1.1, 2.0);
879879

880-
dp.seed = seed;
881-
dp.num_dungeons = num_dungeons;
882-
dp.only_in_ground = true;
883-
dp.num_rooms = ps.range(2, 16);
884-
dp.room_size_min = v3s16(6, 5, 6);
885-
dp.room_size_max = v3s16(10, 6, 10);
886-
dp.room_size_large = v3s16(
887-
ps.range(10, 18), ps.range(8, 16), ps.range(10, 18));
888-
dp.first_room_large = ps.range(1, 4) == 1;
889-
dp.holesize = v3s16(2, 3, 2);
890-
dp.corridor_len_min = 1;
891-
dp.corridor_len_max = 13;
892-
dp.diagonal_dirs = ps.range(1, 12) == 1;
893-
dp.notifytype = GENNOTIFY_DUNGEON;
880+
dp.seed = seed;
881+
dp.num_dungeons = num_dungeons;
882+
dp.only_in_ground = true;
883+
dp.num_rooms = ps.range(2, 16);
884+
dp.room_size_min = v3s16(6, 5, 6);
885+
dp.room_size_max = v3s16(10, 6, 10);
886+
dp.room_size_large_min = v3s16(10, 8, 10);
887+
dp.room_size_large_max = v3s16(18, 16, 18);
888+
dp.large_room_chance = (ps.range(1, 4) == 1) ? 1 : 0;
889+
dp.holesize = v3s16(2, 3, 2);
890+
dp.corridor_len_min = 1;
891+
dp.corridor_len_max = 13;
892+
dp.diagonal_dirs = ps.range(1, 12) == 1;
893+
dp.notifytype = GENNOTIFY_DUNGEON;
894894

895895
// Get biome at mapchunk midpoint
896896
v3s16 chunk_mid = node_min + (node_max - node_min) / v3s16(2, 2, 2);

Diff for: ‎src/mapgen/mapgen_v6.cpp

+11-11
Original file line numberDiff line numberDiff line change
@@ -572,13 +572,13 @@ void MapgenV6::makeChunk(BlockMakeData *data)
572572

573573
DungeonParams dp;
574574

575-
dp.seed = seed;
576-
dp.num_dungeons = num_dungeons;
577-
dp.only_in_ground = true;
578-
dp.corridor_len_min = 1;
579-
dp.corridor_len_max = 13;
580-
dp.num_rooms = ps.range(2, 16);
581-
dp.first_room_large = ps.range(1, 4) == 1;
575+
dp.seed = seed;
576+
dp.num_dungeons = num_dungeons;
577+
dp.only_in_ground = true;
578+
dp.corridor_len_min = 1;
579+
dp.corridor_len_max = 13;
580+
dp.num_rooms = ps.range(2, 16);
581+
dp.large_room_chance = (ps.range(1, 4) == 1) ? 1 : 0;
582582

583583
dp.np_alt_wall
584584
= NoiseParams(-0.4, 1.0, v3f(40.0, 40.0, 40.0), 32474, 6, 1.1, 2.0);
@@ -592,8 +592,8 @@ void MapgenV6::makeChunk(BlockMakeData *data)
592592
dp.holesize = v3s16(2, 3, 2);
593593
dp.room_size_min = v3s16(6, 9, 6);
594594
dp.room_size_max = v3s16(10, 11, 10);
595-
dp.room_size_large = v3s16(
596-
ps.range(10, 18), ps.range(13, 21), ps.range(10, 18));
595+
dp.room_size_large_min = v3s16(10, 13, 10);
596+
dp.room_size_large_max = v3s16(18, 21, 18);
597597
dp.notifytype = GENNOTIFY_TEMPLE;
598598
} else {
599599
dp.c_wall = c_cobble;
@@ -604,8 +604,8 @@ void MapgenV6::makeChunk(BlockMakeData *data)
604604
dp.holesize = v3s16(1, 2, 1);
605605
dp.room_size_min = v3s16(4, 4, 4);
606606
dp.room_size_max = v3s16(8, 6, 8);
607-
dp.room_size_large = v3s16(
608-
ps.range(8, 16), ps.range(8, 16), ps.range(8, 16));
607+
dp.room_size_large_min = v3s16(8, 8, 8);
608+
dp.room_size_large_max = v3s16(16, 16, 16);
609609
dp.notifytype = GENNOTIFY_DUNGEON;
610610
}
611611

0 commit comments

Comments
 (0)
Please sign in to comment.