Skip to content

Commit 54606e1

Browse files
authoredApr 29, 2018
Mapgen caves: Re-order generation to fix cavern bug
Previously, caverns confused tunnel generation causing biome top and filler nodes to appear in caverns. Split 'generateCaves()' into 2 functions to separate tunnel and large randomwalk cave generation. In each mapgen re-order cave generation to generate tunnels before caverns.
1 parent bb3baef commit 54606e1

8 files changed

+73
-39
lines changed
 

Diff for: ‎src/mapgen/mapgen.cpp

+9-4
Original file line numberDiff line numberDiff line change
@@ -824,21 +824,26 @@ void MapgenBasic::dustTopNodes()
824824
}
825825

826826

827-
void MapgenBasic::generateCaves(s16 max_stone_y, s16 large_cave_depth)
827+
void MapgenBasic::generateCavesNoiseIntersection(s16 max_stone_y)
828828
{
829-
if (max_stone_y < node_min.Y)
829+
if (node_min.Y > max_stone_y)
830830
return;
831831

832832
CavesNoiseIntersection caves_noise(ndef, m_bmgr, csize,
833833
&np_cave1, &np_cave2, seed, cave_width);
834834

835835
caves_noise.generateCaves(vm, node_min, node_max, biomemap);
836+
}
837+
836838

837-
if (node_max.Y > large_cave_depth)
839+
void MapgenBasic::generateCavesRandomWalk(s16 max_stone_y, s16 large_cave_depth)
840+
{
841+
if (node_min.Y > max_stone_y || node_max.Y > large_cave_depth)
838842
return;
839843

840844
PseudoRandom ps(blockseed + 21343);
841845
u32 bruises_count = ps.range(0, 2);
846+
842847
for (u32 i = 0; i < bruises_count; i++) {
843848
CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
844849
c_water_source, c_lava_source, lava_depth, biomegen);
@@ -849,7 +854,7 @@ void MapgenBasic::generateCaves(s16 max_stone_y, s16 large_cave_depth)
849854
}
850855

851856

