Skip to content

Commit 2a74727

Browse files
authored
Randomwalk caves: Add parameters for number, proportion flooded. Allow small caves (#8928)
Add mapgen parameters to set the range of the random number of randomwalk caves per mapchunk, and to set the proportion that are flooded with liquids. Default values are, for now, unchanged from the previous hardcoded values. Add parameters to allow small randomwalk caves Disabled by default for now as they have never been present in the non-mgv6 mapgens.
1 parent 5506e97 commit 2a74727

17 files changed

+416
-188
lines changed

builtin/settingtypes.txt

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,21 @@ mgv5_large_cave_depth (Large cave depth) int -256
14791479
# Y of upper limit of lava in large caves.
14801480
mgv5_lava_depth (Lava depth) int -256
14811481

1482+
# Minimum limit of random number of small caves per mapchunk.
1483+
mgv5_small_cave_num_min (Small cave minimum number) int 0 0 256
1484+
1485+
# Maximum limit of random number of small caves per mapchunk.
1486+
mgv5_small_cave_num_max (Small cave maximum number) int 0 0 256
1487+
1488+
# Minimum limit of random number of large caves per mapchunk.
1489+
mgv5_large_cave_num_min (Large cave minimum number) int 0 0 64
1490+
1491+
# Maximum limit of random number of large caves per mapchunk.
1492+
mgv5_large_cave_num_max (Large cave maximum number) int 2 0 64
1493+
1494+
# Proportion of large caves that contain liquid.
1495+
mgv5_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0
1496+
14821497
# Y-level of cavern upper limit.
14831498
mgv5_cavern_limit (Cavern limit) int -256
14841499

@@ -1596,6 +1611,21 @@ mgv7_large_cave_depth (Large cave depth) int -33
15961611
# Y of upper limit of lava in large caves.
15971612
mgv7_lava_depth (Lava depth) int -256
15981613

1614+
# Minimum limit of random number of small caves per mapchunk.
1615+
mgv7_small_cave_num_min (Small cave minimum number) int 0 0 256
1616+
1617+
# Maximum limit of random number of small caves per mapchunk.
1618+
mgv7_small_cave_num_max (Small cave maximum number) int 0 0 256
1619+
1620+
# Minimum limit of random number of large caves per mapchunk.
1621+
mgv7_large_cave_num_min (Large cave minimum number) int 0 0 64
1622+
1623+
# Maximum limit of random number of large caves per mapchunk.
1624+
mgv7_large_cave_num_max (Large cave maximum number) int 2 0 64
1625+
1626+
# Proportion of large caves that contain liquid.
1627+
mgv7_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0
1628+
15991629
# Controls the density of mountain-type floatlands.
16001630
# Is a noise offset added to the 'mgv7_np_mountain' noise value.
16011631
mgv7_float_mount_density (Floatland mountain density) float 0.6
@@ -1704,6 +1734,21 @@ mgcarpathian_large_cave_depth (Large cave depth) int -33
17041734
# Y of upper limit of lava in large caves.
17051735
mgcarpathian_lava_depth (Lava depth) int -256
17061736

1737+
# Minimum limit of random number of small caves per mapchunk.
1738+
mgcarpathian_small_cave_num_min (Small cave minimum number) int 0 0 256
1739+
1740+
# Maximum limit of random number of small caves per mapchunk.
1741+
mgcarpathian_small_cave_num_max (Small cave maximum number) int 0 0 256
1742+
1743+
# Minimum limit of random number of large caves per mapchunk.
1744+
mgcarpathian_large_cave_num_min (Large cave minimum number) int 0 0 64
1745+
1746+
# Maximum limit of random number of large caves per mapchunk.
1747+
mgcarpathian_large_cave_num_max (Large cave maximum number) int 2 0 64
1748+
1749+
# Proportion of large caves that contain liquid.
1750+
mgcarpathian_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0
1751+
17071752
# Y-level of cavern upper limit.
17081753
mgcarpathian_cavern_limit (Cavern limit) int -256
17091754

@@ -1788,6 +1833,21 @@ mgflat_large_cave_depth (Large cave depth) int -33
17881833
# Y of upper limit of lava in large caves.
17891834
mgflat_lava_depth (Lava depth) int -256
17901835

1836+
# Minimum limit of random number of small caves per mapchunk.
1837+
mgflat_small_cave_num_min (Small cave minimum number) int 0 0 256
1838+
1839+
# Maximum limit of random number of small caves per mapchunk.
1840+
mgflat_small_cave_num_max (Small cave maximum number) int 0 0 256
1841+
1842+
# Minimum limit of random number of large caves per mapchunk.
1843+
mgflat_large_cave_num_min (Large cave minimum number) int 0 0 64
1844+
1845+
# Maximum limit of random number of large caves per mapchunk.
1846+
mgflat_large_cave_num_max (Large cave maximum number) int 2 0 64
1847+
1848+
# Proportion of large caves that contain liquid.
1849+
mgflat_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0
1850+
17911851
# Controls width of tunnels, a smaller value creates wider tunnels.
17921852
mgflat_cave_width (Cave width) float 0.09
17931853

@@ -1847,6 +1907,21 @@ mgfractal_large_cave_depth (Large cave depth) int -33
18471907
# Y of upper limit of lava in large caves.
18481908
mgfractal_lava_depth (Lava depth) int -256
18491909

1910+
# Minimum limit of random number of small caves per mapchunk.
1911+
mgfractal_small_cave_num_min (Small cave minimum number) int 0 0 256
1912+
1913+
# Maximum limit of random number of small caves per mapchunk.
1914+
mgfractal_small_cave_num_max (Small cave maximum number) int 0 0 256
1915+
1916+
# Minimum limit of random number of large caves per mapchunk.
1917+
mgfractal_large_cave_num_min (Large cave minimum number) int 0 0 64
1918+
1919+
# Maximum limit of random number of large caves per mapchunk.
1920+
mgfractal_large_cave_num_max (Large cave maximum number) int 2 0 64
1921+
1922+
# Proportion of large caves that contain liquid.
1923+
mgfractal_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0
1924+
18501925
# Lower Y limit of dungeons.
18511926
mgfractal_dungeon_ymin (Dungeon minimum Y) int -31000
18521927

@@ -1970,6 +2045,21 @@ mgvalleys_large_cave_depth (Large cave depth) int -33
19702045
# Y of upper limit of lava in large caves.
19712046
mgvalleys_lava_depth (Lava depth) int 1
19722047

2048+
# Minimum limit of random number of small caves per mapchunk.
2049+
mgvalleys_small_cave_num_min (Small cave minimum number) int 0 0 256
2050+
2051+
# Maximum limit of random number of small caves per mapchunk.
2052+
mgvalleys_small_cave_num_max (Small cave maximum number) int 0 0 256
2053+
2054+
# Minimum limit of random number of large caves per mapchunk.
2055+
mgvalleys_large_cave_num_min (Large cave minimum number) int 0 0 64
2056+
2057+
# Maximum limit of random number of large caves per mapchunk.
2058+
mgvalleys_large_cave_num_max (Large cave maximum number) int 2 0 64
2059+
2060+
# Proportion of large caves that contain liquid.
2061+
mgvalleys_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0
2062+
19732063
# Depth below which you'll find giant caverns.
19742064
mgvalleys_cavern_limit (Cavern upper limit) int -256
19752065

src/mapgen/cavegen.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -280,18 +280,20 @@ CavesRandomWalk::CavesRandomWalk(
280280
int water_level,
281281
content_t water_source,
282282
content_t lava_source,
283+
float large_cave_flooded,
283284
int lava_depth,
284285
BiomeGen *biomegen)
285286
{
286287
assert(ndef);
287288

288-
this->ndef = ndef;
289-
this->gennotify = gennotify;
290-
this->seed = seed;
291-
this->water_level = water_level;
292-
this->np_caveliquids = &nparams_caveliquids;
293-
this->lava_depth = lava_depth;
294-
this->bmgn = biomegen;
289+
this->ndef = ndef;
290+
this->gennotify = gennotify;
291+
this->seed = seed;
292+
this->water_level = water_level;
293+
this->np_caveliquids = &nparams_caveliquids;
294+
this->large_cave_flooded = large_cave_flooded;
295+
this->lava_depth = lava_depth;
296+
this->bmgn = biomegen;
295297

296298
c_water_source = water_source;
297299
if (c_water_source == CONTENT_IGNORE)
@@ -322,7 +324,7 @@ void CavesRandomWalk::makeCave(MMVManip *vm, v3s16 nmin, v3s16 nmax,
322324

323325
this->ystride = nmax.X - nmin.X + 1;
324326

325-
flooded = ps->range(1, 2) == 2;
327+
flooded = ps->range(1, 1000) <= large_cave_flooded * 1000.0f;
326328

327329
// If flooded:
328330
// Get biome at mapchunk midpoint. If cave liquid defined for biome, use it.

src/mapgen/cavegen.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,15 +116,14 @@ class CavesRandomWalk
116116
s16 *heightmap;
117117
BiomeGen *bmgn;
118118

119-
// configurable parameters
120119
s32 seed;
121120
int water_level;
121+
float large_cave_flooded;
122122
// TODO 'lava_depth' and 'np_caveliquids' are deprecated and should be removed.
123123
// Cave liquids are now defined and located using biome definitions.
124124
int lava_depth;
125125
NoiseParams *np_caveliquids;
126126

127-
// intermediate state variables
128127
u16 ystride;
129128

130129
s16 min_tunnel_diameter;
@@ -161,7 +160,8 @@ class CavesRandomWalk
161160
CavesRandomWalk(const NodeDefManager *ndef, GenerateNotifier *gennotify =
162161
NULL, s32 seed = 0, int water_level = 1, content_t water_source =
163162
CONTENT_IGNORE, content_t lava_source = CONTENT_IGNORE,
164-
int lava_depth = -256, BiomeGen *biomegen = NULL);
163+
float large_cave_flooded = 0.5f, int lava_depth = -256,
164+
BiomeGen *biomegen = NULL);
165165

166166
// vm and ps are mandatory parameters.
167167
// If heightmap is NULL, the surface level at all points is assumed to

src/mapgen/mapgen.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -843,18 +843,29 @@ void MapgenBasic::generateCavesNoiseIntersection(s16 max_stone_y)
843843

844844
void MapgenBasic::generateCavesRandomWalk(s16 max_stone_y, s16 large_cave_depth)
845845
{
846-
if (node_min.Y > max_stone_y || node_max.Y > large_cave_depth)
846+
if (node_min.Y > max_stone_y)
847847
return;
848848

849849
PseudoRandom ps(blockseed + 21343);
850-
u32 bruises_count = ps.range(0, 2);
850+
// Small randomwalk caves
851+
u32 num_small_caves = ps.range(small_cave_num_min, small_cave_num_max);
851852

852-
for (u32 i = 0; i < bruises_count; i++) {
853+
for (u32 i = 0; i < num_small_caves; i++) {
853854
CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
854-
c_water_source, c_lava_source, lava_depth, biomegen);
855+
c_water_source, c_lava_source, large_cave_flooded, lava_depth, biomegen);
856+
cave.makeCave(vm, node_min, node_max, &ps, false, max_stone_y, heightmap);
857+
}
858+
859+
if (node_max.Y > large_cave_depth)
860+
return;
861+
862+
// Large randomwalk caves below 'large_cave_depth'
863+
u32 num_large_caves = ps.range(large_cave_num_min, large_cave_num_max);
855864

856-
cave.makeCave(vm, node_min, node_max, &ps, true, max_stone_y,
857-
heightmap);
865+
for (u32 i = 0; i < num_large_caves; i++) {
866+
CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
867+
c_water_source, c_lava_source, large_cave_flooded, lava_depth, biomegen);
868+
cave.makeCave(vm, node_min, node_max, &ps, true, max_stone_y, heightmap);
858869
}
859870
}
860871

