Beispiel #1
0
        public void GetProductionProgressPerTurnOnProject_ChangedByProductionModifiersOfPolicyBonuses()
        {
            var productionLogic = Container.Resolve <ProductionLogic>();

            var city    = BuildCity();
            var project = BuildProject();

            var civ = BuildCiv(city);

            var policyBonuses = new List <ISocialPolicyBonusesData>()
            {
                BuildBonusData(BuildModifier(2f, true)),
                BuildBonusData(BuildModifier(3f, true)),
                BuildBonusData(BuildModifier(4f, false)),
            };

            MockSocialPolicyCanon.Setup(canon => canon.GetPolicyBonusesForCiv(civ)).Returns(policyBonuses);

            var totalYield = new YieldSummary(production: 10);

            MockGenerationLogic.Setup(
                logic => logic.GetTotalYieldForCity(city, It.Is <YieldSummary>(summary => summary[YieldType.Production] == 2f + 3f))
                ).Returns(totalYield);

            Assert.AreEqual(10, productionLogic.GetProductionProgressPerTurnOnProject(city, project));
        }
Beispiel #2
0
        public void SubtractionOperator_SubtractsComponents()
        {
            var summaryOne   = new YieldSummary(food: 3, production: 2, gold: 1);
            var summaryTwo   = new YieldSummary(production: 5, gold: 1, culture: 6);
            var summaryThree = new YieldSummary(food: 9, gold: 17, culture: 12);

            var copyOfOne   = new YieldSummary(summaryOne);
            var copyOfTwo   = new YieldSummary(summaryTwo);
            var copyOfThree = new YieldSummary(summaryThree);

            var oneMinusTwo   = summaryOne - summaryTwo;
            var oneMinusThree = summaryOne - summaryThree;
            var twoMinusThree = summaryTwo - summaryThree;

            foreach (var resourceType in EnumUtil.GetValues <YieldType>())
            {
                Assert.AreEqual(summaryOne[resourceType] - summaryTwo[resourceType], oneMinusTwo[resourceType],
                                "OneMinusTwo has an incorrect value for resource type " + resourceType);

                Assert.AreEqual(summaryOne[resourceType] - summaryThree[resourceType], oneMinusThree[resourceType],
                                "OneMinusThree has an incorrect value for resource type " + resourceType);

                Assert.AreEqual(summaryTwo[resourceType] - summaryThree[resourceType], twoMinusThree[resourceType],
                                "TwoMinusThree has an incorrect value for resource type " + resourceType);

                Assert.AreEqual(copyOfOne[resourceType], summaryOne[resourceType],
                                "SummaryOne's value was changed by the addition operations");

                Assert.AreEqual(copyOfTwo[resourceType], summaryTwo[resourceType],
                                "SummaryTwo's value was changed by the addition operations");

                Assert.AreEqual(copyOfThree[resourceType], summaryThree[resourceType],
                                "SummaryThree's value was changed by the addition operations");
            }
        }
