private void AddBeaches( [NotNull] Map map )
{
if ( map == null )
throw new ArgumentNullException( "map" );
int beachExtentSqr = ( args.BeachExtent + 1 ) * ( args.BeachExtent + 1 );
for ( int x = 0; x < map.Width; x++ ) {
for ( int y = 0; y < map.Length; y++ ) {
for ( int z = args.WaterLevel; z <= args.WaterLevel + args.BeachHeight; z++ ) {
if ( map.GetBlock( x, y, z ) != bGroundSurface )
continue;
bool found = false;
for ( int dx = -args.BeachExtent; !found && dx <= args.BeachExtent; dx++ ) {
for ( int dy = -args.BeachExtent; !found && dy <= args.BeachExtent; dy++ ) {
for ( int dz = -args.BeachHeight; dz <= 0; dz++ ) {
if ( dx * dx + dy * dy + dz * dz > beachExtentSqr )
continue;
int xx = x + dx;
int yy = y + dy;
int zz = z + dz;
if ( xx < 0 || xx >= map.Width || yy < 0 || yy >= map.Length || zz < 0 ||
zz >= map.Height )
continue;
Block block = map.GetBlock( xx, yy, zz );
if ( block == bWater || block == bWaterSurface ) {
found = true;
break;
}
}
}
}
if ( found ) {
map.SetBlock( x, y, z, bSeaFloor );
if ( z > 0 && map.GetBlock( x, y, z - 1 ) == bGround ) {
map.SetBlock( x, y, z - 1, bSeaFloor );
}
}
}
}
}
}