private Tile[,] CreatePrimaryWorldArray() { Tile[,] worldTiles = new Tile[X, Z]; // Each layer can be done asynchronusly - seems unnecessary so far. // Elevation double startingElevation = randy.NextDouble() * 10.0 - 5.0; double[,] elevationLayer = generateWorldLayer(-100.0, 100.0, 2.0, startingElevation, true); // Temps double startingHighTemp = randy.NextDouble() * 40.0 + 40.0; double[,] highTempLayer = generateWorldLayer(20.0, 100.0, 2.0, startingHighTemp, false); double[,] lowTempLayer = generateWorldLayer(-20.0, 70.0, 2.0, randy.NextDouble() * 40.0, false); double startingMidpoint = randy.NextDouble() * 30.0 + 45.0; double[,] midpointLayer = generateWorldLayer(45.0, 75.0, 2.0, startingMidpoint, true); // Variance double[,] varianceLayer = generateWorldLayer(0.0, 12.0, 1.0, randy.NextDouble() * 12.0, false); // Humidity double[][,] humiditySegments = new double[Humidity.HUMIDITY_SEGMENTS][, ]; for (int i = 0; i < Humidity.HUMIDITY_SEGMENTS; i++) { humiditySegments[i] = generateWorldLayer(0.0, 12.0, 1.0, randy.NextDouble() * 12.0, false); } // This can be done asynchronously once the above is completed - seems to halve world creation time. Parallel.For(X, x => { for (int z = 0; z < Z; z++) { Humidity currentHumidity = Humidity.convertToObject(x, z, humiditySegments); worldTiles[x, z] = new Tile(elevationLayer[x, z], lowTempLayer[x, z], highTempLayer[x, z], midpointLayer[x, z], varianceLayer[x, z], currentHumidity); maxElevationDifference = checkForBiggerMaxDiff(x, z, elevationLayer); } }); return(worldTiles); }