Skip to content

Commit

Permalink
Dungeons: Use biome 'node_stone' if normal stone types not detected
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
paramat committed Jul 30, 2017
1 parent 238d752 commit b20d01a
Show file tree
Hide file tree
Showing 8 changed files with 61 additions and 22 deletions.
34 changes: 27 additions & 7 deletions src/mapgen.cpp
Expand Up @@ -621,15 +621,17 @@ 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);
assert(biomemap);

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);

Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -755,7 +760,8 @@ MgStoneType MapgenBasic::generateBiomes(s16 biome_zero_level)
}
}

return stone_type;
*mgstone_type = stone_type;
*biome_stone = c_biome_stone;
}


Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
8 changes: 5 additions & 3 deletions src/mapgen.h
Expand Up @@ -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 {
Expand Down Expand Up @@ -250,8 +250,10 @@ class MapgenBasic : public Mapgen {

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:
Expand Down
7 changes: 5 additions & 2 deletions src/mapgen_carpathian.cpp
Expand Up @@ -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) {
Expand All @@ -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)
Expand Down
7 changes: 5 additions & 2 deletions src/mapgen_flat.cpp
Expand Up @@ -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)
Expand Down
7 changes: 5 additions & 2 deletions src/mapgen_fractal.cpp
Expand Up @@ -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)
Expand Down
7 changes: 5 additions & 2 deletions src/mapgen_v5.cpp
Expand Up @@ -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) {
Expand All @@ -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)
Expand Down
7 changes: 5 additions & 2 deletions src/mapgen_v7.cpp
Expand Up @@ -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) {
Expand All @@ -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)
Expand Down
6 changes: 4 additions & 2 deletions src/mapgen_valleys.cpp
Expand Up @@ -236,15 +236,17 @@ 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)
generateCaves(stone_surface_max_y, large_cave_depth);

// 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)
Expand Down

0 comments on commit b20d01a

Please sign in to comment.