Skip to content

Commit 859141a

Browse files
committedApr 3, 2017
Cavegen/Mgv5/Mgv7: Add optional giant caverns
Add to MapgenBasic for use by multiple mapgens. Add to mgv5 and mgv7, enabled by default. Similar to mgvalleys caverns but half the scale. Parameters for upper y limit, distance caverns taper to full size, and noise threshold (full cavern size). As with mgvalleys caverns are generated first and classic caves are disabled in any mapchunk containing a cavern, to avoid excessive spreading volumes of liquids. This also avoids floating blobs of liquid where a large classic cave has overgenerated out into a neighbouring previously-generated mapchunk.
1 parent 86b1542 commit 859141a

10 files changed

+303
-54
lines changed
 

Diff for: ‎builtin/settingtypes.txt

+23
Original file line numberDiff line numberDiff line change
@@ -940,12 +940,25 @@ mg_biome_np_humidity_blend (Mapgen biome humidity blend noise parameters) noise_
940940
# Controls width of tunnels, a smaller value creates wider tunnels.
941941
mgv5_cave_width (Mapgen v5 cave width) float 0.125
942942

943+
# Y-level of cavern upper limit.
944+
mgv5_cavern_limit (Mapgen v5 cavern limit) int -256
945+
946+
# Y-distance over which caverns expand to full size.
947+
mgv5_cavern_taper (Mapgen v5 cavern taper) int 256
948+
949+
# Defines full size of caverns, smaller values create larger caverns.
950+
mgv5_cavern_threshold (Mapgen v5 cavern threshold) float 0.7
951+
943952
mgv5_np_filler_depth (Mapgen v5 filler depth noise parameters) noise_params 0, 1, (150, 150, 150), 261, 4, 0.7, 2.0
944953
mgv5_np_factor (Mapgen v5 factor noise parameters) noise_params 0, 1, (250, 250, 250), 920381, 3, 0.45, 2.0
945954
mgv5_np_height (Mapgen v5 height noise parameters) noise_params 0, 10, (250, 250, 250), 84174, 4, 0.5, 2.0
946955
mgv5_np_cave1 (Mapgen v5 cave1 noise parameters) noise_params 0, 12, (50, 50, 50), 52534, 4, 0.5, 2.0
947956
mgv5_np_cave2 (Mapgen v5 cave2 noise parameters) noise_params 0, 12, (50, 50, 50), 10325, 4, 0.5, 2.0
957+
mgv5_np_cavern (Mapgen v5 cavern noise parameters) noise_params 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0
948958
# TODO
959+
# Noise parameters in group format, unsupported by advanced settings
960+
# menu but settable in minetest.conf.
961+
# See documentation of noise parameter formats in minetest.conf.example.
949962
#mgv5_np_ground = {
950963
# offset = 0
951964
# scale = 40
@@ -1007,6 +1020,15 @@ mgv7_floatland_level (Mapgen v7 floatland level) int 1280
10071020
# Y-level to which floatland shadows extend.
10081021
mgv7_shadow_limit (Mapgen v7 shadow limit) int 1024
10091022

1023+
# Y-level of cavern upper limit.
1024+
mgv7_cavern_limit (Mapgen v7 cavern limit) int -256
1025+
1026+
# Y-distance over which caverns expand to full size.
1027+
mgv7_cavern_taper (Mapgen v7 cavern taper) int 256
1028+
1029+
# Defines full size of caverns, smaller values create larger caverns.
1030+
mgv7_cavern_threshold (Mapgen v7 cavern threshold) float 0.7
1031+
10101032
mgv7_np_terrain_base (Mapgen v7 terrain base noise parameters) noise_params 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0
10111033
mgv7_np_terrain_alt (Mapgen v7 terrain altitude noise parameters) noise_params 4, 25, (600, 600, 600), 5934, 5, 0.6, 2.0
10121034
mgv7_np_terrain_persist (Mapgen v7 terrain persistation noise parameters) noise_params 0.6, 0.1, (2000, 2000, 2000), 539, 3, 0.6, 2.0
@@ -1018,6 +1040,7 @@ mgv7_np_floatland_base (Mapgen v7 floatland base terrain noise parameters) noise
10181040
mgv7_np_float_base_height (Mapgen v7 floatland base terrain height noise parameters) noise_params 48, 24, (300, 300, 300), 907, 4, 0.7, 2.0
10191041
mgv7_np_mountain (Mapgen v7 mountain noise parameters) noise_params -0.6, 1, (250, 350, 250), 5333, 5, 0.63, 2.0
10201042
mgv7_np_ridge (Mapgen v7 river channel wall noise parameters) noise_params 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0
1043+
mgv7_np_cavern (Mapgen v7 cavern noise parameters) noise_params 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0
10211044
mgv7_np_cave1 (Mapgen v7 cave1 noise parameters) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
10221045
mgv7_np_cave2 (Mapgen v7 cave2 noise parameters) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
10231046