Beispiel #3
0
 public void DisplaySummary(YieldSummary summary)
 {
     if (IncludeNormalYield)
     {
         if (IncludeGreatPersonYield)
         {
             SummaryField.text = YieldFormatter.GetTMProFormattedYieldString(
                 summary, EnumUtil.GetValues <YieldType>(), DisplayEmptyResources,
                 PlusSignOnPositiveNumbers
                 );
         }
         else
         {
             SummaryField.text = YieldFormatter.GetTMProFormattedYieldString(
                 summary, CoreConfig.NormalYields, DisplayEmptyResources,
                 PlusSignOnPositiveNumbers
                 );
         }
     }
     else if (IncludeGreatPersonYield)
     {
         SummaryField.text = YieldFormatter.GetTMProFormattedYieldString(
             summary, CoreConfig.GreatPersonYields, DisplayEmptyResources,
             PlusSignOnPositiveNumbers
             );
     }
 }
        public YieldSummary GetTotalYieldForCity(ICity city, YieldSummary additionalBonuses)
        {
            if (city == null)
            {
                throw new ArgumentNullException("city");
            }

            var retval = CityCenterYieldLogic.GetYieldOfCityCenter(city);

            foreach (var cell in CellPossessionCanon.GetPossessionsOfOwner(city))
            {
                if (!cell.SuppressSlot && cell.WorkerSlot.IsOccupied)
                {
                    retval += GetYieldOfCellForCity(cell, city);
                }
            }

            foreach (var building in BuildingPossessionCanon.GetPossessionsOfOwner(city))
            {
                retval += GetYieldOfBuildingForCity(building, city);
            }

            retval += GetYieldOfUnemployedPersonForCity(city) * UnemploymentLogic.GetUnemployedPeopleInCity(city);

            return(retval * (YieldSummary.Ones + additionalBonuses));
        }
        public void GetYieldOfCell_CallsIntoBuildingYieldIfCellBelongsToCity()
        {
            var cell = BuildCell();

            var buildings = new List <IBuilding>()
            {
                BuildBuilding(), BuildBuilding(), BuildBuilding()
            };

            var buildingTemplates = buildings.Select(building => building.Template);

            BuildCity(cell, buildings);

            var buildingYield = new YieldSummary(food: 1, production: 2, gold: 3);

            MockBuildingYieldLogic.Setup(
                logic => logic.GetBonusCellYieldFromBuildings(cell, It.IsAny <IEnumerable <IBuildingTemplate> >())
                ).Returns(buildingYield);

            var yieldLogic = Container.Resolve <CellYieldLogic>();

            Assert.AreEqual(buildingYield, yieldLogic.GetYieldOfCell(cell, null));

            MockBuildingYieldLogic.Verify(
                logic => logic.GetBonusCellYieldFromBuildings(
                    cell,
                    It.Is <IEnumerable <IBuildingTemplate> >(
                        templates => templates.SequenceEqual(buildingTemplates)
                        )
                    ),
                Times.Once
                );
        }
Beispiel #6
0
 public bool TryIncreaseYield(
     MapRegion region, RegionData regionData, YieldType type, out YieldSummary yieldAdded
     )
 {
     yieldAdded = YieldSummary.Empty;
     return(false);
 }
Beispiel #7
0
        public void BalanceHomelandYields(HomelandData homelandData)
        {
            YieldSummary currentYield = YieldSummary.Empty;

            foreach (var cell in homelandData.Cells)
            {
                currentYield += YieldEstimator.GetYieldEstimateForCell(cell, TechCanon.AvailableTechs);
            }

            float weightedCellCount = homelandData.LandCells.Count() * homelandData.YieldAndResources.LandWeight
                                      + homelandData.WaterCells.Count() * homelandData.YieldAndResources.WaterWeight;

            float minFood       = homelandData.YieldAndResources.MinFoodPerCell * weightedCellCount;
            float minProduction = homelandData.YieldAndResources.MinProductionPerCell * weightedCellCount;

            BringYieldTypeToMin(
                YieldType.Food, minFood, homelandData, ref currentYield
                );

            BringYieldTypeToMin(
                YieldType.Production, minProduction, homelandData, ref currentYield
                );

            float minScore = homelandData.YieldAndResources.MinScorePerCell * weightedCellCount;
            float maxScore = homelandData.YieldAndResources.MaxScorePerCell * weightedCellCount;

            KeepScoreWithinBounds(homelandData, minScore, maxScore);
        }
