1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Biome API / dungeons: Add biome-defined dungeon nodes

Add new biome fields 'node_dungeon', 'node_dungeon_alt', 'node_dungeon_stair'.
If 'node_dungeon' is not defined dungeons fall back to classic behaviour.

Remove messy and imprecise dungeon material code from 'generateBiomes()'.
Code deciding dungeon materials is now in 'generateDungeons()' and uses the
biome at mapchunk centre for more precision.

Remove hardcoded 'MG_STONE' types as long intended.
This commit is contained in:
Paramat 2018-04-07 22:09:54 +01:00 committed by GitHub
parent 460b375cad
commit 746ca41f58
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 97 additions and 97 deletions

View file

@ -640,8 +640,7 @@ MapgenBasic::~MapgenBasic()
}
void MapgenBasic::generateBiomes(MgStoneType *mgstone_type,
content_t *biome_stone)
void MapgenBasic::generateBiomes()
{
// can't generate biomes without a biome generator!
assert(biomegen);
@ -649,8 +648,6 @@ void MapgenBasic::generateBiomes(MgStoneType *mgstone_type,
const v3s16 &em = vm->m_area.getExtent();
u32 index = 0;
MgStoneType stone_type = MGSTONE_OTHER;
content_t c_biome_stone = c_stone;
noise_filler_depth->perlinMap2D(node_min.X, node_min.Z);
@ -705,17 +702,6 @@ void MapgenBasic::generateBiomes(MgStoneType *mgstone_type,
depth_water_top = biome->depth_water_top;
depth_riverbed = biome->depth_riverbed;
biome_y_min = biome->min_pos.Y;
// Detect stone type for dungeons during every biome calculation.
// 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) {
@ -776,9 +762,6 @@ void MapgenBasic::generateBiomes(MgStoneType *mgstone_type,
VoxelArea::add_y(em, vi, -1);
}
}
*mgstone_type = stone_type;
*biome_stone = c_biome_stone;
}
@ -878,16 +861,18 @@ bool MapgenBasic::generateCaverns(s16 max_stone_y)
}
void MapgenBasic::generateDungeons(s16 max_stone_y,
MgStoneType stone_type, content_t biome_stone)
void MapgenBasic::generateDungeons(s16 max_stone_y)
{
if (max_stone_y < node_min.Y)
return;
// Get biome at mapchunk midpoint
v3s16 chunk_mid = node_min + (node_max - node_min) / v3s16(2, 2, 2);
Biome *biome = (Biome *)biomegen->calcBiomeAtPoint(chunk_mid);
DungeonParams dp;
dp.seed = seed;
dp.only_in_ground = true;
dp.corridor_len_min = 1;
dp.corridor_len_max = 13;
@ -899,9 +884,27 @@ void MapgenBasic::generateDungeons(s16 max_stone_y,
dp.np_density = nparams_dungeon_density;
dp.np_alt_wall = nparams_dungeon_alt_wall;
switch (stone_type) {
default:
case MGSTONE_STONE:
// Biome-defined dungeon nodes
if (biome->c_dungeon != CONTENT_IGNORE) {
dp.c_wall = biome->c_dungeon;
// If 'node_dungeon_alt' is not defined by biome, it and dp.c_alt_wall
// become CONTENT_IGNORE which skips the alt wall node placement loop in
// dungeongen.cpp.
dp.c_alt_wall = biome->c_dungeon_alt;
// Stairs fall back to 'c_dungeon' if not defined by biome
dp.c_stair = (biome->c_dungeon_stair != CONTENT_IGNORE) ?
biome->c_dungeon_stair : biome->c_dungeon;
dp.diagonal_dirs = false;
dp.holesize = v3s16(2, 2, 2);
dp.room_size_min = v3s16(6, 4, 6);
dp.room_size_max = v3s16(10, 6, 10);
dp.room_size_large_min = v3s16(10, 8, 10);
dp.room_size_large_max = v3s16(18, 16, 18);
dp.notifytype = GENNOTIFY_DUNGEON;
// Otherwise classic behaviour
} else if (biome->c_stone == c_stone) {
dp.c_wall = c_cobble;
dp.c_alt_wall = c_mossycobble;
dp.c_stair = c_stair_cobble;
@ -913,8 +916,8 @@ void MapgenBasic::generateDungeons(s16 max_stone_y,
dp.room_size_large_min = v3s16(8, 8, 8);
dp.room_size_large_max = v3s16(16, 16, 16);
dp.notifytype = GENNOTIFY_DUNGEON;
break;
case MGSTONE_DESERT_STONE:
} else if (biome->c_stone == c_desert_stone) {
dp.c_wall = c_desert_stone;
dp.c_alt_wall = CONTENT_IGNORE;
dp.c_stair = c_stair_desert_stone;
@ -926,8 +929,8 @@ void MapgenBasic::generateDungeons(s16 max_stone_y,
dp.room_size_large_min = v3s16(10, 13, 10);
dp.room_size_large_max = v3s16(18, 21, 18);
dp.notifytype = GENNOTIFY_TEMPLE;
break;
case MGSTONE_SANDSTONE:
} else if (biome->c_stone == c_sandstone) {
dp.c_wall = c_sandstonebrick;
dp.c_alt_wall = CONTENT_IGNORE;
dp.c_stair = c_stair_sandstone_block;
@ -939,20 +942,20 @@ void MapgenBasic::generateDungeons(s16 max_stone_y,
dp.room_size_large_min = v3s16(10, 8, 10);
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;
// Fallback to using biome 'node_stone'
} else {
dp.c_wall = biome->c_stone;
dp.c_alt_wall = CONTENT_IGNORE;
dp.c_stair = biome->c_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.holesize = v3s16(2, 2, 2);
dp.room_size_min = v3s16(6, 4, 6);
dp.room_size_max = v3s16(10, 6, 10);
dp.room_size_large_min = v3s16(10, 8, 10);
dp.room_size_large_max = v3s16(18, 16, 18);
dp.notifytype = GENNOTIFY_DUNGEON;
break;
}
DungeonGen dgen(ndef, &gennotify, &dp);