private bool IsUnitInFriendlyTerritory(IUnit unit)
        {
            var unitOwner    = UnitPossessionCanon.GetOwnerOfPossession(unit);
            var unitLocation = UnitPositionCanon.GetOwnerOfPossession(unit);

            return(unitLocation != null && unitOwner == CivTerritoryLogic.GetCivClaimingCell(unitLocation));
        }
        public bool IsCityConnectedToCapital(ICity city)
        {
            var cityOwner = CityPossessionCanon.GetOwnerOfPossession(city);

            var capitalOfOwner = CapitalCityCanon.GetCapitalOfCiv(cityOwner);

            if (capitalOfOwner == city)
            {
                return(true);
            }

            if (capitalOfOwner == null)
            {
                return(false);
            }

            var cityLocation    = CityLocationCanon.GetOwnerOfPossession(city);
            var capitalLocation = CityLocationCanon.GetOwnerOfPossession(capitalOfOwner);

            var pathTo = HexPathfinder.GetShortestPathBetween(
                cityLocation, capitalLocation, ConnectionPathCostLogic.BuildCapitalConnectionPathCostFunction(cityOwner)
                );

            return(pathTo != null);
        }
Example #3
0
        public bool CanPlaceUnitAtLocation(IUnit unit, IHexCell location, bool isMeleeAttacking)
        {
            if (location == null)
            {
                return(true);
            }

            isMeleeAttacking &= unit.Type != UnitType.Civilian;

            var unitOwner = UnitPossessionCanon.GetOwnerOfPossession(unit);

            if (IsCellImpassableFor(unit.MovementSummary, location, unitOwner, isMeleeAttacking))
            {
                return(false);
            }
            else if (CellHasDomesticUnits(location, unitOwner))
            {
                return(!LocationHasUnitBlockingType(location, unit.Type));
            }
            else if (CellHasForeignUnits(location, unitOwner))
            {
                return(isMeleeAttacking);
            }
            else
            {
                return(true);
            }
        }
        public bool AreCivilizationsConnected(ICivilization civOne, ICivilization civTwo)
        {
            var capitalOne = CapitalCityCanon.GetCapitalOfCiv(civOne);
            var capitalTwo = CapitalCityCanon.GetCapitalOfCiv(civTwo);

            var capitalOneLocation = CityLocationCanon.GetOwnerOfPossession(capitalOne);
            var capitalTwoLocation = CityLocationCanon.GetOwnerOfPossession(capitalTwo);

            return(HexPathfinder.GetShortestPathBetween(
                       capitalOneLocation, capitalTwoLocation, ConnectionPathCostLogic.BuildCivConnectionPathCostFunction(civOne, civTwo)
                       ) != null);
        }
