This commit is contained in:
Cartmic 2024-05-15 07:05:30 +03:00 committed by GitHub
commit 8129c5614d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 555 additions and 43 deletions

View File

@ -33,30 +33,10 @@ local cb_caverns = { "caverns", fgettext("Caverns"),
fgettext("Very large caverns deep in the underground") } fgettext("Very large caverns deep in the underground") }
local flag_checkboxes = { local flag_checkboxes = {
v5 = {
cb_caverns,
},
v7 = {
cb_caverns,
{ "ridges", fgettext("Rivers"), fgettext("Sea level rivers") },
{ "mountains", fgettext("Mountains") },
{ "floatlands", fgettext("Floatlands (experimental)"),
fgettext("Floating landmasses in the sky") },
},
carpathian = { carpathian = {
cb_caverns, cb_caverns,
{ "rivers", fgettext("Rivers"), fgettext("Sea level rivers") }, { "rivers", fgettext("Rivers"), fgettext("Sea level rivers") },
}, },
valleys = {
{ "altitude_chill", fgettext("Altitude chill"),
fgettext("Reduces heat with altitude") },
{ "altitude_dry", fgettext("Altitude dry"),
fgettext("Reduces humidity with altitude") },
{ "humid_rivers", fgettext("Humid rivers"),
fgettext("Increases humidity around rivers") },
{ "vary_river_depth", fgettext("Vary river depth"),
fgettext("Low humidity and high heat causes shallow or dry rivers") },
},
flat = { flat = {
cb_caverns, cb_caverns,
{ "hills", fgettext("Hills") }, { "hills", fgettext("Hills") },
@ -66,14 +46,35 @@ local flag_checkboxes = {
{ "terrain", fgettext("Additional terrain"), { "terrain", fgettext("Additional terrain"),
fgettext("Generate non-fractal terrain: Oceans and underground") }, fgettext("Generate non-fractal terrain: Oceans and underground") },
}, },
trailgen = {
cb_caverns,
},
v5 = {
cb_caverns,
},
v6 = { v6 = {
{ "trees", fgettext("Trees and jungle grass") }, { "trees", fgettext("Trees and jungle grass") },
{ "flat", fgettext("Flat terrain") }, { "flat", fgettext("Flat terrain") },
{ "mudflow", fgettext("Mud flow"), fgettext("Terrain surface erosion") }, { "mudflow", fgettext("Mud flow"), fgettext("Terrain surface erosion") },
{ "temples", fgettext("Desert temples"),
fgettext("Different dungeon variant generated in desert biomes (only if dungeons enabled)") },
-- Biome settings are in mgv6_biomes below -- Biome settings are in mgv6_biomes below
}, },
v7 = {
cb_caverns,
{ "ridges", fgettext("Rivers"), fgettext("Sea level rivers") },
{ "mountains", fgettext("Mountains") },
{ "floatlands", fgettext("Floatlands (experimental)"),
fgettext("Floating landmasses in the sky") },
},
valleys = {
{ "altitude_chill", fgettext("Altitude chill"),
fgettext("Reduces heat with altitude") },
{ "altitude_dry", fgettext("Altitude dry"),
fgettext("Reduces humidity with altitude") },
{ "humid_rivers", fgettext("Humid rivers"),
fgettext("Increases humidity around rivers") },
{ "vary_river_depth", fgettext("Vary river depth"),
fgettext("Low humidity and high heat causes shallow or dry rivers") },
},
} }
local mgv6_biomes = { local mgv6_biomes = {
@ -281,7 +282,7 @@ local function create_world_formspec(dialogdata)
end end
local retval = local retval =
"size[12.25,7.4,true]" .. "size[12.25,7,true]" ..
-- Left side -- Left side
"container[0,0]".. "container[0,0]"..
@ -323,10 +324,8 @@ local function create_world_formspec(dialogdata)
"container_end[]".. "container_end[]"..
-- Menu buttons -- Menu buttons
"container[0,6.9]".. "button[3.25,6.5;3,0.5;world_create_confirm;" .. fgettext("Create") .. "]" ..
"button[3.25,0;3,0.5;world_create_confirm;" .. fgettext("Create") .. "]" .. "button[6.25,6.5;3,0.5;world_create_cancel;" .. fgettext("Cancel") .. "]"
"button[6.25,0;3,0.5;world_create_cancel;" .. fgettext("Cancel") .. "]" ..
"container_end[]"
return retval return retval
@ -389,13 +388,14 @@ local function create_world_buttonhandler(this, fields)
fixed_map_seed = this.data.seed, fixed_map_seed = this.data.seed,
mg_name = this.data.mg, mg_name = this.data.mg,
mg_flags = table_to_flags(this.data.flags.main), mg_flags = table_to_flags(this.data.flags.main),
mgcarpathian_spflags = table_to_flags(this.data.flags.carpathian),
mgflat_spflags = table_to_flags(this.data.flags.flat),
mgfractal_spflags = table_to_flags(this.data.flags.fractal),
mgtrailgen_spflags = table_to_flags(this.data.flags.trailgen),
mgv5_spflags = table_to_flags(this.data.flags.v5), mgv5_spflags = table_to_flags(this.data.flags.v5),
mgv6_spflags = table_to_flags(this.data.flags.v6), mgv6_spflags = table_to_flags(this.data.flags.v6),
mgv7_spflags = table_to_flags(this.data.flags.v7), mgv7_spflags = table_to_flags(this.data.flags.v7),
mgfractal_spflags = table_to_flags(this.data.flags.fractal),
mgcarpathian_spflags = table_to_flags(this.data.flags.carpathian),
mgvalleys_spflags = table_to_flags(this.data.flags.valleys), mgvalleys_spflags = table_to_flags(this.data.flags.valleys),
mgflat_spflags = table_to_flags(this.data.flags.flat),
} }
message = core.create_world(worldname, game.id, settings) message = core.create_world(worldname, game.id, settings)
end end
@ -472,13 +472,14 @@ function create_create_world_dlg()
mg = core.settings:get("mg_name"), mg = core.settings:get("mg_name"),
flags = { flags = {
main = core.settings:get_flags("mg_flags"), main = core.settings:get_flags("mg_flags"),
carpathian = core.settings:get_flags("mgcarpathian_spflags"),
flat = core.settings:get_flags("mgflat_spflags"),
fractal = core.settings:get_flags("mgfractal_spflags"),
trailgen = core.settings:get_flags("mgtrailgen_spflags"),
v5 = core.settings:get_flags("mgv5_spflags"), v5 = core.settings:get_flags("mgv5_spflags"),
v6 = core.settings:get_flags("mgv6_spflags"), v6 = core.settings:get_flags("mgv6_spflags"),
v7 = core.settings:get_flags("mgv7_spflags"), v7 = core.settings:get_flags("mgv7_spflags"),
fractal = core.settings:get_flags("mgfractal_spflags"),
carpathian = core.settings:get_flags("mgcarpathian_spflags"),
valleys = core.settings:get_flags("mgvalleys_spflags"), valleys = core.settings:get_flags("mgvalleys_spflags"),
flat = core.settings:get_flags("mgflat_spflags"),
} }
} }

