#include "noise.h"
#include "mapblock.h"
#include "map.h"
-#include "serverobject.h"
#include "mineral.h"
+//#include "serverobject.h"
+#include "content_sao.h"
namespace mapgen
{
else
length = random.range(1,6);
length = random.range(1,13);
- u32 partlength = random.range(1,length);
+ u32 partlength = random.range(1,13);
u32 partcount = 0;
s16 make_stairs = 0;
if(random.next()%2 == 0 && partlength >= 3)
continue;
v3s16 roomplace;
// X east, Z north, Y up
+#if 1
+ if(doordir == v3s16(1,0,0)) // X+
+ roomplace = doorplace +
+ v3s16(0,-1,m_random.range(-roomsize.Z+2,-2));
+ if(doordir == v3s16(-1,0,0)) // X-
+ roomplace = doorplace +
+ v3s16(-roomsize.X+1,-1,m_random.range(-roomsize.Z+2,-2));
+ if(doordir == v3s16(0,0,1)) // Z+
+ roomplace = doorplace +
+ v3s16(m_random.range(-roomsize.X+2,-2),-1,0);
+ if(doordir == v3s16(0,0,-1)) // Z-
+ roomplace = doorplace +
+ v3s16(m_random.range(-roomsize.X+2,-2),-1,-roomsize.Z+1);
+#endif
+#if 0
if(doordir == v3s16(1,0,0)) // X+
- roomplace = doorplace + v3s16(0,-1,-roomsize.Z/2+m_random.range(-roomsize.Z/2+1,roomsize.Z/2-1));
+ roomplace = doorplace + v3s16(0,-1,-roomsize.Z/2);
if(doordir == v3s16(-1,0,0)) // X-
- roomplace = doorplace + v3s16(-roomsize.X+1,-1,-roomsize.Z/2+m_random.range(-roomsize.Z/2+1,roomsize.Z/2-1));
+ roomplace = doorplace + v3s16(-roomsize.X+1,-1,-roomsize.Z/2);
if(doordir == v3s16(0,0,1)) // Z+
- roomplace = doorplace + v3s16(-roomsize.X/2+m_random.range(-roomsize.X/2+1,roomsize.X/2-1),-1,0);
+ roomplace = doorplace + v3s16(-roomsize.X/2,-1,0);
if(doordir == v3s16(0,0,-1)) // Z-
- roomplace = doorplace + v3s16(-roomsize.X/2+m_random.range(-roomsize.X/2+1,roomsize.X/2-1),-1,-roomsize.Z+1);
+ roomplace = doorplace + v3s16(-roomsize.X/2,-1,-roomsize.Z+1);
+#endif
// Check fit
bool fits = true;
// Determine walker start position
- bool start_in_last_room = (random.range(0,1)==0);
+ bool start_in_last_room = (random.range(0,2)!=0);
//bool start_in_last_room = true;
v3s16 walker_start_place;
Noise functions. Make sure seed is mangled differently in each one.
*/
-// This affects the shape of the contour
+/*
+ Scaling the output of the noise function affects the overdrive of the
+ contour function, which affects the shape of the output considerably.
+*/
+#define CAVE_NOISE_SCALE 12.0
//#define CAVE_NOISE_SCALE 10.0
//#define CAVE_NOISE_SCALE 7.5
-#define CAVE_NOISE_SCALE 5.0
+//#define CAVE_NOISE_SCALE 5.0
+//#define CAVE_NOISE_SCALE 1.0
+
+//#define CAVE_NOISE_THRESHOLD (2.5/CAVE_NOISE_SCALE)
+#define CAVE_NOISE_THRESHOLD (1.5/CAVE_NOISE_SCALE)
NoiseParams get_cave_noise1_params(u64 seed)
{
/*return NoiseParams(NOISE_PERLIN_CONTOUR, seed+52534, 5, 0.7,
200, CAVE_NOISE_SCALE);*/
- return NoiseParams(NOISE_PERLIN_CONTOUR, seed+52534, 4, 0.7,
- 100, CAVE_NOISE_SCALE);
+ /*return NoiseParams(NOISE_PERLIN_CONTOUR, seed+52534, 4, 0.7,
+ 100, CAVE_NOISE_SCALE);*/
+ /*return NoiseParams(NOISE_PERLIN_CONTOUR, seed+52534, 5, 0.6,
+ 100, CAVE_NOISE_SCALE);*/
+ /*return NoiseParams(NOISE_PERLIN_CONTOUR, seed+52534, 5, 0.3,
+ 100, CAVE_NOISE_SCALE);*/
+ return NoiseParams(NOISE_PERLIN_CONTOUR, seed+52534, 4, 0.5,
+ 50, CAVE_NOISE_SCALE);
+ //return NoiseParams(NOISE_CONSTANT_ONE);
}
NoiseParams get_cave_noise2_params(u64 seed)
{
/*return NoiseParams(NOISE_PERLIN_CONTOUR_FLIP_YZ, seed+10325, 5, 0.7,
200, CAVE_NOISE_SCALE);*/
- return NoiseParams(NOISE_PERLIN_CONTOUR_FLIP_YZ, seed+10325, 4, 0.7,
- 100, CAVE_NOISE_SCALE);
+ /*return NoiseParams(NOISE_PERLIN_CONTOUR_FLIP_YZ, seed+10325, 4, 0.7,
+ 100, CAVE_NOISE_SCALE);*/
+ /*return NoiseParams(NOISE_PERLIN_CONTOUR_FLIP_YZ, seed+10325, 5, 0.3,
+ 100, CAVE_NOISE_SCALE);*/
+ return NoiseParams(NOISE_PERLIN_CONTOUR_FLIP_YZ, seed+10325, 4, 0.5,
+ 50, CAVE_NOISE_SCALE);
+ //return NoiseParams(NOISE_CONSTANT_ONE);
}
-//#define CAVE_NOISE_THRESHOLD (2.5/CAVE_NOISE_SCALE)
-#define CAVE_NOISE_THRESHOLD (2.0/CAVE_NOISE_SCALE)
-
NoiseParams get_ground_noise1_params(u64 seed)
{
return NoiseParams(NOISE_PERLIN, seed+983240, 5,
TODO: No perlin noises here, they should be outsourced
and buffered
+ NOTE: The speed of these actually isn't terrible
*/
bool val_is_ground(double ground_noise1_val, v3s16 p, u64 seed)
{
//return ((double)p.Y < ground_noise1_val);
- double f = 0.8 + noise2d_perlin(
+ double f = 0.55 + noise2d_perlin(
0.5+(float)p.X/250, 0.5+(float)p.Z/250,
seed+920381, 3, 0.5);
if(f < 0.01)
f = 0.01;
else if(f >= 1.0)
- f *= 2.0;
+ f *= 1.6;
double h = WATER_LEVEL + 10 * noise2d_perlin(
0.5+(float)p.X/250, 0.5+(float)p.Z/250,
seed+84174, 4, 0.5);
+ /*double f = 1;
+ double h = 0;*/
return ((double)p.Y - h < ground_noise1_val * f);
}
v2s16 node_min = sectorpos*MAP_BLOCKSIZE;
v2s16 node_max = (sectorpos+v2s16(1,1))*MAP_BLOCKSIZE-v2s16(1,1);
double a = -31000;
+ // Corners
a = MYMAX(a, find_ground_level_from_noise(seed,
v2s16(node_min.X, node_min.Y), p));
a = MYMAX(a, find_ground_level_from_noise(seed,
v2s16(node_max.X, node_max.Y), p));
a = MYMAX(a, find_ground_level_from_noise(seed,
v2s16(node_min.X, node_min.Y), p));
+ // Center
a = MYMAX(a, find_ground_level_from_noise(seed,
v2s16(node_min.X+MAP_BLOCKSIZE/2, node_min.Y+MAP_BLOCKSIZE/2), p));
+ // Side middle points
+ a = MYMAX(a, find_ground_level_from_noise(seed,
+ v2s16(node_min.X+MAP_BLOCKSIZE/2, node_min.Y), p));
+ a = MYMAX(a, find_ground_level_from_noise(seed,
+ v2s16(node_min.X+MAP_BLOCKSIZE/2, node_max.Y), p));
+ a = MYMAX(a, find_ground_level_from_noise(seed,
+ v2s16(node_min.X, node_min.Y+MAP_BLOCKSIZE/2), p));
+ a = MYMAX(a, find_ground_level_from_noise(seed,
+ v2s16(node_max.X, node_min.Y+MAP_BLOCKSIZE/2), p));
return a;
}
v2s16 node_min = sectorpos*MAP_BLOCKSIZE;
v2s16 node_max = (sectorpos+v2s16(1,1))*MAP_BLOCKSIZE-v2s16(1,1);
double a = 31000;
+ // Corners
a = MYMIN(a, find_ground_level_from_noise(seed,
v2s16(node_min.X, node_min.Y), p));
a = MYMIN(a, find_ground_level_from_noise(seed,
v2s16(node_max.X, node_max.Y), p));
a = MYMIN(a, find_ground_level_from_noise(seed,
v2s16(node_min.X, node_min.Y), p));
+ // Center
a = MYMIN(a, find_ground_level_from_noise(seed,
v2s16(node_min.X+MAP_BLOCKSIZE/2, node_min.Y+MAP_BLOCKSIZE/2), p));
+ // Side middle points
+ a = MYMIN(a, find_ground_level_from_noise(seed,
+ v2s16(node_min.X+MAP_BLOCKSIZE/2, node_min.Y), p));
+ a = MYMIN(a, find_ground_level_from_noise(seed,
+ v2s16(node_min.X+MAP_BLOCKSIZE/2, node_max.Y), p));
+ a = MYMIN(a, find_ground_level_from_noise(seed,
+ v2s16(node_min.X, node_min.Y+MAP_BLOCKSIZE/2), p));
+ a = MYMIN(a, find_ground_level_from_noise(seed,
+ v2s16(node_max.X, node_min.Y+MAP_BLOCKSIZE/2), p));
return a;
}
/*dstream<<"makeBlock(): ("<<blockpos.X<<","<<blockpos.Y<<","
<<blockpos.Z<<")"<<std::endl;*/
- ManualMapVoxelManipulator &vmanip = data->vmanip;
+ ManualMapVoxelManipulator &vmanip = *(data->vmanip);
v3s16 blockpos_min = blockpos - v3s16(1,1,1);
v3s16 blockpos_max = blockpos + v3s16(1,1,1);
// Area of center block
vmanip.m_data[i] = MapNode(CONTENT_AIR);
}
- data->vmanip.m_area.add_y(em, i, 1);
+ data->vmanip->m_area.add_y(em, i, 1);
}
}
}
If block is deep underground, this is set to true and ground
density noise is not generated, for speed optimization.
*/
- bool all_is_ground_except_caves = (minimum_ground_depth > 16);
+ bool all_is_ground_except_caves = (minimum_ground_depth > 40);
/*
Create a block-specific seed
*/
- u32 blockseed = (data->seed%0x100000000) + full_node_min.Z*38134234
+ u32 blockseed = (u32)(data->seed%0x100000000) + full_node_min.Z*38134234
+ full_node_min.Y*42123 + full_node_min.X*23;
/*
/*
Cave noise
*/
-
+#if 1
noisebuf_cave.create(get_cave_noise1_params(data->seed),
minpos_f.X, minpos_f.Y, minpos_f.Z,
maxpos_f.X, maxpos_f.Y, maxpos_f.Z,
- 4, 3, 4);
-
+ 2, 2, 2);
noisebuf_cave.multiply(get_cave_noise2_params(data->seed));
+#endif
/*
Ground noise
vmanip.m_data[i] = MapNode(CONTENT_STONE);
}
- data->vmanip.m_area.add_y(em, i, 1);
+ data->vmanip->m_area.add_y(em, i, 1);
}
}
}
}
}
- data->vmanip.m_area.add_y(em, i, -1);
+ data->vmanip->m_area.add_y(em, i, -1);
}
}
}
&& node_min.Y < approx_groundlevel)
{
// Dungeon generator doesn't modify places which have this set
- data->vmanip.clearFlag(VMANIP_FLAG_DUNGEON_INSIDE
+ data->vmanip->clearFlag(VMANIP_FLAG_DUNGEON_INSIDE
| VMANIP_FLAG_DUNGEON_PRESERVE);
// Set all air and water to be untouchable to make dungeons open
vmanip.m_flags[i] |= VMANIP_FLAG_DUNGEON_PRESERVE;
else if(vmanip.m_data[i].d == CONTENT_WATERSOURCE)
vmanip.m_flags[i] |= VMANIP_FLAG_DUNGEON_PRESERVE;
- data->vmanip.m_area.add_y(em, i, -1);
+ data->vmanip->m_area.add_y(em, i, -1);
}
}
}
PseudoRandom random(blockseed+2);
// Add it
- make_dungeon1(data->vmanip, random);
+ make_dungeon1(vmanip, random);
// Convert some cobble to mossy cobble
for(s16 x=full_node_min.X; x<=full_node_max.X; x++)
if(wetness > 1.2)
vmanip.m_data[i].d = CONTENT_MUD;
}*/
- data->vmanip.m_area.add_y(em, i, -1);
+ data->vmanip->m_area.add_y(em, i, -1);
}
}
}
}
}
- data->vmanip.m_area.add_y(em, i, -1);
+ data->vmanip->m_area.add_y(em, i, -1);
}
}
}
else if(current_depth != 0)
break;
- data->vmanip.m_area.add_y(em, i, -1);
+ data->vmanip->m_area.add_y(em, i, -1);
}
}
}
bool found = false;
for(; p.Y >= y-6; p.Y--)
{
- u32 i = data->vmanip.m_area.index(p);
- MapNode *n = &data->vmanip.m_data[i];
+ u32 i = data->vmanip->m_area.index(p);
+ MapNode *n = &data->vmanip->m_data[i];
if(n->d != CONTENT_AIR && n->d != CONTENT_IGNORE)
{
found = true;
Trees grow only on mud and grass
*/
{
- u32 i = data->vmanip.m_area.index(p);
- MapNode *n = &data->vmanip.m_data[i];
+ u32 i = data->vmanip->m_area.index(p);
+ MapNode *n = &data->vmanip->m_data[i];
if(n->d != CONTENT_MUD && n->d != CONTENT_GRASS)
continue;
}
// Tree will be placed one higher
p.Y++;
// Make a tree
- make_tree(data->vmanip, p);
+ make_tree(vmanip, p);
}
#if 0
v3s16 p(x,y,z);
// Filter placement
/*{
- u32 i = data->vmanip.m_area.index(v3s16(p));
- MapNode *n = &data->vmanip.m_data[i];
+ u32 i = data->vmanip->m_area.index(v3s16(p));
+ MapNode *n = &data->vmanip->m_data[i];
if(n->d != CONTENT_MUD && n->d != CONTENT_GRASS)
continue;
}*/
v3s16 p(x,y,z);
// Filter placement
/*{
- u32 i = data->vmanip.m_area.index(v3s16(p));
- MapNode *n = &data->vmanip.m_data[i];
+ u32 i = data->vmanip->m_area.index(v3s16(p));
+ MapNode *n = &data->vmanip->m_data[i];
if(n->d != CONTENT_MUD && n->d != CONTENT_GRASS)
continue;
}*/
}
+BlockMakeData::BlockMakeData():
+ no_op(false),
+ vmanip(NULL),
+ seed(0)
+{}
+
+BlockMakeData::~BlockMakeData()
+{
+ delete vmanip;
+}
+
}; // namespace mapgen