Skip to content

Commit

Permalink
Biome API: Revert biomes, decos, ores being relative to water level
Browse files Browse the repository at this point in the history
Feature is unnecessary and would greatly complicate future development,
it would also make 'get biome at pos' extremely complex.
Mgv7: Revert option to repeat surface biomes in floatlands, which
depended on the above.
  • Loading branch information
paramat committed Sep 17, 2017
1 parent 76817fd commit 27144b4
Show file tree
Hide file tree
Showing 16 changed files with 42 additions and 99 deletions.
3 changes: 1 addition & 2 deletions builtin/settingtypes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1346,10 +1346,9 @@ mgv6_np_apple_trees (Apple trees noise) noise_params 0, 1, (100, 100, 100), 3429

# Map generation attributes specific to Mapgen v7.
# 'ridges' enables the rivers.
# 'biomerepeat' causes surface biomes to repeat in the floatlands.
# Flags that are not specified in the flag string are not modified from the default.
# Flags starting with 'no' are used to explicitly disable them.
mgv7_spflags (Mapgen V7 specific flags) flags mountains,ridges,nofloatlands,caverns,biomerepeat mountains,ridges,floatlands,caverns,biomerepeat,nomountains,noridges,nofloatlands,nocaverns,nobiomerepeat
mgv7_spflags (Mapgen V7 specific flags) flags mountains,ridges,nofloatlands,caverns mountains,ridges,floatlands,caverns,nomountains,noridges,nofloatlands,nocaverns

# Y of mountain density gradient zero level. Used to shift mountains vertically.
mgv7_mount_zero_level (Mountain zero level) int 0
Expand Down
5 changes: 0 additions & 5 deletions doc/lua_api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4609,8 +4609,6 @@ Definition tables
y_min = -31000,
y_max = 64,
-- ^ Lower and upper limits for ore.
-- ^ Limits are relative to y = water_level - 1 for core mapgen, or
-- ^ relative to y = 0 for minetest.generate_ores().
flags = "",
-- ^ Attributes for this ore generation
noise_threshold = 0.5,
Expand Down Expand Up @@ -4655,7 +4653,6 @@ Definition tables
y_min = 1,
y_max = 31000,
-- ^ Lower and upper limits for biome.
-- ^ Limits are relative to y = water_level - 1.
heat_point = 0,
humidity_point = 50,
-- ^ Characteristic average temperature and humidity for the biome.
Expand Down Expand Up @@ -4692,8 +4689,6 @@ Definition tables
y_min = -31000
y_max = 31000
-- ^ Lower and upper limits for decoration.
-- ^ Limits are relative to y = water_level - 1 for core mapgen, or
-- ^ relative to y = 0 for minetest.generate_decorations().
-- ^ This parameter refers to the `y` position of the decoration base, so
-- the actual maximum height would be `height_max + size.Y`.
spawn_by = "default:water",
Expand Down
10 changes: 3 additions & 7 deletions src/mapgen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -613,7 +613,7 @@ MapgenBasic::~MapgenBasic()