View File

@ -992,7 +992,7 @@ fixed_map_seed (Fixed map seed) string
# Creating a world in the main menu will override this. # Creating a world in the main menu will override this.
# Current mapgens in a highly unstable state: # Current mapgens in a highly unstable state:
# - The optional floatlands of v7 (disabled by default). # - The optional floatlands of v7 (disabled by default).
mg_name (Mapgen name) enum v7 v7,valleys,carpathian,v5,flat,fractal,singlenode,v6 mg_name (Mapgen name) enum v7 v7,valleys,carpathian,trailgen,v5,flat,fractal,singlenode,v6
# Water surface level of the world. # Water surface level of the world.
water_level (Water level) int 1 -31000 31000 water_level (Water level) int 1 -31000 31000
@ -1100,8 +1100,7 @@ mgv5_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2
# The 'snowbiomes' flag enables the new 5 biome system. # The 'snowbiomes' flag enables the new 5 biome system.
# When the 'snowbiomes' flag is enabled jungles are automatically enabled and # When the 'snowbiomes' flag is enabled jungles are automatically enabled and
# the 'jungles' flag is ignored. # the 'jungles' flag is ignored.
# The 'temples' flag disables generation of desert temples. Normal dungeons will appear instead. mgv6_spflags (Mapgen V6 specific flags) flags jungles,biomeblend,mudflow,snowbiomes,noflat,trees jungles,biomeblend,mudflow,snowbiomes,flat,trees,nojungles,nobiomeblend,nomudflow,nosnowbiomes,noflat,notrees
mgv6_spflags (Mapgen V6 specific flags) flags jungles,biomeblend,mudflow,snowbiomes,noflat,trees,temples jungles,biomeblend,mudflow,snowbiomes,flat,trees,temples,nojungles,nobiomeblend,nomudflow,nosnowbiomes,noflat,notrees,notemples
# Deserts occur when np_biome exceeds this value. # Deserts occur when np_biome exceeds this value.
# When the 'snowbiomes' flag is enabled, this is ignored. # When the 'snowbiomes' flag is enabled, this is ignored.
@ -1128,7 +1127,7 @@ mgv6_np_terrain_higher (Terrain higher noise) noise_params_2d 20, 16, (500, 500,
mgv6_np_steepness (Steepness noise) noise_params_2d 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2.0, eased mgv6_np_steepness (Steepness noise) noise_params_2d 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2.0, eased
# Defines distribution of higher terrain. # Defines distribution of higher terrain.
mgv6_np_height_select (Height select noise) noise_params_2d 0.5, 1, (250, 250, 250), 4213, 5, 0.69, 2.0, eased mgv6_np_height_select (Height select noise) noise_params_2d 0, 1, (250, 250, 250), 4213, 5, 0.69, 2.0, eased
# Varies depth of biome surface nodes. # Varies depth of biome surface nodes.
mgv6_np_mud (Mud noise) noise_params_2d 4, 2, (200, 200, 200), 91013, 3, 0.55, 2.0, eased mgv6_np_mud (Mud noise) noise_params_2d 4, 2, (200, 200, 200), 91013, 3, 0.55, 2.0, eased
@ -1610,6 +1609,66 @@ mgfractal_np_cave2 (Cave2 noise) noise_params_3d 0, 12, (67, 67, 67), 10325, 3,
# 3D noise that determines number of dungeons per mapchunk. # 3D noise that determines number of dungeons per mapchunk.
mgfractal_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 mgfractal_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0
[*Mapgen Trailgen]
# Map generation attributes specific to Mapgen trailgen.
mgtrailgen_spflags (Mapgen Trailgen specific flags) flags caverns caverns,nocaverns
# Y of upper limit of large caves.
mgtrailgen_large_cave_depth (Large cave depth) int -33
# Minimum limit of random number of small caves per mapchunk.
mgtrailgen_small_cave_num_min (Small cave minimum number) int 0 0 256
# Maximum limit of random number of small caves per mapchunk.
mgtrailgen_small_cave_num_max (Small cave maximum number) int 0 0 256
# Minimum limit of random number of large caves per mapchunk.
mgtrailgen_large_cave_num_min (Large cave minimum number) int 0 0 64
# Maximum limit of random number of large caves per mapchunk.
mgtrailgen_large_cave_num_max (Large cave maximum number) int 2 0 64
# Proportion of large caves that contain liquid.
mgtrailgen_large_cave_flooded (Large cave proportion flooded) float 0.5 0.0 1.0
# Controls width of tunnels, a smaller value creates wider tunnels.
# Value >= 10.0 completely disables generation of tunnels and avoids the
# intensive noise calculations.
mgtrailgen_cave_width (Cave width) float 0.09
# Y-level of cavern upper limit.
mgtrailgen_cavern_limit (Cavern limit) int -256
# Y-distance over which caverns expand to full size.
mgtrailgen_cavern_taper (Cavern taper) int 256
# Defines full size of caverns, smaller values create larger caverns.
mgtrailgen_cavern_threshold (Cavern threshold) float 0.7
# Lower Y limit of dungeons.
mgtrailgen_dungeon_ymin (Dungeon minimum Y) int -31000
# Upper Y limit of dungeons.
mgtrailgen_dungeon_ymax (Dungeon maximum Y) int 31000
[**Noises]
# Y-level of lower terrain and seabed.
mgtrailgen_np_terrain_base (Terrain base noise) noise_params_2d -4, 20, (250, 250, 250), 82341, 5, 0.6, 2.0, eased
# Y-level of higher terrain that creates cliffs.
mgtrailgen_np_terrain_higher (Terrain higher noise) noise_params_2d 20, 16, (500, 500, 500), 85039, 5, 0.6, 2.0, eased
# Varies steepness of cliffs.
mgtrailgen_np_steepness (Steepness noise) noise_params_2d 0.85, 0.5, (125, 125, 125), -932, 5, 0.7, 2.0, eased
# Defines distribution of higher terrain.
mgtrailgen_np_height_select (Height select noise) noise_params_2d 0, 1, (250, 250, 250), 4213, 5, 0.69, 2.0, eased
# Variation of biome filler depth.
mgtrailgen_np_filler_depth (Filler Depth) noise_params_2d 1, 2, (200, 200, 200), 91013, 3, 0.7, 2.0, eased
[*Mapgen Valleys] [*Mapgen Valleys]
# Map generation attributes specific to Mapgen Valleys. # Map generation attributes specific to Mapgen Valleys.
@ -1704,7 +1763,6 @@ mgvalleys_np_inter_valley_slope (Valley slope) noise_params_2d 0.5, 0.5, (128, 1
# 3D noise that determines number of dungeons per mapchunk. # 3D noise that determines number of dungeons per mapchunk.
mgvalleys_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0 mgvalleys_np_dungeons (Dungeon noise) noise_params_3d 0.9, 0.5, (500, 500, 500), 0, 2, 0.8, 2.0
[Advanced] [Advanced]
[*Developer Options] [*Developer Options]

View File

@ -6,6 +6,7 @@ set(mapgen_SRCS
${CMAKE_CURRENT_SOURCE_DIR}/mapgen_flat.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mapgen_flat.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mapgen_fractal.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mapgen_fractal.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mapgen_singlenode.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mapgen_singlenode.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mapgen_trailgen.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mapgen_v5.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mapgen_v5.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mapgen_v6.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mapgen_v6.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mapgen_v7.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mapgen_v7.cpp

View File

@ -44,11 +44,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapgen_carpathian.h" #include "mapgen_carpathian.h"
#include "mapgen_flat.h" #include "mapgen_flat.h"
#include "mapgen_fractal.h" #include "mapgen_fractal.h"
#include "mapgen_singlenode.h"
#include "mapgen_trailgen.h"
#include "mapgen_v5.h" #include "mapgen_v5.h"
#include "mapgen_v6.h" #include "mapgen_v6.h"
#include "mapgen_v7.h" #include "mapgen_v7.h"
#include "mapgen_valleys.h" #include "mapgen_valleys.h"
#include "mapgen_singlenode.h"
#include "cavegen.h" #include "cavegen.h"
#include "dungeongen.h" #include "dungeongen.h"
@ -93,6 +94,7 @@ static MapgenDesc g_reg_mapgens[] = {
{"v7", true}, {"v7", true},
{"valleys", true}, {"valleys", true},
{"carpathian", true}, {"carpathian", true},
{"trailgen", true},
{"v5", true}, {"v5", true},
{"flat", true}, {"flat", true},
{"fractal", true}, {"fractal", true},
@ -175,6 +177,8 @@ Mapgen *Mapgen::createMapgen(MapgenType mgtype, MapgenParams *params,
return new MapgenFractal((MapgenFractalParams *)params, emerge); return new MapgenFractal((MapgenFractalParams *)params, emerge);
case MAPGEN_SINGLENODE: case MAPGEN_SINGLENODE:
return new MapgenSinglenode((MapgenSinglenodeParams *)params, emerge); return new MapgenSinglenode((MapgenSinglenodeParams *)params, emerge);
case MAPGEN_TRAILGEN:
return new MapgenTrailgen((MapgenTrailgenParams *)params, emerge);
case MAPGEN_V5: case MAPGEN_V5:
return new MapgenV5((MapgenV5Params *)params, emerge); return new MapgenV5((MapgenV5Params *)params, emerge);
case MAPGEN_V6: case MAPGEN_V6:
@ -200,6 +204,8 @@ MapgenParams *Mapgen::createMapgenParams(MapgenType mgtype)
return new MapgenFractalParams; return new MapgenFractalParams;
case MAPGEN_SINGLENODE: case MAPGEN_SINGLENODE:
return new MapgenSinglenodeParams; return new MapgenSinglenodeParams;
case MAPGEN_TRAILGEN:
return new MapgenTrailgenParams;
case MAPGEN_V5: case MAPGEN_V5:
return new MapgenV5Params; return new MapgenV5Params;
case MAPGEN_V6: case MAPGEN_V6:

View File

@ -118,6 +118,7 @@ enum MapgenType {
MAPGEN_V7, MAPGEN_V7,
MAPGEN_VALLEYS, MAPGEN_VALLEYS,
MAPGEN_CARPATHIAN, MAPGEN_CARPATHIAN,
MAPGEN_TRAILGEN,
MAPGEN_V5, MAPGEN_V5,
MAPGEN_FLAT, MAPGEN_FLAT,
MAPGEN_FRACTAL, MAPGEN_FRACTAL,
@ -161,9 +162,9 @@ private:
If a feature exposed by a public member pointer is not supported by a If a feature exposed by a public member pointer is not supported by a
certain mapgen, it must be set to NULL. certain mapgen, it must be set to NULL.
Apart from makeChunk, getGroundLevelAtPoint, and getSpawnLevelAtPoint, all Apart from makeChunk and getSpawnLevelAtPoint, all methods can be used by
methods can be used by constructing a Mapgen base class and setting the constructing a Mapgen base class and setting the appropriate public members
appropriate public members (e.g. vm, ndef, and so on). (e.g. vm, ndef, and so on).
*/ */
class Mapgen { class Mapgen {
public: public:
@ -240,7 +241,6 @@ public:
void spreadLight(const v3s16 &nmin, const v3s16 &nmax); void spreadLight(const v3s16 &nmin, const v3s16 &nmax);
virtual void makeChunk(BlockMakeData *data) {} virtual void makeChunk(BlockMakeData *data) {}
virtual int getGroundLevelAtPoint(v2s16 p) { return 0; }
// getSpawnLevelAtPoint() is a function within each mapgen that returns a // getSpawnLevelAtPoint() is a function within each mapgen that returns a
// suitable y co-ordinate for player spawn ('suitable' usually meaning // suitable y co-ordinate for player spawn ('suitable' usually meaning

View File

@ -0,0 +1,354 @@
/*
Minetest
Copyright (C) 2015-2020 paramat
Copyright (C) 2015-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
Copyright (C) 2021-2022 cartmic, Michael Carter
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "mapgen.h"
#include "voxel.h"
#include "noise.h"
#include "mapblock.h"
#include "mapnode.h"
#include "map.h"
#include "nodedef.h"
#include "voxelalgorithms.h"
//#include "profiler.h" // For TimeTaker
#include "settings.h"
#include "emerge.h"
#include "dungeongen.h"
#include "cavegen.h"
#include "mg_biome.h"
#include "mg_ore.h"
#include "mg_decoration.h"
#include "mapgen_trailgen.h"
FlagDesc flagdesc_mapgen_trailgen[] = {
{"caverns", MGTRAILGEN_CAVERNS},
{NULL, 0}
};
MapgenTrailgen::MapgenTrailgen(MapgenTrailgenParams *params, EmergeParams *emerge)
: MapgenBasic(MAPGEN_TRAILGEN, params, emerge)
{
ystride = csize.X;
spflags = params->spflags;
cave_width = params->cave_width;
small_cave_num_min = params->small_cave_num_min;
small_cave_num_max = params->small_cave_num_max;
large_cave_num_min = params->large_cave_num_min;
large_cave_num_max = params->large_cave_num_max;
large_cave_depth = params->large_cave_depth;
large_cave_flooded = params->large_cave_flooded;
cavern_limit = params->cavern_limit;
cavern_taper = params->cavern_taper;
cavern_threshold = params->cavern_threshold;
dungeon_ymin = params->dungeon_ymin;
dungeon_ymax = params->dungeon_ymax;
// 2D noise
noise_terrain_base = new Noise(&params->np_terrain_base, seed, csize.X, csize.Z);
noise_terrain_higher = new Noise(&params->np_terrain_higher, seed, csize.X, csize.Z);
noise_steepness = new Noise(&params->np_steepness, seed, csize.X, csize.Z);
noise_height_select = new Noise(&params->np_height_select, seed, csize.X, csize.Z);
noise_filler_depth = new Noise(&params->np_filler_depth, seed, csize.X, csize.Z);
// 3D noise
MapgenBasic::np_cave1 = params->np_cave1;
MapgenBasic::np_cave2 = params->np_cave2;
MapgenBasic::np_cavern = params->np_cavern;
MapgenBasic::np_dungeons = params->np_dungeons;
}
MapgenTrailgen::~MapgenTrailgen()
{
delete noise_terrain_base;
delete noise_terrain_higher;
delete noise_steepness;
delete noise_height_select;
delete noise_filler_depth;
}
MapgenTrailgenParams::MapgenTrailgenParams() :
np_terrain_base (-4, 20.0, v3f(250.0, 250.0, 250.0), 82341, 5, 0.6, 2.0),
np_terrain_higher (20, 16.0, v3f(500.0, 500.0, 500.0), 85039, 5, 0.6, 2.0),
np_steepness (0.85, 0.5, v3f(125.0, 125.0, 125.0), -932, 5, 0.7, 2.0),
np_height_select (0, 1.0, v3f(250.0, 250.0, 250.0), 4213, 5, 0.69, 2.0),
np_filler_depth (1, 2, v3f(200.0, 200.0, 200.0), 91013, 3, 0.7, 2.0),
np_cavern (0.0, 1.0, v3f(384, 128, 384), 723, 5, 0.63, 2.0),
np_cave1 (0, 12, v3f(61, 61, 61), 52534, 3, 0.5, 2.0),
np_cave2 (0, 12, v3f(67, 67, 67), 10325, 3, 0.5, 2.0),
np_dungeons (0.9, 0.5, v3f(500, 500, 500), 0, 2, 0.8, 2.0)
{
}
void MapgenTrailgenParams::readParams(const Settings *settings)
{
settings->getFlagStrNoEx("mgtrailgen_spflags", spflags, flagdesc_mapgen_trailgen);
settings->getU16NoEx("mgtrailgen_small_cave_num_min", small_cave_num_min);
settings->getU16NoEx("mgtrailgen_small_cave_num_max", small_cave_num_max);
settings->getU16NoEx("mgtrailgen_large_cave_num_min", large_cave_num_min);
settings->getU16NoEx("mgtrailgen_large_cave_num_max", large_cave_num_max);
settings->getS16NoEx("mgtrailgen_large_cave_depth", large_cave_depth);
settings->getFloatNoEx("mgtrailgen_large_cave_flooded", large_cave_flooded);
settings->getFloatNoEx("mgtrailgen_cave_width", cave_width);
settings->getS16NoEx("mgtrailgen_cavern_limit", cavern_limit);
settings->getS16NoEx("mgtrailgen_cavern_taper", cavern_taper);
settings->getFloatNoEx("mgtrailgen_cavern_threshold", cavern_threshold);
settings->getS16NoEx("mgtrailgen_dungeon_ymin", dungeon_ymin);
settings->getS16NoEx("mgtrailgen_dungeon_ymax", dungeon_ymax);
settings->getNoiseParams("mgtrailgen_np_terrain_base", np_terrain_base);
settings->getNoiseParams("mgtrailgen_np_terrain_higher", np_terrain_higher);
settings->getNoiseParams("mgtrailgen_np_steepness", np_steepness);
settings->getNoiseParams("mgtrailgen_np_height_select", np_height_select);
settings->getNoiseParams("mgtrailgen_np_filler_depth", np_filler_depth);
settings->getNoiseParams("mgtrailgen_np_cavern", np_cavern);
settings->getNoiseParams("mgtrailgen_np_cave1", np_cave1);
settings->getNoiseParams("mgtrailgen_np_cave2", np_cave2);
settings->getNoiseParams("mgtrailgen_np_dungeons", np_dungeons);
}
void MapgenTrailgenParams::writeParams(Settings *settings) const
{
settings->setFlagStr("mgtrailgen_spflags", spflags, flagdesc_mapgen_trailgen);
settings->setU16("mgtrailgen_small_cave_num_min", small_cave_num_min);
settings->setU16("mgtrailgen_small_cave_num_max", small_cave_num_max);
settings->setU16("mgtrailgen_large_cave_num_min", large_cave_num_min);
settings->setU16("mgtrailgen_large_cave_num_max", large_cave_num_max);
settings->setS16("mgtrailgen_large_cave_depth", large_cave_depth);
settings->setFloat("mgtrailgen_large_cave_flooded", large_cave_flooded);
settings->setFloat("mgtrailgen_cave_width", cave_width);
settings->setS16("mgtrailgen_cavern_limit", cavern_limit);
settings->setS16("mgtrailgen_cavern_taper", cavern_taper);
settings->setFloat("mgtrailgen_cavern_threshold", cavern_threshold);
settings->setS16("mgtrailgen_dungeon_ymin", dungeon_ymin);
settings->setS16("mgtrailgen_dungeon_ymax", dungeon_ymax);
settings->setNoiseParams("mgtrailgen_np_terrain_base", np_terrain_base);
settings->setNoiseParams("mgtrailgen_np_terrain_higher", np_terrain_higher);
settings->setNoiseParams("mgtrailgen_np_steepness", np_steepness);
settings->setNoiseParams("mgtrailgen_np_height_select", np_height_select);
settings->setNoiseParams("mgtrailgen_np_filler_depth", np_filler_depth);
settings->setNoiseParams("mgtrailgen_np_cavern", np_cavern);
settings->setNoiseParams("mgtrailgen_np_cave1", np_cave1);
settings->setNoiseParams("mgtrailgen_np_cave2", np_cave2);
settings->setNoiseParams("mgtrailgen_np_dungeons", np_dungeons);
}
void MapgenTrailgenParams::setDefaultSettings(Settings *settings)
{
settings->setDefault("mgtrailgen_spflags", flagdesc_mapgen_trailgen,
MGTRAILGEN_CAVERNS);
}
void MapgenTrailgen::makeChunk(BlockMakeData *data)
{
// Pre-conditions
assert(data->vmanip);
assert(data->nodedef);
//TimeTaker t("makeChunk");
this->generating = true;
this->vm = data->vmanip;
this->ndef = data->nodedef;
// Use minimum block coords for old code that assumes a single block
v3s16 blockpos_min = data->blockpos_min;
v3s16 blockpos_max = data->blockpos_max;
// Area of central chunk
node_min = blockpos_min * MAP_BLOCKSIZE;
node_max = (blockpos_max + v3s16(1, 1, 1)) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
// Full allocated area
full_node_min = (blockpos_min - 1) * MAP_BLOCKSIZE;
full_node_max = (blockpos_max + 2) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
blockseed = getBlockSeed2(full_node_min, seed);
// Make some noise
calculateNoise();
// Generate base terrain
s16 stone_surface_max_y = generateTerrain();
// Create heightmap
updateHeightmap(node_min, node_max);
// Init biome generator, place biome-specific nodes, and build biomemap
if (flags & MG_BIOMES) {
biomegen->calcBiomeNoise(node_min);
generateBiomes();
}
// Generate tunnels, caverns and large randomwalk caves
if (flags & MG_CAVES) {
// Generate tunnels first as caverns confuse them
generateCavesNoiseIntersection(stone_surface_max_y);
// Generate caverns
bool near_cavern = false;
if (spflags & MGTRAILGEN_CAVERNS)
near_cavern = generateCavernsNoise(stone_surface_max_y);
// Generate large randomwalk caves
if (near_cavern)
// Disable large randomwalk caves in this mapchunk by setting
// 'large cave depth' to world base. Avoids excessive liquid in
// large caverns and floating blobs of overgenerated liquid.
generateCavesRandomWalk(stone_surface_max_y, -MAX_MAP_GENERATION_LIMIT);
else
generateCavesRandomWalk(stone_surface_max_y, large_cave_depth);
}
// Generate the registered ores
if (flags & MG_ORES)
m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);
if (flags & MG_DUNGEONS)
generateDungeons(stone_surface_max_y);
// Generate the registered decorations
if (flags & MG_DECORATIONS)
m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);
// Sprinkle some dust on top after everything else was generated
if (flags & MG_BIOMES)
dustTopNodes();
updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);
if (flags & MG_LIGHT)
calcLighting(node_min - v3s16(0, 1, 0), node_max + v3s16(0, 1, 0),
full_node_min, full_node_max);
this->generating = false;
//printf("makeChunk: %dms\n", t.stop());
}
float MapgenTrailgen::baseTerrainLevel(float terrain_base, float terrain_higher,
float steepness, float height_select)
{
float base = 1 + terrain_base;
float higher = 1 + terrain_higher;
// Limit higher ground level to at least base
if (higher < base)
higher = base;
// Steepness factor of cliffs
float b = steepness;
b = rangelim(b, 0.0, 1000.0);
b = 5 * b * b * b * b * b * b * b;
b = rangelim(b, 0.5, 1000.0);
// Values 1.5...100 give quite horrible looking slopes
if (b > 1.5 && b < 100.0)
b = (b < 10.0) ? 1.5 : 100.0;
float a_off = -0.20; // Offset to more low
float a = 0.5 + b * (a_off + height_select);
a = rangelim(a, 0.0, 1.0); // Limit
return base * (1.0 - a) + higher * a;
}
float MapgenTrailgen::baseTerrainLevelFromNoise(v2s16 p)
{
float terrain_base = NoisePerlin2D_PO(&noise_terrain_base->np,
p.X, 0.5, p.Y, 0.5, seed);
float terrain_higher = NoisePerlin2D_PO(&noise_terrain_higher->np,
p.X, 0.5, p.Y, 0.5, seed);
float steepness = NoisePerlin2D_PO(&noise_steepness->np,
p.X, 0.5, p.Y, 0.5, seed);
float height_select = NoisePerlin2D_PO(&noise_height_select->np,
p.X, 0.5, p.Y, 0.5, seed);
return baseTerrainLevel(terrain_base, terrain_higher, steepness, height_select);
}
float MapgenTrailgen::baseTerrainLevelFromMap(u32 index)
{
float terrain_base = noise_terrain_base->result[index];
float terrain_higher = noise_terrain_higher->result[index];
float steepness = noise_steepness->result[index];
float height_select = noise_height_select->result[index];
return baseTerrainLevel(terrain_base, terrain_higher, steepness, height_select);
}
int MapgenTrailgen::getSpawnLevelAtPoint(v2s16 p)
{
// y + 2 because y is surface level and due to biome 'dust'
s16 level_at_point = baseTerrainLevelFromNoise(p) + 2;
if (level_at_point <= water_level || level_at_point > water_level + 16)
return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point
return level_at_point;
}
s16 MapgenTrailgen::generateTerrain()
{
MapNode n_air(CONTENT_AIR);
MapNode n_stone(c_stone);
MapNode n_water(c_water_source);
s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
u32 index = 0;
for (s16 z = node_min.Z; z <= node_max.Z; z++)
for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
s16 surface_y = (s16)baseTerrainLevelFromMap(index);
if (surface_y > stone_surface_max_y)
stone_surface_max_y = surface_y;
const v3s16 &em = vm->m_area.getExtent();
u32 vi = vm->m_area.index(x, node_min.Y - 1, z);
for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
if (vm->m_data[vi].getContent() == CONTENT_IGNORE) {
if (y <= surface_y) {
vm->m_data[vi] = n_stone;
} else if (y <= water_level) {
vm->m_data[vi] = n_water;
} else {
vm->m_data[vi] = n_air;
}
}
VoxelArea::add_y(em, vi, 1);
}
}
return stone_surface_max_y;
}
void MapgenTrailgen::calculateNoise()
{
s16 x = node_min.X;
s16 z = node_min.Z;
noise_terrain_base->perlinMap2D_PO(x, 0.5, z, 0.5);
noise_terrain_higher->perlinMap2D_PO(x, 0.5, z, 0.5);
noise_steepness->perlinMap2D_PO(x, 0.5, z, 0.5);
noise_height_select->perlinMap2D_PO(x, 0.5, z, 0.5);
}

View File

@ -0,0 +1,92 @@
/*
Minetest
Copyright (C) 2015-2020 paramat
Copyright (C) 2015-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
Copyright (C) 2021-2022 cartmic, Michael Carter
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#pragma once
#include "mapgen.h"
#define MGTRAILGEN_CAVERNS 0x01
class BiomeManager;
extern FlagDesc flagdesc_mapgen_trailgen[];
struct MapgenTrailgenParams : public MapgenParams
{
float cave_width = 0.09f;
u16 small_cave_num_min = 0;
u16 small_cave_num_max = 0;
u16 large_cave_num_min = 0;
u16 large_cave_num_max = 2;
s16 large_cave_depth = -33;
float large_cave_flooded = 0.5f;
s16 cavern_limit = -256;
s16 cavern_taper = 256;
float cavern_threshold = 0.7f;
s16 dungeon_ymin = -31000;
s16 dungeon_ymax = 31000;
NoiseParams np_terrain_base;
NoiseParams np_terrain_higher;
NoiseParams np_steepness;
NoiseParams np_height_select;
NoiseParams np_filler_depth;
NoiseParams np_cavern;
NoiseParams np_cave1;
NoiseParams np_cave2;
NoiseParams np_dungeons;
MapgenTrailgenParams();
~MapgenTrailgenParams() = default;
void readParams(const Settings *settings);
void writeParams(Settings *settings) const;
void setDefaultSettings(Settings *settings);
};
class MapgenTrailgen : public MapgenBasic
{
public:
MapgenTrailgen(MapgenTrailgenParams *params, EmergeParams *emerge);
virtual ~MapgenTrailgen() override;
virtual MapgenType getType() const override { return MAPGEN_TRAILGEN; }
virtual void makeChunk(BlockMakeData *data) override;
float baseTerrainLevel(float terrain_base, float terrain_higher,
float steepness, float height_select);
float baseTerrainLevelFromNoise(v2s16 p);
float baseTerrainLevelFromMap(u32 index);
virtual int getSpawnLevelAtPoint(v2s16 p) override;
s16 generateTerrain();
void calculateNoise();
private:
Noise *noise_terrain_base;
Noise *noise_terrain_higher;
Noise *noise_steepness;
Noise *noise_height_select;
};