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); }
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)); }