Пример #1
0
        public static void GiveAdvance(this Game game, int advanceIndex, Civilization civilization)
        {
            var research = _researched[advanceIndex];

            if (civilization.Advances[advanceIndex])
            {
                return;
            }
            if (civilization.AllowedAdvanceGroups[game.Rules.Advances[advanceIndex].AdvanceGroup] == AdvanceGroupAccess.Prohibited)
            {
                return;
            }

            var targetCiv = civilization.Id;

            //TODO: here we'd look for a lua script to check for effeccts

            //TODO: check for default effect

            if (!research.Discovered)
            {
                research.DiscoveredBy = targetCiv;
                game.History.AdvanceDiscovered(advanceIndex, targetCiv);
            }

            if (civilization.ReseachingAdvance == advanceIndex)
            {
                civilization.ReseachingAdvance = AdvancesConstants.No;
            }

            civilization.Advances[advanceIndex] = true;
            ProductionPossibilities.AddItems(targetCiv,
                                             game.Rules.ProductionItems.Where(i => i.RequiredTech == advanceIndex && i.CanBuild(civilization)));
            ProductionPossibilities.RemoveItems(targetCiv, game.Rules.ProductionItems.Where(o => o.ExpiresTech == advanceIndex));
        }
Пример #2
0
        public static void BuildCity(Tile tile, Unit unit, Game game, string name)
        {
            var city = new City
            {
                Location         = tile,
                Name             = name,
                X                = tile.X,
                Y                = tile.Y,
                Owner            = unit.Owner,
                Size             = 1,
                ItemInProduction = game.Rules.ProductionItems.OrderBy(i => i.Cost).First()
            };

            tile.WorkedBy = city;
            tile.CityHere = city;
            game.AllCities.Add(tile.CityHere);
            unit.Owner.Cities.Add(tile.CityHere);

            game.SetImprovementsForCity(city);

            if (unit.Owner.Cities.Count == 1)
            {
                var capitalImprovement = ProductionPossibilities.FindByEffect(city.Owner.Id, Effects.Capital)
                                         ?? game.Rules.Improvements.Where(i =>
                                                                          i.Effects.ContainsKey(Effects.Capital) &&
                                                                          city.Owner.AllowedAdvanceGroups[
                                                                              game.Rules.Advances[i.Prerequisite].AdvanceGroup] !=
                                                                          AdvanceGroupAccess.Prohibited).OrderBy(i => i.Cost).FirstOrDefault();
                if (capitalImprovement != null)
                {
                    city.AddImprovement(capitalImprovement);
                }
            }
            game.History.CityBuilt(tile.CityHere);

            city.AutoAddDistributionWorkers();
            city.CalculateOutput(city.Owner.Government, game);

            unit.Dead           = true;
            unit.MovePointsLost = unit.MovePoints;

            if (tile.Fertility != -2)
            {
                game.CurrentMap.AdjustFertilityForCity(tile);
            }

            game.TriggerMapEvent(MapEventType.UpdateMap, new List <Tile> {
                tile
            });

            game.ChooseNextUnit();
        }
Пример #3
0
        public static void SetupTech(this Game game)
        {
            _researched = game.Rules.Advances.OrderBy(a => a.Index).Select(a => new AdvanceResearch()).ToArray();

            foreach (var civilization in game.AllCivilizations)
            {
                for (var index = 0; index < civilization.Advances.Length; index++)
                {
                    if (civilization.Advances[index])
                    {
                        _researched[index].DiscoveredBy = civilization.Id;
                    }
                }
            }

            _MapSizeAdjustment = game.TotalMapArea / 1000;

            ProductionPossibilities.InitializeProductionLists(game.AllCivilizations, game.Rules.ProductionItems);
        }
