Skip to content

Commit b20d01a

Browse files
committedJul 30, 2017
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.
1 parent 238d752 commit b20d01a

8 files changed

+61
-22
lines changed
 

Diff for: ‎src/mapgen.cpp

+27-7
Original file line numberDiff line numberDiff line change
@@ -621,15 +621,17 @@ MapgenBasic::~MapgenBasic()
621621
}
622622

623623

624-
MgStoneType MapgenBasic::generateBiomes(s16 biome_zero_level)
624+
void MapgenBasic::generateBiomes(MgStoneType *mgstone_type,
625+
content_t *biome_stone, s16 biome_zero_level)
625626
{
626627
// can't generate biomes without a biome generator!
627628
assert(biomegen);
628629
assert(biomemap);
629630

630631
const v3s16 &em = vm->m_area.getExtent();
631632
u32 index = 0;
632-
MgStoneType stone_type = MGSTONE_STONE;
633+
MgStoneType stone_type = MGSTONE_OTHER;
634+
content_t c_biome_stone = c_stone;
633635

634636
noise_filler_depth->perlinMap2D(node_min.X, node_min.Z);
635637

@@ -689,12 +691,15 @@ MgStoneType MapgenBasic::generateBiomes(s16 biome_zero_level)
689691
depth_riverbed = biome->depth_riverbed;
690692

691693
// Detect stone type for dungeons during every biome calculation.
692-
// This is more efficient than detecting per-node and will not
693-
// miss any desert stone or sandstone biomes.
694-
if (biome->c_stone == c_desert_stone)
694+
// If none detected the last selected biome stone is chosen.
695+
if (biome->c_stone == c_stone)
696+
stone_type = MGSTONE_STONE;
697+
else if (biome->c_stone == c_desert_stone)
695698
stone_type = MGSTONE_DESERT_STONE;
696699
else if (biome->c_stone == c_sandstone)
697700
stone_type = MGSTONE_SANDSTONE;
701+
702+
c_biome_stone = biome->c_stone;
698703
}
699704

700705
if (c == c_stone) {
@@ -755,7 +760,8 @@ MgStoneType MapgenBasic::generateBiomes(s16 biome_zero_level)
755760
}
756761
}
757762

758-
return stone_type;
763+
*mgstone_type = stone_type;
764+
*biome_stone = c_biome_stone;
759765
}
760766

761767

@@ -845,7 +851,8 @@ bool MapgenBasic::generateCaverns(s16 max_stone_y)
845851
}
846852

847853

848-
void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type)
854+
void MapgenBasic::generateDungeons(s16 max_stone_y,
855+
MgStoneType stone_type, content_t biome_stone)
849856
{
850857
if (max_stone_y < node_min.Y)
851858
return;
@@ -908,6 +915,19 @@ void MapgenBasic::generateDungeons(s16 max_stone_y, MgStoneType stone_type)
908915
dp.room_size_large_max = v3s16(18, 16, 18);
909916
dp.notifytype = GENNOTIFY_DUNGEON;
910917
break;
918+
case MGSTONE_OTHER:
919+
dp.c_wall = biome_stone;
920+
dp.c_alt_wall = biome_stone;
921+
dp.c_stair = biome_stone;
922+
923+
dp.diagonal_dirs = false;
924+
dp.holesize = v3s16(1, 2, 1);
925+
dp.room_size_min = v3s16(4, 4, 4);
926+
dp.room_size_max = v3s16(8, 6, 8);
927+
dp.room_size_large_min = v3s16(8, 8, 8);
928+
dp.room_size_large_max = v3s16(16, 16, 16);
929+
dp.notifytype = GENNOTIFY_DUNGEON;
930+
break;
911931
}
912932

913933
DungeonGen dgen(ndef, &gennotify, &dp);

Diff for: ‎src/mapgen.h

+5-3
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ enum GenNotifyType {
7979
NUM_GENNOTIFY_TYPES
8080
};
8181

82-
// TODO(hmmmm/paramat): make stone type selection dynamic
8382
enum MgStoneType {
8483
MGSTONE_STONE,
8584
MGSTONE_DESERT_STONE,
8685
MGSTONE_SANDSTONE,
86+
MGSTONE_OTHER,
8787
};
8888