Beispiel #8
0
        public bool TryIncreaseYield(
            MapRegion region, RegionData regionData, YieldType type, out YieldSummary yieldAdded
            )
        {
            if (type != YieldType.Production)
            {
                yieldAdded = YieldSummary.Empty;
                return(false);
            }

            var candidates = region.Cells.Where(HillCandidateFilter_ProductionIncreasing);

            if (candidates.Any())
            {
                var newHill = candidates.Random();

                var oldYield = YieldEstimator.GetYieldEstimateForCell(newHill, TechCanon.AvailableTechs);

                ModLogic.ChangeShapeOfCell(newHill, CellShape.Hills);

                var newYield = YieldEstimator.GetYieldEstimateForCell(newHill, TechCanon.AvailableTechs);

                yieldAdded = newYield - oldYield;
                return(true);
            }
            else
            {
                yieldAdded = YieldSummary.Empty;
                return(false);
            }
        }
        private void DisplayGrowthData()
        {
            YieldSummary income = YieldGenerationLogic.GetTotalYieldForCity(ObjectToDisplay);

            float currentFoodStockpile = ObjectToDisplay.FoodStockpile;
            int   foodUntilNextGrowth  = GrowthLogic.GetFoodStockpileToGrow(ObjectToDisplay);
            float netFoodIncome        = income[YieldType.Food] - GrowthLogic.GetFoodConsumptionPerTurn(ObjectToDisplay);

            float realFoodGain = GrowthLogic.GetFoodStockpileAdditionFromIncome(ObjectToDisplay, netFoodIncome);

            int turnsToGrow = Mathf.CeilToInt((foodUntilNextGrowth - currentFoodStockpile) / realFoodGain);

            if (realFoodGain > 0)
            {
                TurnsUntilGrowthField.text = turnsToGrow.ToString();
            }
            else
            {
                TurnsUntilGrowthField.text = "--";
            }

            TurnsUntilGrowthField.text = turnsToGrow.ToString();

            PopulationField.text = ObjectToDisplay.Population.ToString();

            GrowthSlider.minValue = 0;
            GrowthSlider.maxValue = foodUntilNextGrowth;
            GrowthSlider.value    = Mathf.FloorToInt(currentFoodStockpile);
        }
        public YieldSummary GetYieldOfImprovementTemplate(
            IImprovementTemplate template, IResourceNode nodeAtLocation,
            IEnumerable <IResourceDefinition> visibleResources,
            IEnumerable <IImprovementModificationData> improvementModifications,
            bool hasFreshWater
            )
        {
            YieldSummary retval = YieldSummary.Empty;

            if (nodeAtLocation == null || nodeAtLocation.Resource.Extractor != template ||
                !visibleResources.Contains(nodeAtLocation.Resource)
                )
            {
                retval += template.BonusYieldNormal;
            }

            foreach (var mod in improvementModifications)
            {
                if (mod.Template == template && (!mod.RequiresFreshWater || hasFreshWater))
                {
                    retval += mod.BonusYield;
                }
            }

            return(retval);
        }
        private ISpecialistDefinition BuildSpecialist(YieldSummary yield)
        {
            var mockSpecialist = new Mock <ISpecialistDefinition>();

            mockSpecialist.Setup(specialist => specialist.Yield).Returns(yield);

            return(mockSpecialist.Object);
        }
        private IBuilding BuildBuilding(YieldSummary civilizationModifier, YieldSummary cityModifier)
        {
            var mockBuilding = new Mock <IBuilding>();

            mockBuilding.Setup(building => building.CivilizationYieldModifier).Returns(civilizationModifier);
            mockBuilding.Setup(building => building.CityYieldModifier).Returns(cityModifier);

            return(mockBuilding.Object);
        }
Beispiel #13
0
        public CellYieldModificationData(CellVegetation featureRequired, YieldSummary bonusYield)
        {
            _propertyConsidered = CellPropertyType.Vegetation;
            _vegetationRequired = featureRequired;
            _bonusYield         = bonusYield;

            _terrainRequired  = CellTerrain.Grassland;
            _shapeRequired    = CellShape.Flatlands;
            _mustBeUnderwater = false;
        }
Beispiel #14
0
        public CellYieldModificationData(bool mustBeUnderwater, YieldSummary bonusYield)
        {
            _propertyConsidered = CellPropertyType.CellIsUnderwater;
            _mustBeUnderwater   = mustBeUnderwater;
            _bonusYield         = bonusYield;

            _terrainRequired    = CellTerrain.Grassland;
            _shapeRequired      = CellShape.Flatlands;
            _vegetationRequired = CellVegetation.None;
        }