Пример #4
0
        // Update stats of all cities
        private void CitiesTurn(IPlayer player)
        {
            var currentScienceCost = AdvanceFunctions.CalculateScienceCost(this, _activeCiv);

            var foodRows   = Rules.Cosmic.RowsFoodBox;
            var shieldRows = Rules.Cosmic.RowsShieldBox;

            foreach (var city in _activeCiv.Cities)
            {
                city.ImprovementSold = false;

                // Change food in storage
                city.FoodInStorage += city.SurplusHunger;

                var shields = city.Production;

                var tax = city.Tax;

                var science = city.Science;

                // Change city size
                if (city.FoodInStorage < 0)
                {
                    city.FoodInStorage = 0;
                    city.Size         -= 1;
                    AutoRemoveWorkersDistribution(city);
                    city.CalculateOutput(city.Owner.Government, this);
                }
                else
                {
                    var maxFood = (city.Size + 1) * foodRows;
                    if (city.FoodInStorage > maxFood)
                    {
                        city.FoodInStorage = 0;

                        city.Size += 1;

                        var storageBuildings = city.Improvements
                                               .Where(i => i.Effects.ContainsKey(ImprovementEffect.FoodStorage)).Select(b => b.Effects[ImprovementEffect.FoodStorage]).ToList();


                        if (storageBuildings.Count > 0)
                        {
                            var totalStorage = storageBuildings.Sum();
                            if (totalStorage is > 100 or < 0)
                            {
                                totalStorage = storageBuildings.Where(v => v is >= 0 and <= 100).Max();
                            }

                            if (totalStorage != 0)
                            {
                                city.FoodInStorage += maxFood * totalStorage / 100;
                            }
                        }

                        AutoAddDistributionWorkers(city); // Automatically add a workers on a tile
                        city.CalculateOutput(city.Owner.Government, this);
                    }
                }

                if (city.UnhappyCitizens > 0)
                {
                    if (city.WeLoveKingDay)
                    {
                        player.WeLoveTheKingCanceled(city);
                        city.WeLoveKingDay = false;
                    }

                    if (city.UnhappyCitizens > city.HappyCitizens)
                    {
                        player.CivilDisorder(city);
                        city.CivilDisorder = true;
                        continue;
                    }

                    if (city.CivilDisorder)
                    {
                        city.CivilDisorder = false;
                        player.OrderRestored(city);
                    }
                }
                else
                {
                    if (city.CivilDisorder)
                    {
                        city.CivilDisorder = false;
                        player.OrderRestored(city);
                    }

                    if (city.HappyCitizens >= city.Size - city.UnhappyCitizens - city.HappyCitizens)
                    {
                        if (!city.WeLoveKingDay)
                        {
                            player.WeLoveTheKingStarted(city);
                        }

                        city.WeLoveKingDay = true;
                    }
                }

                if (!ProductionPossibilities.ProductionValid(city))
                {
                    var newItem = ProductionPossibilities.AutoNext(city);

                    player.CantProduce(city, newItem);

                    if (newItem != null)
                    {
                        city.ItemInProduction = newItem;
                    }
                }

                city.ShieldsProgress += shields;


                if (city.ShieldsProgress >= city.ItemInProduction.Cost * shieldRows)
                {
                    if (city.ItemInProduction.CompleteProduction(city, Rules))
                    {
                        city.ShieldsProgress = 0;
                        player.CityProductionComplete(city);
                    }
                }

                _activeCiv.Money += tax;

                foreach (var cityImprovement in city.Improvements)
                {
                    if (cityImprovement.Upkeep > 0)
                    {
                        if (_activeCiv.Money >= cityImprovement.Upkeep)
                        {
                            _activeCiv.Money -= cityImprovement.Upkeep;
                        }
                        else
                        {
                            //Sell it !!
                            city.SellImprovement(cityImprovement);
                            player.CantMaintain(city, cityImprovement);
                        }
                    }
                }

                if (science > 0)
                {
                    _activeCiv.Science += science;
                    if (_activeCiv.ReseachingAdvance < 0)
                    {
                        var researchPossibilities = AdvanceFunctions.CalculateAvailableResearch(this, _activeCiv);
                        player.SelectNewAdvance(this, researchPossibilities);
                        currentScienceCost = AdvanceFunctions.CalculateScienceCost(this, _activeCiv);
                    }
                    else if (currentScienceCost <= _activeCiv.Science)
                    {
                        this.GiveAdvance(_activeCiv.ReseachingAdvance, _activeCiv);
                        _activeCiv.Science -= currentScienceCost;
                    }
                }
            }
        }
Пример #5
0
        public static void GiveAdvance(this Game game, int advanceIndex, Civilization civilization)
        {
            var research = _researched[advanceIndex];

            if (civilization.Advances[advanceIndex])
            {
                return;
            }
            if (civilization.AllowedAdvanceGroups[game.Rules.Advances[advanceIndex].AdvanceGroup] == AdvanceGroupAccess.Prohibited)
            {
                return;
            }

            var targetCiv = civilization.Id;

            if (!research.Discovered)
            {
                research.DiscoveredBy = targetCiv;
                game.History.AdvanceDiscovered(advanceIndex, targetCiv);
            }

            if (civilization.ReseachingAdvance == advanceIndex)
            {
                civilization.ReseachingAdvance = AdvancesConstants.No;
            }

            foreach (var effect in game.Rules.Advances[advanceIndex].Effects)
            {
                civilization.GlobalEffects[effect.Key] += effect.Value;
            }

            foreach (var improvement in game.TerrainImprovements.Values)
            {
                for (var level = 0; level < improvement.Levels.Count; level++)
                {
                    if (improvement.Levels[level].RequiredTech != advanceIndex)
                    {
                        continue;
                    }

                    game.Players[civilization.Id].NotifyImprovementEnabled(improvement, level);

                    if (!improvement.AllCitys)
                    {
                        continue;
                    }
                    var locations = civilization.Cities
                                    .Select(c => c.Location)
                                    .Select(tile => new
                    {
                        tile,
                        terrain = improvement.AllowedTerrains[tile.Z]
                                  .FirstOrDefault(t => t.TerrainType == (int)tile.Type)
                    })
                                    .Where(t => t.terrain is not null)
                                    .Select(loc =>
                    {
                        loc.tile.AddImprovement(improvement, loc.terrain, level,
                                                game.Rules.Terrains[loc.tile.Z]);
                        return(loc.tile);
                    }).ToList();
                    game.TriggerMapEvent(MapEventType.UpdateMap, improvement.HasMultiTile ? locations.Concat(locations.SelectMany(l => l.Neighbours())).ToList() : locations);
                }
            }

            civilization.Advances[advanceIndex] = true;
            ProductionPossibilities.AddItems(targetCiv,
                                             game.Rules.ProductionItems.Where(i => i.RequiredTech == advanceIndex && i.CanBuild(civilization)));
            ProductionPossibilities.RemoveItems(targetCiv, game.Rules.ProductionItems.Where(o => o.ExpiresTech == advanceIndex));
        }