8989
struct GenNotifyEvent {
@@ -250,8 +250,10 @@ class MapgenBasic : public Mapgen {
250250

251251
virtual void generateCaves(s16 max_stone_y, s16 large_cave_depth);
252252
virtual bool generateCaverns(s16 max_stone_y);
253-
virtual void generateDungeons(s16 max_stone_y, MgStoneType stone_type);
254-
virtual MgStoneType generateBiomes(s16 biome_zero_level = 0);
253+
virtual void generateDungeons(s16 max_stone_y,
254+
MgStoneType stone_type, content_t biome_stone);
255+
virtual void generateBiomes(MgStoneType *mgstone_type,
256+
content_t *biome_stone, s16 biome_zero_level);
255257
virtual void dustTopNodes();
256258

257259
protected:

Diff for: ‎src/mapgen_carpathian.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,10 @@ void MapgenCarpathian::makeChunk(BlockMakeData *data)
242242

243243
// Init biome generator, place biome-specific nodes, and build biomemap
244244
biomegen->calcBiomeNoise(node_min);
245-
MgStoneType stone_type = generateBiomes(water_level - 1);
245+
246+
MgStoneType mgstone_type;
247+
content_t biome_stone;
248+
generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
246249

247250
// Generate caverns, tunnels and classic caves
248251
if (flags & MG_CAVES) {
@@ -262,7 +265,7 @@ void MapgenCarpathian::makeChunk(BlockMakeData *data)
262265

263266
// Generate dungeons
264267
if (flags & MG_DUNGEONS)
265-
generateDungeons(stone_surface_max_y, stone_type);
268+
generateDungeons(stone_surface_max_y, mgstone_type, biome_stone);
266269

267270
// Generate the registered decorations
268271
if (flags & MG_DECORATIONS)

Diff for: ‎src/mapgen_flat.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,16 @@ void MapgenFlat::makeChunk(BlockMakeData *data)
189189

190190
// Init biome generator, place biome-specific nodes, and build biomemap
191191
biomegen->calcBiomeNoise(node_min);
192-
MgStoneType stone_type = generateBiomes(water_level - 1);
192+
193+
MgStoneType mgstone_type;
194+
content_t biome_stone;
195+
generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
193196

194197
if (flags & MG_CAVES)
195198
generateCaves(stone_surface_max_y, large_cave_depth);
196199

197200
if (flags & MG_DUNGEONS)
198-
generateDungeons(stone_surface_max_y, stone_type);
201+
generateDungeons(stone_surface_max_y, mgstone_type, biome_stone);
199202

200203
// Generate the registered decorations
201204
if (flags & MG_DECORATIONS)

Diff for: ‎src/mapgen_fractal.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -200,13 +200,16 @@ void MapgenFractal::makeChunk(BlockMakeData *data)
200200

201201
// Init biome generator, place biome-specific nodes, and build biomemap
202202
biomegen->calcBiomeNoise(node_min);
203-
MgStoneType stone_type = generateBiomes(water_level - 1);
203+
204+
MgStoneType mgstone_type;
205+
content_t biome_stone;
206+
generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
204207

205208
if (flags & MG_CAVES)
206209
generateCaves(stone_surface_max_y, large_cave_depth);
207210

208211
if (flags & MG_DUNGEONS)
209-
generateDungeons(stone_surface_max_y, stone_type);
212+
generateDungeons(stone_surface_max_y, mgstone_type, biome_stone);
210213

211214
// Generate the registered decorations
212215
if (flags & MG_DECORATIONS)

Diff for: ‎src/mapgen_v5.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,10 @@ void MapgenV5::makeChunk(BlockMakeData *data)
200200

201201
// Init biome generator, place biome-specific nodes, and build biomemap
202202
biomegen->calcBiomeNoise(node_min);
203-
MgStoneType stone_type = generateBiomes(water_level - 1);
203+
204+
MgStoneType mgstone_type;
205+
content_t biome_stone;
206+
generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
204207

205208
// Generate caverns, tunnels and classic caves
206209
if (flags & MG_CAVES) {
@@ -220,7 +223,7 @@ void MapgenV5::makeChunk(BlockMakeData *data)
220223

221224
// Generate dungeons and desert temples
222225
if (flags & MG_DUNGEONS)
223-
generateDungeons(stone_surface_max_y, stone_type);
226+
generateDungeons(stone_surface_max_y, mgstone_type, biome_stone);
224227

225228
// Generate the registered decorations
226229
if (flags & MG_DECORATIONS)

Diff for: ‎src/mapgen_v7.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,10 @@ void MapgenV7::makeChunk(BlockMakeData *data)
308308

309309
// Init biome generator, place biome-specific nodes, and build biomemap
310310
biomegen->calcBiomeNoise(node_min);
311-
MgStoneType stone_type = generateBiomes(biome_zero_level);
311+
312+
MgStoneType mgstone_type;
313+
content_t biome_stone;
314+
generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
312315

313316
// Generate caverns, tunnels and classic caves
314317
if (flags & MG_CAVES) {
@@ -328,7 +331,7 @@ void MapgenV7::makeChunk(BlockMakeData *data)
328331

329332
// Generate dungeons
330333
if (flags & MG_DUNGEONS)
331-
generateDungeons(stone_surface_max_y, stone_type);
334+
generateDungeons(stone_surface_max_y, mgstone_type, biome_stone);
332335

333336
// Generate the registered decorations
334337
if (flags & MG_DECORATIONS)

Diff for: ‎src/mapgen_valleys.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -236,15 +236,17 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
236236
updateHeightmap(node_min, node_max);
237237

238238
// Place biome-specific nodes and build biomemap
239-
MgStoneType stone_type = generateBiomes(water_level - 1);
239+
MgStoneType mgstone_type;
240+
content_t biome_stone;
241+
generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
240242

241243
// Cave creation.
242244
if (flags & MG_CAVES)
243245
generateCaves(stone_surface_max_y, large_cave_depth);
244246

245247
// Dungeon creation
246248
if ((flags & MG_DUNGEONS) && node_max.Y < 50)
247-
generateDungeons(stone_surface_max_y, stone_type);
249+
generateDungeons(stone_surface_max_y, mgstone_type, biome_stone);
248250

249251
// Generate the registered decorations
250252
if (flags & MG_DECORATIONS)

0 commit comments

Comments
 (0)
Please sign in to comment.