public Civilization(string name, Color civColor, CultureTemplate cultureTemplate) { Name = name; CivColor = civColor; CultureTemplate = cultureTemplate; Settlements = new List <Settlement>(); Armies = new List <Army>(); Buildings = new List <MapBuilding>(); }
public static void PlaceInitialCivilizations(TimelineLayer timelineLayer, NamelessGame game) { var worldSettingsContinentTilesPerCivilization = game.WorldSettings.ContinentTilesPerCivilization; foreach (var worldBoardContinent in timelineLayer.Continents) { var civNumber = worldBoardContinent.SizeInTiles / worldSettingsContinentTilesPerCivilization; var continentTiles = new Queue <WorldTile>(); foreach (var worldBoardWorldTile in timelineLayer.WorldTiles) { if (worldBoardWorldTile.Continent == worldBoardContinent && worldBoardWorldTile.Terrain != TerrainTypes.Water && worldBoardWorldTile.Owner == null) { continentTiles.Enqueue(worldBoardWorldTile); } } //randomize list continentTiles = new Queue <WorldTile>(continentTiles.OrderBy( (o) => { return(game.WorldSettings.GlobalRandom.Next() % continentTiles.Count); })); InternalRandom random = new InternalRandom(game.WorldSettings.GlobalRandom.Next(int.MaxValue - 1)); for (int i = 0; i < civNumber; i++) { bool civNameUnique = false; string civName = ""; while (!civNameUnique) { civName = game.WorldSettings.NamesGenerator.GetCountryName(random).FirstCharToUpper(); civNameUnique = timelineLayer.Civilizations.All(x => x.Name != civName); } CultureTemplate culture = game.WorldSettings.CultureTemplates[ random.Next(game.WorldSettings.CultureTemplates.Count - 1)]; var civilization = new Civilization(civName, new Microsoft.Xna.Framework.Color( new Vector4((float)random.Next(0, 100) / 100, (float)random.Next(0, 100) / 100, (float)random.Next(0, 100) / 100, 1)), culture); timelineLayer.Civilizations.Add(civilization); var firstSettlement = new Settlement() { Name = civilization.CultureTemplate.GetTownName(random) }; civilization.Settlements.Add(firstSettlement); WorldTile tile = null; bool noNeighbooringCivs = false; const int squareToCheck = 10; const int radiusToClaim = 7; while (!noNeighbooringCivs) { if (!continentTiles.Any()) { break; } tile = continentTiles.Dequeue(); noNeighbooringCivs = true; for (int x = tile.WorldBoardPosiiton.X - squareToCheck; x <= tile.WorldBoardPosiiton.X + squareToCheck; x++) { for (int y = tile.WorldBoardPosiiton.Y - squareToCheck; y <= tile.WorldBoardPosiiton.Y + squareToCheck; y++) { if (timelineLayer.WorldTiles[x, y].Owner != null) { noNeighbooringCivs = false; } } } } //if there is no tiles to place civilizations then break the loop if (!continentTiles.Any()) { break; } timelineLayer.Civilizations.Add(civilization); tile.Settlement = firstSettlement; for (int x = tile.WorldBoardPosiiton.X - radiusToClaim; x <= tile.WorldBoardPosiiton.X + radiusToClaim; x++) { for (int y = tile.WorldBoardPosiiton.Y - radiusToClaim; y <= tile.WorldBoardPosiiton.Y + radiusToClaim; y++) { var dX = x - tile.WorldBoardPosiiton.X; var dY = y - tile.WorldBoardPosiiton.Y; if (dX * dX + dY * dY <= (radiusToClaim)) { timelineLayer.WorldTiles[x, y].Owner = civilization; } } } } // var names = timelineLayer.Civilizations.Select(x => x.Name).Aggregate((s1, s2) => s1 + ", " + s2); } }