Example #5
0
        public bool CanHandleCommandOnUnit(AbilityCommandRequest command, IUnit unit)
        {
            var unitOwner = UnitPossessionCanon.GetOwnerOfPossession(unit);

            var unitLocation = UnitPositionCanon.GetOwnerOfPossession(unit);

            bool hasRightType = command.Type == AbilityCommandType.AnnexAdjacentTerritory;

            bool unitInOwnerTerritory = CivTerritoryLogic.GetCivClaimingCell(unitLocation) == unitOwner;

            bool hasAnyCities = CityPossessionCanon.GetPossessionsOfOwner(unitOwner).Any();

            return(hasRightType && unitInOwnerTerritory && hasAnyCities);
        }
        private void OnCityGainedBuilding(Tuple <ICity, IBuilding> data)
        {
            var city     = data.Item1;
            var building = data.Item2;

            var cityLocation = CityLocationCanon.GetOwnerOfPossession(city);
            var cityOwner    = CityPossessionCanon.GetOwnerOfPossession(city);

            foreach (var templateToBuild in building.Template.FreeUnits)
            {
                var validCell = GetValidNearbyCell(cityLocation, templateToBuild, cityOwner);

                UnitFactory.BuildUnit(validCell, templateToBuild, cityOwner);
            }
        }
        public YieldSummary GetYieldOfCellForCity(IHexCell cell, ICity city)
        {
            if (cell == null)
            {
                throw new ArgumentNullException("slot");
            }
            else if (city == null)
            {
                throw new ArgumentNullException("city");
            }

            ICivilization owner = CityPossessionCanon.GetOwnerOfPossession(city);

            return(CellYieldLogic.GetYieldOfCell(cell, owner) * GetMultiplier(city));
        }
        public void ReturnFocusToPlayer(IPlayer player)
        {
            var civOfPlayer = player.ControlledCiv;

            var capital = CapitalCityCanon.GetCapitalOfCiv(civOfPlayer);

            if (capital != null)
            {
                var capitalLocation = CityLocationCanon.GetOwnerOfPossession(capital);

                GameCamera.SnapToCell(capitalLocation);
            }
            else
            {
                var unitsOf = UnitPossessionCanon.GetPossessionsOfOwner(civOfPlayer);

                var cityBuilder = unitsOf.Where(unit => CanBuildCityLogic.CanUnitBuildCity(unit)).FirstOrDefault();

                if (cityBuilder != null)
                {
                    GameCamera.SnapToCell(UnitPositionCanon.GetOwnerOfPossession(cityBuilder));
                }
                else if (unitsOf.Any())
                {
                    GameCamera.SnapToCell(UnitPositionCanon.GetOwnerOfPossession(unitsOf.FirstOrDefault()));
                }
            }
        }
Example #9
0
        public void ComposeUnits(SerializableMapData mapData)
        {
            mapData.Units = new List <SerializableUnitData>();

            foreach (var unit in UnitFactory.AllUnits)
            {
                if (unit.Type == UnitType.City)
                {
                    continue;
                }

                var unitOwner    = UnitPossessionCanon.GetOwnerOfPossession(unit);
                var unitLocation = UnitPositionCanon.GetOwnerOfPossession(unit);

                var unitData = new SerializableUnitData()
                {
                    Location        = unitLocation.Coordinates,
                    Template        = unit.Template.name,
                    Owner           = unitOwner.Template.Name,
                    CurrentMovement = unit.CurrentMovement,
                    Hitpoints       = unit.CurrentHitpoints,
                    CurrentPath     = unit.CurrentPath != null?unit.CurrentPath.Select(cell => cell.Coordinates).ToList() : null,
                                          IsSetUpToBombard = unit.IsSetUpToBombard,
                                          Experience       = unit.Experience,
                                          Level            = unit.Level,
                                          PromotionTree    = PromotionTreeComposer.ComposePromotionTree(unit.PromotionTree)
                };

                mapData.Units.Add(unitData);
            }
        }
Example #10
0
        public bool IsCellValidForCity(IHexCell cell)
        {
            if (CellPossessionCanon.GetOwnerOfPossession(cell) != null)
            {
                return(false);
            }

            if (cell.Terrain.IsWater())
            {
                return(false);
            }

            if (cell.Feature != CellFeature.None)
            {
                return(false);
            }

            foreach (var city in CityFactory.AllCities)
            {
                var cityLocation = CityLocationCanon.GetOwnerOfPossession(city);

                if (HexGrid.GetDistance(cell, cityLocation) < Config.MinimumSeparation)
                {
                    return(false);
                }
            }

            return(true);
        }
        public float GetFoodStockpileAdditionFromIncome(ICity city, float foodIncome)
        {
            var cityOwner = CityPossessionCanon.GetOwnerOfPossession(city);

            var ownerHappiness = CivilizationHappinessLogic.GetNetHappinessOfCiv(cityOwner);

            float unmodifiedFoodGained;

            if (ownerHappiness < 0)
            {
                if (ownerHappiness > -10)
                {
                    unmodifiedFoodGained = foodIncome / 4f;
                }
                else
                {
                    unmodifiedFoodGained = 0;
                }
            }
            else
            {
                unmodifiedFoodGained = foodIncome;
            }

            float growthModifier = CityModifiers.Growth.GetValueForCity(city);

            return(unmodifiedFoodGained * growthModifier);
        }
