diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 72a5db206..c1a645dca 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -1151,11 +1151,11 @@ mgv6_np_apple_trees (Apple trees noise) noise_params 0, 1, (100, 100, 100), 3429 [***Mapgen v7] # Map generation attributes specific to Mapgen v7. -# The 'ridges' flag enables the rivers. -# Floatlands are currently experimental and subject to change. +# '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 mountains,ridges,floatlands,caverns,nomountains,noridges,nofloatlands,nocaverns +mgv7_spflags (Mapgen v7 specific flags) flags mountains,ridges,nofloatlands,caverns,biomerepeat mountains,ridges,floatlands,caverns,biomerepeat,nomountains,noridges,nofloatlands,nocaverns,nobiomerepeat # Controls width of tunnels, a smaller value creates wider tunnels. mgv7_cave_width (Cave width) float 0.09 diff --git a/minetest.conf.example b/minetest.conf.example index f29849baf..9e4a0e2ee 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -1390,12 +1390,12 @@ #### Mapgen v7 # Map generation attributes specific to Mapgen v7. -# The 'ridges' flag enables the rivers. -# Floatlands are currently experimental and subject to change. +# '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. -# type: flags possible values: mountains, ridges, floatlands, caverns, nomountains, noridges, nofloatlands, nocaverns -# mgv7_spflags = mountains,ridges,nofloatlands,caverns +# type: flags possible values: mountains, ridges, floatlands, caverns, biomerepeat, nomountains, noridges, nofloatlands, nocaverns, nobiomerepeat +# mgv7_spflags = mountains,ridges,nofloatlands,caverns,biomerepeat # Controls width of tunnels, a smaller value creates wider tunnels. # type: float diff --git a/src/mapgen_v7.cpp b/src/mapgen_v7.cpp index 4b263bdb3..cdf76993d 100644 --- a/src/mapgen_v7.cpp +++ b/src/mapgen_v7.cpp @@ -40,11 +40,12 @@ with this program; if not, write to the Free Software Foundation, Inc., FlagDesc flagdesc_mapgen_v7[] = { - {"mountains", MGV7_MOUNTAINS}, - {"ridges", MGV7_RIDGES}, - {"floatlands", MGV7_FLOATLANDS}, - {"caverns", MGV7_CAVERNS}, - {NULL, 0} + {"mountains", MGV7_MOUNTAINS}, + {"ridges", MGV7_RIDGES}, + {"floatlands", MGV7_FLOATLANDS}, + {"caverns", MGV7_CAVERNS}, + {"biomerepeat", MGV7_BIOMEREPEAT}, + {NULL, 0} }; @@ -285,6 +286,12 @@ 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(); @@ -298,7 +305,7 @@ void MapgenV7::makeChunk(BlockMakeData *data) // Init biome generator, place biome-specific nodes, and build biomemap biomegen->calcBiomeNoise(node_min); - MgStoneType stone_type = generateBiomes(water_level - 1); + MgStoneType stone_type = generateBiomes(biome_zero_level); // Generate caverns, tunnels and classic caves if (flags & MG_CAVES) { @@ -323,7 +330,7 @@ void MapgenV7::makeChunk(BlockMakeData *data) // Generate the registered decorations if (flags & MG_DECORATIONS) m_emerge->decomgr->placeAllDecos(this, blockseed, - node_min, node_max, water_level - 1); + node_min, node_max, biome_zero_level); // Generate the registered ores m_emerge->oremgr->placeAllOres(this, blockseed, diff --git a/src/mapgen_v7.h b/src/mapgen_v7.h index 7b4364ef1..aededa7f5 100644 --- a/src/mapgen_v7.h +++ b/src/mapgen_v7.h @@ -23,11 +23,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "mapgen.h" -//////////// Mapgen V7 flags -#define MGV7_MOUNTAINS 0x01 -#define MGV7_RIDGES 0x02 -#define MGV7_FLOATLANDS 0x04 -#define MGV7_CAVERNS 0x08 +/////////////// Mapgen V7 flags +#define MGV7_MOUNTAINS 0x01 +#define MGV7_RIDGES 0x02 +#define MGV7_FLOATLANDS 0x04 +#define MGV7_CAVERNS 0x08 +#define MGV7_BIOMEREPEAT 0x10 class BiomeManager; @@ -35,7 +36,8 @@ extern FlagDesc flagdesc_mapgen_v7[]; struct MapgenV7Params : public MapgenParams { - u32 spflags = MGV7_MOUNTAINS | MGV7_RIDGES | MGV7_CAVERNS; + u32 spflags = MGV7_MOUNTAINS | MGV7_RIDGES | + MGV7_CAVERNS | MGV7_BIOMEREPEAT; float cave_width = 0.09f; s16 large_cave_depth = -33; s16 lava_depth = -256;