Diff for: ‎minetest.conf.example

+30
Original file line numberDiff line numberDiff line change
@@ -1174,6 +1174,18 @@ server_side_occlusion_culling = true
11741174
# type: float
11751175
# mgv5_cave_width = 0.125
11761176

1177+
# Y-level of cavern upper limit.
1178+
# type: int
1179+
# mgv5_cavern_limit = -256
1180+
1181+
# Y-distance over which caverns expand to full size.
1182+
# type: int
1183+
# mgv5_cavern_taper = 256
1184+
1185+
# Defines full size of caverns, smaller values create larger caverns.
1186+
# type: float
1187+
# mgv5_cavern_threshold = 0.7
1188+
11771189
# type: noise_params
11781190
# mgv5_np_filler_depth = 0, 1, (150, 150, 150), 261, 4, 0.7, 2.0
11791191

@@ -1189,6 +1201,9 @@ server_side_occlusion_culling = true
11891201
# type: noise_params
11901202
# mgv5_np_cave2 = 0, 12, (50, 50, 50), 10325, 4, 0.5, 2.0
11911203

1204+
# type: noise_params
1205+
# mgv5_np_cavern = 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0
1206+
11921207
# Noise parameters in group format, unsupported by advanced settings
11931208
# menu but settable in minetest.conf.
11941209
# See documentation of noise parameter formats above.
@@ -1284,6 +1299,18 @@ server_side_occlusion_culling = true
12841299
# type: int
12851300
# mgv7_shadow_limit = 1024
12861301

1302+
# Y-level of cavern upper limit.
1303+
# type: int
1304+
# mgv7_cavern_limit = -256
1305+
1306+
# Y-distance over which caverns expand to full size.
1307+
# type: int
1308+
# mgv7_cavern_taper = 256
1309+
1310+
# Defines full size of caverns, smaller values create larger caverns.
1311+
# type: float
1312+
# mgv7_cavern_threshold = 0.7
1313+
12871314
# type: noise_params
12881315
# mgv7_np_terrain_base = 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0
12891316

@@ -1317,6 +1344,9 @@ server_side_occlusion_culling = true
13171344
# type: noise_params
13181345
# mgv7_np_ridge = 0, 1, (100, 100, 100), 6467, 4, 0.75, 2.0
13191346

1347+
# type: noise_params
1348+
# mgv7_np_cavern = 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0
1349+
13201350
# type: noise_params
13211351
# mgv7_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
13221352

Diff for: ‎src/cavegen.cpp

+95
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,101 @@ void CavesNoiseIntersection::generateCaves(MMVManip *vm,
150150
}
151151

152152

