diff --git a/src/mapgen.cpp b/src/mapgen.cpp index f34526891..56f66f696 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -1472,43 +1472,36 @@ void make_block(BlockMakeData *data) /* Make caves (this code is relatively horrible) */ - double cave_amount = noise2d_perlin( + double cave_amount = 6.0 + 6.0 * noise2d_perlin( 0.5+(double)node_min.X/250, 0.5+(double)node_min.Y/250, data->seed+34329, 3, 0.50); - cave_amount = MYMAX(0.0, 4.0*cave_amount+2.0); - u32 caves_count = cave_amount * volume_nodes / 100000; - u32 bruises_count = cave_amount * volume_nodes / 400000; - bruises_count *= MYMAX(1, -node_max.Y/100); - if(stone_surface_max_y < WATER_LEVEL - 20) - bruises_count = 0; + cave_amount = MYMAX(0.0, cave_amount); + u32 caves_count = cave_amount * volume_nodes / 50000; + u32 bruises_count = 1; + PseudoRandom ps(blockseed+21343); + if(ps.range(1, 4) == 1) + bruises_count = ps.range(0, ps.range(0, 2)); for(u32 jj=0; jj= caves_count); s16 min_tunnel_diameter = 2; - s16 max_tunnel_diameter = myrand_range(3,5); - u16 tunnel_routepoints = myrand_range(5,25); - int dswitchint = myrand_range(1,14); - int part_max_length_rs = myrand_range(2,11); + s16 max_tunnel_diameter = ps.range(2,5); + int dswitchint = ps.range(1,14); + u16 tunnel_routepoints = 0; + int part_max_length_rs = 0; + if(large_cave){ + part_max_length_rs = ps.range(2,4); + tunnel_routepoints = ps.range(5, ps.range(15,30)); + min_tunnel_diameter = 5; + max_tunnel_diameter = ps.range(7, ps.range(8,24)); + } else { + part_max_length_rs = ps.range(2,9); + tunnel_routepoints = ps.range(10, ps.range(15,30)); + } + bool large_cave_is_flat = (ps.range(0,1) == 0); v3f main_direction(0,0,0); - bool bruise_surface = (jj > caves_count); - - if(bruise_surface) - { - min_tunnel_diameter = 5; - max_tunnel_diameter = myrand_range(10, myrand_range(20,40)); - /*min_tunnel_diameter = MYMAX(0, stone_surface_max_y/6); - max_tunnel_diameter = myrand_range(MYMAX(0, stone_surface_max_y/6), MYMAX(0, stone_surface_max_y/2));*/ - - /*s16 tunnel_rou = rangelim(25*(0.5+1.0*noise2d(data->seed+42, - data->sectorpos_base.X, data->sectorpos_base.Y)), 0, 15);*/ - - tunnel_routepoints = 5; - } - else - { - } - // Allowed route area size in nodes v3s16 ar = central_area_size; @@ -1528,13 +1521,13 @@ void make_block(BlockMakeData *data) s16 route_y_max = -of.Y + stone_surface_max_y + max_tunnel_diameter/2 + 7; /*// If caves, don't go through surface too often - if(bruise_surface == false) - route_y_max -= myrand_range(0, max_tunnel_diameter*2);*/ + if(large_cave == false) + route_y_max -= ps.range(0, max_tunnel_diameter*2);*/ // Limit maximum to area route_y_max = rangelim(route_y_max, 0, ar.Y-1); - if(bruise_surface) + if(large_cave) { /*// Minimum is at y=0 route_y_min = -of.Y - 0;*/ @@ -1543,7 +1536,12 @@ void make_block(BlockMakeData *data) //s16 min = -of.Y + max_tunnel_diameter/4; //s16 min = -of.Y + 0; s16 min = 0; - route_y_min = myrand_range(min, min + max_tunnel_diameter); + if(node_min.Y < WATER_LEVEL && node_max.Y > WATER_LEVEL) + { + min = WATER_LEVEL - max_tunnel_diameter/3 - of.Y; + route_y_max = WATER_LEVEL + max_tunnel_diameter/3 - of.Y; + } + route_y_min = ps.range(min, min + max_tunnel_diameter); route_y_min = rangelim(route_y_min, 0, route_y_max); } @@ -1556,7 +1554,7 @@ void make_block(BlockMakeData *data) // Start every 4th cave from surface when applicable /*bool coming_from_surface = false; if(node_min.Y <= 0 && node_max.Y >= 0){ - coming_from_surface = (jj % 4 == 0 && bruise_surface == false); + coming_from_surface = (jj % 4 == 0 && large_cave == false); if(coming_from_surface) route_start_y_min = -of.Y + stone_surface_max_y + 10; }*/ @@ -1566,9 +1564,9 @@ void make_block(BlockMakeData *data) // Randomize starting position v3f orp( - (float)(myrand()%ar.X)+0.5, - (float)(myrand_range(route_start_y_min, route_start_y_max))+0.5, - (float)(myrand()%ar.Z)+0.5 + (float)(ps.next()%ar.X)+0.5, + (float)(ps.range(route_start_y_min, route_start_y_max))+0.5, + (float)(ps.next()%ar.Z)+0.5 ); v3s16 startp(orp.X, orp.Y, orp.Z); @@ -1584,50 +1582,58 @@ void make_block(BlockMakeData *data) for(u16 j=0; j 7 && abs(y0) >= rs/3) + continue; + } s16 z = cp.Z + z0; s16 y = cp.Y + y0; s16 x = cp.X + x0; v3s16 p(x,y,z); - /*if(isInArea(p, ar) == false) - continue;*/ - // Check only height - if(y < 0 || y >= ar.Y) - continue; p += of; if(vmanip.m_area.contains(p) == false) continue; - // Just set it to air, it will be changed to - // water afterwards u32 i = vmanip.m_area.index(p); - if(bruise_surface) + if(large_cave) { if(full_node_min.Y < WATER_LEVEL && full_node_max.Y > WATER_LEVEL){ @@ -1705,9 +1705,7 @@ void make_block(BlockMakeData *data) else vmanip.m_data[i] = airnode; } else if(full_node_max.Y < WATER_LEVEL){ - if(is_bottomish) - vmanip.m_data[i] = MapNode(c_stone); - else if(p.Y < startp.Y - 2) + if(p.Y < startp.Y - 2) vmanip.m_data[i] = lavanode; else vmanip.m_data[i] = airnode; @@ -1720,11 +1718,9 @@ void make_block(BlockMakeData *data) vmanip.m_data[i].getContent() == c_water_source || vmanip.m_data[i].getContent() == c_lava_source) continue; + vmanip.m_data[i] = airnode; - } - if(bruise_surface == false) - { // Set tunnel flag vmanip.m_flags[i] |= VMANIP_FLAG_CAVE; } @@ -1885,6 +1881,9 @@ void make_block(BlockMakeData *data) u32 i = vmanip.m_area.index(v3s16(p2d.X, node_max.Y, p2d.Y)); s16 y=node_max.Y; + while(y >= node_min.Y) + { + for(;; y--) { MapNode *n = NULL; @@ -2013,6 +2012,7 @@ void make_block(BlockMakeData *data) break; } } + } } }