Beispiel #15
0
        public void MultiplicationOperatorSummaries_MultipliesComponents()
        {
            var firstSummary  = new YieldSummary(food: 1, production: 2, gold: -1, culture: 0);
            var secondSummary = new YieldSummary(food: 3, production: 4, gold: 2, culture: 10);

            Assert.AreEqual(
                new YieldSummary(food: 3, production: 8, gold: -2, culture: 0),
                firstSummary * secondSummary,
                "Operator *(ResourceSummary, ResourceSummary) did not return a pairwise multiplication of its operands"
                );
        }
Beispiel #16
0
        private ICity BuildCity(YieldSummary yield)
        {
            var mockCity = new Mock <ICity>();

            var newCity = mockCity.Object;

            MockGenerationLogic.Setup(logic => logic.GetTotalYieldForCity(newCity)).Returns(yield);
            AllCities.Add(newCity);

            return(newCity);
        }
Beispiel #17
0
        public YieldSummary GetYieldOfCivilization(ICivilization civ)
        {
            YieldSummary retval = YieldSummary.Empty;

            foreach (var city in CityPossessionCanon.GetPossessionsOfOwner(civ))
            {
                retval += ResourceYieldLogic.GetTotalYieldForCity(city);
            }

            retval -= new YieldSummary(gold: UnitMaintenanceLogic.GetMaintenanceOfUnitsForCiv(civ));

            return(retval);
        }
