-#endif
-
- }//timer1
-
- // Limit dirt flow area by 1 because mud is flown into neighbors.
- assert(central_area_size.X == central_area_size.Z);
- s16 mudflow_minpos = 0-max_spread_amount+1;
- s16 mudflow_maxpos = central_area_size.X+max_spread_amount-2;
-
- /*
- Loop this part, it will make stuff look older and newer nicely
- */
-
- const u32 age_loops = 2;
- for(u32 i_age=0; i_age<age_loops; i_age++)
- { // Aging loop
- /******************************
- BEGINNING OF AGING LOOP
- ******************************/
-
-#if 1
- {
- // 24ms @cs=8
- //TimeTaker timer1("caves");
-
- /*
- Make caves (this code is relatively horrible)
- */
- 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, cave_amount);
- u32 caves_count = cave_amount * volume_nodes / 20000;
- u32 bruises_count = 1;
- PseudoRandom ps(blockseed+21343);
- if(ps.range(1, 4) == 1)
- bruises_count = ps.range(0, ps.range(0, 2));
- if(get_biome(data->seed, v2s16(node_min.X, node_min.Y)) == BT_DESERT){
- caves_count /= 3;
- bruises_count /= 3;
- }
- for(u32 jj=0; jj<caves_count+bruises_count; jj++)
- {
- bool large_cave = (jj >= caves_count);
- s16 min_tunnel_diameter = 2;
- 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);
-
- // Allowed route area size in nodes
- v3s16 ar = central_area_size;
-
- // Area starting point in nodes
- v3s16 of = node_min;
-
- // Allow a bit more
- //(this should be more than the maximum radius of the tunnel)
- //s16 insure = 5; // Didn't work with max_d = 20
- s16 insure = 10;
- s16 more = max_spread_amount - max_tunnel_diameter/2 - insure;
- ar += v3s16(1,0,1) * more * 2;
- of -= v3s16(1,0,1) * more;
-
- s16 route_y_min = 0;
- // Allow half a diameter + 7 over stone surface
- 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(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(large_cave)
- {
- /*// Minimum is at y=0
- route_y_min = -of.Y - 0;*/
- // Minimum is at y=max_tunnel_diameter/4
- //route_y_min = -of.Y + max_tunnel_diameter/4;
- //s16 min = -of.Y + max_tunnel_diameter/4;
- //s16 min = -of.Y + 0;
- s16 min = 0;
- 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);
- }