Example #12
0
        public void PerformDamageOnUnitFromImprovements(IUnit unit)
        {
            var unitOwner    = UnitPossessionCanon.GetOwnerOfPossession(unit);
            var unitLocation = UnitPositionCanon.GetOwnerOfPossession(unit);

            float highestDamage = 0f;

            foreach (var nearbyCell in Grid.GetCellsInRadius(unitLocation, 1))
            {
                var ownerOfCell = CivTerritoryLogic.GetCivClaimingCell(nearbyCell);

                if (ownerOfCell == null || !WarCanon.AreAtWar(unitOwner, ownerOfCell))
                {
                    continue;
                }

                foreach (var improvement in ImprovementLocationCanon.GetPossessionsOfOwner(nearbyCell))
                {
                    highestDamage = Mathf.Max(highestDamage, improvement.Template.AdjacentEnemyDamagePercentage);
                }
            }

            if (highestDamage > 0f)
            {
                unit.CurrentHitpoints -= Mathf.RoundToInt(unit.MaxHitpoints * highestDamage);
            }
        }
        public bool CanHandleCommandOnUnit(AbilityCommandRequest command, IUnit unit)
        {
            if (command.Type != AbilityCommandType.Pillage)
            {
                return(false);
            }

            var unitLocation = UnitPositionCanon.GetOwnerOfPossession(unit);
            var unitOwner    = UnitPossessionCanon.GetOwnerOfPossession(unit);

            bool hasImprovement = ImprovementLocationCanon.GetPossessionsOfOwner(unitLocation).Any(
                improvement => !improvement.IsPillaged
                );

            if (hasImprovement || unitLocation.HasRoads)
            {
                var cellOwner = CivTerritoryLogic.GetCivClaimingCell(unitLocation);

                return(cellOwner == null || WarCanon.AreAtWar(unitOwner, cellOwner));
            }
            else
            {
                return(false);
            }
        }
        private void SetCityToAttack(ICity city)
        {
            Clear();
            CityToAttack = city;
            var cityLocation = CityLocationCanon.GetOwnerOfPossession(city);

            OverlayManager.ShowOverlayOfCell(cityLocation, CellOverlayType.AttackIndicator);

            CombatSummaryDisplay.AttackingUnit = SelectedUnit;
            CombatSummaryDisplay.DefendingUnit = city.CombatFacade;
            CombatSummaryDisplay.IsMeleeAttack = true;

            CombatSummaryDisplay.gameObject.SetActive(true);

            CombatSummaryDisplay.Refresh();
        }
        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 override void Refresh()
        {
            foreach (var projectRecord in new List <CityProjectRecord>(InstantiatedProjectRecords))
            {
                Destroy(projectRecord.gameObject);
            }
            InstantiatedProjectRecords.Clear();

            if (ObjectToDisplay == null)
            {
                return;
            }

            var cityOwner = CityPossessionCanon.GetOwnerOfPossession(ObjectToDisplay);

            if (DisplayType == CityDisplayType.PlayMode)
            {
                AddUnitProjects(cityOwner);

                AddBuildingProjects(
                    cityOwner, TechCanon.GetResearchedBuildings(cityOwner),
                    template => ObjectToDisplay.ActiveProject = ProjectFactory.ConstructProject(template)
                    );
            }
            else if (DisplayType == CityDisplayType.MapEditor)
            {
                AddBuildingProjects(
                    cityOwner, AllBuildingTemplates,
                    template => BuildingFactory.BuildBuilding(template, ObjectToDisplay)
                    );
            }
        }
