public static UnitActionAssessment CanImprovementBeBuiltHere(Tile location,
                                                                     TerrainImprovement improvement, Civilization civilization)
        {
            if (location.CityHere != null)
            {
                return(new UnitActionAssessment(false, errorPopup: "CANTDO"));
            }

            var alreadyBuilt = location.Improvements.FirstOrDefault(i => i.Improvement == improvement.Id);


            if (alreadyBuilt != null)
            {
                if (improvement.Negative)
                {
                    return(new UnitActionAssessment(true,
                                                    commandTitle: improvement.Levels[alreadyBuilt.Level].BuildLabel));
                }
                if (alreadyBuilt.Level >= improvement.Levels.Count)
                {
                    return(new UnitActionAssessment(false, errorPopup: improvement.MaxLevelReachedMessage));
                }

                var nextLevel = improvement.Levels[alreadyBuilt.Level + 1];
                if (nextLevel.RequiredTech != AdvancesConstants.Nil &&
                    !AdvanceFunctions.HasTech(civilization, nextLevel.RequiredTech))
                {
                    return(new UnitActionAssessment(false, nextLevel.BuildLabel, errorPopup: nextLevel.MissingRequiredTechMessage));
                }

                return(new UnitActionAssessment(true, LabelFrom(nextLevel)));
            }

            if (improvement.Negative)
            {
                return(new UnitActionAssessment(false, errorPopup: improvement.MaxLevelReachedMessage));
            }

            if (improvement.Levels[0].RequiredTech != AdvancesConstants.Nil &&
                !AdvanceFunctions.HasTech(civilization, improvement.Levels[0].RequiredTech))
            {
                return(new UnitActionAssessment(false,
                                                errorPopup: improvement.Levels[0].MissingRequiredTechMessage));
            }

            var allowedTerrain = improvement.AllowedTerrains[location.Z]
                                 .FirstOrDefault(t => t.TerrainType == (int)location.Type);

            if (allowedTerrain == null)
            {
                return(new UnitActionAssessment(false, errorPopup: "CANTIMPROVE"));
            }

            if (location.River)
            {
                var riverAllowance = improvement.AllowedTerrains[location.Z]
                                     .FirstOrDefault(t => t.TerrainType == TerrainConstants.River);
                if (riverAllowance != null)
                {
                    if (riverAllowance.RequiredTech != AdvancesConstants.Nil &&
                        !AdvanceFunctions.HasTech(civilization, riverAllowance.RequiredTech))
                    {
                        return(new UnitActionAssessment(false, errorPopup: riverAllowance.MissingRequiredTechMessage));
                    }
                }
            }

            if (allowedTerrain.RequiredTech != AdvancesConstants.Nil &&
                !AdvanceFunctions.HasTech(civilization, allowedTerrain.RequiredTech))
            {
                return(new UnitActionAssessment(false, errorPopup: allowedTerrain.MissingRequiredTechMessage));
            }

            var transform = allowedTerrain.Effects?.FirstOrDefault(e => e.Target == ImprovementConstants.Transform);

            if (transform != null)
            {
                return(new UnitActionAssessment(true, transform.Text));
            }

            if (improvement.AdjacencyRules is { Count : > 0 })
Ejemplo n.º 2
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;
                    }
                }
            }
        }
Ejemplo n.º 3
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;
                    }
                }
            }
        }