153+
////
154+
//// CavernsNoise
155+
////
156+
157+
CavernsNoise::CavernsNoise(
158+
INodeDefManager *nodedef, v3s16 chunksize, NoiseParams *np_cavern,
159+
s32 seed, float cavern_limit, float cavern_taper, float cavern_threshold)
160+
{
161+
assert(nodedef);
162+
163+
m_ndef = nodedef;
164+
165+
m_csize = chunksize;
166+
m_cavern_limit = cavern_limit;
167+
m_cavern_taper = cavern_taper;
168+
m_cavern_threshold = cavern_threshold;
169+
170+
m_ystride = m_csize.X;
171+
m_zstride_1d = m_csize.X * (m_csize.Y + 1);
172+
173+
// Noise is created using 1-down overgeneration
174+
// A Nx-by-1-by-Nz-sized plane is at the bottom of the desired for
175+
// re-carving the solid overtop placed for blocking sunlight
176+
noise_cavern = new Noise(np_cavern, seed, m_csize.X, m_csize.Y + 1, m_csize.Z);
177+
178+
c_water_source = m_ndef->getId("mapgen_water_source");
179+
if (c_water_source == CONTENT_IGNORE)
180+
c_water_source = CONTENT_AIR;
181+
182+
c_lava_source = m_ndef->getId("mapgen_lava_source");
183+
if (c_lava_source == CONTENT_IGNORE)
184+
c_lava_source = CONTENT_AIR;
185+
}
186+
187+
188+
CavernsNoise::~CavernsNoise()
189+
{
190+
delete noise_cavern;
191+
}
192+
193+
194+
bool CavernsNoise::generateCaverns(MMVManip *vm, v3s16 nmin, v3s16 nmax)
195+
{
196+
assert(vm);
197+
198+
// Calculate noise
199+
noise_cavern->perlinMap3D(nmin.X, nmin.Y - 1, nmin.Z);
200+
201+
// Cache cavern_amp values
202+
float cavern_amp[m_csize.Y + 1];
203+
u8 cavern_amp_index = 0; // Index zero at column top
204+
for (s16 y = nmax.Y; y >= nmin.Y - 1; y--, cavern_amp_index++) {
205+
cavern_amp[cavern_amp_index] =
206+
MYMIN((m_cavern_limit - y) / (float)m_cavern_taper, 1.0f);
207+
}
208+
209+
//// Place nodes
210+
bool has_cavern = false;
211+
v3s16 em = vm->m_area.getExtent();
212+
u32 index2d = 0;
213+
214+
for (s16 z = nmin.Z; z <= nmax.Z; z++)
215+
for (s16 x = nmin.X; x <= nmax.X; x++, index2d++) {
216+
// Reset cave_amp index to column top
217+
cavern_amp_index = 0;
218+
// Initial voxelmanip index at column top
219+
u32 vi = vm->m_area.index(x, nmax.Y, z);
220+
// Initial 3D noise index at column top
221+
u32 index3d = (z - nmin.Z) * m_zstride_1d + m_csize.Y * m_ystride +
222+
(x - nmin.X);
223+
// Don't excavate the overgenerated stone at node_max.Y + 1,
224+
// this creates a 'roof' over the cavern, preventing light in
225+
// caverns at mapchunk borders when generating mapchunks upwards.
226+
// This 'roof' is excavated when the mapchunk above is generated.
227+
for (s16 y = nmax.Y; y >= nmin.Y - 1; y--,
228+
index3d -= m_ystride,
229+
vm->m_area.add_y(em, vi, -1),
230+
cavern_amp_index++) {
231+
content_t c = vm->m_data[vi].getContent();
232+
float nabs_cavern = fabs(noise_cavern->result[index3d]);
233+
// Caverns generate first but still remove lava and water in case
234+
// of overgenerated classic caves.
235+
if (nabs_cavern * cavern_amp[cavern_amp_index] > m_cavern_threshold &&
236+
(m_ndef->get(c).is_ground_content ||
237+
c == c_lava_source || c == c_water_source)) {
238+
vm->m_data[vi] = MapNode(CONTENT_AIR);
239+
has_cavern = true;
240+
}
241+
}
242+
}
243+
244+
return has_cavern;
245+
}
246+
247+
153248
////
154249
//// CavesRandomWalk
155250
////

Diff for: ‎src/cavegen.h

+30
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,36 @@ class CavesNoiseIntersection {
6262
Noise *noise_cave2;
6363
};
6464