Example #17
0
        public void ApplyToMaps(InfluenceMaps maps, ICivilization targetCiv)
        {
            foreach (var unit in UnitFactory.AllUnits)
            {
                var unitOwner    = UnitPossessionCanon.GetOwnerOfPossession(unit);
                var unitLocation = UnitPositionCanon.GetOwnerOfPossession(unit);

                float unitStrength = UnitStrengthEstimator.EstimateUnitStrength(unit);

                if (unitOwner == targetCiv)
                {
                    InfluenceMapApplier.ApplyInfluenceToMap(
                        unitStrength, maps.AllyPresence, unitLocation, AIConfig.UnitMaxInfluenceRadius,
                        InfluenceMapApplier.PowerOfTwoRolloff, InfluenceMapApplier.ApplySum
                        );
                }
                else if (WarCanon.AreAtWar(unitOwner, targetCiv))
                {
                    InfluenceMapApplier.ApplyInfluenceToMap(
                        unitStrength, maps.EnemyPresence, unitLocation, AIConfig.UnitMaxInfluenceRadius,
                        InfluenceMapApplier.PowerOfTwoRolloff, InfluenceMapApplier.ApplySum
                        );
                }
            }
        }
        public IEnumerable <IPromotion> GetPromotionsForUnit(IUnit unit)
        {
            var unitOwner = UnitPossessionCanon.GetOwnerOfPossession(unit);

            return(unit.Template.StartingPromotions
                   .Concat(GlobalPromotionLogic.GetGlobalPromotionsOfCiv(unitOwner))
                   .Concat(unit.PromotionTree.GetAllPromotions()));
        }
Example #19
0
        public bool CanSetCapitalOfCiv(ICivilization civ, ICity city)
        {
            if (civ == null)
            {
                throw new ArgumentNullException("civ");
            }

            return(city == null || (GetCapitalOfCiv(civ) != city && CityPossessionCanon.GetOwnerOfPossession(city) == civ));
        }
        private bool ShouldCombatResultInCitySack(IUnit attacker, IUnit defender, CombatInfo combatInfo)
        {
            var attackerOwner = UnitPossessionCanon.GetOwnerOfPossession(attacker);

            return(attackerOwner.Template.IsBarbaric &&
                   defender.CurrentHitpoints <= 0 &&
                   defender.Type == UnitType.City &&
                   combatInfo.CombatType == CombatType.Melee);
        }
Example #21
0
        private bool IsMovementValidForConnection(IHexCell fromCell, IHexCell toCell, ICivilization civOne, ICivilization civTwo)
        {
            if (toCell.Terrain.IsWater())
            {
                if (fromCell.Terrain.IsWater())
                {
                    return(true);
                }

                var cityAtFromCell = CityLocationCanon.GetPossessionsOfOwner(fromCell).FirstOrDefault();
                if (cityAtFromCell == null)
                {
                    return(false);
                }

                var cityOwner = CityPossessionCanon.GetOwnerOfPossession(cityAtFromCell);
                if (cityOwner != civOne && cityOwner != civTwo)
                {
                    return(false);
                }

                return(IsCityValidHarbor(cityAtFromCell));
            }
            else if (toCell.HasRoads)
            {
                return(true);
            }
            else
            {
                var cityAtToCell = CityLocationCanon.GetPossessionsOfOwner(toCell).FirstOrDefault();
                if (cityAtToCell == null)
                {
                    return(false);
                }

                var cityOwner = CityPossessionCanon.GetOwnerOfPossession(cityAtToCell);
                if (cityOwner != civOne && cityOwner != civTwo)
                {
                    return(false);
                }

                return(!fromCell.Terrain.IsWater() || toCell.Terrain.IsWater() || IsCityValidHarbor(cityAtToCell));
            }
        }
        private void OnCityGainedBuilding(Tuple <ICity, IBuilding> data)
        {
            var city     = data.Item1;
            var building = data.Item2;

            if (building.Template.StartsGoldenAge)
            {
                TryStartGoldenAge(CityPossessionCanon.GetOwnerOfPossession(city));
            }
        }
