private ExpansionWeightFunction GetExpansionWeightFunction( GridPartition partition, IMapTemplate template ) { var middleCell = Grid.GetCellAtOffset(Grid.CellCountX / 2, Grid.CellCountZ / 2); return(delegate(MapSection section, List <MapSection> chunk) { if (IsWithinHardBorder(section.CentroidCell, template)) { return 0; } int borderAvoidanceWeight = GetBorderAvoidanceWeight(section.CentroidCell, template); int neighborsInContinent = partition.GetNeighbors(section).Intersect(chunk).Count(); int neighborsInContinentWeight = neighborsInContinent * template.NeighborsInContinentWeight; int distanceFromSeedCentroid = Grid.GetDistance(chunk[0].CentroidCell, section.CentroidCell); int distanceFromSeedCentroidWeight = distanceFromSeedCentroid * template.DistanceFromSeedCentroidWeight; int distanceFromMapCenter = Grid.GetDistance(section.CentroidCell, middleCell) * template.DistanceFromMapCenterWeight; int weight = 1 + Math.Max( 0, neighborsInContinentWeight + distanceFromSeedCentroidWeight + borderAvoidanceWeight + distanceFromMapCenter ); return weight; }); }