public void GrowCivs(Overworld.MapData[,] map, int iters, List<Faction> civs) { int width = map.GetLength(0); int height = map.GetLength(1); byte[] neighbors = new byte[] {0, 0, 0, 0}; float[] neighborheights = new float[] { 0, 0, 0, 0}; Point[] deltas = new Point[] { new Point(1, 0), new Point(0, 1), new Point(-1, 0), new Point(1, -1) }; for (int i = 0; i < iters; i++) { for (int x = 1; x < width - 1; x++) { for (int y = 1; y < height - 1; y++) { bool isUnclaimed = map[x, y].Faction == 0; bool isWater = map[x, y].Height < Settings.SeaLevel; if (!isUnclaimed && !isWater) { neighbors[0] = map[x + 1, y].Faction; neighbors[1] = map[x, y + 1].Faction; neighbors[2] = map[x - 1, y].Faction; neighbors[3] = map[x, y - 1].Faction; neighborheights[0] = map[x + 1, y].Height; neighborheights[1] = map[x, y + 1].Height; neighborheights[2] = map[x - 1, y].Height; neighborheights[3] = map[x, y - 1].Height; int minNeighbor = -1; float minHeight = float.MaxValue; for (int k = 0; k < 4; k++) { if (neighbors[k] == 0 && neighborheights[k] < minHeight && neighborheights[k] > Settings.SeaLevel) { minHeight = neighborheights[k]; minNeighbor = k; } } if (minNeighbor >= 0 && MathFunctions.RandEvent(0.25f / (neighborheights[minNeighbor] + 1e-2f))) { map[x + deltas[minNeighbor].X, y + deltas[minNeighbor].Y].Faction = map[x, y].Faction; } } } } } for (int x = 1; x < width - 1; x++) { for (int y = 1; y < height - 1; y++) { byte f = map[x, y].Faction; if (f> 0) { civs[f - 1].Center = new Point(x + civs[f - 1].Center.X, y + civs[f - 1].Center.Y); civs[f - 1].TerritorySize++; } } } foreach (Faction f in civs) { if(f.TerritorySize > 0) f.Center = new Point(f.Center.X / f.TerritorySize, f.Center.Y / f.TerritorySize); } }
public Point? GetRandomLandPoint(Overworld.MapData[,] map) { const int maxIters = 1000; int i = 0; int width = map.GetLength(0); int height = map.GetLength(1); while (i < maxIters) { int x = PlayState.Random.Next(0, width); int y = PlayState.Random.Next(0, height); if (map[x, y].Height > Settings.SeaLevel) { return new Point(x, y); } i++; } return null; }