void Carve() {
Random carveRand = new Random( random.Next() );
int caveDensity = (int)Math.Round( BaseCaveDensity/genParams.CaveDensity );
int maxCaves = genParams.MapWidth*genParams.MapLength*genParams.MapHeight/caveDensity/64*2;
for( int i = 0; i < maxCaves; i++ ) {
double startX = carveRand.NextDouble()*genParams.MapWidth;
double startY = carveRand.NextDouble()*genParams.MapLength;
double startZ = carveRand.NextDouble()*genParams.MapHeight;
double f9 = carveRand.NextDouble()*Math.PI*2;
double f10 = 0;
double f11 = carveRand.NextDouble()*Math.PI*2;
double f12 = 0;
double f13 = carveRand.NextDouble()*carveRand.NextDouble();
int caveLength = (int)((carveRand.NextDouble() + carveRand.NextDouble())*200);
for( int step = 0; step < caveLength; step++ ) {
startX += Math.Sin( f9 )*Math.Cos( f11 );
startY += Math.Cos( f9 )*Math.Cos( f11 );
startZ += Math.Sin( f11 );
f9 += f10*0.2;
f10 = f10*0.9 + (carveRand.NextDouble() - carveRand.NextDouble());
f11 = (f11 + f12*0.5)*0.5;
f12 = f12*0.75 + (carveRand.NextDouble() - carveRand.NextDouble());
if( carveRand.NextDouble() < 0.25 )
continue;
double f1 = startX + (carveRand.NextDouble()*4 - 2)*0.2;
double f2 = startZ + (carveRand.NextDouble()*4 - 2)*0.2;
double f5 = startY + (carveRand.NextDouble()*4 - 2)*0.2;
double f6 = (genParams.MapHeight - f2)/genParams.MapHeight;
f6 = 1.2 + (f6*3.5 + 1)*f13;
f6 = Math.Sin( step*Math.PI/caveLength )*f6;
for( int x = (int)(f1 - f6); x <= (int)(f1 + f6); x++ ) {
for( int z = (int)(f2 - f6); z <= (int)(f2 + f6); z++ ) {
for( int y = (int)(f5 - f6); y <= (int)(f5 + f6); y++ ) {
double f14 = x - f1;
double f15 = z - f2;
double f16 = y - f5;
f14 = f14*f14 + f15*f15*2 + f16*f16;
if( (f14 >= f6*f6) ||
(x < 1) || (z < 1) || (y < 1) ||
(x >= genParams.MapWidth - 1) || (z >= genParams.MapHeight - 1) ||
(y >= genParams.MapLength - 1) ) {
continue;
}
int index = Index( x, y, z );
if( (Block)blocks[index] == Block.Stone ) {
blocks[index] = (byte)Block.Air;
}
}
}
}
}
}
}