/*
Minetest Valleys C
-Copyright (C) 2010-2015 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
-Copyright (C) 2010-2015 paramat, Matt Gregory
-Copyright (C) 2016 Duane Robertson <duane@duanerobertson.com>
+Copyright (C) 2016-2017 Duane Robertson <duane@duanerobertson.com>
+Copyright (C) 2016-2017 paramat
Based on Valleys Mapgen by Gael de Sailly
(https://forum.minetest.net/viewtopic.php?f=9&t=11430)
#include "mapblock.h"
#include "mapnode.h"
#include "map.h"
-#include "content_sao.h"
#include "nodedef.h"
#include "voxelalgorithms.h"
#include "settings.h" // For g_settings
#include "emerge.h"
#include "dungeongen.h"
-#include "treegen.h"
#include "mg_biome.h"
#include "mg_ore.h"
#include "mg_decoration.h"
: MapgenBasic(mapgenid, params, emerge)
{
// NOTE: MapgenValleys has a hard dependency on BiomeGenOriginal
- this->m_bgen = (BiomeGenOriginal *)biomegen;
-
- this->map_gen_limit = MYMIN(MAX_MAP_GENERATION_LIMIT,
- g_settings->getU16("map_generation_limit"));
+ m_bgen = (BiomeGenOriginal *)biomegen;
BiomeParamsOriginal *bp = (BiomeParamsOriginal *)params->bparams;
- this->spflags = params->spflags;
- this->altitude_chill = params->altitude_chill;
- this->large_cave_depth = params->large_cave_depth;
- this->lava_features_lim = rangelim(params->lava_features, 0, 10);
- this->massive_cave_depth = params->massive_cave_depth;
- this->river_depth_bed = params->river_depth + 1.f;
- this->river_size_factor = params->river_size / 100.f;
- this->water_features_lim = rangelim(params->water_features, 0, 10);
- this->cave_width = params->cave_width;
+ spflags = params->spflags;
+ altitude_chill = params->altitude_chill;
+ large_cave_depth = params->large_cave_depth;
+ lava_features_lim = rangelim(params->lava_features, 0, 10);
+ massive_cave_depth = params->massive_cave_depth;
+ river_depth_bed = params->river_depth + 1.f;
+ river_size_factor = params->river_size / 100.f;
+ water_features_lim = rangelim(params->water_features, 0, 10);
+ cave_width = params->cave_width;
//// 2D Terrain noise
noise_filler_depth = new Noise(¶ms->np_filler_depth, seed, csize.X, csize.Z);
noise_cave2 = new Noise(¶ms->np_cave2, seed, csize.X, csize.Y + 1, csize.Z);
noise_massive_caves = new Noise(¶ms->np_massive_caves, seed, csize.X, csize.Y + 1, csize.Z);
- this->humid_rivers = (spflags & MGVALLEYS_HUMID_RIVERS);
- this->use_altitude_chill = (spflags & MGVALLEYS_ALT_CHILL);
- this->humidity_adjust = bp->np_humidity.offset - 50.f;
+ humid_rivers = (spflags & MGVALLEYS_HUMID_RIVERS);
+ use_altitude_chill = (spflags & MGVALLEYS_ALT_CHILL);
+ humidity_adjust = bp->np_humidity.offset - 50.f;
// a small chance of overflows if the settings are very high
- this->cave_water_max_height = water_level + MYMAX(0, water_features_lim - 4) * 50;
- this->lava_max_height = water_level + MYMAX(0, lava_features_lim - 4) * 50;
+ cave_water_max_height = water_level + MYMAX(0, water_features_lim - 4) * 50;
+ lava_max_height = water_level + MYMAX(0, lava_features_lim - 4) * 50;
tcave_cache = new float[csize.Y + 2];
-
- // Resolve content to be used
- c_lava_source = ndef->getId("mapgen_lava_source");
}
MapgenValleysParams::MapgenValleysParams()
{
- spflags = MGVALLEYS_HUMID_RIVERS | MGVALLEYS_ALT_CHILL;
- altitude_chill = 90; // The altitude at which temperature drops by 20C.
- large_cave_depth = -33;
- lava_features = 0; // How often water will occur in caves.
- massive_cave_depth = -256; // highest altitude of massive caves
- river_depth = 4; // How deep to carve river channels.
- river_size = 5; // How wide to make rivers.
- water_features = 0; // How often water will occur in caves.
- cave_width = 0.09;
-
np_cave1 = NoiseParams(0, 12, v3f(61, 61, 61), 52534, 3, 0.5, 2.0);
np_cave2 = NoiseParams(0, 12, v3f(67, 67, 67), 10325, 3, 0.5, 2.0);
np_filler_depth = NoiseParams(0.f, 1.2f, v3f(256, 256, 256), 1605, 3, 0.5f, 2.f);
blockseed = getBlockSeed2(full_node_min, seed);
- // Generate noise maps and base terrain height.
- calculateNoise();
-
// Generate biome noises. Note this must be executed strictly before
// generateTerrain, because generateTerrain depends on intermediate
// biome-related noises.
m_bgen->calcBiomeNoise(node_min);
+ // Generate noise maps and base terrain height.
+ // Modify heat and humidity maps.
+ calculateNoise();
+
// Generate base terrain with initial heightmaps
s16 stone_surface_max_y = generateTerrain();
+ // Recalculate heightmap
+ updateHeightmap(node_min, node_max);
+
// Place biome-specific nodes and build biomemap
- MgStoneType stone_type = generateBiomes();
+ MgStoneType mgstone_type;
+ content_t biome_stone;
+ generateBiomes(&mgstone_type, &biome_stone, water_level - 1);
// Cave creation.
if (flags & MG_CAVES)
// 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)
- m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);
+ m_emerge->decomgr->placeAllDecos(this, blockseed,
+ node_min, node_max, water_level - 1);
// Generate the registered ores
- m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);
+ m_emerge->oremgr->placeAllOres(this, blockseed,
+ node_min, node_max, water_level - 1);
// Sprinkle some dust on top after everything else was generated
dustTopNodes();
if (level_at_point <= water_level ||
level_at_point > water_level + 32)
return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point
- else
- return level_at_point;
+
+ return level_at_point;
}
MapNode n_stone(c_stone);
MapNode n_water(c_water_source);
- v3s16 em = vm->m_area.getExtent();
+ const v3s16 &em = vm->m_area.getExtent();
s16 surface_max_y = -MAX_MAP_GENERATION_LIMIT;
u32 index_2d = 0;
index_3d += ystride;
}
- // This happens if we're generating a chunk that doesn't
- // contain the terrain surface, in which case, we need
- // to set heightmap to a value outside of the chunk,
- // to avoid confusing lua mods that use heightmap.
if (heightmap[index_2d] == -MAX_MAP_GENERATION_LIMIT) {
s16 surface_y_int = myround(surface_y);
if (surface_y_int > node_max.Y + 1 || surface_y_int < node_min.Y - 1) {
MapNode n_lava(c_lava_source);
MapNode n_water(c_river_water_source);
- v3s16 em = vm->m_area.getExtent();
+ const v3s16 &em = vm->m_area.getExtent();
// Cave blend distance near YMIN, YMAX
const float massive_cave_blend = 128.f;
const float massive_cave_threshold = 0.6f;
// mct: 1 = small rare caves, 0.5 1/3rd ground volume, 0 = 1/2 ground volume.
- float yblmin = -map_gen_limit + massive_cave_blend * 1.5f;
+ float yblmin = -mapgen_limit + massive_cave_blend * 1.5f;
float yblmax = massive_cave_depth - massive_cave_blend * 1.5f;
bool made_a_big_one = false;
// lava_depth varies between one and ten as you approach
// the bottom of the world.
- s16 lava_depth = ceil((lava_max_height - node_min.Y + 1) * 10.f / map_gen_limit);
+ s16 lava_depth = ceil((lava_max_height - node_min.Y + 1) * 10.f / mapgen_limit);
// This allows random lava spawns to be less common at the surface.
s16 lava_chance = MYCUBE(lava_features_lim) * lava_depth;
// water_depth varies between ten and one on the way down.
- s16 water_depth = ceil((map_gen_limit - abs(node_min.Y) + 1) * 10.f / map_gen_limit);
+ s16 water_depth = ceil((mapgen_limit - abs(node_min.Y) + 1) * 10.f / mapgen_limit);
// This allows random water spawns to be more common at the surface.
s16 water_chance = MYCUBE(water_features_lim) * water_depth;
// Saves some time.
if (y > terrain + 10)
continue;
- else if (y < terrain - 40)
+
+ if (y < terrain - 40)
underground = true;
// Dig massive caves.
u32 bruises_count = ps.range(0, 2);
for (u32 i = 0; i < bruises_count; i++) {
CavesRandomWalk cave(ndef, &gennotify, seed, water_level,
- c_water_source, c_lava_source);
+ c_water_source, c_lava_source, lava_max_height);
cave.makeCave(vm, node_min, node_max, &ps, true, max_stone_y, heightmap);
}