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>();
 }
Exemple #2
0
        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);
            }
        }