Beispiel #18
0
        private IResourceDefinition BuildResourceDefinition(
            IImprovementTemplate extractor, YieldSummary bonusYieldBase,
            YieldSummary bonusYieldWhenImproved
            )
        {
            var mockResource = new Mock <IResourceDefinition>();

            mockResource.Setup(resource => resource.Extractor).Returns(extractor);
            mockResource.Setup(resource => resource.BonusYieldBase).Returns(bonusYieldBase);
            mockResource.Setup(resource => resource.BonusYieldWhenImproved).Returns(bonusYieldWhenImproved);

            return(mockResource.Object);
        }
        public void GetYieldOfCell_AlwaysCallsIntoInherentYield()
        {
            var cell = BuildCell();

            var cellYield = new YieldSummary(food: 1, production: 2, gold: 3);

            MockInherentCellYieldLogic.Setup(logic => logic.GetInherentCellYield(cell, false)).Returns(cellYield);

            var yieldLogic = Container.Resolve <CellYieldLogic>();

            Assert.AreEqual(cellYield, yieldLogic.GetYieldOfCell(cell, null));

            MockInherentCellYieldLogic.Verify(logic => logic.GetInherentCellYield(cell, false), Times.Once);
        }
        public YieldSummary GetYieldOfCell(IHexCell cell, ICivilization perspectiveCiv)
        {
            if (cell == null)
            {
                throw new ArgumentNullException("cell");
            }

            YieldSummary retval         = YieldSummary.Empty;
            ICity        cityOwningCell = CellPossessionCanon.GetOwnerOfPossession(cell);

            retval += InherentYieldLogic.GetInherentCellYield(cell, false);

            var nodeAtLocation = NodePositionCanon.GetPossessionsOfOwner(cell).FirstOrDefault();

            var visibleResources = TechCanon.GetResourcesVisibleToCiv(perspectiveCiv);

            var improvementOnCell = ImprovementLocationCanon.GetPossessionsOfOwner(cell).FirstOrDefault();

            var discoveredTechs = TechCanon.GetTechsDiscoveredByCiv(perspectiveCiv);

            bool hasFreshWater = FreshWaterCanon.HasAccessToFreshWater(cell);

            if (cityOwningCell != null)
            {
                var buildingsOnCell = BuildingPossessionCanon.GetPossessionsOfOwner(cityOwningCell)
                                      .Select(building => building.Template);

                retval += BuildingYieldLogic.GetBonusCellYieldFromBuildings(cell, buildingsOnCell);
            }

            if (nodeAtLocation != null)
            {
                retval += NodeYieldLogic.GetYieldFromNode(nodeAtLocation, visibleResources, improvementOnCell);
            }

            if (improvementOnCell != null)
            {
                retval += ImprovementYieldLogic.GetYieldOfImprovement(
                    improvementOnCell, nodeAtLocation, visibleResources, discoveredTechs, hasFreshWater
                    );
            }

            if (perspectiveCiv != null && GoldenAgeCanon.IsCivInGoldenAge(perspectiveCiv) && retval[YieldType.Gold] > 0f)
            {
                retval[YieldType.Gold] += CivConfig.GoldenAgeBonusGoldOnCells;
            }

            return(retval);
        }
        public void GetYieldOfCell_CallsIntoImprovementYieldIfCellHasImprovement()
        {
            var cell = BuildCell(true);

            var visibleResources = new List <IResourceDefinition>()
            {
                BuildResourceDefinition(), BuildResourceDefinition()
            };

            var discoveredTechs = new List <ITechDefinition>()
            {
                BuildTechDefinition(), BuildTechDefinition(),
            };

            var civ = BuildCivilization(visibleResources, discoveredTechs);

            var node = BuildResourceNode(cell);

            var improvement = BuildImprovement(cell);

            var improvementYield = new YieldSummary(food: 5, production: 4, gold: 3);

            MockImprovementYieldLogic.Setup(
                logic => logic.GetYieldOfImprovement(
                    improvement, node, It.IsAny <IEnumerable <IResourceDefinition> >(),
                    It.IsAny <IEnumerable <ITechDefinition> >(), It.IsAny <bool>()
                    )
                ).Returns(improvementYield);


            var yieldLogic = Container.Resolve <CellYieldLogic>();

            Assert.AreEqual(improvementYield, yieldLogic.GetYieldOfCell(cell, civ));

            MockImprovementYieldLogic.Verify(
                logic => logic.GetYieldOfImprovement(
                    improvement, node,
                    It.Is <IEnumerable <IResourceDefinition> >(
                        resources => resources.SequenceEqual(visibleResources)
                        ),
                    It.Is <IEnumerable <ITechDefinition> >(
                        techs => techs.SequenceEqual(discoveredTechs)
                        ),
                    true
                    ),
                Times.Once
                );
        }