src/mapgen/mapgen.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,11 @@ class MapgenBasic : public Mapgen {
280280
float cavern_limit;
281281
float cavern_taper;
282282
float cavern_threshold;
283+
int small_cave_num_min;
284+
int small_cave_num_max;
285+
int large_cave_num_min;
286+
int large_cave_num_max;
287+
float large_cave_flooded;
283288
// TODO 'lava_depth' is deprecated and should be removed. Cave liquids are
284289
// now defined and located using biome definitions.
285290
int lava_depth;

src/mapgen/mapgen_carpathian.cpp

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -58,15 +58,20 @@ MapgenCarpathian::MapgenCarpathian(MapgenCarpathianParams *params, EmergeManager
5858
river_depth = params->river_depth;
5959
valley_width = params->valley_width;
6060

61-
spflags = params->spflags;
62-
cave_width = params->cave_width;
63-
large_cave_depth = params->large_cave_depth;
64-
lava_depth = params->lava_depth;
65-
cavern_limit = params->cavern_limit;
66-
cavern_taper = params->cavern_taper;
67-
cavern_threshold = params->cavern_threshold;
68-
dungeon_ymin = params->dungeon_ymin;
69-
dungeon_ymax = params->dungeon_ymax;
61+
spflags = params->spflags;
62+
cave_width = params->cave_width;
63+
large_cave_depth = params->large_cave_depth;
64+
lava_depth = params->lava_depth;
65+
small_cave_num_min = params->small_cave_num_min;
66+
small_cave_num_max = params->small_cave_num_max;
67+
large_cave_num_min = params->large_cave_num_min;
68+
large_cave_num_max = params->large_cave_num_max;
69+
large_cave_flooded = params->large_cave_flooded;
70+
cavern_limit = params->cavern_limit;
71+
cavern_taper = params->cavern_taper;
72+
cavern_threshold = params->cavern_threshold;
73+
dungeon_ymin = params->dungeon_ymin;
74+
dungeon_ymax = params->dungeon_ymax;
7075

7176
grad_wl = 1 - water_level;
7277

@@ -148,14 +153,19 @@ void MapgenCarpathianParams::readParams(const Settings *settings)
148153
settings->getFloatNoEx("mgcarpathian_river_depth", river_depth);
149154
settings->getFloatNoEx("mgcarpathian_valley_width", valley_width);
150155

151-
settings->getFloatNoEx("mgcarpathian_cave_width", cave_width);
152-
settings->getS16NoEx("mgcarpathian_large_cave_depth", large_cave_depth);
153-
settings->getS16NoEx("mgcarpathian_lava_depth", lava_depth);
154-
settings->getS16NoEx("mgcarpathian_cavern_limit", cavern_limit);
155-
settings->getS16NoEx("mgcarpathian_cavern_taper", cavern_taper);
156-
settings->getFloatNoEx("mgcarpathian_cavern_threshold", cavern_threshold);
157-
settings->getS16NoEx("mgcarpathian_dungeon_ymin", dungeon_ymin);
158-
settings->getS16NoEx("mgcarpathian_dungeon_ymax", dungeon_ymax);
156+
settings->getFloatNoEx("mgcarpathian_cave_width", cave_width);
157+
settings->getS16NoEx("mgcarpathian_large_cave_depth", large_cave_depth);
158+
settings->getS16NoEx("mgcarpathian_lava_depth", lava_depth);
159+
settings->getU16NoEx("mgcarpathian_small_cave_num_min", small_cave_num_min);
160+
settings->getU16NoEx("mgcarpathian_small_cave_num_max", small_cave_num_max);
161+
settings->getU16NoEx("mgcarpathian_large_cave_num_min", large_cave_num_min);
162+
settings->getU16NoEx("mgcarpathian_large_cave_num_max", large_cave_num_max);
163+
settings->getFloatNoEx("mgcarpathian_large_cave_flooded", large_cave_flooded);
164+
settings->getS16NoEx("mgcarpathian_cavern_limit", cavern_limit);
165+
settings->getS16NoEx("mgcarpathian_cavern_taper", cavern_taper);
166+
settings->getFloatNoEx("mgcarpathian_cavern_threshold", cavern_threshold);
167+
settings->getS16NoEx("mgcarpathian_dungeon_ymin", dungeon_ymin);
168+
settings->getS16NoEx("mgcarpathian_dungeon_ymax", dungeon_ymax);
159169

160170
settings->getNoiseParams("mgcarpathian_np_filler_depth", np_filler_depth);
161171
settings->getNoiseParams("mgcarpathian_np_height1", np_height1);
@@ -186,14 +196,19 @@ void MapgenCarpathianParams::writeParams(Settings *settings) const
186196
settings->setFloat("mgcarpathian_river_depth", river_depth);
187197
settings->setFloat("mgcarpathian_valley_width", valley_width);
188198

189-
settings->setFloat("mgcarpathian_cave_width", cave_width);
190-
settings->setS16("mgcarpathian_large_cave_depth", large_cave_depth);
191-
settings->setS16("mgcarpathian_lava_depth", lava_depth);
192-
settings->setS16("mgcarpathian_cavern_limit", cavern_limit);
193-
settings->setS16("mgcarpathian_cavern_taper", cavern_taper);
194-
settings->setFloat("mgcarpathian_cavern_threshold", cavern_threshold);
195-
settings->setS16("mgcarpathian_dungeon_ymin", dungeon_ymin);
196-
settings->setS16("mgcarpathian_dungeon_ymax", dungeon_ymax);
199+
settings->setFloat("mgcarpathian_cave_width", cave_width);
200+
settings->setS16("mgcarpathian_large_cave_depth", large_cave_depth);
201+
settings->setS16("mgcarpathian_lava_depth", lava_depth);
202+
settings->setU16("mgcarpathian_small_cave_num_min", small_cave_num_min);
203+
settings->setU16("mgcarpathian_small_cave_num_max", small_cave_num_max);
204+
settings->setU16("mgcarpathian_large_cave_num_min", large_cave_num_min);
205+
settings->setU16("mgcarpathian_large_cave_num_max", large_cave_num_max);
206+
settings->setFloat("mgcarpathian_large_cave_flooded", large_cave_flooded);
207+
settings->setS16("mgcarpathian_cavern_limit", cavern_limit);
208+
settings->setS16("mgcarpathian_cavern_taper", cavern_taper);
209+
settings->setFloat("mgcarpathian_cavern_threshold", cavern_threshold);
210+
settings->setS16("mgcarpathian_dungeon_ymin", dungeon_ymin);
211+
settings->setS16("mgcarpathian_dungeon_ymax", dungeon_ymax);
197212

198213
settings->setNoiseParams("mgcarpathian_np_filler_depth", np_filler_depth);
199214
settings->setNoiseParams("mgcarpathian_np_height1", np_height1);

src/mapgen/mapgen_carpathian.h

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,20 @@ struct MapgenCarpathianParams : public MapgenParams
3737
float river_depth = 24.0f;
3838
float valley_width = 0.25f;
3939

40-
u32 spflags = MGCARPATHIAN_CAVERNS;
41-
float cave_width = 0.09f;
42-
s16 large_cave_depth = -33;
43-
s16 lava_depth = -256;
44-
s16 cavern_limit = -256;
45-
s16 cavern_taper = 256;
46-
float cavern_threshold = 0.7f;
47-
s16 dungeon_ymin = -31000;
48-
s16 dungeon_ymax = 31000;
40+
u32 spflags = MGCARPATHIAN_CAVERNS;
41+
float cave_width = 0.09f;
42+
s16 large_cave_depth = -33;
43+
s16 lava_depth = -256;
44+
u16 small_cave_num_min = 0;
45+
u16 small_cave_num_max = 0;
46+
u16 large_cave_num_min = 0;
47+
u16 large_cave_num_max = 2;
48+
float large_cave_flooded = 0.5f;
49+
s16 cavern_limit = -256;
50+
s16 cavern_taper = 256;
51+
float cavern_threshold = 0.7f;
52+
s16 dungeon_ymin = -31000;
53+
s16 dungeon_ymax = 31000;
4954

5055
NoiseParams np_filler_depth;
5156
NoiseParams np_height1;

0 commit comments

Comments
 (0)