Example #23
0
        public bool IsCityGarrisoned(ICity city)
        {
            var cityLocation = CityLocationCanon.GetOwnerOfPossession(city);

            var militaryUnitsAt = UnitPositionCanon
                                  .GetPossessionsOfOwner(cityLocation)
                                  .Where(unit => unit.Type != UnitType.Civilian && unit.Type != UnitType.City);

            return(militaryUnitsAt.Any());
        }
Example #24
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));
        }
Example #25
0
        public void OnMeleeCombatWithUnit(UnitCombatResults results)
        {
            HandleBounty(results);

            if (results.Defender.Type != UnitType.City)
            {
                return;
            }

            var attackerOwner = UnitPossessionLogic.GetOwnerOfPossession(results.Attacker);
            var defenderOwner = UnitPossessionLogic.GetOwnerOfPossession(results.Defender);

            var goldStolen = Mathf.Min(
                results.DamageToDefender * results.Attacker.CombatSummary.GoldRaidingPercentage,
                defenderOwner.GoldStockpile
                );

            defenderOwner.GoldStockpile -= Mathf.FloorToInt(goldStolen);
            attackerOwner.GoldStockpile += Mathf.FloorToInt(goldStolen);
        }
        private bool IsConditionMetByAdjacentUnits(IUnit centerUnit)
        {
            var unitOwner    = UnitPossessionCanon.GetOwnerOfPossession(centerUnit);
            var unitLocation = UnitPositionCanon.GetOwnerOfPossession(centerUnit);

            foreach (var adjacentCell in Grid.GetNeighbors(unitLocation))
            {
                foreach (var adjacentUnit in UnitPositionCanon.GetPossessionsOfOwner(adjacentCell))
                {
                    var adjacentOwner = UnitPossessionCanon.GetOwnerOfPossession(adjacentUnit);

                    if (adjacentOwner == unitOwner && UnitTypeArguments.Contains(adjacentUnit.Type))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }
Example #27
0
        public void RazeCity(ICity city)
        {
            var cityLocation = CityLocationCanon.GetOwnerOfPossession(city);

            city.Destroy();

            if (cityLocation.Feature == CellFeature.None && CellModLogic.CanChangeFeatureOfCell(cityLocation, CellFeature.CityRuins))
            {
                CellModLogic.ChangeFeatureOfCell(cityLocation, CellFeature.CityRuins);
            }
        }
        public override bool CanExecuteBetweenCivs(ICivilization fromCiv, ICivilization toCiv)
        {
            if (CityInput == null)
            {
                return(false);
            }

            var cityOwner = CityPossessionCanon.GetOwnerOfPossession(CityInput);

            return(cityOwner == fromCiv && CityPossessionCanon.CanChangeOwnerOfPossession(CityInput, toCiv));
        }
Example #29
0
        private bool DoesCellHaveUnitsForeignTo(IHexCell cell, ICivilization domesticCiv)
        {
            foreach (var unit in UnitPositionCanon.GetPossessionsOfOwner(cell))
            {
                if (UnitPossessionCanon.GetOwnerOfPossession(unit) != domesticCiv)
                {
                    return(true);
                }
            }

            return(false);
        }
        protected override void DoOnPossessionEstablished(IBuilding building, ICity newOwner)
        {
            if (newOwner == null)
            {
                return;
            }

            var cityOwner = CityPossessionCanon.GetOwnerOfPossession(newOwner);

            foreach (var resource in building.Template.ResourcesConsumed)
            {
                ResourceLockingCanon.LockCopyOfResourceForCiv(resource, cityOwner);
            }

            if (building.Template.ProvidesFreeTech)
            {
                TechCanon.AddFreeTechToCiv(cityOwner);
            }

            CitySignals.GainedBuilding.OnNext(new Tuple <ICity, IBuilding>(newOwner, building));
        }