From 0a5373d4002d462208d810dd8c3b5f5f8b3cf429 Mon Sep 17 00:00:00 2001
From: paramat <mat.gregory@virginmedia.com>
Date: Sun, 30 Nov 2014 04:42:02 +0000
Subject: [PATCH] Add definable node_stone to biome API, mgv5, mgv7. Reduce and
 correct depth of mgv7 biomes. l_mapgen.cpp: add '#include mapgen_v5.h'
 because '#include mapgen_v7' is there. Improve underwater grass hack

---
 src/mapgen_v5.cpp               | 24 ++++++++++++++++--------
 src/mapgen_v7.cpp               | 25 +++++++++++++++++--------
 src/mg_biome.cpp                |  2 ++
 src/mg_biome.h                  |  2 ++
 src/script/lua_api/l_mapgen.cpp |  3 +++
 5 files changed, 40 insertions(+), 16 deletions(-)

diff --git a/src/mapgen_v5.cpp b/src/mapgen_v5.cpp
index ebc5e5719..3867827cc 100644
--- a/src/mapgen_v5.cpp
+++ b/src/mapgen_v5.cpp
@@ -451,23 +451,31 @@ void MapgenV5::generateBiomes() {
 				
 				if (c_below != CONTENT_AIR) {
 					if (nplaced < y0_top) {
-						// A hack to prevent dirt_with_grass from being
-						// placed below water.  TODO: fix later
-						content_t c_place = ((y < water_level) &&
-								(biome->c_top ==
-								c_dirt_with_grass)) ?
-								 c_dirt : biome->c_top;
-						
-						vm->m_data[i] = MapNode(c_place);
+						if(y < water_level)
+							vm->m_data[i] = MapNode(biome->c_filler);
+						else
+							vm->m_data[i] = MapNode(biome->c_top);
 						nplaced++;
 					} else if (nplaced < y0_filler && nplaced >= y0_top) {
 						vm->m_data[i] = MapNode(biome->c_filler);
 						nplaced++;
+					} else if (c == c_stone) {
+						have_air = false;
+						nplaced  = 0;
+						vm->m_data[i] = MapNode(biome->c_stone);
 					} else {
 						have_air = false;
 						nplaced  = 0;
 					}
+				} else if (c == c_stone) {
+					have_air = false;
+					nplaced = 0;
+					vm->m_data[i] = MapNode(biome->c_stone);
 				}
+			} else if (c == c_stone) {
+				have_air = false;
+				nplaced = 0;
+				vm->m_data[i] = MapNode(biome->c_stone);
 			} else if (c == c_water_source) {
 				have_air = true;
 				nplaced = 0;
diff --git a/src/mapgen_v7.cpp b/src/mapgen_v7.cpp
index 8e345164e..bad01bc2a 100644
--- a/src/mapgen_v7.cpp
+++ b/src/mapgen_v7.cpp
@@ -534,7 +534,7 @@ void MapgenV7::generateBiomes() {
 		Biome *biome  = (Biome *)bmgr->get(biomemap[index]);
 		s16 dfiller   = biome->depth_filler + noise_filler_depth->result[index];
 		s16 y0_top    = biome->depth_top;
-		s16 y0_filler = biome->depth_filler + biome->depth_top + dfiller;
+		s16 y0_filler = biome->depth_top + dfiller;
 
 		s16 nplaced = 0;
 		u32 i = vm->m_area.index(x, node_max.Y, z);	
@@ -560,22 +560,31 @@ void MapgenV7::generateBiomes() {
 				
 				if (c_below != CONTENT_AIR) {
 					if (nplaced < y0_top) {
-						// A hack to prevent dirt_with_grass from being
-						// placed below water.  TODO: fix later
-						content_t c_place = ((y < water_level) &&
-								(biome->c_top == c_dirt_with_grass)) ?
-								 c_dirt : biome->c_top;
-						
-						vm->m_data[i] = MapNode(c_place);
+						if(y < water_level)
+							vm->m_data[i] = MapNode(biome->c_filler);
+						else
+							vm->m_data[i] = MapNode(biome->c_top);
 						nplaced++;
 					} else if (nplaced < y0_filler && nplaced >= y0_top) {
 						vm->m_data[i] = MapNode(biome->c_filler);
 						nplaced++;
+					} else if (c == c_stone) {
+						have_air = false;
+						nplaced  = 0;
+						vm->m_data[i] = MapNode(biome->c_stone);
 					} else {
 						have_air = false;
 						nplaced  = 0;
 					}
+				} else if (c == c_stone) {
+					have_air = false;
+					nplaced = 0;
+					vm->m_data[i] = MapNode(biome->c_stone);
 				}
+			} else if (c == c_stone) {
+				have_air = false;
+				nplaced = 0;
+				vm->m_data[i] = MapNode(biome->c_stone);
 			} else if (c == c_water_source) {
 				have_air = true;
 				nplaced = 0;
diff --git a/src/mg_biome.cpp b/src/mg_biome.cpp
index 1746be25d..9a986b3de 100644
--- a/src/mg_biome.cpp
+++ b/src/mg_biome.cpp
@@ -58,6 +58,7 @@ BiomeManager::BiomeManager(IGameDef *gamedef)
 
 	resolver->addNode("air",                 "", CONTENT_AIR, &b->c_top);
 	resolver->addNode("air",                 "", CONTENT_AIR, &b->c_filler);
+	resolver->addNode("mapgen_stone",        "", CONTENT_AIR, &b->c_stone);
 	resolver->addNode("mapgen_water_source", "", CONTENT_AIR, &b->c_water);
 	resolver->addNode("air",                 "", CONTENT_AIR, &b->c_dust);
 	resolver->addNode("mapgen_water_source", "", CONTENT_AIR, &b->c_dust_water);
@@ -112,3 +113,4 @@ Biome *BiomeManager::getBiome(float heat, float humidity, s16 y)
 	
 	return biome_closest ? biome_closest : (Biome *)m_elements[0];
 }
+
diff --git a/src/mg_biome.h b/src/mg_biome.h
index d6130ee3a..7a62998e3 100644
--- a/src/mg_biome.h
+++ b/src/mg_biome.h
@@ -42,6 +42,7 @@ class Biome : public GenElement {
 
 	content_t c_top;
 	content_t c_filler;
+	content_t c_stone;
 	content_t c_water;
 	content_t c_dust;
 	content_t c_dust_water;
@@ -77,3 +78,4 @@ class BiomeManager : public GenElementManager {
 };
 
 #endif
+
diff --git a/src/script/lua_api/l_mapgen.cpp b/src/script/lua_api/l_mapgen.cpp
index 89bf8dadb..bb76bb450 100644
--- a/src/script/lua_api/l_mapgen.cpp
+++ b/src/script/lua_api/l_mapgen.cpp
@@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mg_ore.h"
 #include "mg_decoration.h"
 #include "mg_schematic.h"
+#include "mapgen_v5.h"
 #include "mapgen_v7.h"
 #include "settings.h"
 #include "main.h"
@@ -336,6 +337,8 @@ int ModApiMapgen::l_register_biome(lua_State *L)
 		 "mapgen_dirt_with_grass", CONTENT_AIR, &b->c_top);
 	resolver->addNode(getstringfield_default(L, index, "node_filler", ""),
 		"mapgen_dirt", CONTENT_AIR, &b->c_filler);
+	resolver->addNode(getstringfield_default(L, index, "node_stone", ""),
+		"mapgen_stone", CONTENT_AIR, &b->c_stone);
 	resolver->addNode(getstringfield_default(L, index, "node_water", ""),
 		"mapgen_water_source", CONTENT_AIR, &b->c_water);
 	resolver->addNode(getstringfield_default(L, index, "node_dust", ""),
-- 
GitLab