]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/mapgen.cpp
Move ContentFeatures to mapnode_contentfeatures.{h,cpp} and clean stuff
[dragonfireclient.git] / src / mapgen.cpp
index 0ba7f91abadb9d71178f0ed4bab29f84b04e553b..8fc568f36b226da59dda3a5528cd6d869b3e114f 100644 (file)
@@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mineral.h"
 //#include "serverobject.h"
 #include "content_sao.h"
+#include "mapnode_contentfeatures.h"
 
 namespace mapgen
 {
@@ -80,11 +81,12 @@ static s16 find_ground_level_clever(VoxelManipulator &vmanip, v2s16 p2d)
 }
 #endif
 
-static void make_tree(VoxelManipulator &vmanip, v3s16 p0)
+void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0, bool is_apple_tree)
 {
        MapNode treenode(CONTENT_TREE);
        MapNode leavesnode(CONTENT_LEAVES);
-
+       MapNode applenode(CONTENT_APPLE);
+       
        s16 trunk_h = myrand_range(4, 5);
        v3s16 p1 = p0;
        for(s16 ii=0; ii<trunk_h; ii++)
@@ -147,8 +149,14 @@ static void make_tree(VoxelManipulator &vmanip, v3s16 p0)
                                && vmanip.m_data[vi].getContent() != CONTENT_IGNORE)
                        continue;
                u32 i = leaves_a.index(x,y,z);
-               if(leaves_d[i] == 1)
-                       vmanip.m_data[vi] = leavesnode;
+               if(leaves_d[i] == 1) {
+                       bool is_apple = myrand_range(0,99) < 10;
+                       if(is_apple_tree && is_apple) {
+                               vmanip.m_data[vi] = applenode;
+                       } else {
+                               vmanip.m_data[vi] = leavesnode;
+                       }
+               }
        }
 }
 
@@ -976,6 +984,40 @@ static void make_dungeon1(VoxelManipulator &vmanip, PseudoRandom &random)
        }
 }
 
+static void make_nc(VoxelManipulator &vmanip, PseudoRandom &random)
+{
+       v3s16 dir;
+       u8 facedir_i = 0;
+       s32 r = random.range(0, 3);
+       if(r == 0){
+               dir = v3s16( 1, 0, 0);
+               facedir_i = 3;
+       }
+       if(r == 1){
+               dir = v3s16(-1, 0, 0);
+               facedir_i = 1;
+       }
+       if(r == 2){
+               dir = v3s16( 0, 0, 1);
+               facedir_i = 2;
+       }
+       if(r == 3){
+               dir = v3s16( 0, 0,-1);
+               facedir_i = 0;
+       }
+       v3s16 p = vmanip.m_area.MinEdge + v3s16(
+                       16+random.range(0,15),
+                       16+random.range(0,15),
+                       16+random.range(0,15));
+       vmanip.m_data[vmanip.m_area.index(p)] = MapNode(CONTENT_NC, facedir_i);
+       u32 length = random.range(3,15);
+       for(u32 j=0; j<length; j++)
+       {
+               p -= dir;
+               vmanip.m_data[vmanip.m_area.index(p)] = MapNode(CONTENT_NC_RB);
+       }
+}
+
 /*
        Noise functions. Make sure seed is mangled differently in each one.
 */
@@ -1364,6 +1406,7 @@ bool get_have_sand(u64 seed, v2s16 p2d)
 */
 void add_random_objects(MapBlock *block)
 {
+#if 0
        for(s16 z0=0; z0<MAP_BLOCKSIZE; z0++)
        for(s16 x0=0; x0<MAP_BLOCKSIZE; x0++)
        {
@@ -1424,6 +1467,7 @@ void add_random_objects(MapBlock *block)
                }
        }
        block->setChangedFlag();
+#endif
 }
 
 void make_block(BlockMakeData *data)
@@ -1518,7 +1562,7 @@ void make_block(BlockMakeData *data)
        /*
                Create a block-specific seed
        */
-       u32 blockseed = (u32)(data->seed%0x100000000) + full_node_min.Z*38134234
+       u32 blockseed = (u32)(data->seed%0x100000000ULL) + full_node_min.Z*38134234
                        + full_node_min.Y*42123 + full_node_min.X*23;
        
        /*
@@ -1783,6 +1827,16 @@ void make_block(BlockMakeData *data)
                                                if(noisebuf_ground_wetness.get(x,y,z) < -0.6)
                                                        vmanip.m_data[i] = MapNode(CONTENT_GRAVEL);
                                        }
+                                       else if(noisebuf_ground_crumbleness.get(x,y,z) <
+                                                       -3.0 + MYMIN(0.1 * sqrt((float)MYMAX(0, -y)), 1.5))
+                                       {
+                                               vmanip.m_data[i] = MapNode(CONTENT_LAVASOURCE);
+                                               for(s16 x1=-1; x1<=1; x1++)
+                                               for(s16 y1=-1; y1<=1; y1++)
+                                               for(s16 z1=-1; z1<=1; z1++)
+                                                       data->transforming_liquid.push_back(
+                                                                       v3s16(p2d.X+x1, y+y1, p2d.Y+z1));
+                                       }
                                }
 
                                data->vmanip->m_area.add_y(em, i, -1);
@@ -1871,6 +1925,17 @@ void make_block(BlockMakeData *data)
                        }
                }
        }
+
+       /*
+               Add NC
+       */
+       {
+               PseudoRandom ncrandom(blockseed+9324342);
+               if(ncrandom.range(0, 1000) == 0 && blockpos.Y <= -3)
+               {
+                       make_nc(vmanip, ncrandom);
+               }
+       }
        
        /*
                Add top and bottom side of water to transforming_liquid queue
@@ -2074,7 +2139,16 @@ void make_block(BlockMakeData *data)
                                        p.Y++;
                                        //if(surface_humidity_2d(data->seed, v2s16(x, y)) < 0.5)
                                        if(is_jungle == false)
-                                               make_tree(vmanip, p);
+                                       {
+                                               bool is_apple_tree;
+                                               if(myrand_range(0,4) != 0)
+                                                       is_apple_tree = false;
+                                               else
+                                                       is_apple_tree = noise2d_perlin(
+                                                                       0.5+(float)p.X/100, 0.5+(float)p.Z/100,
+                                                                       data->seed+342902, 3, 0.45) > 0.2;
+                                               make_tree(vmanip, p, is_apple_tree);
+                                       }
                                        else
                                                make_jungletree(vmanip, p);
                                }