From b20d01a3f19ea7ad1e788077af1ed5769648e3a1 Mon Sep 17 00:00:00 2001 From: paramat Date: Fri, 28 Jul 2017 03:31:11 +0100 Subject: [PATCH] Dungeons: Use biome 'node_stone' if normal stone types not detected Construct dungeons from the node defined as biome 'node_stone' if 'mapgen_stone', 'mapgen_desert_stone' and 'mapgen_sandstone' are not detected. Feature long-intended by kwolekr/hmmmm and present in code as a TODO. --- src/mapgen.cpp | 34 +++++++++++++++++++++++++++------- src/mapgen.h | 8 +++++--- src/mapgen_carpathian.cpp | 7 +++++-- src/mapgen_flat.cpp | 7 +++++-- src/mapgen_fractal.cpp | 7 +++++-- src/mapgen_v5.cpp | 7 +++++-- src/mapgen_v7.cpp | 7 +++++-- src/mapgen_valleys.cpp | 6 ++++-- 8 files changed, 61 insertions(+), 22 deletions(-) diff --git a/src/mapgen.cpp b/src/mapgen.cpp index f73930e6e..cec59389d 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -621,7 +621,8 @@ MapgenBasic::~MapgenBasic() } -MgStoneType MapgenBasic::generateBiomes(s16 biome_zero_level) +void MapgenBasic::generateBiomes(MgStoneType *mgstone_type, + content_t *biome_stone, s16 biome_zero_level) { // can't generate biomes without a biome generator! assert(biomegen); @@ -629,7 +630,8 @@ MgStoneType MapgenBasic::generateBiomes(s16 biome_zero_level) const v3s16 &em = vm->m_area.getExtent(); u32 index = 0; - MgStoneType stone_type = MGSTONE_STONE; + MgStoneType stone_type = MGSTONE_OTHER; + content_t c_biome_stone = c_stone; noise_filler_depth->perlinMap2D(node_min.X, node_min.Z); @@ -689,12 +691,15 @@ MgStoneType MapgenBasic::generateBiomes(s16 biome_zero_level) depth_riverbed = biome->depth_riverbed; // Detect stone type for dungeons during every biome calculation. - // This is more efficient than detecting per-node and will not - // miss any desert stone or sandstone biomes. - if (biome->c_stone == c_desert_stone) + // If none detected the last selected biome stone is chosen. + if (biome->c_stone == c_stone) + stone_type = MGSTONE_STONE; + else if (biome->c_stone == c_desert_stone) stone_type = MGSTONE_DESERT_STONE; else if (biome->c_stone == c_sandstone) stone_type = MGSTONE_SANDSTONE; + + c_biome_stone = biome->c_stone; } if (c == c_stone) { @@ -755,7 +760,8 @@ MgStoneType MapgenBasic::generateBiomes(s16 biome_zero_level) } } - return stone_type; + *mgstone_type = stone_type; + *biome_stone = c_biome_stone; } @@ -845,7 +851,8 @@ bool MapgenBasic::generateCaverns(s16 max_stone_y) } -void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type) +void MapgenBasic::generateDungeons(s16 max_stone_y, + MgStoneType stone_type, content_t biome_stone) { if (max_stone_y < node_min.Y) return; @@ -908,6 +915,19 @@ void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type) dp.room_size_large_max = v3s16(18, 16, 18); dp.notifytype = GENNOTIFY_DUNGEON; break; + case MGSTONE_OTHER: + dp.c_wall = biome_stone; + dp.c_alt_wall = biome_stone; + dp.c_stair = biome_stone; + + dp.diagonal_dirs = false; + dp.holesize = v3s16(1, 2, 1); + dp.room_size_min = v3s16(4, 4, 4); + dp.room_size_max = v3s16(8, 6, 8); + dp.room_size_large_min = v3s16(8, 8, 8); + dp.room_size_large_max = v3s16(16, 16, 16); + dp.notifytype = GENNOTIFY_DUNGEON; + break; } DungeonGen dgen(ndef, &gennotify, &dp); diff --git a/src/mapgen.h b/src/mapgen.h index 7f4b76c3e..931622d3c 100644 --- a/src/mapgen.h +++ b/src/mapgen.h @@ -79,11 +79,11 @@ enum GenNotifyType { NUM_GENNOTIFY_TYPES }; -// TODO(hmmmm/paramat): make stone type selection dynamic enum MgStoneType { MGSTONE_STONE, MGSTONE_DESERT_STONE, MGSTONE_SANDSTONE, + MGSTONE_OTHER, }; struct GenNotifyEvent { @@ -250,8 +250,10 @@ public: virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth); virtual bool generateCaverns(s16 max_stone_y); - virtual void generateDungeons(s16 max_stone_y, MgStoneType stone_type); - virtual MgStoneType generateBiomes(s16 biome_zero_level = 0); + virtual void generateDungeons(s16 max_stone_y, + MgStoneType stone_type, content_t biome_stone); + virtual void generateBiomes(MgStoneType *mgstone_type, + content_t *biome_stone, s16 biome_zero_level); virtual void dustTopNodes(); protected: diff --git a/src/mapgen_carpathian.cpp b/src/mapgen_carpathian.cpp index 598795830..6a9daf759 100644 --- a/src/mapgen_carpathian.cpp +++ b/src/mapgen_carpathian.cpp @@ -242,7 +242,10 @@ void MapgenCarpathian::makeChunk(BlockMakeData *data) // Init biome generator, place biome-specific nodes, and build biomemap biomegen->calcBiomeNoise(node_min); - MgStoneType stone_type = generateBiomes(water_level - 1); + + MgStoneType mgstone_type; + content_t biome_stone; + generateBiomes(&mgstone_type, &biome_stone, water_level - 1); // Generate caverns, tunnels and classic caves if (flags & MG_CAVES) { @@ -262,7 +265,7 @@ void MapgenCarpathian::makeChunk(BlockMakeData *data) // Generate dungeons if (flags & MG_DUNGEONS) - generateDungeons(stone_surface_max_y, stone_type); + generateDungeons(stone_surface_max_y, mgstone_type, biome_stone); // Generate the registered decorations if (flags & MG_DECORATIONS) diff --git a/src/mapgen_flat.cpp b/src/mapgen_flat.cpp index 9ae9d208c..34074c8b7 100644 --- a/src/mapgen_flat.cpp +++ b/src/mapgen_flat.cpp @@ -189,13 +189,16 @@ void MapgenFlat::makeChunk(BlockMakeData *data) // Init biome generator, place biome-specific nodes, and build biomemap biomegen->calcBiomeNoise(node_min); - MgStoneType stone_type = generateBiomes(water_level - 1); + + MgStoneType mgstone_type; + content_t biome_stone; + generateBiomes(&mgstone_type, &biome_stone, water_level - 1); if (flags & MG_CAVES) generateCaves(stone_surface_max_y, large_cave_depth); if (flags & MG_DUNGEONS) - generateDungeons(stone_surface_max_y, stone_type); + generateDungeons(stone_surface_max_y, mgstone_type, biome_stone); // Generate the registered decorations if (flags & MG_DECORATIONS) diff --git a/src/mapgen_fractal.cpp b/src/mapgen_fractal.cpp index 720408dbb..3663599a5 100644 --- a/src/mapgen_fractal.cpp +++ b/src/mapgen_fractal.cpp @@ -200,13 +200,16 @@ void MapgenFractal::makeChunk(BlockMakeData *data) // Init biome generator, place biome-specific nodes, and build biomemap biomegen->calcBiomeNoise(node_min); - MgStoneType stone_type = generateBiomes(water_level - 1); + + MgStoneType mgstone_type; + content_t biome_stone; + generateBiomes(&mgstone_type, &biome_stone, water_level - 1); if (flags & MG_CAVES) generateCaves(stone_surface_max_y, large_cave_depth); if (flags & MG_DUNGEONS) - generateDungeons(stone_surface_max_y, stone_type); + generateDungeons(stone_surface_max_y, mgstone_type, biome_stone); // Generate the registered decorations if (flags & MG_DECORATIONS) diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp index ad1e9d0a5..faca0e16a 100644 --- a/src/mapgen_v5.cpp +++ b/src/mapgen_v5.cpp @@ -200,7 +200,10 @@ void MapgenV5::makeChunk(BlockMakeData *data) // Init biome generator, place biome-specific nodes, and build biomemap biomegen->calcBiomeNoise(node_min); - MgStoneType stone_type = generateBiomes(water_level - 1); + + MgStoneType mgstone_type; + content_t biome_stone; + generateBiomes(&mgstone_type, &biome_stone, water_level - 1); // Generate caverns, tunnels and classic caves if (flags & MG_CAVES) { @@ -220,7 +223,7 @@ void MapgenV5::makeChunk(BlockMakeData *data) // Generate dungeons and desert temples if (flags & MG_DUNGEONS) - generateDungeons(stone_surface_max_y, stone_type); + generateDungeons(stone_surface_max_y, mgstone_type, biome_stone); // Generate the registered decorations if (flags & MG_DECORATIONS) diff --git a/src/mapgen_v7.cpp b/src/mapgen_v7.cpp index e63c648bc..f254a74d8 100644 --- a/src/mapgen_v7.cpp +++ b/src/mapgen_v7.cpp @@ -308,7 +308,10 @@ void MapgenV7::makeChunk(BlockMakeData *data) // Init biome generator, place biome-specific nodes, and build biomemap biomegen->calcBiomeNoise(node_min); - MgStoneType stone_type = generateBiomes(biome_zero_level); + + MgStoneType mgstone_type; + content_t biome_stone; + generateBiomes(&mgstone_type, &biome_stone, water_level - 1); // Generate caverns, tunnels and classic caves if (flags & MG_CAVES) { @@ -328,7 +331,7 @@ void MapgenV7::makeChunk(BlockMakeData *data) // Generate dungeons if (flags & MG_DUNGEONS) - generateDungeons(stone_surface_max_y, stone_type); + generateDungeons(stone_surface_max_y, mgstone_type, biome_stone); // Generate the registered decorations if (flags & MG_DECORATIONS) diff --git a/src/mapgen_valleys.cpp b/src/mapgen_valleys.cpp index ff56c69da..f0c145934 100644 --- a/src/mapgen_valleys.cpp +++ b/src/mapgen_valleys.cpp @@ -236,7 +236,9 @@ void MapgenValleys::makeChunk(BlockMakeData *data) updateHeightmap(node_min, node_max); // Place biome-specific nodes and build biomemap - MgStoneType stone_type = generateBiomes(water_level - 1); + MgStoneType mgstone_type; + content_t biome_stone; + generateBiomes(&mgstone_type, &biome_stone, water_level - 1); // Cave creation. if (flags & MG_CAVES) @@ -244,7 +246,7 @@ void MapgenValleys::makeChunk(BlockMakeData *data) // Dungeon creation if ((flags & MG_DUNGEONS) && node_max.Y < 50) - generateDungeons(stone_surface_max_y, stone_type); + generateDungeons(stone_surface_max_y, mgstone_type, biome_stone); // Generate the registered decorations if (flags & MG_DECORATIONS) -- 2.25.1