void MapgenBasic::generateBiomes(MgStoneType *mgstone_type,
content_t *biome_stone, s16 biome_zero_level)
content_t *biome_stone)
{
// can't generate biomes without a biome generator!
assert(biomegen);
Expand Down Expand Up @@ -665,10 +665,7 @@ void MapgenBasic::generateBiomes(MgStoneType *mgstone_type,

if (is_stone_surface || is_water_surface) {
// (Re)calculate biome
// Limit to +-MAX MAP GENERATION LIMIT to work with biome y_min / y_max.
s32 relative_y = rangelim(y - biome_zero_level,
-MAX_MAP_GENERATION_LIMIT, MAX_MAP_GENERATION_LIMIT);
biome = biomegen->getBiomeAtIndex(index, relative_y);
biome = biomegen->getBiomeAtIndex(index, y);

if (biomemap[index] == BIOME_NONE && is_stone_surface)
biomemap[index] = biome->index;
Expand All @@ -679,8 +676,7 @@ void MapgenBasic::generateBiomes(MgStoneType *mgstone_type,
noise_filler_depth->result[index], 0.0f);
depth_water_top = biome->depth_water_top;
depth_riverbed = biome->depth_riverbed;
biome_y_min = rangelim(biome->y_min + biome_zero_level,
-MAX_MAP_GENERATION_LIMIT, MAX_MAP_GENERATION_LIMIT);
biome_y_min = biome->y_min;

// Detect stone type for dungeons during every biome calculation.
// If none detected the last selected biome stone is chosen.
Expand Down
2 changes: 1 addition & 1 deletion src/mapgen.h
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ class MapgenBasic : public Mapgen {
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);
content_t *biome_stone);
virtual void dustTopNodes();

protected:
Expand Down
8 changes: 3 additions & 5 deletions src/mapgen_carpathian.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ void MapgenCarpathian::makeChunk(BlockMakeData *data)

MgStoneType mgstone_type;
content_t biome_stone;
generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
generateBiomes(&mgstone_type, &biome_stone);

// Generate caverns, tunnels and classic caves
if (flags & MG_CAVES) {
Expand All @@ -269,12 +269,10 @@ void MapgenCarpathian::makeChunk(BlockMakeData *data)

// Generate the registered decorations
if (flags & MG_DECORATIONS)
m_emerge->decomgr->placeAllDecos(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);

// Generate the registered ores
m_emerge->oremgr->placeAllOres(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);

// Sprinkle some dust on top after everything else was generated
dustTopNodes();
Expand Down
8 changes: 3 additions & 5 deletions src/mapgen_flat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ void MapgenFlat::makeChunk(BlockMakeData *data)

MgStoneType mgstone_type;
content_t biome_stone;
generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
generateBiomes(&mgstone_type, &biome_stone);

if (flags & MG_CAVES)
generateCaves(stone_surface_max_y, large_cave_depth);
Expand All @@ -203,12 +203,10 @@ void MapgenFlat::makeChunk(BlockMakeData *data)

// Generate the registered decorations
if (flags & MG_DECORATIONS)
m_emerge->decomgr->placeAllDecos(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);

// Generate the registered ores
m_emerge->oremgr->placeAllOres(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);

// Sprinkle some dust on top after everything else was generated
dustTopNodes();
Expand Down
8 changes: 3 additions & 5 deletions src/mapgen_fractal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ void MapgenFractal::makeChunk(BlockMakeData *data)

MgStoneType mgstone_type;
content_t biome_stone;
generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
generateBiomes(&mgstone_type, &biome_stone);

if (flags & MG_CAVES)
generateCaves(stone_surface_max_y, large_cave_depth);
Expand All @@ -213,12 +213,10 @@ void MapgenFractal::makeChunk(BlockMakeData *data)

// Generate the registered decorations
if (flags & MG_DECORATIONS)
m_emerge->decomgr->placeAllDecos(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);

// Generate the registered ores
m_emerge->oremgr->placeAllOres(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);

// Sprinkle some dust on top after everything else was generated
dustTopNodes();
Expand Down
8 changes: 3 additions & 5 deletions src/mapgen_v5.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ void MapgenV5::makeChunk(BlockMakeData *data)

MgStoneType mgstone_type;
content_t biome_stone;
generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
generateBiomes(&mgstone_type, &biome_stone);

// Generate caverns, tunnels and classic caves
if (flags & MG_CAVES) {
Expand All @@ -228,12 +228,10 @@ void MapgenV5::makeChunk(BlockMakeData *data)

// Generate the registered decorations
if (flags & MG_DECORATIONS)
m_emerge->decomgr->placeAllDecos(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);

// Generate the registered ores
m_emerge->oremgr->placeAllOres(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);

// Sprinkle some dust on top after everything else was generated
dustTopNodes();
Expand Down
6 changes: 2 additions & 4 deletions src/mapgen_v6.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -615,12 +615,10 @@ void MapgenV6::makeChunk(BlockMakeData *data)

// Generate the registered decorations
if (flags & MG_DECORATIONS)
m_emerge->decomgr->placeAllDecos(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);

// Generate the registered ores
m_emerge->oremgr->placeAllOres(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);

// Calculate lighting
if (flags & MG_LIGHT)
Expand Down
15 changes: 3 additions & 12 deletions src/mapgen_v7.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ FlagDesc flagdesc_mapgen_v7[] = {
{"ridges", MGV7_RIDGES},
{"floatlands", MGV7_FLOATLANDS},
{"caverns", MGV7_CAVERNS},
{"biomerepeat", MGV7_BIOMEREPEAT},
{NULL, 0}
};

Expand Down Expand Up @@ -290,12 +289,6 @@ void MapgenV7::makeChunk(BlockMakeData *data)

blockseed = getBlockSeed2(full_node_min, seed);

// Get zero level for biomes and decorations
// Optionally repeat surface biomes in floatlands
s16 biome_zero_level = ((spflags & MGV7_FLOATLANDS) &&
(spflags & MGV7_BIOMEREPEAT) && node_max.Y >= shadow_limit) ?
floatland_level - 1 : water_level - 1;

// Generate base and mountain terrain
// An initial heightmap is no longer created here for use in generateRidgeTerrain()
s16 stone_surface_max_y = generateTerrain();
Expand All @@ -312,7 +305,7 @@ void MapgenV7::makeChunk(BlockMakeData *data)

MgStoneType mgstone_type;
content_t biome_stone;
generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
generateBiomes(&mgstone_type, &biome_stone);

// Generate caverns, tunnels and classic caves
if (flags & MG_CAVES) {
Expand All @@ -336,12 +329,10 @@ void MapgenV7::makeChunk(BlockMakeData *data)

// Generate the registered decorations
if (flags & MG_DECORATIONS)
m_emerge->decomgr->placeAllDecos(this, blockseed,
node_min, node_max, biome_zero_level);
m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);

// Generate the registered ores
m_emerge->oremgr->placeAllOres(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);

// Sprinkle some dust on top after everything else was generated
dustTopNodes();
Expand Down
7 changes: 3 additions & 4 deletions src/mapgen_v7.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,

#include "mapgen.h"

/////////////// Mapgen V7 flags
///////////// Mapgen V7 flags
#define MGV7_MOUNTAINS 0x01
#define MGV7_RIDGES 0x02
#define MGV7_FLOATLANDS 0x04
#define MGV7_CAVERNS 0x08
#define MGV7_BIOMEREPEAT 0x10
#define MGV7_BIOMEREPEAT 0x10 // Now unused

class BiomeManager;

extern FlagDesc flagdesc_mapgen_v7[];


struct MapgenV7Params : public MapgenParams {
u32 spflags = MGV7_MOUNTAINS | MGV7_RIDGES |
MGV7_CAVERNS | MGV7_BIOMEREPEAT;
u32 spflags = MGV7_MOUNTAINS | MGV7_RIDGES | MGV7_CAVERNS;
s16 mount_zero_level = 0;
float cave_width = 0.09f;
s16 large_cave_depth = -33;
Expand Down
8 changes: 3 additions & 5 deletions src/mapgen_valleys.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ void MapgenValleys::makeChunk(BlockMakeData *data)
// Place biome-specific nodes and build biomemap
MgStoneType mgstone_type;
content_t biome_stone;
generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
generateBiomes(&mgstone_type, &biome_stone);

// Cave creation.
if (flags & MG_CAVES)
Expand All @@ -249,12 +249,10 @@ void MapgenValleys::makeChunk(BlockMakeData *data)

// Generate the registered decorations
if (flags & MG_DECORATIONS)
m_emerge->decomgr->placeAllDecos(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);

// Generate the registered ores
m_emerge->oremgr->placeAllOres(this, blockseed,
node_min, node_max, water_level - 1);
m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);

// Sprinkle some dust on top after everything else was generated
dustTopNodes();
Expand Down
18 changes: 4 additions & 14 deletions src/mg_decoration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ DecorationManager::DecorationManager(IGameDef *gamedef) :


size_t DecorationManager::placeAllDecos(Mapgen *mg, u32 blockseed,
v3s16 nmin, v3s16 nmax, s16 deco_zero_level)
v3s16 nmin, v3s16 nmax)
{
size_t nplaced = 0;

Expand All @@ -57,7 +57,7 @@ size_t DecorationManager::placeAllDecos(Mapgen *mg, u32 blockseed,
if (!deco)
continue;

nplaced += deco->placeDeco(mg, blockseed, nmin, nmax, deco_zero_level);
nplaced += deco->placeDeco(mg, blockseed, nmin, nmax);
blockseed++;
}

Expand Down Expand Up @@ -124,18 +124,8 @@ bool Decoration::canPlaceDecoration(MMVManip *vm, v3s16 p)
}


size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed,
v3s16 nmin, v3s16 nmax, s16 deco_zero_level)
size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
{
// Decoration y_min / y_max is displaced by deco_zero_level or remains
// unchanged. Any decoration with a limit at +-MAX_MAP_GENERATION_LIMIT is
// considered to have that limit at +-infinity, so we do not alter that limit.
s32 y_min_disp = (y_min <= -MAX_MAP_GENERATION_LIMIT) ?
-MAX_MAP_GENERATION_LIMIT : y_min + deco_zero_level;

s32 y_max_disp = (y_max >= MAX_MAP_GENERATION_LIMIT) ?
MAX_MAP_GENERATION_LIMIT : y_max + deco_zero_level;

PcgRandom ps(blockseed + 53);
int carea_size = nmax.X - nmin.X + 1;

Expand Down Expand Up @@ -190,7 +180,7 @@ size_t Decoration::placeDeco(Mapgen *mg, u32 blockseed,
else
y = mg->findGroundLevel(v2s16(x, z), nmin.Y, nmax.Y);

if (y < y_min_disp || y > y_max_disp || y < nmin.Y || y > nmax.Y)
if (y < y_min || y > y_max || y < nmin.Y || y > nmax.Y)
continue;

if (y + getHeight() > mg->vm->m_area.MaxEdge.Y)
Expand Down
6 changes: 2 additions & 4 deletions src/mg_decoration.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,7 @@ class Decoration : public ObjDef, public NodeResolver {
virtual void resolveNodeNames();

bool canPlaceDecoration(MMVManip *vm, v3s16 p);
size_t placeDeco(Mapgen *mg, u32 blockseed,
v3s16 nmin, v3s16 nmax, s16 deco_zero_level);
size_t placeDeco(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);

virtual size_t generate(MMVManip *vm, PcgRandom *pr, v3s16 p) = 0;
virtual int getHeight() = 0;
Expand Down Expand Up @@ -133,6 +132,5 @@ class DecorationManager : public ObjDefManager {
}
}

size_t placeAllDecos(Mapgen *mg, u32 blockseed,
v3s16 nmin, v3s16 nmax, s16 deco_zero_level = 0);
size_t placeAllDecos(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax);
};
23 changes: 6 additions & 17 deletions src/mg_ore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,7 @@ OreManager::OreManager(IGameDef *gamedef) :
}


size_t OreManager::placeAllOres(Mapgen *mg, u32 blockseed,
v3s16 nmin, v3s16 nmax, s16 ore_zero_level)
size_t OreManager::placeAllOres(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
{
size_t nplaced = 0;

Expand All @@ -54,7 +53,7 @@ size_t OreManager::placeAllOres(Mapgen *mg, u32 blockseed,
if (!ore)
continue;

nplaced += ore->placeOre(mg, blockseed, nmin, nmax, ore_zero_level);
nplaced += ore->placeOre(mg, blockseed, nmin, nmax);
blockseed++;
}

Expand Down Expand Up @@ -88,23 +87,13 @@ void Ore::resolveNodeNames()
}


size_t Ore::placeOre(Mapgen *mg, u32 blockseed,
v3s16 nmin, v3s16 nmax, s16 ore_zero_level)
size_t Ore::placeOre(Mapgen *mg, u32 blockseed, v3s16 nmin, v3s16 nmax)
{
// Ore y_min / y_max is displaced by ore_zero_level or remains unchanged.
// Any ore with a limit at +-MAX_MAP_GENERATION_LIMIT is considered to have
// that limit at +-infinity, so we do not alter that limit.
s32 y_min_disp = (y_min <= -MAX_MAP_GENERATION_LIMIT) ?
-MAX_MAP_GENERATION_LIMIT : y_min + ore_zero_level;

s32 y_max_disp = (y_max >= MAX_MAP_GENERATION_LIMIT) ?
MAX_MAP_GENERATION_LIMIT : y_max + ore_zero_level;

if (nmin.Y > y_max_disp || nmax.Y < y_min_disp)
if (nmin.Y > y_max || nmax.Y < y_min)
return 0;

int actual_ymin = MYMAX(nmin.Y, y_min_disp);
int actual_ymax = MYMIN(nmax.Y, y_max_disp);
int actual_ymin = MYMAX(nmin.Y, y_min);
int actual_ymax = MYMIN(nmax.Y, y_max);
if (clust_size >= actual_ymax - actual_ymin + 1)
return 0;

Expand Down
Loading

0 comments on commit 27144b4

Please sign in to comment.