From 7452d5399b9c7516abfc9f97bf5db70aff2ce0fa Mon Sep 17 00:00:00 2001 From: paramat Date: Wed, 31 Dec 2014 00:19:05 +0000 Subject: 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 --- src/mapgen_v5.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src/mapgen_v5.cpp') 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; } -- cgit v1.2.3