Mapgen: Add Carpathian mapgen (#6015)
authorVaughan Lapsley <vlapsley@users.noreply.github.com>
Thu, 6 Jul 2017 11:53:56 +0000 (21:53 +1000)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Thu, 6 Jul 2017 11:53:56 +0000 (13:53 +0200)
build/android/jni/Android.mk
builtin/settingtypes.txt
minetest.conf.example
src/CMakeLists.txt
src/mapgen.cpp
src/mapgen.h
src/mapgen_carpathian.cpp [new file with mode: 0644]
src/mapgen_carpathian.h [new file with mode: 0644]
util/travis/clang-format-whitelist.txt

index 6155b0d9cef79b59409bcf5f1c195ab243e041cb..889c24776750c1968dc72eb7ba999bb9fd91218a 100644 (file)
@@ -175,6 +175,7 @@ LOCAL_SRC_FILES := \
                jni/src/mapblock.cpp                      \
                jni/src/mapblock_mesh.cpp                 \
                jni/src/mapgen.cpp                        \
+               jni/src/mapgen_carpathian.cpp             \
                jni/src/mapgen_flat.cpp                   \
                jni/src/mapgen_fractal.cpp                \
                jni/src/mapgen_singlenode.cpp             \
index 10e3969e7ee25c3f844dffe8d85217cd33291f16..0f2a329ad44868c1243d1a3f64fd56adf84105db 100644 (file)
@@ -1220,6 +1220,76 @@ mgv7_np_cave1 (Cave1 noise) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
 #    Second of 2 3D noises that together define tunnels.
 mgv7_np_cave2 (Cave2 noise) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
+[***Mapgen carpathian]
+
+#    Map generation attributes specific to Mapgen Carpathian.
+#    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.
+mgcarpathian_spflags (Mapgen Carpathian specific flags) flags caverns caverns,nocaverns
+
+#    Controls width of tunnels, a smaller value creates wider tunnels.
+mgcarpathian_cave_width (Cave width) float 0.09
+
+#    Y of upper limit of large pseudorandom caves.
+mgcarpathian_large_cave_depth (Large cave depth) int -33
+
+#    Y-level of cavern upper limit.
+mgcarpathian_cavern_limit (Cavern limit) int -256
+
+#    Y-distance over which caverns expand to full size.
+mgcarpathian_cavern_taper (Cavern taper) int 256
+
+#    Defines full size of caverns, smaller values create larger caverns.
+mgcarpathian_cavern_threshold (Cavern threshold) float 0.7
+
+#    2D noise that defines the base ground level.
+mgcarpathian_np_base (Base ground noise) noise_params 12, 1, (2557, 2557, 2557), 6538, 4, 0.8, 0.5
+
+#    Variation of biome filler depth.
+mgcarpathian_np_filler_depth (Filler depth noise) noise_params 0, 1, (128, 128, 128), 261, 3, 0.7, 2.0
+
+#    First of 4 3D noises that together define hill/mountain range height.
+mgcarpathian_np_height1 (Hilliness1 noise) noise_params 0, 5, (251, 251, 251), 9613, 5, 0.5, 2.0
+
+#    Second of 4 3D noises that together define hill/mountain range height.
+mgcarpathian_np_height2 (Hilliness2 noise) noise_params 0, 5, (383, 383, 383), 1949, 5, 0.5, 2.0
+
+#    Third of 4 3D noises that together define hill/mountain range height.
+mgcarpathian_np_height3 (Hilliness3 noise) noise_params 0, 5, (509, 509, 509), 3211, 5, 0.5, 2.0
+
+#    Fourth of 4 3D noises that together define hill/mountain range height.
+mgcarpathian_np_height4 (Hilliness4 noise) noise_params 0, 5, (631, 631, 631), 1583, 5, 0.5, 2.0
+
+#    2D noise that controls the size/occurance of rolling hills.
+mgcarpathian_np_hills_terrain (Rolling hills spread noise) noise_params 1, 1, (1301, 1301, 1301), 1692, 3, 0.5, 2.0
+
+#    2D noise that controls the size/occurance of ridged mountain ranges.
+mgcarpathian_np_ridge_terrain (Ridge mountain spread noise) noise_params 1, 1, (1889, 1889, 1889), 3568, 3, 0.5, 2.0
+
+#    2D noise that controls the size/occurance of step mountain ranges.
+mgcarpathian_np_step_terrain (Step mountain spread noise) noise_params 1, 1, (1889, 1889, 1889), 4157, 3, 0.5, 2.0
+
+#    2D noise that controls the shape/size of rolling hills.
+mgcarpathian_np_hills (Rolling hill size noise) noise_params 0, 3, (257, 257, 257), 6604, 6, 0.5, 2.0
+
+#    2D noise that controls the shape/size of ridged mountains.
+mgcarpathian_np_ridge_mnt (Ridged mountain size noise) noise_params 0, 12, (743, 743, 743), 5520, 6, 0.7, 2.0
+
+#    2D noise that controls the shape/size of step mountains.
+mgcarpathian_np_step_mnt (Step mountain size noise) noise_params 0, 8, (509, 509, 509), 2590, 6, 0.6, 2.0
+
+#    3D noise for mountain overhangs, cliffs, etc. Usually small variations.
+mgcarpathian_np_mnt_var (Mountain variation noise) noise_params 0, 1, (499, 499, 499), 2490, 5, 0.6, 2.0
+
+#    First of 2 3D noises that together define tunnels.
+mgcarpathian_np_cave1 (Cave1 noise) noise_params 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+
+#    Second of 2 3D noises that together define tunnels.
+mgcarpathian_np_cave2 (Cave2 noise) noise_params 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
+
+#    3D noise defining giant caverns.
+mgcarpathian_np_cavern (Cavern noise) noise_params 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0
+
 [***Mapgen flat]
 
 #    Map generation attributes specific to Mapgen flat.
index 77cc3ed53c5840ba28162a7e5a92890d29090636..5d54c23f34221b99a08d8860b8ace2f2ce4062d2 100644 (file)
 #    type: noise_params
 # mgv7_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
 
+#### Mapgen carpathian
+
+#    Map generation attributes specific to Mapgen Carpathian.
+#    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.
+#    type: flags possible values: caverns, nocaverns
+# mgcarpathian_spflags = caverns
+
+#    Controls width of tunnels, a smaller value creates wider tunnels.
+#    type: float
+# mgcarpathian_cave_width = 0.09
+
+#    Y of upper limit of large pseudorandom caves.
+#    type: int
+# mgcarpathian_large_cave_depth = -33
+#    Y-level of cavern upper limit.
+#    type: int
+# mgcarpathian_cavern_limit = -256
+
+#    Y-distance over which caverns expand to full size.
+#    type: int
+# mgcarpathian_cavern_taper = 256
+
+#    Defines full size of caverns, smaller values create larger caverns.
+#    type: float
+# mgcarpathian_cavern_threshold = 0.7
+
+#    2D noise that defines the base ground level.
+#    type: noise_params
+# mgcarpathian_np_base = 12, 1, (2557, 2557, 2557), 6538, 4, 0.8, 0.5
+
+#    Variation of biome filler depth.
+#    type: noise_params
+# mgcarpathian_np_filler_depth = 0, 1, (128, 128, 128), 261, 3, 0.7, 2.0
+
+#    First of 4 3D noises that together define hill/mountain range height.
+#    type: noise_params
+# mgcarpathian_np_height1 = 0, 5, (251, 251, 251), 9613, 5, 0.5, 2.0
+
+#    Second of 4 3D noises that together define hill/mountain range height.
+#    type: noise_params
+# mgcarpathian_np_height2 = 0, 5, (383, 383, 383), 1949, 5, 0.5, 2.0
+
+#    Third of 4 3D noises that together definehill/mountain range height.
+#    type: noise_params
+# mgcarpathian_np_height3 = 0, 5, (509, 509, 509), 3211, 5, 0.5, 2.0
+
+#    Fourth of 4 3D noises that together define hill/mountain range height.
+#    type: noise_params
+# mgcarpathian_np_height4 = 0, 5, (631, 631, 631), 1583, 5, 0.5, 2.0
+
+#    2D noise that controls the size/occurance of rolling hills.
+#    type: noise_params
+# mgcarpathian_np_hills_terrain = 1, 1, (1301, 1301, 1301), 1692, 3, 0.5, 2.0
+
+#    2D noise that controls the size/occurance of ridged mountain ranges.
+#    type: noise_params
+# mgcarpathian_np_ridge_terrain = 1, 1, (1889, 1889, 1889), 3568, 3, 0.5, 2.0
+
+#    2D noise that controls the size/occurance of step mountain ranges.
+#    type: noise_params
+# mgcarpathian_np_step_terrain = 1, 1, (1889, 1889, 1889), 4157, 3, 0.5, 2.0
+
+#    2D noise that controls the shape/size of rolling hills.
+#    type: noise_params
+# mgcarpathian_np_hills = 0, 3, (257, 257, 257), 6604, 6, 0.5, 2.0
+
+#    2D noise that controls the shape/size of ridged mountains.
+#    type: noise_params
+# mgcarpathian_np_ridge_mnt = 0, 12, (743, 743, 743), 5520, 6, 0.7, 2.0
+
+#    2D noise that controls the shape/size of step mountains.
+#    type: noise_params
+# mgcarpathian_np_step_mnt = 0, 8, (509, 509, 509), 2590, 6, 0.6, 2.0
+
+#    3D noise for mountain overhangs, cliffs, etc. Usually small variations.
+#    type: noise_params
+# mgcarpathian_np_mnt_var = 0, 1, (499, 499, 499), 2490, 5, 0.6, 2.0
+
+#    First of 2 3D noises that together define tunnels.
+#    type: noise_params
+# mgcarpathian_np_cave1 = 0, 12, (61, 61, 61), 52534, 3, 0.5, 2.0
+
+#    Second of 2 3D noises that together define tunnels.
+#    type: noise_params
+# mgcarpathian_np_cave2 = 0, 12, (67, 67, 67), 10325, 3, 0.5, 2.0
+
+#    3D noise defining giant caverns.
+#    type: noise_params
+# mgcarpathian_np_cavern = 0, 1, (384, 128, 384), 723, 5, 0.63, 2.0
+
 #### Mapgen flat
 
 #    Map generation attributes specific to Mapgen flat.
index e03f3f397e096ff42de95a69e5c1745791e32ec7..75a835b897d2a9c1a59bd3eff7b5b3566859fd28 100644 (file)
@@ -400,6 +400,7 @@ set(common_SRCS
        map_settings_manager.cpp
        mapblock.cpp
        mapgen.cpp
+       mapgen_carpathian.cpp
        mapgen_flat.cpp
        mapgen_fractal.cpp
        mapgen_singlenode.cpp
index e40bf2a7ede09e62b2f60684d2256fae5992c37c..b095d34c8756ea1d2f004fa604b2b8b62b702125 100644 (file)
@@ -40,6 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "util/numeric.h"
 #include "filesys.h"
 #include "log.h"
+#include "mapgen_carpathian.h"
 #include "mapgen_flat.h"
 #include "mapgen_fractal.h"
 #include "mapgen_v5.h"
@@ -86,6 +87,7 @@ static MapgenDesc g_reg_mapgens[] = {
        {"fractal",    true},
        {"valleys",    true},
        {"singlenode", true},
+       {"carpathian", true},
 };
 
 STATIC_ASSERT(
@@ -159,6 +161,8 @@ Mapgen *Mapgen::createMapgen(MapgenType mgtype, int mgid,
        MapgenParams *params, EmergeManager *emerge)
 {
        switch (mgtype) {
+       case MAPGEN_CARPATHIAN:
+               return new MapgenCarpathian(mgid, (MapgenCarpathianParams *)params, emerge);
        case MAPGEN_FLAT:
                return new MapgenFlat(mgid, (MapgenFlatParams *)params, emerge);
        case MAPGEN_FRACTAL:
@@ -182,6 +186,8 @@ Mapgen *Mapgen::createMapgen(MapgenType mgtype, int mgid,
 MapgenParams *Mapgen::createMapgenParams(MapgenType mgtype)
 {
        switch (mgtype) {
+       case MAPGEN_CARPATHIAN:
+               return new MapgenCarpathianParams;
        case MAPGEN_FLAT:
                return new MapgenFlatParams;
        case MAPGEN_FRACTAL:
index 9369a6c357f9b8898a94b9bce3ef283ebdc6b977..7acceddaf89681d7a7f47a2d62513456a05e8543 100644 (file)
@@ -118,6 +118,7 @@ enum MapgenType {
        MAPGEN_FRACTAL,
        MAPGEN_VALLEYS,
        MAPGEN_SINGLENODE,
+       MAPGEN_CARPATHIAN,
        MAPGEN_INVALID,
 };
 
diff --git a/src/mapgen_carpathian.cpp b/src/mapgen_carpathian.cpp
new file mode 100644 (file)
index 0000000..8529fd5
--- /dev/null
@@ -0,0 +1,448 @@
+/*
+Minetest
+Copyright (C) 2010-2016 paramat, Matt Gregory
+Copyright (C) 2010-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
+Copyright (C) 2017 vlapsley, Vaughan Lapsley <vlapsley@gmail.com>
+
+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 <cmath>
+#include "mapgen.h"
+#include "voxel.h"
+#include "noise.h"
+#include "mapblock.h"
+#include "mapnode.h"
+#include "map.h"
+#include "content_sao.h"
+#include "nodedef.h"
+#include "voxelalgorithms.h"
+//#include "profiler.h" // For TimeTaker
+#include "settings.h" // For g_settings
+#include "emerge.h"
+#include "dungeongen.h"
+#include "cavegen.h"
+#include "mg_biome.h"
+#include "mg_ore.h"
+#include "mg_decoration.h"
+#include "mapgen_carpathian.h"
+
+
+FlagDesc flagdesc_mapgen_carpathian[] = {
+       {"caverns", MGCARPATHIAN_CAVERNS},
+       {NULL,      0}
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+MapgenCarpathian::MapgenCarpathian(
+               int mapgenid, MapgenCarpathianParams *params, EmergeManager *emerge)
+       : MapgenBasic(mapgenid, params, emerge)
+{
+       spflags          = params->spflags;
+       cave_width       = params->cave_width;
+       large_cave_depth = params->large_cave_depth;
+       cavern_limit     = params->cavern_limit;
+       cavern_taper     = params->cavern_taper;
+       cavern_threshold = params->cavern_threshold;
+       grad_wl          = 1 - water_level;
+
+       //// 2D Terrain noise
+       noise_base          = new Noise(&params->np_base,          seed, csize.X, csize.Z);
+       noise_filler_depth  = new Noise(&params->np_filler_depth,  seed, csize.X, csize.Z);
+       noise_height1       = new Noise(&params->np_height1,       seed, csize.X, csize.Z);
+       noise_height2       = new Noise(&params->np_height2,       seed, csize.X, csize.Z);
+       noise_height3       = new Noise(&params->np_height3,       seed, csize.X, csize.Z);
+       noise_height4       = new Noise(&params->np_height4,       seed, csize.X, csize.Z);
+       noise_hills_terrain = new Noise(&params->np_hills_terrain, seed, csize.X, csize.Z);
+       noise_ridge_terrain = new Noise(&params->np_ridge_terrain, seed, csize.X, csize.Z);
+       noise_step_terrain  = new Noise(&params->np_step_terrain,  seed, csize.X, csize.Z);
+       noise_hills         = new Noise(&params->np_hills,         seed, csize.X, csize.Z);
+       noise_ridge_mnt     = new Noise(&params->np_ridge_mnt,     seed, csize.X, csize.Z);
+       noise_step_mnt      = new Noise(&params->np_step_mnt,      seed, csize.X, csize.Z);
+
+       //// 3D terrain noise
+       // 1 up 1 down overgeneration
+       noise_mnt_var = new Noise(&params->np_mnt_var, seed, csize.X, csize.Y + 2, csize.Z);
+
+       //// Cave noise
+       MapgenBasic::np_cave1  = params->np_cave1;
+       MapgenBasic::np_cave2  = params->np_cave2;
+       MapgenBasic::np_cavern = params->np_cavern;
+}
+
+
+MapgenCarpathian::~MapgenCarpathian()
+{
+       delete noise_base;
+       delete noise_filler_depth;
+       delete noise_height1;
+       delete noise_height2;
+       delete noise_height3;
+       delete noise_height4;
+       delete noise_hills_terrain;
+       delete noise_ridge_terrain;
+       delete noise_step_terrain;
+       delete noise_hills;
+       delete noise_ridge_mnt;
+       delete noise_step_mnt;
+       delete noise_mnt_var;
+}
+
+
+MapgenCarpathianParams::MapgenCarpathianParams()
+{
+       np_base          = NoiseParams(12, 1,  v3f(2557, 2557, 2557), 6538,  4, 0.8,  0.5);
+       np_filler_depth  = NoiseParams(0,  1,  v3f(128,  128,  128),  261,   3, 0.7,  2.0);
+       np_height1       = NoiseParams(0,  5,  v3f(251,  251,  251),  9613,  5, 0.5,  2.0);
+       np_height2       = NoiseParams(0,  5,  v3f(383,  383,  383),  1949,  5, 0.5,  2.0);
+       np_height3       = NoiseParams(0,  5,  v3f(509,  509,  509),  3211,  5, 0.5,  2.0);
+       np_height4       = NoiseParams(0,  5,  v3f(631,  631,  631),  1583,  5, 0.5,  2.0);
+       np_hills_terrain = NoiseParams(1,  1,  v3f(1301, 1301, 1301), 1692,  5, 0.5,  2.0);
+       np_ridge_terrain = NoiseParams(1,  1,  v3f(1889, 1889, 1889), 3568,  5, 0.5,  2.0);
+       np_step_terrain  = NoiseParams(1,  1,  v3f(1889, 1889, 1889), 4157,  5, 0.5,  2.0);
+       np_hills         = NoiseParams(0,  3,  v3f(257,  257,  257),  6604,  6, 0.5,  2.0);
+       np_ridge_mnt     = NoiseParams(0,  12, v3f(743,  743,  743),  5520,  6, 0.7,  2.0);
+       np_step_mnt      = NoiseParams(0,  8,  v3f(509,  509,  509),  2590,  6, 0.6,  2.0);
+       np_mnt_var       = NoiseParams(0,  1,  v3f(499,  499,  499),  2490,  5, 0.6,  2.0);
+       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_cavern        = NoiseParams(0,  1,  v3f(384,  128,  384),  723,   5, 0.63, 2.0);
+}
+
+
+void MapgenCarpathianParams::readParams(const Settings *settings)
+{
+       settings->getFlagStrNoEx("mgcarpathian_spflags", spflags, flagdesc_mapgen_carpathian);
+       settings->getFloatNoEx("mgcarpathian_cave_width",       cave_width);
+       settings->getS16NoEx("mgcarpathian_large_cave_depth",   large_cave_depth);
+       settings->getS16NoEx("mgcarpathian_cavern_limit",       cavern_limit);
+       settings->getS16NoEx("mgcarpathian_cavern_taper",       cavern_taper);
+       settings->getFloatNoEx("mgcarpathian_cavern_threshold", cavern_threshold);
+
+       settings->getNoiseParams("mgcarpathian_np_base",          np_base);
+       settings->getNoiseParams("mgcarpathian_np_filler_depth",  np_filler_depth);
+       settings->getNoiseParams("mgcarpathian_np_height1",       np_height1);
+       settings->getNoiseParams("mgcarpathian_np_height2",       np_height2);
+       settings->getNoiseParams("mgcarpathian_np_height3",       np_height3);
+       settings->getNoiseParams("mgcarpathian_np_height4",       np_height4);
+       settings->getNoiseParams("mgcarpathian_np_hills_terrain", np_hills_terrain);
+       settings->getNoiseParams("mgcarpathian_np_ridge_terrain", np_ridge_terrain);
+       settings->getNoiseParams("mgcarpathian_np_step_terrain",  np_step_terrain);
+       settings->getNoiseParams("mgcarpathian_np_hills",         np_hills);
+       settings->getNoiseParams("mgcarpathian_np_ridge_mnt",     np_ridge_mnt);
+       settings->getNoiseParams("mgcarpathian_np_step_mnt",      np_step_mnt);
+       settings->getNoiseParams("mgcarpathian_np_mnt_var",       np_mnt_var);
+       settings->getNoiseParams("mgcarpathian_np_cave1",         np_cave1);
+       settings->getNoiseParams("mgcarpathian_np_cave2",         np_cave2);
+       settings->getNoiseParams("mgcarpathian_np_cavern",        np_cavern);
+}
+
+
+void MapgenCarpathianParams::writeParams(Settings *settings) const
+{
+       settings->setFlagStr("mgcarpathian_spflags", spflags, flagdesc_mapgen_carpathian, U32_MAX);
+       settings->setFloat("mgcarpathian_cave_width",       cave_width);
+       settings->setS16("mgcarpathian_large_cave_depth",   large_cave_depth);
+       settings->setS16("mgcarpathian_cavern_limit",       cavern_limit);
+       settings->setS16("mgcarpathian_cavern_taper",       cavern_taper);
+       settings->setFloat("mgcarpathian_cavern_threshold", cavern_threshold);
+
+       settings->setNoiseParams("mgcarpathian_np_base",          np_base);
+       settings->setNoiseParams("mgcarpathian_np_filler_depth",  np_filler_depth);
+       settings->setNoiseParams("mgcarpathian_np_height1",       np_height1);
+       settings->setNoiseParams("mgcarpathian_np_height2",       np_height2);
+       settings->setNoiseParams("mgcarpathian_np_height3",       np_height3);
+       settings->setNoiseParams("mgcarpathian_np_height4",       np_height4);
+       settings->setNoiseParams("mgcarpathian_np_hills_terrain", np_hills_terrain);
+       settings->setNoiseParams("mgcarpathian_np_ridge_terrain", np_ridge_terrain);
+       settings->setNoiseParams("mgcarpathian_np_step_terrain",  np_step_terrain);
+       settings->setNoiseParams("mgcarpathian_np_hills",         np_hills);
+       settings->setNoiseParams("mgcarpathian_np_ridge_mnt",     np_ridge_mnt);
+       settings->setNoiseParams("mgcarpathian_np_step_mnt",      np_step_mnt);
+       settings->setNoiseParams("mgcarpathian_np_mnt_var",       np_mnt_var);
+       settings->setNoiseParams("mgcarpathian_np_cave1",         np_cave1);
+       settings->setNoiseParams("mgcarpathian_np_cave2",         np_cave2);
+       settings->setNoiseParams("mgcarpathian_np_cavern",        np_cavern);
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+// Lerp function
+inline float MapgenCarpathian::getLerp(float noise1, float noise2, float mod)
+{
+       return noise1 + mod * (noise2 - noise1);
+}
+
+// Steps function
+float MapgenCarpathian::getSteps(float noise1, float noise2)
+{
+       float w = fabs(noise2);
+       float k = floor(noise1 / w);
+       float f = (noise1 - k * w) / w;
+       float s = std::fmin(2.f * f, 1.f);
+       return (k + s) * w;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+void MapgenCarpathian::makeChunk(BlockMakeData *data)
+{
+       // Pre-conditions
+       assert(data->vmanip);
+       assert(data->nodedef);
+       assert(data->blockpos_requested.X >= data->blockpos_min.X &&
+                       data->blockpos_requested.Y >= data->blockpos_min.Y &&
+                       data->blockpos_requested.Z >= data->blockpos_min.Z);
+       assert(data->blockpos_requested.X <= data->blockpos_max.X &&
+                       data->blockpos_requested.Y <= data->blockpos_max.Y &&
+                       data->blockpos_requested.Z <= data->blockpos_max.Z);
+
+       this->generating = true;
+       this->vm = data->vmanip;
+       this->ndef = data->nodedef;
+
+       v3s16 blockpos_min = data->blockpos_min;
+       v3s16 blockpos_max = data->blockpos_max;
+       node_min = blockpos_min * MAP_BLOCKSIZE;
+       node_max = (blockpos_max + v3s16(1, 1, 1)) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
+       full_node_min = (blockpos_min - 1) * MAP_BLOCKSIZE;
+       full_node_max = (blockpos_max + 2) * MAP_BLOCKSIZE - v3s16(1, 1, 1);
+
+       // Create a block-specific seed
+       blockseed = getBlockSeed2(full_node_min, seed);
+
+       // Generate terrain
+       s16 stone_surface_max_y = generateTerrain();
+
+       // Create heightmap
+       updateHeightmap(node_min, node_max);
+
+       // Init biome generator, place biome-specific nodes, and build biomemap
+       biomegen->calcBiomeNoise(node_min);
+       MgStoneType stone_type = generateBiomes();
+
+       // Generate caverns, tunnels and classic caves
+       if (flags & MG_CAVES) {
+               bool has_cavern = false;
+               // Generate caverns
+               if (spflags & MGCARPATHIAN_CAVERNS)
+                       has_cavern = generateCaverns(stone_surface_max_y);
+               // Generate tunnels and classic caves
+               if (has_cavern)
+                       // Disable classic caves in this mapchunk by setting
+                       // 'large cave depth' to world base. Avoids excessive liquid in
+                       // large caverns and floating blobs of overgenerated liquid.
+                       generateCaves(stone_surface_max_y, -MAX_MAP_GENERATION_LIMIT);
+               else
+                       generateCaves(stone_surface_max_y, large_cave_depth);
+       }
+
+       // Generate dungeons
+       if (flags & MG_DUNGEONS)
+               generateDungeons(stone_surface_max_y, stone_type);
+
+       // Generate the registered decorations
+       if (flags & MG_DECORATIONS)
+               m_emerge->decomgr->placeAllDecos(this, blockseed, node_min, node_max);
+
+       // Generate the registered ores
+       m_emerge->oremgr->placeAllOres(this, blockseed, node_min, node_max);
+
+       // Sprinkle some dust on top after everything else was generated
+       dustTopNodes();
+
+       // Update liquids
+       updateLiquid(&data->transforming_liquid, full_node_min, full_node_max);
+
+       // Calculate lighting
+       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;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+int MapgenCarpathian::getSpawnLevelAtPoint(v2s16 p)
+{
+       s16 level_at_point = terrainLevelAtPoint(p.X, p.Y);
+       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;
+}
+
+
+float MapgenCarpathian::terrainLevelAtPoint(s16 x, s16 z)
+{
+       float ground = NoisePerlin2D(&noise_base->np, x, z, seed);
+       float height1 = NoisePerlin2D(&noise_height1->np, x, z, seed);
+       float height2 = NoisePerlin2D(&noise_height2->np, x, z, seed);
+       float height3 = NoisePerlin2D(&noise_height3->np, x, z, seed);
+       float height4 = NoisePerlin2D(&noise_height4->np, x, z, seed);
+       float hter = NoisePerlin2D(&noise_hills_terrain->np, x, z, seed);
+       float rter = NoisePerlin2D(&noise_ridge_terrain->np, x, z, seed);
+       float ster = NoisePerlin2D(&noise_step_terrain->np, x, z, seed);
+       float n_hills = NoisePerlin2D(&noise_hills->np, x, z, seed);
+       float n_ridge_mnt = NoisePerlin2D(&noise_ridge_mnt->np, x, z, seed);
+       float n_step_mnt = NoisePerlin2D(&noise_step_mnt->np, x, z, seed);
+
+       int height = -MAX_MAP_GENERATION_LIMIT;
+
+       for (s16 y = 1; y <= 30; y++) {
+               float mnt_var = NoisePerlin3D(&noise_mnt_var->np, x, y, z, seed);
+
+               // Gradient & shallow seabed
+               s32 grad = (y < water_level) ? grad_wl + (water_level - y) * 3 : 1 - y;
+
+               // Hill/Mountain height (hilliness)
+               float hill1 = getLerp(height1, height2, mnt_var);
+               float hill2 = getLerp(height3, height4, mnt_var);
+               float hill3 = getLerp(height3, height2, mnt_var);
+               float hill4 = getLerp(height1, height4, mnt_var);
+               float hilliness = std::fmax(std::fmin(hill1, hill2), std::fmin(hill3, hill4));
+
+               // Rolling hills
+               float hill_mnt = hilliness * pow(n_hills, 2.f);
+               float hills = pow(hter, 3.f) * hill_mnt;
+
+               // Ridged mountains
+               float ridge_mnt = hilliness * (1.f - fabs(n_ridge_mnt));
+               float ridged_mountains = pow(rter, 3.f) * ridge_mnt;
+
+               // Step (terraced) mountains
+               float step_mnt = hilliness * getSteps(n_step_mnt, fabs(mnt_var));
+               float step_mountains = pow(ster, 3.f) * step_mnt;
+
+               // Final terrain level
+               float mountains = hills + ridged_mountains + step_mountains;
+               float surface_level = ground + mountains + grad;
+
+               if (y > surface_level && height < 0)
+                       height = y;
+       }
+
+       return height;
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+
+
+int MapgenCarpathian::generateTerrain()
+{
+       MapNode mn_air(CONTENT_AIR);
+       MapNode mn_stone(c_stone);
+       MapNode mn_water(c_water_source);
+
+       s16 stone_surface_max_y = -MAX_MAP_GENERATION_LIMIT;
+       u32 index2d = 0;
+       u32 index3d = 0;
+
+       // Calculate noise for terrain generation
+       noise_base->perlinMap2D(node_min.X, node_min.Z);
+       noise_height1->perlinMap2D(node_min.X, node_min.Z);
+       noise_height2->perlinMap2D(node_min.X, node_min.Z);
+       noise_height3->perlinMap2D(node_min.X, node_min.Z);
+       noise_height4->perlinMap2D(node_min.X, node_min.Z);
+       noise_hills_terrain->perlinMap2D(node_min.X, node_min.Z);
+       noise_ridge_terrain->perlinMap2D(node_min.X, node_min.Z);
+       noise_step_terrain->perlinMap2D(node_min.X, node_min.Z);
+       noise_hills->perlinMap2D(node_min.X, node_min.Z);
+       noise_ridge_mnt->perlinMap2D(node_min.X, node_min.Z);
+       noise_step_mnt->perlinMap2D(node_min.X, node_min.Z);
+       noise_mnt_var->perlinMap3D(node_min.X, node_min.Y - 1, node_min.Z);
+
+       //// Place nodes
+       for (s16 z = node_min.Z; z <= node_max.Z; z++) {
+               for (s16 y = node_min.Y - 1; y <= node_max.Y + 1; y++) {
+                       u32 vi = vm->m_area.index(node_min.X, y, z);
+                       for (s16 x = node_min.X; x <= node_max.X;
+                                       x++, vi++, index2d++, index3d++) {
+                               if (vm->m_data[vi].getContent() != CONTENT_IGNORE)
+                                       continue;
+
+                               // Base terrain
+                               float ground = noise_base->result[index2d];
+
+                               // Gradient & shallow seabed
+                               s32 grad = (y < water_level) ? grad_wl + (water_level - y) * 3 : 1 - y;
+
+                               // Hill/Mountain height (hilliness)
+                               float height1 = noise_height1->result[index2d];
+                               float height2 = noise_height2->result[index2d];
+                               float height3 = noise_height3->result[index2d];
+                               float height4 = noise_height4->result[index2d];
+                               float mnt_var = noise_mnt_var->result[index3d];
+                               // Combine height noises and apply 3D variation
+                               float hill1 = getLerp(height1, height2, mnt_var);
+                               float hill2 = getLerp(height3, height4, mnt_var);
+                               float hill3 = getLerp(height3, height2, mnt_var);
+                               float hill4 = getLerp(height1, height4, mnt_var);
+                               // 'hilliness' determines whether hills/mountains are
+                               // small or large
+                               float hilliness = std::fmax(std::fmin(hill1, hill2), std::fmin(hill3, hill4));
+
+                               // Rolling hills
+                               float hter = noise_hills_terrain->result[index2d];
+                               float n_hills = noise_hills->result[index2d];
+                               float hill_mnt = hilliness * pow(n_hills, 2.f);
+                               float hills = pow(fabs(hter), 3.f) * hill_mnt;
+
+                               // Ridged mountains
+                               float rter = noise_ridge_terrain->result[index2d];
+                               float n_ridge_mnt = noise_ridge_mnt->result[index2d];
+                               float ridge_mnt = hilliness * (1.f - fabs(n_ridge_mnt));
+                               float ridged_mountains = pow(fabs(rter), 3.f) * ridge_mnt;
+
+                               // Step (terraced) mountains
+                               float ster = noise_step_terrain->result[index2d];
+                               float n_step_mnt = noise_step_mnt->result[index2d];
+                               float step_mnt = hilliness * getSteps(n_step_mnt, fabs(mnt_var));
+                               float step_mountains = pow(fabs(ster), 3.f) * step_mnt;
+
+                               // Final terrain level
+                               float mountains = hills + ridged_mountains + step_mountains;
+                               float surface_level = ground + mountains + grad;
+
+                               if (y < surface_level) {
+                                       vm->m_data[vi] = mn_stone; // Stone
+                                       if (y > stone_surface_max_y)
+                                               stone_surface_max_y = y;
+                               } else if (y <= water_level) {
+                                       vm->m_data[vi] = mn_water; // Sea water
+                               } else {
+                                       vm->m_data[vi] = mn_air; // Air
+                               }
+                       }
+                       index2d -= ystride;
+               }
+               index2d += ystride;
+       }
+
+       return stone_surface_max_y;
+}
\ No newline at end of file
diff --git a/src/mapgen_carpathian.h b/src/mapgen_carpathian.h
new file mode 100644 (file)
index 0000000..2dba409
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+Minetest
+Copyright (C) 2010-2016 paramat, Matt Gregory
+Copyright (C) 2010-2016 kwolekr, Ryan Kwolek <kwolekr@minetest.net>
+Copyright (C) 2017 vlapsley, Vaughan Lapsley <vlapsley@gmail.com>
+
+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.
+*/
+
+#ifndef MAPGEN_CARPATHIAN_HEADER
+#define MAPGEN_CARPATHIAN_HEADER
+
+#include "mapgen.h"
+
+///////// Mapgen Carpathian flags
+#define MGCARPATHIAN_CAVERNS 0x01
+
+class BiomeManager;
+
+extern FlagDesc flagdesc_mapgen_carpathian[];
+
+
+struct MapgenCarpathianParams : public MapgenParams
+{
+       u32 spflags            = MGCARPATHIAN_CAVERNS;
+       float cave_width       = 0.09f;
+       s16 large_cave_depth   = -33;
+       s16 cavern_limit       = -256;
+       s16 cavern_taper       = 256;
+       float cavern_threshold = 0.7f;
+
+       NoiseParams np_base;
+       NoiseParams np_filler_depth;
+       NoiseParams np_height1;
+       NoiseParams np_height2;
+       NoiseParams np_height3;
+       NoiseParams np_height4;
+       NoiseParams np_hills_terrain;
+       NoiseParams np_ridge_terrain;
+       NoiseParams np_step_terrain;
+       NoiseParams np_hills;
+       NoiseParams np_ridge_mnt;
+       NoiseParams np_step_mnt;
+       NoiseParams np_mnt_var;
+       NoiseParams np_cave1;
+       NoiseParams np_cave2;
+       NoiseParams np_cavern;
+
+       MapgenCarpathianParams();
+       ~MapgenCarpathianParams() {}
+
+       void readParams(const Settings *settings);
+       void writeParams(Settings *settings) const;
+};
+
+class MapgenCarpathian : public MapgenBasic
+{
+public:
+       MapgenCarpathian(int mapgenid, MapgenCarpathianParams *params,
+                       EmergeManager *emerge);
+       ~MapgenCarpathian();
+
+       virtual MapgenType getType() const { return MAPGEN_CARPATHIAN; }
+
+       float getSteps(float noise1, float noise2);
+       inline float getLerp(float noise1, float noise2, float mod);
+
+       virtual void makeChunk(BlockMakeData *data);
+       int getSpawnLevelAtPoint(v2s16 p);
+
+private:
+       s16 large_cave_depth;
+       s32 grad_wl;
+
+       Noise *noise_base;
+       Noise *noise_height1;
+       Noise *noise_height2;
+       Noise *noise_height3;
+       Noise *noise_height4;
+       Noise *noise_hills_terrain;
+       Noise *noise_ridge_terrain;
+       Noise *noise_step_terrain;
+       Noise *noise_hills;
+       Noise *noise_ridge_mnt;
+       Noise *noise_step_mnt;
+       Noise *noise_mnt_var;
+
+       float terrainLevelAtPoint(s16 x, s16 z);
+       int generateTerrain();
+};
+
+#endif
\ No newline at end of file
index 23c036cb5395d37b3ae47a39ea9e59e2d8bbe55e..9883134d1492d796745630384e19138cc9f2a2c3 100644 (file)
@@ -129,6 +129,8 @@ src/mapblock_mesh.cpp
 src/mapblock_mesh.h
 src/map.cpp
 src/mapgen.cpp
+src/mapgen_carpathian.cpp
+src/mapgen_carpathian.h
 src/mapgen_flat.cpp
 src/mapgen_fractal.cpp
 src/mapgen.h