示例#1
0
        public T GetValueForCity(ICity city)
        {
            T retval = default(T);

            var cityOwner = CityPossessionCanon.GetOwnerOfPossession(city);

            var ownerCapital = CapitalCityCanon.GetCapitalOfCiv(cityOwner);

            if (city == ownerCapital)
            {
                IEnumerable <T> capitalValues = SocialPolicyCanon
                                                .GetPolicyBonusesForCiv(cityOwner)
                                                .Select(bonuses => DataForExtraction.PolicyCapitalBonusesExtractor(bonuses));

                if (capitalValues.Any())
                {
                    retval = DataForExtraction.Aggregator(
                        retval, capitalValues.Aggregate(DataForExtraction.Aggregator)
                        );
                }
            }

            IEnumerable <T> cityValues = SocialPolicyCanon
                                         .GetPolicyBonusesForCiv(cityOwner)
                                         .Select(bonuses => DataForExtraction.PolicyCityBonusesExtractor(bonuses));

            if (cityValues.Any())
            {
                retval = DataForExtraction.Aggregator(
                    retval, cityValues.Aggregate(DataForExtraction.Aggregator)
                    );
            }

            if (DataForExtraction.BuildingLocalBonusesExtractor != null)
            {
                foreach (var building in BuildingPossessionCanon.GetPossessionsOfOwner(city))
                {
                    retval = DataForExtraction.Aggregator(
                        retval, DataForExtraction.BuildingLocalBonusesExtractor(building.Template)
                        );
                }
            }

            if (DataForExtraction.BuildingGlobalBonusesExtractor != null)
            {
                foreach (var building in GetGlobalBuildings(cityOwner))
                {
                    retval = DataForExtraction.Aggregator(
                        retval, DataForExtraction.BuildingGlobalBonusesExtractor(building.Template)
                        );
                }
            }

            return(DataForExtraction.Aggregator(DataForExtraction.UnitaryValue, retval));
        }
        public float GetBorderExpansionModifierForCity(ICity city)
        {
            float localBuildingModifiers = BuildingPossessionCanon.GetPossessionsOfOwner(city).Sum(
                building => building.Template.LocalBorderExpansionModifier
                );

            var cityOwner = CityPossessionCanon.GetOwnerOfPossession(city);

            var citiesOfOwner = CityPossessionCanon.GetPossessionsOfOwner(cityOwner).ToArray();

            var buildingsOfOwner = new List <IBuilding>();

            foreach (var ownedCity in citiesOfOwner)
            {
                buildingsOfOwner.AddRange(BuildingPossessionCanon.GetPossessionsOfOwner(ownedCity));
            }

            float globalBuildingModifiers = buildingsOfOwner.Sum(building => building.Template.GlobalBorderExpansionModifier);

            var policyBonuses = SocialPolicyCanon.GetPolicyBonusesForCiv(cityOwner);

            float policyModifiers = policyBonuses.Sum(bonuses => bonuses.CityBorderExpansionModifier);

            if (CapitalCityCanon.GetCapitalOfCiv(cityOwner) == city)
            {
                policyModifiers += policyBonuses.Sum(bonuses => bonuses.CapitalBorderExpansionModifier);
            }

            return(1f + localBuildingModifiers + globalBuildingModifiers + policyModifiers);
        }
示例#3
0
        public T GetValueForCiv(ICivilization civ)
        {
            var retval = DataForExtraction.UnitaryValue;

            var policyBonuses = SocialPolicyCanon.GetPolicyBonusesForCiv(civ);

            var policyValues = policyBonuses.Select(bonuses => DataForExtraction.PolicyExtractor(bonuses));

            if (policyValues.Any())
            {
                retval = DataForExtraction.Aggregator(retval, policyValues.Aggregate(DataForExtraction.Aggregator));
            }

            if (DataForExtraction.GlobalBuildingExtractor != null)
            {
                var citiesOf = CityPossessionCanon.GetPossessionsOfOwner(civ);

                var buildingsOf = citiesOf.SelectMany(
                    city => BuildingPossessionCanon.GetPossessionsOfOwner(city)
                    ).ToList();

                foreach (var building in buildingsOf)
                {
                    retval = DataForExtraction.Aggregator(
                        retval, DataForExtraction.GlobalBuildingExtractor(building.Template)
                        );
                }
            }

            return(retval);
        }
        public T GetValueForUnit(IUnit unit)
        {
            T retval = DataForExtraction.UnitaryValue;

            var unitOwner = UnitPossessionCanon.GetOwnerOfPossession(unit);

            foreach (var bonuses in SocialPolicyCanon.GetPolicyBonusesForCiv(unitOwner))
            {
                retval = DataForExtraction.Aggregator(retval, DataForExtraction.PolicyBonusesExtractor(bonuses));
            }

            return(retval);
        }
        public int GetCostOfNextPolicyForCiv(ICivilization civ)
        {
            int cityCount = CityPossessionCanon.GetPossessionsOfOwner(civ).Count();

            int policyCount = PolicyCanon.GetPoliciesUnlockedFor(civ).Count();

            float fromPolicies = CivConfig.BasePolicyCost + (
                CivConfig.PolicyCostPerPolicyCoefficient *
                (Mathf.Pow(policyCount, CivConfig.PolicyCostPerPolicyExponent))
                );

            float fromCities = 1 + CivConfig.PolicyCostPerCityCoefficient * (cityCount - 1);

            float cityCostModifier = 1f + PolicyCanon.GetPolicyBonusesForCiv(civ).Sum(
                bonuses => bonuses.PolicyCostFromCityCountModifier
                );

            float unroundedValue = fromPolicies * fromCities * cityCostModifier;

            int distanceFromLastMultipleOf5 = (int)unroundedValue % 5;

            return(Mathf.FloorToInt(unroundedValue) - distanceFromLastMultipleOf5);
        }
        /// <inheritdoc/>
        public int GetProductionProgressPerTurnOnProject(ICity city, IProductionProject project)
        {
            if (city == null)
            {
                throw new ArgumentNullException("city");
            }
            else if (project == null)
            {
                throw new ArgumentNullException("project");
            }

            float productionModifier = 0f;

            foreach (var building in BuildingPossessionCanon.GetPossessionsOfOwner(city))
            {
                if (building.Template.ProductionModifier.DoesModifierApply(project, city))
                {
                    productionModifier += building.Template.ProductionModifier.Value;
                }
            }

            var cityOwner = CityPossessionCanon.GetOwnerOfPossession(city);

            foreach (var policyBonuses in SocialPolicyCanon.GetPolicyBonusesForCiv(cityOwner))
            {
                if (policyBonuses.ProductionModifier.DoesModifierApply(project, city))
                {
                    productionModifier += policyBonuses.ProductionModifier.Value;
                }
            }

            float totalProduction = GenerationLogic.GetTotalYieldForCity(
                city, new YieldSummary(production: productionModifier)
                )[YieldType.Production];

            return(Mathf.RoundToInt(totalProduction));
        }