From dc9e4517a89c3e67585908c88c01442c4d6e3efa Mon Sep 17 00:00:00 2001
From: paramat <paramat@users.noreply.github.com>
Date: Thu, 13 Jul 2017 21:03:16 +0100
Subject: Mgv7: Add option to repeat surface biomes in floatlands

---
 src/mapgen_v7.cpp | 21 ++++++++++++++-------
 src/mapgen_v7.h   | 14 ++++++++------
 2 files changed, 22 insertions(+), 13 deletions(-)

(limited to 'src')

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;
-- 
cgit v1.2.3