Skip to content

Commit a901a56

Browse files
committedFeb 26, 2017
Dungeongen: Add and improve parameters
Add: Bool for 'only_in_ground'. Min and max corridor length. Min and max room size with X, Y, Z components. Min and max large room size with X, Y, Z components. 'only_in_ground = false' allows core mapgens to create structures in air and water using dungeongen. Corridor length parameters replace a fixed random range. Room size parameters replace the former system where one parameter 'roomsize' was added to fixed random ranges. All parameters are set for no change to current dungeon behaviour. Remove some now-redundant and long-unused code.
1 parent 4d634ef commit a901a56

File tree

4 files changed

+137
-108
lines changed

4 files changed

+137
-108
lines changed
 

‎src/dungeongen.cpp

+45-49
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ DungeonGen::DungeonGen(INodeDefManager *ndef,
5252
if (dparams) {
5353
memcpy(&dp, dparams, sizeof(dp));
5454
} else {
55+
// Default dungeon parameters
5556
dp.seed = 0;
5657

5758
dp.c_water = ndef->getId("mapgen_water_source");
@@ -63,14 +64,20 @@ DungeonGen::DungeonGen(INodeDefManager *ndef,
6364
if (dp.c_river_water == CONTENT_IGNORE)
6465
dp.c_river_water = ndef->getId("mapgen_water_source");
6566

66-
dp.diagonal_dirs = false;
67-
dp.holesize = v3s16(1, 2, 1);
68-
dp.roomsize = v3s16(0, 0, 0);
69-
dp.rooms_min = 2;
70-
dp.rooms_max = 16;
71-
dp.y_min = -MAX_MAP_GENERATION_LIMIT;
72-
dp.y_max = MAX_MAP_GENERATION_LIMIT;
73-
dp.notifytype = GENNOTIFY_DUNGEON;
67+
dp.diagonal_dirs = false;
68+
dp.only_in_ground = true;
69+
dp.holesize = v3s16(1, 2, 1);
70+
dp.corridor_len_min = 1;
71+
dp.corridor_len_max = 13;
72+
dp.room_size_min = v3s16(4, 4, 4);
73+
dp.room_size_max = v3s16(8, 6, 8);
74+
dp.room_size_large_min = v3s16(8, 8, 8);
75+
dp.room_size_large_max = v3s16(16, 16, 16);
76+
dp.rooms_min = 2;
77+
dp.rooms_max = 16;
78+
dp.y_min = -MAX_MAP_GENERATION_LIMIT;
79+
dp.y_max = MAX_MAP_GENERATION_LIMIT;
80+
dp.notifytype = GENNOTIFY_DUNGEON;
7481

7582
dp.np_density = nparams_dungeon_density;
7683
dp.np_alt_wall = nparams_dungeon_alt_wall;
@@ -97,16 +104,19 @@ void DungeonGen::generate(MMVManip *vm, u32 bseed, v3s16 nmin, v3s16 nmax)
97104
// Dungeon generator doesn't modify places which have this set
98105
vm->clearFlag(VMANIP_FLAG_DUNGEON_INSIDE | VMANIP_FLAG_DUNGEON_PRESERVE);
99106

100-
// Set all air and water to be untouchable
101-
// to make dungeons open to caves and open air
102-
for (s16 z = nmin.Z; z <= nmax.Z; z++) {
103-
for (s16 y = nmin.Y; y <= nmax.Y; y++) {
104-
u32 i = vm->m_area.index(nmin.X, y, z);
105-
for (s16 x = nmin.X; x <= nmax.X; x++) {
106-
content_t c = vm->m_data[i].getContent();
107-
if (c == CONTENT_AIR || c == dp.c_water || c == dp.c_river_water)
108-
vm->m_flags[i] |= VMANIP_FLAG_DUNGEON_PRESERVE;
109-
i++;
107+
if (dp.only_in_ground) {
108+
// Set all air and water to be untouchable
109+
// to make dungeons open to caves and open air
110+
for (s16 z = nmin.Z; z <= nmax.Z; z++) {
111+
for (s16 y = nmin.Y; y <= nmax.Y; y++) {
112+
u32 i = vm->m_area.index(nmin.X, y, z);
113+
for (s16 x = nmin.X; x <= nmax.X; x++) {
114+
content_t c = vm->m_data[i].getContent();
115+
if (c == CONTENT_AIR || c == dp.c_water ||
116+
c == dp.c_river_water)
117+
vm->m_flags[i] |= VMANIP_FLAG_DUNGEON_PRESERVE;
118+
i++;
119+
}
110120
}
111121
}
112122
}
@@ -142,21 +152,25 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
142152
v3s16 roomplace;
143153

144154
/*
145-
Find place for first room
155+
Find place for first room.
156+
There is a 1 in 4 chance of the first room being 'large',
157+
all other rooms are not 'large'.
146158
*/
147159
bool fits = false;
148160
for (u32 i = 0; i < 100 && !fits; i++) {
149161
bool is_large_room = ((random.next() & 3) == 1);
150162
if (is_large_room) {
151-
roomsize.Z = random.range(8, 16);
152-
roomsize.Y = random.range(8, 16);
153-
roomsize.X = random.range(8, 16);
163+
roomsize.Z = random.range(
164+
dp.room_size_large_min.Z, dp.room_size_large_max.Z);
165+
roomsize.Y = random.range(
166+
dp.room_size_large_min.Y, dp.room_size_large_max.Y);
167+
roomsize.X = random.range(
168+
dp.room_size_large_min.X, dp.room_size_large_max.X);
154169
} else {
155-
roomsize.Z = random.range(4, 8);
156-
roomsize.Y = random.range(4, 6);
157-
roomsize.X = random.range(4, 8);
170+
roomsize.Z = random.range(dp.room_size_min.Z, dp.room_size_max.Z);
171+
roomsize.Y = random.range(dp.room_size_min.Y, dp.room_size_max.Y);
172+
roomsize.X = random.range(dp.room_size_min.X, dp.room_size_max.X);
158173
}
159-
roomsize += dp.roomsize;
160174

161175
// start_padding is used to disallow starting the generation of
162176
// a dungeon in a neighboring generation chunk
@@ -246,10 +260,9 @@ void DungeonGen::makeDungeon(v3s16 start_padding)
246260
makeCorridor(doorplace, doordir, corridor_end, corridor_end_dir);
247261

248262
// Find a place for a random sized room
249-
roomsize.Z = random.range(4, 8);
250-
roomsize.Y = random.range(4, 6);
251-
roomsize.X = random.range(4, 8);
252-
roomsize += dp.roomsize;
263+
roomsize.Z = random.range(dp.room_size_min.Z, dp.room_size_max.Z);
264+
roomsize.Y = random.range(dp.room_size_min.Y, dp.room_size_max.Y);
265+
roomsize.X = random.range(dp.room_size_min.X, dp.room_size_max.X);
253266

254267
m_pos = corridor_end;
255268
m_dir = corridor_end_dir;
@@ -397,13 +410,8 @@ void DungeonGen::makeCorridor(v3s16 doorplace, v3s16 doordir,
397410
makeHole(doorplace);
398411
v3s16 p0 = doorplace;
399412
v3s16 dir = doordir;
400-
u32 length;
401-
/*if (random.next() % 2)
402-
length = random.range(1, 13);
403-
else
404-
length = random.range(1, 6);*/
405-
length = random.range(1, 13);
406-
u32 partlength = random.range(1, 13);
413+
u32 length = random.range(dp.corridor_len_min, dp.corridor_len_max);
414+
u32 partlength = random.range(dp.corridor_len_min, dp.corridor_len_max);
407415
u32 partcount = 0;
408416
s16 make_stairs = 0;
409417

@@ -556,7 +564,6 @@ bool DungeonGen::findPlaceForRoomDoor(v3s16 roomsize, v3s16 &result_doorplace,
556564
continue;
557565
v3s16 roomplace;
558566
// X east, Z north, Y up
559-
#if 1
560567
if (doordir == v3s16(1, 0, 0)) // X+
561568
roomplace = doorplace +
562569
v3s16(0, -1, random.range(-roomsize.Z + 2, -2));
@@ -569,17 +576,6 @@ bool DungeonGen::findPlaceForRoomDoor(v3s16 roomsize, v3s16 &result_doorplace,
569576
if (doordir == v3s16(0, 0, -1)) // Z-
570577
roomplace = doorplace +
571578
v3s16(random.range(-roomsize.X + 2, -2), -1, -roomsize.Z + 1);
572-
#endif
573-
#if 0
574-
if (doordir == v3s16(1, 0, 0)) // X+
575-
roomplace = doorplace + v3s16(0, -1, -roomsize.Z / 2);
576-
if (doordir == v3s16(-1, 0, 0)) // X-
577-
roomplace = doorplace + v3s16(-roomsize.X+1,-1,-roomsize.Z / 2);
578-
if (doordir == v3s16(0, 0, 1)) // Z+
579-
roomplace = doorplace + v3s16(-roomsize.X / 2, -1, 0);
580-
if (doordir == v3s16(0, 0, -1)) // Z-
581-
roomplace = doorplace + v3s16(-roomsize.X / 2, -1, -roomsize.Z + 1);
582-
#endif
583579

584580
// Check fit
585581
bool fits = true;

‎src/dungeongen.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,14 @@ struct DungeonParams {
4848
content_t c_stair;
4949

5050
bool diagonal_dirs;
51+
bool only_in_ground;
5152
v3s16 holesize;
52-
v3s16 roomsize;
53+
u16 corridor_len_min;
54+
u16 corridor_len_max;
55+
v3s16 room_size_min;
56+
v3s16 room_size_max;
57+
v3s16 room_size_large_min;
58+
v3s16 room_size_large_max;
5359
u16 rooms_min;
5460
u16 rooms_max;
5561
s16 y_min;

‎src/mapgen.cpp

+47-33
Original file line numberDiff line numberDiff line change
@@ -845,47 +845,61 @@ void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type)
845845

846846
DungeonParams dp;
847847

848-
dp.seed = seed;
849-
dp.c_water = c_water_source;
850-
dp.c_river_water = c_river_water_source;
851-
dp.rooms_min = 2;
852-
dp.rooms_max = 16;
853-
dp.y_min = -MAX_MAP_GENERATION_LIMIT;
854-
dp.y_max = MAX_MAP_GENERATION_LIMIT;
855-
dp.np_density = nparams_dungeon_density;
856-
dp.np_alt_wall = nparams_dungeon_alt_wall;
848+
dp.seed = seed;
849+
dp.c_water = c_water_source;
850+
dp.c_river_water = c_river_water_source;
851+
852+
dp.only_in_ground = true;
853+
dp.corridor_len_min = 1;
854+
dp.corridor_len_max = 13;
855+
dp.rooms_min = 2;
856+
dp.rooms_max = 16;
857+
dp.y_min = -MAX_MAP_GENERATION_LIMIT;
858+
dp.y_max = MAX_MAP_GENERATION_LIMIT;
859+
860+
dp.np_density = nparams_dungeon_density;
861+
dp.np_alt_wall = nparams_dungeon_alt_wall;
857862

858863
switch (stone_type) {
859864
default:
860865
case MGSTONE_STONE:
861-
dp.c_wall = c_cobble;
862-
dp.c_alt_wall = c_mossycobble;
863-
dp.c_stair = c_stair_cobble;
864-
865-
dp.diagonal_dirs = false;
866-
dp.holesize = v3s16(1, 2, 1);
867-
dp.roomsize = v3s16(0, 0, 0);
868-
dp.notifytype = GENNOTIFY_DUNGEON;
866+
dp.c_wall = c_cobble;
867+
dp.c_alt_wall = c_mossycobble;
868+
dp.c_stair = c_stair_cobble;
869+
870+
dp.diagonal_dirs = false;
871+
dp.holesize = v3s16(1, 2, 1);
872+
dp.room_size_min = v3s16(4, 4, 4);
873+
dp.room_size_max = v3s16(8, 6, 8);
874+
dp.room_size_large_min = v3s16(8, 8, 8);
875+
dp.room_size_large_max = v3s16(16, 16, 16);
876+
dp.notifytype = GENNOTIFY_DUNGEON;
869877
break;
870878
case MGSTONE_DESERT_STONE:
871-
dp.c_wall = c_desert_stone;
872-
dp.c_alt_wall = CONTENT_IGNORE;
873-
dp.c_stair = c_stair_desert_stone;
874-
875-
dp.diagonal_dirs = true;
876-
dp.holesize = v3s16(2, 3, 2);
877-
dp.roomsize = v3s16(2, 5, 2);
878-
dp.notifytype = GENNOTIFY_TEMPLE;
879+
dp.c_wall = c_desert_stone;
880+
dp.c_alt_wall = CONTENT_IGNORE;
881+
dp.c_stair = c_stair_desert_stone;
882+
883+
dp.diagonal_dirs = true;
884+
dp.holesize = v3s16(2, 3, 2);
885+
dp.room_size_min = v3s16(6, 9, 6);
886+
dp.room_size_max = v3s16(10, 11, 10);
887+
dp.room_size_large_min = v3s16(10, 13, 10);
888+
dp.room_size_large_max = v3s16(18, 21, 18);
889+
dp.notifytype = GENNOTIFY_TEMPLE;
879890
break;
880891
case MGSTONE_SANDSTONE:
881-
dp.c_wall = c_sandstonebrick;
882-
dp.c_alt_wall = CONTENT_IGNORE;
883-
dp.c_stair = c_stair_sandstonebrick;
884-
885-
dp.diagonal_dirs = false;
886-
dp.holesize = v3s16(2, 2, 2);
887-
dp.roomsize = v3s16(2, 0, 2);
888-
dp.notifytype = GENNOTIFY_DUNGEON;
892+
dp.c_wall = c_sandstonebrick;
893+
dp.c_alt_wall = CONTENT_IGNORE;
894+
dp.c_stair = c_stair_sandstonebrick;
895+
896+
dp.diagonal_dirs = false;
897+
dp.holesize = v3s16(2, 2, 2);
898+
dp.room_size_min = v3s16(6, 4, 6);
899+
dp.room_size_max = v3s16(10, 6, 10);
900+
dp.room_size_large_min = v3s16(10, 8, 10);
901+
dp.room_size_large_max = v3s16(18, 16, 18);
902+
dp.notifytype = GENNOTIFY_DUNGEON;
889903
break;
890904
}
891905

‎src/mapgen_v6.cpp

+38-25
Original file line numberDiff line numberDiff line change
@@ -564,34 +564,47 @@ void MapgenV6::makeChunk(BlockMakeData *data)
564564
if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
565565
DungeonParams dp;
566566

567-
dp.seed = seed;
568-
dp.c_water = c_water_source;
569-
dp.c_river_water = c_water_source;
570-
dp.rooms_min = 2;
571-
dp.rooms_max = 16;
572-
dp.y_min = -MAX_MAP_GENERATION_LIMIT;
573-
dp.y_max = MAX_MAP_GENERATION_LIMIT;
574-
dp.np_density = NoiseParams(0.9, 0.5, v3f(500.0, 500.0, 500.0), 0, 2, 0.8, 2.0);
575-
dp.np_alt_wall = NoiseParams(-0.4, 1.0, v3f(40.0, 40.0, 40.0), 32474, 6, 1.1, 2.0);
567+
dp.seed = seed;
568+
dp.c_water = c_water_source;
569+
dp.c_river_water = c_water_source;
570+
571+
dp.only_in_ground = true;
572+
dp.corridor_len_min = 1;
573+
dp.corridor_len_max = 13;
574+
dp.rooms_min = 2;
575+
dp.rooms_max = 16;
576+
dp.y_min = -MAX_MAP_GENERATION_LIMIT;
577+
dp.y_max = MAX_MAP_GENERATION_LIMIT;
578+
579+
dp.np_density
580+
= NoiseParams(0.9, 0.5, v3f(500.0, 500.0, 500.0), 0, 2, 0.8, 2.0);
581+
dp.np_alt_wall
582+
= NoiseParams(-0.4, 1.0, v3f(40.0, 40.0, 40.0), 32474, 6, 1.1, 2.0);
576583

577584
if (getBiome(0, v2s16(node_min.X, node_min.Z)) == BT_DESERT) {
578-
dp.c_wall = c_desert_stone;
579-
dp.c_alt_wall = CONTENT_IGNORE;
580-
dp.c_stair = c_stair_desert_stone;
581-
582-
dp.diagonal_dirs = true;
583-
dp.holesize = v3s16(2, 3, 2);
584-
dp.roomsize = v3s16(2, 5, 2);
585-
dp.notifytype = GENNOTIFY_TEMPLE;
585+
dp.c_wall = c_desert_stone;
586+
dp.c_alt_wall = CONTENT_IGNORE;
587+
dp.c_stair = c_stair_desert_stone;
588+
589+
dp.diagonal_dirs = true;
590+
dp.holesize = v3s16(2, 3, 2);
591+
dp.room_size_min = v3s16(6, 9, 6);
592+
dp.room_size_max = v3s16(10, 11, 10);
593+
dp.room_size_large_min = v3s16(10, 13, 10);
594+
dp.room_size_large_max = v3s16(18, 21, 18);
595+
dp.notifytype = GENNOTIFY_TEMPLE;
586596
} else {
587-
dp.c_wall = c_cobble;
588-
dp.c_alt_wall = c_mossycobble;
589-
dp.c_stair = c_stair_cobble;
590-
591-
dp.diagonal_dirs = false;
592-
dp.holesize = v3s16(1, 2, 1);
593-
dp.roomsize = v3s16(0, 0, 0);
594-
dp.notifytype = GENNOTIFY_DUNGEON;
597+
dp.c_wall = c_cobble;
598+
dp.c_alt_wall = c_mossycobble;
599+
dp.c_stair = c_stair_cobble;
600+
601+
dp.diagonal_dirs = false;
602+
dp.holesize = v3s16(1, 2, 1);
603+
dp.room_size_min = v3s16(4, 4, 4);
604+
dp.room_size_max = v3s16(8, 6, 8);
605+
dp.room_size_large_min = v3s16(8, 8, 8);
606+
dp.room_size_large_max = v3s16(16, 16, 16);
607+
dp.notifytype = GENNOTIFY_DUNGEON;
595608
}
596609

597610
DungeonGen dgen(ndef, &gennotify, &dp);

0 commit comments

Comments
 (0)
Please sign in to comment.