Beispiel #22
0
        private void BringYieldTypeToMin(
            YieldType type, float minYield, HomelandData homelandData,
            ref YieldSummary currentYield
            )
        {
            float yieldDeficit = minYield - currentYield[type];

            var strategyWeightsByRegion = new Dictionary <MapRegion, Dictionary <IBalanceStrategy, int> >();

            foreach (var region in homelandData.AllRegions)
            {
                strategyWeightsByRegion[region] = homelandData.GetDataOfRegion(region).GetBalanceStrategyWeights();
            }

            int iterations = homelandData.AllRegions.Count() * 10;

            List <MapRegion> regions = homelandData.AllRegions.ToList();

            while (yieldDeficit > 0 && iterations-- > 0)
            {
                if (regions.Count == 0)
                {
                    regions = homelandData.AllRegions.ToList();
                }

                var region = regions.Random();
                regions.Remove(region);

                var strategyWeights = strategyWeightsByRegion[region];

                var strategy = GetStrategy(strategyWeights);

                YieldSummary yieldAdded;
                if (strategy.TryIncreaseYield(region, homelandData.GetDataOfRegion(region), type, out yieldAdded))
                {
                    yieldDeficit -= yieldAdded[type];
                    currentYield += yieldAdded;
                }
            }

            if (currentYield[type] < minYield)
            {
                Debug.LogWarningFormat("Failed to bring yield type {0} to min yield {1}", type, minYield);
            }
        }
        public void GetYieldOfCell_IgnoresBonusGoldIfCellDoesntProduceGold()
        {
            var cell = BuildCell();

            var cellYield = new YieldSummary(food: 1, production: 2);

            MockInherentCellYieldLogic.Setup(logic => logic.GetInherentCellYield(cell, false)).Returns(cellYield);

            MockCivConfig.Setup(config => config.GoldenAgeBonusGoldOnCells).Returns(3);

            var civ = BuildCivilization(new List <IResourceDefinition>(), new List <ITechDefinition>(), true);

            var yieldLogic = Container.Resolve <CellYieldLogic>();

            Assert.AreEqual(
                new YieldSummary(food: 1f, production: 2f), yieldLogic.GetYieldOfCell(cell, civ)
                );
        }
        public void GetYieldOfCell_AddsConfiguredBonusGoldIfCellProducesGold_AndPerspectiveCivInAGoldenAge()
        {
            var cell = BuildCell();

            var cellYield = new YieldSummary(food: 1, production: 2, gold: 3);

            MockInherentCellYieldLogic.Setup(logic => logic.GetInherentCellYield(cell, false)).Returns(cellYield);

            MockCivConfig.Setup(config => config.GoldenAgeBonusGoldOnCells).Returns(3);

            var civ = BuildCivilization(new List <IResourceDefinition>(), new List <ITechDefinition>(), true);

            var yieldLogic = Container.Resolve <CellYieldLogic>();

            Assert.AreEqual(
                new YieldSummary(food: 1f, production: 2f, gold: 6f), yieldLogic.GetYieldOfCell(cell, civ)
                );
        }
 public string GetTMProFormattedYieldString(
     YieldSummary summary, IEnumerable <YieldType> typesToDisplay,
     bool includeEmptyValues = false, bool plusOnPositiveNumbers = true
     )
 {
     if (includeEmptyValues)
     {
         return(GetTMProFormattedYieldString(
                    summary, typesToDisplay, plusOnPositiveNumbers
                    ));
     }
     else
     {
         return(GetTMProFormattedYieldString(
                    summary, typesToDisplay.Where(type => summary[type] != 0f),
                    plusOnPositiveNumbers
                    ));
     }
 }
Beispiel #26
0
        public void DivisionOperatorFloat_DividesComponentsByCoefficientAndRounds()
        {
            var summary       = new YieldSummary(food: 2, production: 2, gold: 2);
            var copyOfSummary = new YieldSummary(summary);

            var divOne   = summary / 2f;
            var divTwo   = summary / 3.5f;
            var divThree = summary / -4.2f;

            foreach (var resourceType in EnumUtil.GetValues <YieldType>())
            {
                Assert.AreEqual(summary[resourceType] / 2f, divOne[resourceType], "DivOne has an incorrect value");
                Assert.AreEqual(summary[resourceType] / 3.5f, divTwo[resourceType], "DivTwo has an incorrect value");
                Assert.AreEqual(summary[resourceType] / -4.2f, divThree[resourceType], "DivThree has an incorrect value");

                Assert.AreEqual(copyOfSummary[resourceType], summary[resourceType],
                                "Summary's value was changed by the addition operations");
            }
        }
Beispiel #27
0
        public void MultiplicationOperatorFloat_MultipliesComponentsByCoefficientAndRounds()
        {
            var summary       = new YieldSummary(food: 1, production: 1, gold: 1);
            var copyOfSummary = new YieldSummary(summary);

            var multOne   = summary * 1f;
            var multTwo   = summary * 1.4f;
            var multThree = summary * -1.7f;

            foreach (var resourceType in EnumUtil.GetValues <YieldType>())
            {
                Assert.AreEqual(summary[resourceType] * 1f, multOne[resourceType], "MultOne has an incorrect value");
                Assert.AreEqual(summary[resourceType] * 1.4f, multTwo[resourceType], "MultTwo has an incorrect value");
                Assert.AreEqual(summary[resourceType] * -1.7f, multThree[resourceType], "MultThree has an incorrect value");

                Assert.AreEqual(copyOfSummary[resourceType], summary[resourceType],
                                "Summary's value was changed by the addition operations");
            }
        }
