Skip to content

Commit

Permalink
Merge commit 'd24f384'
Browse files Browse the repository at this point in the history
  • Loading branch information
proller committed Jun 13, 2016
2 parents caa416d + d24f384 commit 3164a03
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 17 deletions.
6 changes: 6 additions & 0 deletions doc/lua_api.txt
Expand Up @@ -3723,6 +3723,9 @@ Definition tables

### Biome definition (`register_biome`)

**Note**
The biome API is still in an experimental phase and subject to change.

{
name = "tundra",
node_dust = "default:snow",
Expand All @@ -3742,6 +3745,9 @@ Definition tables
-- ^ Node that replaces all seawater nodes not in the defined surface layer.
node_river_water = "default:ice",
-- ^ Node that replaces river water in mapgens that use default:river_water.
node_riverbed = "default:gravel",
depth_riverbed = 2,
-- ^ Node placed under river water and thickness of this layer.
y_min = 1,
y_max = 31000,
-- ^ Lower and upper limits for biome.
Expand Down
24 changes: 18 additions & 6 deletions src/mapgen.cpp
Expand Up @@ -581,13 +581,15 @@ MgStoneType MapgenBasic::generateBiomes()
u16 depth_top = 0;
u16 base_filler = 0;
u16 depth_water_top = 0;
u16 depth_riverbed = 0;
u32 vi = vm->m_area.index(x, node_max.Y, z);

// Check node at base of mapchunk above, either a node of a previously
// generated mapchunk or if not, a node of overgenerated base terrain.
content_t c_above = vm->m_data[vi + em.X].getContent();
bool air_above = c_above == CONTENT_AIR;
bool water_above = (c_above == c_water_source || c_above == c_river_water_source);
bool river_water_above = c_above == c_river_water_source;
bool water_above = c_above == c_water_source || river_water_above;

// If there is air or water above enable top/filler placement, otherwise force
// nplaced to stone level by setting a number exceeding any possible filler depth.
Expand All @@ -613,10 +615,11 @@ MgStoneType MapgenBasic::generateBiomes()
biome = biomegen->getBiomeAtIndex(index, y);

depth_top = biome->depth_top;
base_filler = MYMAX(depth_top
+ biome->depth_filler
+ noise_filler_depth->result[index], 0.f);
base_filler = MYMAX(depth_top +
biome->depth_filler +
noise_filler_depth->result[index], 0.f);
depth_water_top = biome->depth_water_top;
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
Expand All @@ -642,7 +645,15 @@ MgStoneType MapgenBasic::generateBiomes()
|| c_below == c_river_water_source)
nplaced = U16_MAX;

