Heightmaps: Fix uninitialised values in mgv5/mgv6. findGroundLevel: Return -MAP_GENER...
[oweals/minetest.git] / src / mapgen_v7.cpp
index a7b9076b3f2c77b9d0920699885985867fe6b8c2..09e6e54c2805eb28eee7311a826e22826fa8474b 100644 (file)
@@ -142,7 +142,7 @@ MapgenV7Params::MapgenV7Params()
 }
 
 
-void MapgenV7Params::readParams(Settings *settings)
+void MapgenV7Params::readParams(const Settings *settings)
 {
        settings->getFlagStrNoEx("mgv7_spflags", spflags, flagdesc_mapgen_v7);
 
@@ -160,7 +160,7 @@ void MapgenV7Params::readParams(Settings *settings)
 }
 
 
-void MapgenV7Params::writeParams(Settings *settings)
+void MapgenV7Params::writeParams(Settings *settings) const
 {
        settings->setFlagStr("mgv7_spflags", spflags, flagdesc_mapgen_v7, (u32)-1);
 
@@ -210,6 +210,7 @@ int MapgenV7::getGroundLevelAtPoint(v2s16 p)
 
 void MapgenV7::makeChunk(BlockMakeData *data)
 {
+       // Pre-conditions
        assert(data->vmanip);
        assert(data->nodedef);
        assert(data->blockpos_requested.X >= data->blockpos_min.X &&
@@ -239,14 +240,15 @@ void MapgenV7::makeChunk(BlockMakeData *data)
        // Generate base terrain, mountains, and ridges with initial heightmaps
        s16 stone_surface_max_y = generateTerrain();
 
+       // Create heightmap
        updateHeightmap(node_min, node_max);
 
-       // Calculate biomes
+       // Create biomemap at heightmap surface
        bmgr->calcBiomes(csize.X, csize.Z, noise_heat->result,
                noise_humidity->result, heightmap, biomemap);
 
-       // Actually place the biome-specific nodes and what not
-       generateBiomes();
+       // Actually place the biome-specific nodes
+       generateBiomes(noise_heat->result, noise_humidity->result);
 
        if (flags & MG_CAVES)
                generateCaves(stone_surface_max_y);
@@ -534,7 +536,7 @@ void MapgenV7::generateRidgeTerrain()
 }
 
 
-void MapgenV7::generateBiomes()
+void MapgenV7::generateBiomes(float *heat_map, float *humidity_map)
 {
        if (node_max.Y < water_level)
                return;
@@ -548,12 +550,11 @@ void MapgenV7::generateBiomes()
 
        for (s16 z = node_min.Z; z <= node_max.Z; z++)
        for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
-               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_top + dfiller;
-               s16 shore_max       = water_level + biome->height_shore;
-               s16 depth_water_top = biome->depth_water_top;
+               Biome *biome = NULL;
+               s16 dfiller = 0;
+               s16 y0_top = 0;
+               s16 y0_filler = 0;
+               s16 depth_water_top = 0;
 
                s16 nplaced = 0;
                u32 i = vm->m_area.index(x, node_max.Y, z);
@@ -574,25 +575,23 @@ void MapgenV7::generateBiomes()
                                have_air = !getMountainTerrainFromMap(j, index, y);
                        }
 
+                       if (c != CONTENT_IGNORE && c != CONTENT_AIR && (y == node_max.Y || have_air)) {
+                               biome           = bmgr->getBiome(heat_map[index], humidity_map[index], y);
+                               dfiller         = biome->depth_filler + noise_filler_depth->result[index];
+                               y0_top          = biome->depth_top;
+                               y0_filler       = biome->depth_top + dfiller;
+                               depth_water_top = biome->depth_water_top;
+                       }
+
                        if (c == c_stone && have_air) {
                                content_t c_below = vm->m_data[i - em.X].getContent();
 
                                if (c_below != CONTENT_AIR) {
                                        if (nplaced < y0_top) {
-                                               if(y < water_level)
-                                                       vm->m_data[i] = MapNode(biome->c_underwater);
-                                               else if(y <= shore_max)
-                                                       vm->m_data[i] = MapNode(biome->c_shore_top);
-                                               else
-                                                       vm->m_data[i] = MapNode(biome->c_top);
+                                               vm->m_data[i] = MapNode(biome->c_top);
                                                nplaced++;
                                        } else if (nplaced < y0_filler && nplaced >= y0_top) {
-                                               if(y < water_level)
-                                                       vm->m_data[i] = MapNode(biome->c_underwater);
-                                               else if(y <= shore_max)
-                                                       vm->m_data[i] = MapNode(biome->c_shore_filler);
-                                               else
-                                                       vm->m_data[i] = MapNode(biome->c_filler);
+                                               vm->m_data[i] = MapNode(biome->c_filler);
                                                nplaced++;
                                        } else if (c == c_stone) {
                                                have_air = false;
@@ -792,7 +791,7 @@ void MapgenV7::generateCaves(int max_stone_y)
        PseudoRandom ps(blockseed + 21343);
        u32 bruises_count = (ps.range(1, 5) == 1) ? ps.range(1, 2) : 0;
        for (u32 i = 0; i < bruises_count; i++) {
-               CaveV7 cave(this, &ps, true);
+               CaveV7 cave(this, &ps);
                cave.makeCave(node_min, node_max, max_stone_y);
        }
 }