summaryrefslogtreecommitdiff
path: root/src/mapgen_v5.cpp
diff options
context:
space:
mode:
authorparamat <mat.gregory@virginmedia.com>2014-12-31 00:19:05 +0000
committerkwolekr <kwolekr@minetest.net>2015-01-01 15:44:26 -0500
commit7452d5399b9c7516abfc9f97bf5db70aff2ce0fa (patch)
tree933cc3194d8cdd3301cb0bf62148587e1f9971ae /src/mapgen_v5.cpp
parent938a3f2976ade828f11a84a2a40864271e14ebba (diff)
downloadminetest-7452d5399b9c7516abfc9f97bf5db70aff2ce0fa.tar.gz
minetest-7452d5399b9c7516abfc9f97bf5db70aff2ce0fa.tar.bz2
minetest-7452d5399b9c7516abfc9f97bf5db70aff2ce0fa.zip
MgV5/6/7: Generate dungeons above water level
Use/add stone_surface_max_y to speed-optimise/guide dungeon generation MgV7: Don't let mountain terrain chop dungeons at mapchunk borders Make mountain terrain update stone_surface_max_y for caves in mountains
Diffstat (limited to 'src/mapgen_v5.cpp')
-rw-r--r--src/mapgen_v5.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp
index 64879b0bb..24c81e56d 100644
--- a/src/mapgen_v5.cpp
+++ b/src/mapgen_v5.cpp
@@ -252,7 +252,8 @@ void MapgenV5::makeChunk(BlockMakeData *data)
calculateNoise();
// Generate base terrain
- generateBaseTerrain();
+ s16 stone_surface_max_y = generateBaseTerrain();
+
updateHeightmap(node_min, node_max);
// Generate underground dirt, sand, gravel and lava blobs
@@ -268,7 +269,7 @@ void MapgenV5::makeChunk(BlockMakeData *data)
generateBiomes();
// Generate dungeons and desert temples
- if (flags & MG_DUNGEONS) {
+ if ((flags & MG_DUNGEONS) && (stone_surface_max_y >= node_min.Y)) {
DungeonGen dgen(this, NULL);
dgen.generate(blockseed, full_node_min, full_node_max);
}
@@ -342,10 +343,11 @@ void MapgenV5::calculateNoise()
// Make base ground level
-void MapgenV5::generateBaseTerrain()
+int MapgenV5::generateBaseTerrain()
{
u32 index = 0;
u32 index2d = 0;
+ int stone_surface_max_y = -MAP_GENERATION_LIMIT;
for(s16 z=node_min.Z; z<=node_max.Z; z++) {
for(s16 y=node_min.Y - 1; y<=node_max.Y + 1; y++) {
@@ -372,12 +374,16 @@ void MapgenV5::generateBaseTerrain()
vm->m_data[i] = MapNode(CONTENT_AIR);
} else {
vm->m_data[i] = MapNode(c_stone);
+ if (y > stone_surface_max_y)
+ stone_surface_max_y = y;
}
}
index2d = index2d - ystride;
}
index2d = index2d + ystride;
}
+
+ return stone_surface_max_y;
}