private static Tile GetStartLoc(Civilization civilization, GameInitializationConfig config, Map map)
        {
            var maxFertility = 0m;
            var tiles        = new HashSet <Tile>();

            for (int y = 0; y < map.Tile.GetLength(1); y++)
            {
                for (int x = 0; x < map.Tile.GetLength(0); x++)
                {
                    var tile = map.Tile[x, y];
                    if (tile.Fertility < maxFertility)
                    {
                        continue;
                    }
                    if (tile.Fertility > maxFertility)
                    {
                        tiles.Clear();
                        maxFertility = tile.Fertility;
                    }

                    tiles.Add(tile);
                }
            }

            var selectedTile = tiles.OrderByDescending(t => DistanceToNearestStart(config, t)).First();

            config.StartTiles.Add(selectedTile);
            map.SetAsStartingLocation(selectedTile, civilization.Id);
            return(selectedTile);
        }
Esempio n. 2
0
 public Options(GameInitializationConfig config)
 {
     SimplifiedCombat        = config.SimplifiedCombat;
     Bloodlust               = config.Bloodlust;
     DontRestartIfEliminated = config.DontRestartEliminatedPlayers;
     FlatEarth               = config.FlatWorld;
 }
Esempio n. 3
0
        internal static bool StartPreMade(Main mainForm, Ruleset ruleset, string mapFileName)
        {
            Labels.UpdateLabels(ruleset);
            CityLoader.LoadCities(ruleset);
            var config = new GameInitializationConfig {
                RuleSet = ruleset
            };

            config.PopUps = PopupBoxReader.LoadPopupBoxes(config.RuleSet.Root);
            try
            {
                PopupBox CorrectedPopup(string popupId)
                {
                    var popUp = config.PopUps[popupId];

                    if (popUp.Options != null && popUp.Options.Count != 0)
                    {
                        return(popUp);
                    }
                    popUp.Options = new[] { popUp.Text[^ 2], popUp.Text[^ 1] };
        private static Tile GetDefaultStart(GameInitializationConfig config, Civilization civilization, Map map)
        {
            var index = Array.FindIndex(config.Rules.Leaders, l => l.Adjective == civilization.Adjective);

            if (index > -1 && index < config.StartPositions.Length)
            {
                var pos = config.StartPositions[index];
                if (pos[0] != -1 && pos[1] != -1)
                {
                    var tile = map.TileC2(pos[0], pos[1]);
                    if (tile.Fertility > -1)
                    {
                        map.SetAsStartingLocation(tile, civilization.Id);
                        config.StartTiles.Add(tile);
                        return(tile);
                    }
                }
            }

            return(null);
        }
        private static double DistanceToNearestStart(GameInitializationConfig config, Tile tile)
        {
            if (config.StartTiles.Count == 0)
            {
                return(config.Random.Next());
            }


            var minDist = Utilities.DistanceTo(config.StartTiles[0], tile, config.FlatWorld);

            for (int i = 1; i < config.StartTiles.Count; i++)
            {
                var dist = Utilities.DistanceTo(config.StartTiles[i], tile, config.FlatWorld);
                if (dist < minDist)
                {
                    minDist = dist;
                }
            }

            return(minDist);
        }
        public static void StartNewGame(GameInitializationConfig config, Map[] maps, IList <Civilization> civilizations,
                                        IPlayer localPlayer)
        {
            var settlerType = config.Rules.UnitTypes[(int)UnitType.Settlers];

            var units = civilizations.Skip(1).Select(c => new
            {
                Civ = c, DefaultStart = config.StartPositions != null ? GetDefaultStart(config, c, maps[0]) : null
            })
                        .OrderBy(c => c.DefaultStart != null)
                        .Select(c => new
            {
                c.Civ, StartLocation = c.DefaultStart ?? GetStartLoc(c.Civ, config, maps[0])
            }).Select((c, id) => new Unit
            {
                Counter        = 0,
                Dead           = false,
                Id             = id,
                Order          = OrderType.NoOrders,
                Owner          = c.Civ,
                Veteran        = false,
                X              = c.StartLocation.X,
                Y              = c.StartLocation.Y,
                TypeDefinition = settlerType
            }).ToList();

            units.ForEach(u =>
            {
                u.Owner.Units.Add(u);
                u.CurrentLocation = maps[0].TileC2(u.X, u.Y);
            });

            maps[0].WhichCivsMapShown = config.PlayerCiv.Id;

            Game.StartNew(maps, config, civilizations, localPlayer);
        }