Beispiel #28
0
        public bool TryIncreaseYield(
            MapRegion region, RegionData regionData, YieldType type, out YieldSummary yieldAdded
            )
        {
            var availableResources = BonusResourcesWithYield[type].ToList();

            while (availableResources.Count > 0)
            {
                var chosenResource = ResourceRandomSampler.SampleElementsFromSet(
                    availableResources, 1, GetResourceSelectionWeightFunction(region, regionData)
                    ).FirstOrDefault();

                if (chosenResource == null)
                {
                    break;
                }

                var cell = CellRandomSampler.SampleElementsFromSet(
                    region.Cells, 1, GetCellPlacementWeightFunction(chosenResource)
                    ).FirstOrDefault();

                if (cell != null)
                {
                    var oldYield = YieldEstimator.GetYieldEstimateForCell(cell, TechCanon.AvailableTechs);

                    int copies = chosenResource.Type == ResourceType.Strategic
                               ? StrategicCopiesLogic.GetWeightedRandomCopies()
                               : 0;

                    ResourceNodeFactory.BuildNode(cell, chosenResource, copies);

                    yieldAdded = YieldEstimator.GetYieldEstimateForCell(cell, TechCanon.AvailableTechs) - oldYield;
                    return(true);
                }
                else
                {
                    availableResources.Remove(chosenResource);
                }
            }

            yieldAdded = YieldSummary.Empty;
            return(false);
        }
Beispiel #29
0
        public YieldSummary GetYieldEstimateForCell(IHexCell cell, CachedTechData techData)
        {
            var retval = YieldSummary.Empty;

            var nodeAtLocation = NodeLocationCanon.GetPossessionsOfOwner(cell).FirstOrDefault();

            var validImprovements = GetImprovementsValidFor(
                cell, nodeAtLocation, techData.VisibleResources, techData.AvailableImprovements
                );

            var yieldOfImprovements = validImprovements.Select(
                improvement => GetYieldEstimateForCellWithImprovement(
                    cell, nodeAtLocation, techData.VisibleResources, techData.ImprovementModifications,
                    techData.AvailableBuildingMods, improvement
                    )
                );

            YieldSummary bestYield = YieldSummary.Empty;
            float        bestScore = int.MinValue;

            if (yieldOfImprovements.Any())
            {
                foreach (var yield in yieldOfImprovements)
                {
                    var score = MapScorer.GetScoreOfYield(yield);

                    if (score > bestScore)
                    {
                        bestYield = yield;
                        bestScore = score;
                    }
                }
            }
            else
            {
                bestYield = GetYieldEstimateForCellWithImprovement(
                    cell, nodeAtLocation, techData.VisibleResources,
                    techData.ImprovementModifications, techData.AvailableBuildingMods, null
                    );
            }

            return(bestYield);
        }
Beispiel #30
0
        public void MultiplicationOperatorInt_MultipliesComponentsByCoefficient()
        {
            var summary       = new YieldSummary(food: 3, production: 2, gold: 0);
            var copyOfSummary = new YieldSummary(summary);

            var multOne   = summary * 6;
            var multTwo   = summary * 19;
            var multThree = summary * -7;

            foreach (var resourceType in EnumUtil.GetValues <YieldType>())
            {
                Assert.AreEqual(summary[resourceType] * 6, multOne[resourceType], "MultOne has an incorrect value");
                Assert.AreEqual(summary[resourceType] * 19, multTwo[resourceType], "MultTwo has an incorrect value");
                Assert.AreEqual(summary[resourceType] * -7, multThree[resourceType], "MultThree has an incorrect value");

                Assert.AreEqual(copyOfSummary[resourceType], summary[resourceType],
                                "Summary's value was changed by the addition operations");
            }
        }