if (nplaced < depth_top) {
if (river_water_above) {
if (nplaced < depth_riverbed) {
vm->m_data[vi] = MapNode(biome->c_riverbed);
nplaced++;
} else {
nplaced = U16_MAX; // Disable top/filler placement
river_water_above = false;
}
} else if (nplaced < depth_top) {
vm->m_data[vi] = MapNode(
((y < water_level) /* && (biome->c_top == c_dirt_with_grass)*/ )
? biome->c_top
Expand Down Expand Up @@ -672,9 +683,10 @@ MgStoneType MapgenBasic::generateBiomes()
water_above = true;
} else if (c == c_river_water_source) {
vm->m_data[vi] = MapNode(biome->c_river_water);
nplaced = depth_top; // Enable filler placement for next surface
nplaced = 0; // Enable riverbed placement for next surface
air_above = false;
water_above = true;
river_water_above = true;
} else if (c == CONTENT_AIR) {
nplaced = 0; // Enable top/filler placement for next surface
air_above = true;
Expand Down
13 changes: 2 additions & 11 deletions src/mapgen_valleys.cpp
Expand Up @@ -114,11 +114,6 @@ MapgenValleys::MapgenValleys(int mapgenid, MapgenParams *params, EmergeManager *

// Resolve content to be used
c_lava_source = ndef->getId("mapgen_lava_source");
c_sand = ndef->getId("mapgen_sand");

// Fall back to more basic content if not defined
if (c_sand == CONTENT_IGNORE)
c_sand = c_stone;
}


Expand Down Expand Up @@ -493,7 +488,6 @@ int MapgenValleys::generateTerrain()

MapNode n_air(CONTENT_AIR);
MapNode n_river_water(c_river_water_source);
MapNode n_sand(c_sand);
MapNode n_stone(c_stone);
MapNode n_water(c_water_source);

Expand Down Expand Up @@ -537,10 +531,7 @@ int MapgenValleys::generateTerrain()
float surface_delta = (float)y - surface_y;
bool river = y + 1 < river_y;

if (fabs(surface_delta) <= 0.5f && y > water_level && river) {
// river bottom
vm->m_data[index_data] = n_sand;
} else if (slope * fill > surface_delta) {
if (slope * fill > surface_delta) {
// ground
vm->m_data[index_data] = n_stone;
if (y > heightmap[index_2d])
Expand All @@ -553,7 +544,7 @@ int MapgenValleys::generateTerrain()
} else if (river) {
// river
vm->m_data[index_data] = n_river_water;
} else {
} else { // air
vm->m_data[index_data] = n_air;
}
}
Expand Down
5 changes: 5 additions & 0 deletions src/mg_biome.cpp
Expand Up @@ -49,6 +49,7 @@ BiomeManager::BiomeManager(IGameDef *gamedef) :
b->depth_top = 0;
b->depth_filler = -MAX_MAP_GENERATION_LIMIT;
b->depth_water_top = 0;
b->depth_riverbed = 0;
b->y_min = -MAX_MAP_GENERATION_LIMIT;
b->y_max = MAX_MAP_GENERATION_LIMIT;
b->heat_point = 0.0;
Expand All @@ -64,7 +65,9 @@ BiomeManager::BiomeManager(IGameDef *gamedef) :
//freeminer
b->m_nodenames.push_back("mapgen_ice");
b->m_nodenames.push_back("mapgen_dirt_with_snow");
//========

b->m_nodenames.push_back("mapgen_stone");
b->m_nodenames.push_back("ignore");
m_ndef->pendNodeResolve(b);

Expand Down Expand Up @@ -311,6 +314,8 @@ void Biome::resolveNodeNames()
//freeminer:
getIdFromNrBacklog(&c_ice, "mapgen_ice", c_water);
getIdFromNrBacklog(&c_top_cold, "mapgen_dirt_with_snow", c_top);
//==========

getIdFromNrBacklog(&c_riverbed, "mapgen_stone", CONTENT_AIR);
getIdFromNrBacklog(&c_dust, "ignore", CONTENT_IGNORE);
}
2 changes: 2 additions & 0 deletions src/mg_biome.h
Expand Up @@ -61,12 +61,14 @@ class Biome : public ObjDef, public NodeResolver {
content_t c_water_top;
content_t c_water;
content_t c_river_water;
content_t c_riverbed;
content_t c_dust;


s16 depth_top;
s16 depth_filler;
s16 depth_water_top;
s16 depth_riverbed;

s16 y_min;
s16 y_max;
Expand Down
2 changes: 2 additions & 0 deletions src/script/lua_api/l_mapgen.cpp
Expand Up @@ -381,6 +381,7 @@ Biome *read_biome_def(lua_State *L, int index, INodeDefManager *ndef)
b->depth_top = getintfield_default(L, index, "depth_top", 0);
b->depth_filler = getintfield_default(L, index, "depth_filler", -31000);
b->depth_water_top = getintfield_default(L, index, "depth_water_top", 0);
b->depth_riverbed = getintfield_default(L, index, "depth_riverbed", 0);
b->y_min = getintfield_default(L, index, "y_min", -31000);
b->y_max = getintfield_default(L, index, "y_max", 31000);
b->heat_point = getfloatfield_default(L, index, "heat_point", 0.f);
Expand All @@ -394,6 +395,7 @@ Biome *read_biome_def(lua_State *L, int index, INodeDefManager *ndef)
nn.push_back(getstringfield_default(L, index, "node_water_top", ""));
nn.push_back(getstringfield_default(L, index, "node_water", ""));
nn.push_back(getstringfield_default(L, index, "node_river_water", ""));
nn.push_back(getstringfield_default(L, index, "node_riverbed", ""));
nn.push_back(getstringfield_default(L, index, "node_dust", ""));

//freeminer:
Expand Down

0 comments on commit 3164a03

Please sign in to comment.