65+
/*
66+
CavernsNoise is a cave digging algorithm
67+
*/
68+
class CavernsNoise {
69+
public:
70+
CavernsNoise(INodeDefManager *nodedef, v3s16 chunksize, NoiseParams *np_cavern,
71+
s32 seed, float cavern_limit, float cavern_taper, float cavern_threshold);
72+
~CavernsNoise();
73+
74+
bool generateCaverns(MMVManip *vm, v3s16 nmin, v3s16 nmax);
75+
76+
private:
77+
INodeDefManager *m_ndef;
78+
79+
// configurable parameters
80+
v3s16 m_csize;
81+
float m_cavern_limit;
82+
float m_cavern_taper;
83+
float m_cavern_threshold;
84+
85+
// intermediate state variables
86+
u16 m_ystride;
87+
u16 m_zstride_1d;
88+
89+
Noise *noise_cavern;
90+
91+
content_t c_water_source;
92+
content_t c_lava_source;
93+
};
94+
6595
/*
6696
CavesRandomWalk is an implementation of a cave-digging algorithm that
6797
operates on the principle of a "random walk" to approximate the stochiastic

Diff for: ‎src/mapgen.cpp

+12
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,18 @@ void MapgenBasic::generateCaves(s16 max_stone_y, s16 large_cave_depth)
840840
}
841841

842842

843+
bool MapgenBasic::generateCaverns(s16 max_stone_y)
844+
{
845+
if (node_min.Y > max_stone_y || node_min.Y > cavern_limit)
846+
return false;
847+
848+
CavernsNoise caverns_noise(ndef, csize, &np_cavern,
849+
seed, cavern_limit, cavern_taper, cavern_threshold);
850+
851+
return caverns_noise.generateCaverns(vm, node_min, node_max);
852+
}
853+
854+
843855
void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type)
844856
{
845857
if (max_stone_y < node_min.Y)

Diff for: ‎src/mapgen.h

+5
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ class MapgenBasic : public Mapgen {
243243
virtual ~MapgenBasic();
244244

245245
virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth);
246+
virtual bool generateCaverns(s16 max_stone_y);
246247
virtual void generateDungeons(s16 max_stone_y, MgStoneType stone_type);
247248
virtual MgStoneType generateBiomes();
248249
virtual void dustTopNodes();
@@ -282,7 +283,11 @@ class MapgenBasic : public Mapgen {
282283

283284
NoiseParams np_cave1;
284285
NoiseParams np_cave2;
286+
NoiseParams np_cavern;
285287
float cave_width;
288+
float cavern_limit;
289+
float cavern_taper;
290+
float cavern_threshold;
286291
};
287292

288293
#endif

Diff for: ‎src/mapgen_v5.cpp

+47-39
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,19 @@ with this program; if not, write to the Free Software Foundation, Inc.,
4141

4242

4343
FlagDesc flagdesc_mapgen_v5[] = {
44-
{NULL, 0}
44+
{"caverns", MGV5_CAVERNS},
45+
{NULL, 0}
4546
};
4647

4748

4849
MapgenV5::MapgenV5(int mapgenid, MapgenV5Params *params, EmergeManager *emerge)
4950
: MapgenBasic(mapgenid, params, emerge)
5051
{
51-
this->spflags = params->spflags;
52-
this->cave_width = params->cave_width;
52+
this->spflags = params->spflags;
53+
this->cave_width = params->cave_width;
54+
this->cavern_limit = params->cavern_limit;
55+
this->cavern_taper = params->cavern_taper;
56+
this->cavern_threshold = params->cavern_threshold;
5357

5458
// Terrain noise
5559
noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
@@ -59,9 +63,10 @@ MapgenV5::MapgenV5(int mapgenid, MapgenV5Params *params, EmergeManager *emerge)
5963
// 3D terrain noise
6064
// 1-up 1-down overgeneration
6165
noise_ground = new Noise(&params->np_ground, seed, csize.X, csize.Y + 2, csize.Z);
62-
63-
MapgenBasic::np_cave1 = params->np_cave1;
64-
MapgenBasic::np_cave2 = params->np_cave2;
66+
// 1 down overgeneration
67+
MapgenBasic::np_cave1 = params->np_cave1;
68+
MapgenBasic::np_cave2 = params->np_cave2;
69+
MapgenBasic::np_cavern = params->np_cavern;
6570
}
6671

6772

@@ -76,47 +81,55 @@ MapgenV5::~MapgenV5()
7681

7782
MapgenV5Params::MapgenV5Params()
7883
{
79-
spflags = 0;
80-
cave_width = 0.125;
84+
spflags = MGV5_CAVERNS;
85+
cave_width = 0.125;
86+
cavern_limit = -256;
87+
cavern_taper = 256;
88+
cavern_threshold = 0.7;
8189

8290
np_filler_depth = NoiseParams(0, 1, v3f(150, 150, 150), 261, 4, 0.7, 2.0);
8391
np_factor = NoiseParams(0, 1, v3f(250, 250, 250), 920381, 3, 0.45, 2.0);
8492
np_height = NoiseParams(0, 10, v3f(250, 250, 250), 84174, 4, 0.5, 2.0);
93+
np_ground = NoiseParams(0, 40, v3f(80, 80, 80), 983240, 4, 0.55, 2.0, NOISE_FLAG_EASED);
8594
np_cave1 = NoiseParams(0, 12, v3f(50, 50, 50), 52534, 4, 0.5, 2.0);
8695
np_cave2 = NoiseParams(0, 12, v3f(50, 50, 50), 10325, 4, 0.5, 2.0);
87-
np_ground = NoiseParams(0, 40, v3f(80, 80, 80), 983240, 4, 0.55, 2.0, NOISE_FLAG_EASED);
96+
np_cavern = NoiseParams(0, 1, v3f(384, 128, 384), 723, 5, 0.63, 2.0);
8897
}
8998

9099

91-
//#define CAVE_NOISE_SCALE 12.0
92-
//#define CAVE_NOISE_THRESHOLD (1.5/CAVE_NOISE_SCALE) = 0.125
93-
94-
95100
void MapgenV5Params::readParams(const Settings *settings)
96101
{
97-
settings->getFlagStrNoEx("mgv5_spflags", spflags, flagdesc_mapgen_v5);
98-
settings->getFloatNoEx("mgv5_cave_width", cave_width);
102+
settings->getFlagStrNoEx("mgv5_spflags", spflags, flagdesc_mapgen_v5);
103+
settings->getFloatNoEx("mgv5_cave_width", cave_width);
104+
settings->getS16NoEx("mgv5_cavern_limit", cavern_limit);
105+
settings->getS16NoEx("mgv5_cavern_taper", cavern_taper);
106+
settings->getFloatNoEx("mgv5_cavern_threshold", cavern_threshold);
99107

100108
settings->getNoiseParams("mgv5_np_filler_depth", np_filler_depth);
101109
settings->getNoiseParams("mgv5_np_factor", np_factor);
102110
settings->getNoiseParams("mgv5_np_height", np_height);
111+
settings->getNoiseParams("mgv5_np_ground", np_ground);
103112
settings->getNoiseParams("mgv5_np_cave1", np_cave1);
104113
settings->getNoiseParams("mgv5_np_cave2", np_cave2);
105-
settings->getNoiseParams("mgv5_np_ground", np_ground);
114+
settings->getNoiseParams("mgv5_np_cavern", np_cavern);
106115
}
107116

108117

109118
void MapgenV5Params::writeParams(Settings *settings) const
110119
{
111-
settings->setFlagStr("mgv5_spflags", spflags, flagdesc_mapgen_v5, U32_MAX);
112-
settings->setFloat("mgv5_cave_width", cave_width);
120+
settings->setFlagStr("mgv5_spflags", spflags, flagdesc_mapgen_v5, U32_MAX);
121+
settings->setFloat("mgv5_cave_width", cave_width);
122+
settings->setS16("mgv5_cavern_limit", cavern_limit);
123+
settings->setS16("mgv5_cavern_taper", cavern_taper);
124+
settings->setFloat("mgv5_cavern_threshold", cavern_threshold);
113125

114126
settings->setNoiseParams("mgv5_np_filler_depth", np_filler_depth);
115127
settings->setNoiseParams("mgv5_np_factor", np_factor);
116128
settings->setNoiseParams("mgv5_np_height", np_height);
129+
settings->setNoiseParams("mgv5_np_ground", np_ground);
117130
settings->setNoiseParams("mgv5_np_cave1", np_cave1);
118131
settings->setNoiseParams("mgv5_np_cave2", np_cave2);
119-
settings->setNoiseParams("mgv5_np_ground", np_ground);
132+
settings->setNoiseParams("mgv5_np_cavern", np_cavern);
120133
}
121134

122135

@@ -190,9 +203,21 @@ void MapgenV5::makeChunk(BlockMakeData *data)
190203
biomegen->calcBiomeNoise(node_min);
191204
MgStoneType stone_type = generateBiomes();
192205

193-
// Generate caves
194-
if ((flags & MG_CAVES) && (stone_surface_max_y >= node_min.Y))
195-
generateCaves(stone_surface_max_y, MGV5_LARGE_CAVE_DEPTH);
206+
// Generate caverns, tunnels and classic caves
207+
if (flags & MG_CAVES) {
208+
bool has_cavern = false;
209+
// Generate caverns
210+
if (spflags & MGV5_CAVERNS)
211+
has_cavern = generateCaverns(stone_surface_max_y);
212+
// Generate tunnels and classic caves
213+
if (has_cavern)
214+
// Disable classic caves in this mapchunk by setting
215+
// 'large cave depth' to world base. Avoids excessive liquid in
216+
// large caverns and floating blobs of overgenerated liquid.
217+
generateCaves(stone_surface_max_y, -MAX_MAP_GENERATION_LIMIT);
218+
else
219+
generateCaves(stone_surface_max_y, MGV5_LARGE_CAVE_DEPTH);
220+
}
196221

197222
// Generate dungeons and desert temples
198223
if (flags & MG_DUNGEONS)
@@ -223,23 +248,6 @@ void MapgenV5::makeChunk(BlockMakeData *data)
223248
}
224249

225250

226-
//bool is_cave(u32 index) {
227-
// double d1 = contour(noise_cave1->result[index]);
228-
// double d2 = contour(noise_cave2->result[index]);
229-
// return d1*d2 > CAVE_NOISE_THRESHOLD;
230-
//}
231-
232-
//bool val_is_ground(v3s16 p, u32 index, u32 index2d) {
233-
// double f = 0.55 + noise_factor->result[index2d];
234-
// if(f < 0.01)
235-
// f = 0.01;
236-
// else if(f >= 1.0)
237-
// f *= 1.6;
238-
// double h = WATER_LEVEL + 10 * noise_height->result[index2d];
239-
// return (noise_ground->result[index] * f > (double)p.Y - h);
240-
//}
241-
242-
243251
int MapgenV5::generateBaseTerrain()
244252
{
245253
u32 index = 0;

Diff for: ‎src/mapgen_v5.h

+9-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2525

2626
#define MGV5_LARGE_CAVE_DEPTH -256
2727

28+
///////// Mapgen V5 flags
29+
#define MGV5_CAVERNS 0x01
30+
2831
class BiomeManager;
2932

3033
extern FlagDesc flagdesc_mapgen_v5[];
@@ -33,12 +36,17 @@ extern FlagDesc flagdesc_mapgen_v5[];
3336
struct MapgenV5Params : public MapgenParams {
3437
u32 spflags;
3538
float cave_width;
39+
s16 cavern_limit;
40+
s16 cavern_taper;
41+
float cavern_threshold;
42+
3643
NoiseParams np_filler_depth;
3744
NoiseParams np_factor;
3845
NoiseParams np_height;
46+
NoiseParams np_ground;
3947
NoiseParams np_cave1;
4048
NoiseParams np_cave2;
41-
NoiseParams np_ground;
49+
NoiseParams np_cavern;
4250

4351
MapgenV5Params();
4452
~MapgenV5Params() {}

Diff for: ‎src/mapgen_v7.cpp

+43-10
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
4141

4242

4343
FlagDesc flagdesc_mapgen_v7[] = {
44-
{"mountains", MGV7_MOUNTAINS},
45-
{"ridges", MGV7_RIDGES},
46-
{"floatlands", MGV7_FLOATLANDS},
47-
{NULL, 0}
44+
{"mountains", MGV7_MOUNTAINS},
45+
{"ridges", MGV7_RIDGES},
46+
{"floatlands", MGV7_FLOATLANDS},
47+
{"caverns", MGV7_CAVERNS},
48+
{NULL, 0}
4849
};
4950

5051

@@ -60,6 +61,9 @@ MapgenV7::MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge)
6061
this->float_mount_height = params->float_mount_height;
6162
this->floatland_level = params->floatland_level;
6263
this->shadow_limit = params->shadow_limit;
64+
this->cavern_limit = params->cavern_limit;
65+
this->cavern_taper = params->cavern_taper;
66+
this->cavern_threshold = params->cavern_threshold;
6367

6468
//// Terrain noise
6569
noise_terrain_base = new Noise(&params->np_terrain_base, seed, csize.X, csize.Z);
@@ -76,9 +80,10 @@ MapgenV7::MapgenV7(int mapgenid, MapgenV7Params *params, EmergeManager *emerge)
7680
// 1-up 1-down overgeneration
7781
noise_mountain = new Noise(&params->np_mountain, seed, csize.X, csize.Y + 2, csize.Z);
7882
noise_ridge = new Noise(&params->np_ridge, seed, csize.X, csize.Y + 2, csize.Z);
79-
80-
MapgenBasic::np_cave1 = params->np_cave1;
81-
MapgenBasic::np_cave2 = params->np_cave2;
83+
// 1 down overgeneration
84+
MapgenBasic::np_cave1 = params->np_cave1;
85+
MapgenBasic::np_cave2 = params->np_cave2;
86+
MapgenBasic::np_cavern = params->np_cavern;
8287
}
8388

8489

@@ -100,12 +105,15 @@ MapgenV7::~MapgenV7()
100105

101106
MapgenV7Params::MapgenV7Params()
102107
{
103-
spflags = MGV7_MOUNTAINS | MGV7_RIDGES;
108+
spflags = MGV7_MOUNTAINS | MGV7_RIDGES | MGV7_CAVERNS;
104109
cave_width = 0.09;
105110
float_mount_density = 0.6;
106111
float_mount_height = 128.0;
107112
floatland_level = 1280;
108113
shadow_limit = 1024;
114+
cavern_limit = -256;
115+
cavern_taper = 256;
116+
cavern_threshold = 0.7;
109117

110118
np_terrain_base = NoiseParams(4, 70, v3f(600, 600, 600), 82341, 5, 0.6, 2.0);
111119
np_terrain_alt = NoiseParams(4, 25, v3f(600, 600, 600), 5934, 5, 0.6, 2.0);
@@ -118,6 +126,7 @@ MapgenV7Params::MapgenV7Params()
118126
np_float_base_height = NoiseParams(48, 24, v3f(300, 300, 300), 907, 4, 0.7, 2.0);
119127
np_mountain = NoiseParams(-0.6, 1, v3f(250, 350, 250), 5333, 5, 0.63, 2.0);
120128
np_ridge = NoiseParams(0, 1, v3f(100, 100, 100), 6467, 4, 0.75, 2.0);
129+
np_cavern = NoiseParams(0, 1, v3f(384, 128, 384), 723, 5, 0.63, 2.0);
121130
np_cave1 = NoiseParams(0, 12, v3f(61, 61, 61), 52534, 3, 0.5, 2.0);
122131
np_cave2 = NoiseParams(0, 12, v3f(67, 67, 67), 10325, 3, 0.5, 2.0);
123132
}
@@ -131,6 +140,9 @@ void MapgenV7Params::readParams(const Settings *settings)
131140
settings->getFloatNoEx("mgv7_float_mount_height", float_mount_height);
132141
settings->getS16NoEx("mgv7_floatland_level", floatland_level);
133142
settings->getS16NoEx("mgv7_shadow_limit", shadow_limit);
143+
settings->getS16NoEx("mgv7_cavern_limit", cavern_limit);
144+
settings->getS16NoEx("mgv7_cavern_taper", cavern_taper);
145+
settings->getFloatNoEx("mgv7_cavern_threshold", cavern_threshold);
134146

135147
settings->getNoiseParams("mgv7_np_terrain_base", np_terrain_base);
136148
settings->getNoiseParams("mgv7_np_terrain_alt", np_terrain_alt);
@@ -143,6 +155,7 @@ void MapgenV7Params::readParams(const Settings *settings)
143155
settings->getNoiseParams("mgv7_np_float_base_height", np_float_base_height);
144156
settings->getNoiseParams("mgv7_np_mountain", np_mountain);
145157
settings->getNoiseParams("mgv7_np_ridge", np_ridge);
158+
settings->getNoiseParams("mgv7_np_cavern", np_cavern);
146159
settings->getNoiseParams("mgv7_np_cave1", np_cave1);
147160
settings->getNoiseParams("mgv7_np_cave2", np_cave2);
148161
}
@@ -156,6 +169,9 @@ void MapgenV7Params::writeParams(Settings *settings) const
156169
settings->setFloat("mgv7_float_mount_height", float_mount_height);
157170
settings->setS16("mgv7_floatland_level", floatland_level);
158171
settings->setS16("mgv7_shadow_limit", shadow_limit);
172+
settings->setS16("mgv7_cavern_limit", cavern_limit);
173+
settings->setS16("mgv7_cavern_taper", cavern_taper);
174+
settings->setFloat("mgv7_cavern_threshold", cavern_threshold);
159175

160176
settings->setNoiseParams("mgv7_np_terrain_base", np_terrain_base);
161177
settings->setNoiseParams("mgv7_np_terrain_alt", np_terrain_alt);
@@ -168,6 +184,7 @@ void MapgenV7Params::writeParams(Settings *settings) const
168184
settings->setNoiseParams("mgv7_np_float_base_height", np_float_base_height);
169185
settings->setNoiseParams("mgv7_np_mountain", np_mountain);
170186
settings->setNoiseParams("mgv7_np_ridge", np_ridge);
187+
settings->setNoiseParams("mgv7_np_cavern", np_cavern);
171188
settings->setNoiseParams("mgv7_np_cave1", np_cave1);
172189
settings->setNoiseParams("mgv7_np_cave2", np_cave2);
173190
}
@@ -256,9 +273,23 @@ void MapgenV7::makeChunk(BlockMakeData *data)
256273
biomegen->calcBiomeNoise(node_min);
257274
MgStoneType stone_type = generateBiomes();
258275

259-
if (flags & MG_CAVES)
260-
generateCaves(stone_surface_max_y, water_level);
276+
// Generate caverns, tunnels and classic caves
277+
if (flags & MG_CAVES) {
278+
bool has_cavern = false;
279+
// Generate caverns
280+
if (spflags & MGV7_CAVERNS)
281+
has_cavern = generateCaverns(stone_surface_max_y);
282+
// Generate tunnels and classic caves
283+
if (has_cavern)
284+
// Disable classic caves in this mapchunk by setting
285+
// 'large cave depth' to world base. Avoids excessive liquid in
286+
// large caverns and floating blobs of overgenerated liquid.
287+
generateCaves(stone_surface_max_y, -MAX_MAP_GENERATION_LIMIT);
288+
else
289+
generateCaves(stone_surface_max_y, water_level);
290+
}
261291

292+
// Generate dungeons
262293
if (flags & MG_DUNGEONS)
263294
generateDungeons(stone_surface_max_y, stone_type);
264295

@@ -274,8 +305,10 @@ void MapgenV7::makeChunk(BlockMakeData *data)
274305

275306
//printf("makeChunk: %dms\n", t.stop());
276307

308+
// Update liquids
277309
updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);
278310

311+
// Calculate lighting
279312
// Limit floatland shadow
280313
bool propagate_shadow = !((spflags & MGV7_FLOATLANDS) &&
281314
node_min.Y <= shadow_limit && node_max.Y >= shadow_limit);

Diff for: ‎src/mapgen_v7.h

+9-4
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
2323

2424
#include "mapgen.h"
2525

26-
////////////// Mapgen V7 flags
27-
#define MGV7_MOUNTAINS 0x01
28-
#define MGV7_RIDGES 0x02
29-
#define MGV7_FLOATLANDS 0x04
26+
//////////// Mapgen V7 flags
27+
#define MGV7_MOUNTAINS 0x01
28+
#define MGV7_RIDGES 0x02
29+
#define MGV7_FLOATLANDS 0x04
30+
#define MGV7_CAVERNS 0x08
3031

3132
class BiomeManager;
3233

@@ -40,6 +41,9 @@ struct MapgenV7Params : public MapgenParams {
4041
float float_mount_height;
4142
s16 floatland_level;
4243
s16 shadow_limit;
44+
s16 cavern_limit;
45+
s16 cavern_taper;
46+
float cavern_threshold;
4347

4448
NoiseParams np_terrain_base;
4549
NoiseParams np_terrain_alt;
@@ -52,6 +56,7 @@ struct MapgenV7Params : public MapgenParams {
5256
NoiseParams np_float_base_height;
5357
NoiseParams np_mountain;
5458
NoiseParams np_ridge;
59+
NoiseParams np_cavern;
5560
NoiseParams np_cave1;
5661
NoiseParams np_cave2;
5762

0 commit comments

Comments
 (0)
Please sign in to comment.