852-
bool MapgenBasic::generateCaverns(s16 max_stone_y)
857+
bool MapgenBasic::generateCavernsNoise(s16 max_stone_y)
853858
{
854859
if (node_min.Y > max_stone_y || node_min.Y > cavern_limit)
855860
return false;

Diff for: ‎src/mapgen/mapgen.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -238,11 +238,12 @@ class MapgenBasic : public Mapgen {
238238
MapgenBasic(int mapgenid, MapgenParams *params, EmergeManager *emerge);
239239
virtual ~MapgenBasic();
240240

241-
virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth);
242-
virtual bool generateCaverns(s16 max_stone_y);
243-
virtual void generateDungeons(s16 max_stone_y);
244241
virtual void generateBiomes();
245242
virtual void dustTopNodes();
243+
virtual void generateCavesNoiseIntersection(s16 max_stone_y);
244+
virtual void generateCavesRandomWalk(s16 max_stone_y, s16 large_cave_depth);
245+
virtual bool generateCavernsNoise(s16 max_stone_y);
246+
virtual void generateDungeons(s16 max_stone_y);
246247

247248
protected:
248249
EmergeManager *m_emerge;

Diff for: ‎src/mapgen/mapgen_carpathian.cpp

+13-8
Original file line numberDiff line numberDiff line change
@@ -250,20 +250,25 @@ void MapgenCarpathian::makeChunk(BlockMakeData *data)
250250
biomegen->calcBiomeNoise(node_min);
251251
generateBiomes();
252252

253-
// Generate caverns, tunnels and classic caves
253+
// Generate tunnels, caverns and large randomwalk caves
254254
if (flags & MG_CAVES) {
255-
bool has_cavern = false;
255+
// Generate tunnels first as caverns confuse them
256+
generateCavesNoiseIntersection(stone_surface_max_y);
257+
256258
// Generate caverns
259+
bool near_cavern = false;
257260
if (spflags & MGCARPATHIAN_CAVERNS)
258-
has_cavern = generateCaverns(stone_surface_max_y);
259-
// Generate tunnels and classic caves
260-
if (has_cavern)
261-
// Disable classic caves in this mapchunk by setting
261+
near_cavern = generateCavernsNoise(stone_surface_max_y);
262+
263+
// Generate large randomwalk caves
264+
if (near_cavern)
265+
// Disable large randomwalk caves in this mapchunk by setting
262266
// 'large cave depth' to world base. Avoids excessive liquid in
263267
// large caverns and floating blobs of overgenerated liquid.
264-
generateCaves(stone_surface_max_y, -MAX_MAP_GENERATION_LIMIT);
268+
generateCavesRandomWalk(stone_surface_max_y,
269+
-MAX_MAP_GENERATION_LIMIT);
265270
else
266-
generateCaves(stone_surface_max_y, large_cave_depth);
271+
generateCavesRandomWalk(stone_surface_max_y, large_cave_depth);
267272
}
268273

269274
// Generate dungeons

Diff for: ‎src/mapgen/mapgen_flat.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,12 @@ void MapgenFlat::makeChunk(BlockMakeData *data)
198198
biomegen->calcBiomeNoise(node_min);
199199
generateBiomes();
200200

201-
if (flags & MG_CAVES)
202-
generateCaves(stone_surface_max_y, large_cave_depth);
201+
if (flags & MG_CAVES) {
202+
// Generate tunnels
203+
generateCavesNoiseIntersection(stone_surface_max_y);
204+
// Generate large randomwalk caves
205+
generateCavesRandomWalk(stone_surface_max_y, large_cave_depth);
206+
}
203207

204208
if ((flags & MG_DUNGEONS) && full_node_min.Y >= dungeon_ymin &&
205209
full_node_max.Y <= dungeon_ymax)

Diff for: ‎src/mapgen/mapgen_fractal.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,12 @@ void MapgenFractal::makeChunk(BlockMakeData *data)
209209
biomegen->calcBiomeNoise(node_min);
210210
generateBiomes();
211211

212-
if (flags & MG_CAVES)
213-
generateCaves(stone_surface_max_y, large_cave_depth);
212+
if (flags & MG_CAVES) {
213+
// Generate tunnels
214+
generateCavesNoiseIntersection(stone_surface_max_y);
215+
// Generate large randomwalk caves
216+
generateCavesRandomWalk(stone_surface_max_y, large_cave_depth);
217+
}
214218

215219
if ((flags & MG_DUNGEONS) && full_node_min.Y >= dungeon_ymin &&
216220
full_node_max.Y <= dungeon_ymax)

Diff for: ‎src/mapgen/mapgen_v5.cpp

+12-7
Original file line numberDiff line numberDiff line change
@@ -209,20 +209,25 @@ void MapgenV5::makeChunk(BlockMakeData *data)
209209
biomegen->calcBiomeNoise(node_min);
210210
generateBiomes();
211211

212-
// Generate caverns, tunnels and classic caves
212+
// Generate tunnels, caverns and large randomwalk caves
213213
if (flags & MG_CAVES) {
214-
bool near_cavern = false;
214+
// Generate tunnels first as caverns confuse them
215+
generateCavesNoiseIntersection(stone_surface_max_y);
216+
215217
// Generate caverns
218+
bool near_cavern = false;
216219
if (spflags & MGV5_CAVERNS)
217-
near_cavern = generateCaverns(stone_surface_max_y);
218-
// Generate tunnels and classic caves
220+
near_cavern = generateCavernsNoise(stone_surface_max_y);
221+
222+
// Generate large randomwalk caves
219223
if (near_cavern)
220-
// Disable classic caves in this mapchunk by setting
224+
// Disable large randomwalk caves in this mapchunk by setting
221225
// 'large cave depth' to world base. Avoids excessive liquid in
222226
// large caverns and floating blobs of overgenerated liquid.
223-
generateCaves(stone_surface_max_y, -MAX_MAP_GENERATION_LIMIT);
227+
generateCavesRandomWalk(stone_surface_max_y,
228+
-MAX_MAP_GENERATION_LIMIT);
224229
else
225-
generateCaves(stone_surface_max_y, large_cave_depth);
230+
generateCavesRandomWalk(stone_surface_max_y, large_cave_depth);
226231
}
227232

228233
// Generate dungeons and desert temples

Diff for: ‎src/mapgen/mapgen_v7.cpp

+12-7
Original file line numberDiff line numberDiff line change
@@ -313,20 +313,25 @@ void MapgenV7::makeChunk(BlockMakeData *data)
313313
biomegen->calcBiomeNoise(node_min);
314314
generateBiomes();
315315

316-
// Generate caverns, tunnels and classic caves
316+
// Generate tunnels, caverns and large randomwalk caves
317317
if (flags & MG_CAVES) {
318-
bool near_cavern = false;
318+
// Generate tunnels first as caverns confuse them
319+
generateCavesNoiseIntersection(stone_surface_max_y);
320+
319321
// Generate caverns
322+
bool near_cavern = false;
320323
if (spflags & MGV7_CAVERNS)
321-
near_cavern = generateCaverns(stone_surface_max_y);
322-
// Generate tunnels and classic caves
324+
near_cavern = generateCavernsNoise(stone_surface_max_y);
325+
326+
// Generate large randomwalk caves
323327
if (near_cavern)
324-
// Disable classic caves in this mapchunk by setting
328+
// Disable large randomwalk caves in this mapchunk by setting
325329
// 'large cave depth' to world base. Avoids excessive liquid in
326330
// large caverns and floating blobs of overgenerated liquid.
327-
generateCaves(stone_surface_max_y, -MAX_MAP_GENERATION_LIMIT);
331+
generateCavesRandomWalk(stone_surface_max_y,
332+
-MAX_MAP_GENERATION_LIMIT);
328333
else
329-
generateCaves(stone_surface_max_y, large_cave_depth);
334+
generateCavesRandomWalk(stone_surface_max_y, large_cave_depth);
330335
}
331336

332337
// Generate dungeons

Diff for: ‎src/mapgen/mapgen_valleys.cpp

+11-6
Original file line numberDiff line numberDiff line change
@@ -233,18 +233,23 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
233233
// Place biome-specific nodes and build biomemap
234234
generateBiomes();
235235

236-
// Generate caverns, tunnels and classic caves
236+
// Generate tunnels, caverns and large randomwalk caves
237237
if (flags & MG_CAVES) {
238+
// Generate tunnels first as caverns confuse them
239+
generateCavesNoiseIntersection(stone_surface_max_y);
240+
238241
// Generate caverns
239-
bool near_cavern = generateCaverns(stone_surface_max_y);
240-
// Generate tunnels and classic caves
242+
bool near_cavern = generateCavernsNoise(stone_surface_max_y);
243+
244+
// Generate large randomwalk caves
241245
if (near_cavern)
242-
// Disable classic caves in this mapchunk by setting
246+
// Disable large randomwalk caves in this mapchunk by setting
243247
// 'large cave depth' to world base. Avoids excessive liquid in
244248
// large caverns and floating blobs of overgenerated liquid.
245-
generateCaves(stone_surface_max_y, -MAX_MAP_GENERATION_LIMIT);
249+
generateCavesRandomWalk(stone_surface_max_y,
250+
-MAX_MAP_GENERATION_LIMIT);
246251
else
247-
generateCaves(stone_surface_max_y, large_cave_depth);
252+
generateCavesRandomWalk(stone_surface_max_y, large_cave_depth);
248253
}
249254

250255
// Dungeon creation

0 commit comments

Comments
 (0)
Please sign in to comment.