Пример #6
0
        // Update stats of all cities
        private void CitiesTurn(IPlayer player)
        {
            var currentScienceCost = AdvanceFunctions.CalculateScienceCost(this, _activeCiv);

            var foodRows   = Rules.Cosmic.RowsFoodBox;
            var shieldRows = Rules.Cosmic.RowsShieldBox;

            foreach (var city in _activeCiv.Cities)
            {
                city.ImprovementSold = false;

                // Change food in storage
                city.FoodInStorage += city.SurplusHunger;

                var shields = city.Production;

                var tax = city.Tax;

                var science = city.Science;

                // Change city size
                if (city.FoodInStorage < 0)
                {
                    city.FoodInStorage = 0;
                    city.ShrinkCity(this);
                }
                else
                {
                    var maxFood = (city.Size + 1) * foodRows;
                    if (city.FoodInStorage > maxFood)
                    {
                        city.GrowCity(this);
                        city.ResetFoodStorage(foodRows);
                    }
                }

                if (city.UnhappyCitizens > 0)
                {
                    if (city.WeLoveKingDay)
                    {
                        player.WeLoveTheKingCanceled(city);
                        city.WeLoveKingDay = false;
                    }

                    if (city.UnhappyCitizens > city.HappyCitizens)
                    {
                        player.CivilDisorder(city);
                        city.CivilDisorder = true;
                        continue;
                    }

                    if (city.CivilDisorder)
                    {
                        city.CivilDisorder = false;
                        player.OrderRestored(city);
                    }
                }
                else
                {
                    if (city.CivilDisorder)
                    {
                        city.CivilDisorder = false;
                        player.OrderRestored(city);
                    }

                    if (city.HappyCitizens >= city.Size - city.UnhappyCitizens - city.HappyCitizens)
                    {
                        if (!city.WeLoveKingDay)
                        {
                            player.WeLoveTheKingStarted(city);
                        }

                        city.WeLoveKingDay = true;
                    }
                }

                if (!ProductionPossibilities.ProductionValid(city))
                {
                    var newItem = ProductionPossibilities.AutoNext(city);

                    player.CantProduce(city, newItem);

                    if (newItem != null)
                    {
                        city.ItemInProduction = newItem;
                    }
                }

                city.ShieldsProgress += shields;


                if (city.ShieldsProgress >= city.ItemInProduction.Cost * shieldRows)
                {
                    if (city.ItemInProduction.CompleteProduction(city, Rules))
                    {
                        city.ShieldsProgress = 0;
                        player.CityProductionComplete(city);
                    }
                }

                _activeCiv.Money += tax;

                foreach (var cityImprovement in city.Improvements)
                {
                    if (cityImprovement.Upkeep > 0)
                    {
                        if (_activeCiv.Money >= cityImprovement.Upkeep)
                        {
                            _activeCiv.Money -= cityImprovement.Upkeep;
                        }
                        else
                        {
                            //Sell it !!
                            city.SellImprovement(cityImprovement);
                            player.CantMaintain(city, cityImprovement);
                        }
                    }
                }

                if (science > 0)
                {
                    _activeCiv.Science += science;
                    if (_activeCiv.ReseachingAdvance < 0)
                    {
                        var researchPossibilities = AdvanceFunctions.CalculateAvailableResearch(this, _activeCiv);
                        player.SelectNewAdvance(this, researchPossibilities);
                        currentScienceCost = AdvanceFunctions.CalculateScienceCost(this, _activeCiv);
                    }
                    else if (currentScienceCost <= _activeCiv.Science)
                    {
                        this.GiveAdvance(_activeCiv.ReseachingAdvance, _activeCiv);
                        _activeCiv.Science -= currentScienceCost;
                    }
                }
            }
        }