private bool AskForArmy(int numberOfUnits)
 {
     if (!base.AIDataArmyGUID.IsValid && numberOfUnits > 0 && this.armySpawnTicket == null)
     {
         PathfindingContext pathfindingContext = new PathfindingContext(this.Camp.City.GUID, this.Camp.City.Empire, this.Camp.City.StandardUnits);
         WorldPosition      armyPosition;
         if (!DepartmentOfTheInterior.TryGetWorldPositionForNewArmyFromCity(this.Camp.City, this.pathfindingService, pathfindingContext, out armyPosition))
         {
             return(false);
         }
         if (this.Camp.City.StandardUnits.Count == 0)
         {
             return(false);
         }
         numberOfUnits = Mathf.Min(this.Camp.City.StandardUnits.Count, numberOfUnits);
         if (numberOfUnits > 0)
         {
             GameEntityGUID[] array = new GameEntityGUID[numberOfUnits];
             for (int i = 0; i < numberOfUnits; i++)
             {
                 array[i] = this.Camp.City.StandardUnits[i].GUID;
             }
             OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, this.Camp.City.GUID, array, armyPosition, null, false, true, true);
             base.Commander.Empire.PlayerControllers.AI.PostOrder(order, out this.armySpawnTicket, null);
         }
     }
     return(false);
 }
Пример #2
0
    protected override bool TryComputeArmyMissionParameter()
    {
        if (this.RegionTarget == null || base.AIDataArmyGUID == GameEntityGUID.Zero)
        {
            base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
            return(false);
        }
        base.ArmyMissionParameters.Clear();
        Army army = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID).Army;

        if (army == null || !army.GUID.IsValid)
        {
            return(false);
        }
        if (this.game.Turn == 0 && army.StandardUnits != null && army.StandardUnits.Count > 1 && army.GetPropertyValue(SimulationProperties.Movement) > 1f)
        {
            List <Unit> list = army.StandardUnits.ToList <Unit>().FindAll((Unit U) => !U.IsSettler);
            if (list != null)
            {
                IGameService              service  = Services.GetService <IGameService>();
                IPathfindingService       service2 = service.Game.Services.GetService <IPathfindingService>();
                IWorldPositionningService service3 = service.Game.Services.GetService <IWorldPositionningService>();
                WorldPosition             validArmySpawningPosition = AILayer_ArmyRecruitment.GetValidArmySpawningPosition(army, service3, service2);
                if (validArmySpawningPosition.IsValid)
                {
                    OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, army.GUID, list.ConvertAll <GameEntityGUID>((Unit unit) => unit.GUID).ToArray(), validArmySpawningPosition, StaticString.Empty, false, true, true);
                    Ticket ticket;
                    base.Commander.Empire.PlayerControllers.Server.PostOrder(order, out ticket, new EventHandler <TicketRaisedEventArgs>(this.OrderSplitUnit));
                    return(false);
                }
            }
        }
        if (this.RegionTarget == null || this.RegionTarget.IsRegionColonized() || !army.IsSettler)
        {
            return(base.TryCreateArmyMission("MajorFactionRoaming", new List <object>
            {
                this.RegionTarget.Index,
                false
            }));
        }
        if (base.AIDataArmyGUID == GameEntityGUID.Zero || this.PositionIndex >= this.ListOfPosition.Length)
        {
            return(false);
        }
        if (base.Commander.Empire.GetAgency <DepartmentOfTheInterior>().Cities.Count == 0)
        {
            return(base.TryCreateArmyMission("ColonizeAtImmediatly", new List <object>
            {
                this.ListOfPosition[this.PositionIndex]
            }));
        }
        return(base.TryCreateArmyMission("ColonizeAt", new List <object>
        {
            this.ListOfPosition[this.PositionIndex]
        }));
    }
Пример #3
0
    protected override bool TryComputeArmyMissionParameter()
    {
        base.ArmyMissionParameters.Clear();
        if (base.AIDataArmyGUID == GameEntityGUID.Zero)
        {
            return(false);
        }
        if (this.POI == null)
        {
            base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
            return(false);
        }
        Army army = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID).Army;

        if (army.Hero != null)
        {
            OrderChangeHeroAssignment orderChangeHeroAssignment = new OrderChangeHeroAssignment(base.Commander.Empire.Index, army.Hero.GUID, GameEntityGUID.Zero);
            orderChangeHeroAssignment.IgnoreCooldown = true;
            base.Commander.Empire.PlayerControllers.AI.PostOrder(orderChangeHeroAssignment);
            return(true);
        }
        if (army.StandardUnits.Count((Unit x) => x.UnitDesign.UnitBodyDefinition.SubCategory == "SubCategoryFlying" && x.GetPropertyValue(SimulationProperties.LevelDisplayed) >= 4f) == 0)
        {
            this.Success();
        }
        if (army.StandardUnits.Count <= 1)
        {
            return(base.TryCreateArmyMission("VisitQuestRuin", new List <object>
            {
                this.RegionTarget.Index,
                this.POI
            }));
        }
        Unit        item   = army.StandardUnits.First((Unit x) => x.UnitDesign.UnitBodyDefinition.SubCategory == "SubCategoryFlying" && x.GetPropertyValue(SimulationProperties.LevelDisplayed) >= 4f);
        List <Unit> second = new List <Unit>
        {
            item
        };
        List <Unit>   list = army.StandardUnits.Except(second).ToList <Unit>();
        WorldPosition validArmySpawningPosition = AILayer_ArmyRecruitment.GetValidArmySpawningPosition(army, this.worldPositionningService, this.pathfindingService);

        if (!validArmySpawningPosition.IsValid || list.Count == 0)
        {
            return(base.TryCreateArmyMission("MajorFactionRoaming", new List <object>
            {
                this.RegionTarget.Index,
                true
            }));
        }
        OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, army.GUID, list.ConvertAll <GameEntityGUID>((Unit unit) => unit.GUID).ToArray(), validArmySpawningPosition, StaticString.Empty, false, true, true);

        base.Commander.Empire.PlayerControllers.Server.PostOrder(order);
        return(true);
    }
Пример #4
0
 private bool AskForArmy(int numberOfUnits)
 {
     if (!base.AIDataArmyGUID.IsValid && this.armySpawnTicket == null)
     {
         if (this.City.BesiegingEmpire != null)
         {
             int maxValue = int.MaxValue;
             for (int i = 0; i < this.City.Districts.Count; i++)
             {
                 if (District.IsACityTile(this.City.Districts[i]))
                 {
                     Army armyAtPosition = this.worldPositionningService.GetArmyAtPosition(this.City.Districts[i].WorldPosition);
                     if (armyAtPosition != null && armyAtPosition.Empire == this.City.Empire)
                     {
                         int distanceToBesieger = this.GetDistanceToBesieger(this.City.Districts[i].WorldPosition);
                         if (distanceToBesieger < maxValue)
                         {
                             base.AIDataArmyGUID = armyAtPosition.GUID;
                         }
                         if (distanceToBesieger == 1)
                         {
                             return(false);
                         }
                     }
                 }
             }
             if (base.AIDataArmyGUID.IsValid)
             {
                 return(false);
             }
         }
         PathfindingContext pathfindingContext = new PathfindingContext(this.City.GUID, this.City.Empire, this.City.StandardUnits);
         WorldPosition      armyPosition;
         if (!DepartmentOfTheInterior.TryGetWorldPositionForNewArmyFromCity(this.City, this.pathfindingService, pathfindingContext, out armyPosition))
         {
             return(false);
         }
         if (this.City.StandardUnits.Count == 0)
         {
             return(false);
         }
         numberOfUnits = Mathf.Min(this.City.StandardUnits.Count, numberOfUnits);
         GameEntityGUID[] array = new GameEntityGUID[numberOfUnits];
         for (int j = 0; j < numberOfUnits; j++)
         {
             array[j] = this.City.StandardUnits[j].GUID;
         }
         OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, this.City.GUID, array, armyPosition, null, false, true, true);
         base.Commander.Empire.PlayerControllers.AI.PostOrder(order, out this.armySpawnTicket, null);
     }
     return(false);
 }
    private void OrderTransferUnitToNewArmyTicketRaised(object sender, TicketRaisedEventArgs e)
    {
        this.createFirstArmyTicket = null;
        if (e.Result != PostOrderResponse.Processed)
        {
            for (int i = 0; i < this.UnitGuids.Length; i++)
            {
                IGameEntity gameEntity;
                if (this.gameEntityRepositoryService.TryGetValue(this.UnitGuids[i], out gameEntity))
                {
                    Unit unit = gameEntity as Unit;
                    if (unit != null && (double)unit.GetPropertyValue(SimulationProperties.Movement) < 0.001)
                    {
                        base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
                    }
                    return;
                }
            }
            base.Completion = AICommanderMission.AICommanderMissionCompletion.Initializing;
            return;
        }
        OrderTransferGarrisonToNewArmy orderTransferGarrisonToNewArmy = e.Order as OrderTransferGarrisonToNewArmy;
        AIData_Army aidata = this.aiDataRepository.GetAIData <AIData_Army>(orderTransferGarrisonToNewArmy.ArmyGuid);

        if (aidata != null)
        {
            aidata.UnassignArmyMission();
            for (int j = 0; j < this.UnitGuids.Length; j++)
            {
                AIData_Unit aidata_Unit;
                this.aiDataRepository.TryGetAIData <AIData_Unit>(this.UnitGuids[j], out aidata_Unit);
                if (aidata_Unit == null)
                {
                    Diagnostics.LogWarning("[AICommanderMission_RegroupArmyAt] no AIData for Unit {0}", new object[]
                    {
                        this.UnitGuids[j].ToString()
                    });
                }
                else
                {
                    aidata_Unit.TryUnLockUnit(base.InternalGUID);
                }
            }
            base.AIDataArmyGUID = aidata.GameEntity.GUID;
            if (!aidata.AssignCommanderMission(this))
            {
                Diagnostics.LogWarning(string.Format("LOCKING Problem in [AICommanderMission_RegroupArmyAt]", new object[0]));
            }
        }
    }
 private bool WaitingOnArmyTicket()
 {
     if (this.armySpawnTicket != null && this.armySpawnTicket.Raised)
     {
         if (this.armySpawnTicket.PostOrderResponse == PostOrderResponse.Processed)
         {
             OrderTransferGarrisonToNewArmy orderTransferGarrisonToNewArmy = this.armySpawnTicket.Order as OrderTransferGarrisonToNewArmy;
             if (this.armySpawnTicket != null)
             {
                 base.AIDataArmyGUID = orderTransferGarrisonToNewArmy.ArmyGuid;
             }
         }
         this.armySpawnTicket = null;
     }
     return(this.armySpawnTicket != null);
 }
Пример #7
0
    private void DoRazeInfectedCity()
    {
        Construction currentConstructionRaze = this.GetCurrentConstructionRaze();

        if (currentConstructionRaze != null)
        {
            OrderCancelConstruction order = new OrderCancelConstruction(this.City.Empire.Index, this.City.GUID, currentConstructionRaze.GUID);
            Ticket ticket;
            this.playerControllerRepository.ActivePlayerController.PostOrder(order, out ticket, new EventHandler <TicketRaisedEventArgs>(this.OnOrderResponse));
        }
        else
        {
            bool flag = !Amplitude.Unity.Runtime.Runtime.Registry.GetValue <bool>(OvergrownCityPanel.gameplaySettingOvergrownCityImmediateRazePath, true);
            if (flag)
            {
                DepartmentOfIndustry agency = this.City.Empire.GetAgency <DepartmentOfIndustry>();
                IEnumerable <DepartmentOfIndustry.ConstructibleElement> availableConstructibleElementsAsEnumerable = agency.ConstructibleElementDatabase.GetAvailableConstructibleElementsAsEnumerable(new StaticString[0]);
                DepartmentOfIndustry.ConstructibleElement constructibleElement = availableConstructibleElementsAsEnumerable.FirstOrDefault((DepartmentOfIndustry.ConstructibleElement m) => m.Name == OvergrownCityPanel.CityConstructibleActionInfectedRaze);
                OrderQueueConstruction order2 = new OrderQueueConstruction(this.City.Empire.Index, this.City.GUID, constructibleElement, string.Empty);
                Ticket ticket2;
                this.playerControllerRepository.ActivePlayerController.PostOrder(order2, out ticket2, new EventHandler <TicketRaisedEventArgs>(this.OnOrderResponse));
            }
            else
            {
                WorldPosition firstAvailablePositionForArmyCreation = this.GetFirstAvailablePositionForArmyCreation();
                if (this.City.StandardUnits.Count > 0 && firstAvailablePositionForArmyCreation.IsValid)
                {
                    OrderTransferGarrisonToNewArmy order3 = new OrderTransferGarrisonToNewArmy(this.City.Empire.Index, this.City.GUID, (from m in this.City.Units
                                                                                                                                        select m.GUID).ToArray <GameEntityGUID>(), firstAvailablePositionForArmyCreation, StaticString.Empty, false, false, false);
                    Ticket ticket3;
                    this.playerControllerRepository.ActivePlayerController.PostOrder(order3, out ticket3, new EventHandler <TicketRaisedEventArgs>(this.OrderTransferGarrisonToNewArmy_TicketRaised));
                }
                else
                {
                    this.SendOrderDestroyCity();
                }
                this.Hide(true);
            }
        }
    }
Пример #8
0
 private bool WaitingOnArmyTicket()
 {
     if (this.armySpawnTicket != null && this.armySpawnTicket.Raised)
     {
         if (this.armySpawnTicket.PostOrderResponse == PostOrderResponse.Processed)
         {
             OrderTransferGarrisonToNewArmy orderTransferGarrisonToNewArmy = this.armySpawnTicket.Order as OrderTransferGarrisonToNewArmy;
             if (orderTransferGarrisonToNewArmy != null)
             {
                 base.AIDataArmyGUID = orderTransferGarrisonToNewArmy.ArmyGuid;
                 if (this.HighPriority)
                 {
                     base.TryGetArmyData();
                 }
             }
         }
         else if (this.armySpawnTicket.PostOrderResponse == PostOrderResponse.PreprocessHasFailed)
         {
             base.Success();
         }
         this.armySpawnTicket = null;
     }
     return(this.armySpawnTicket != null);
 }
Пример #9
0
    protected override bool TryComputeArmyMissionParameter()
    {
        if (this.ticket != null)
        {
            if (this.ticket.Raised)
            {
                this.ticket = null;
            }
            return(false);
        }
        if (base.AIDataArmyGUID.IsValid && this.TargetCity != null && this.TargetCity.Empire == base.Commander.Empire && this.aiDataRepository.GetAIData <AIData_City>(this.TargetCity.GUID) != null)
        {
            AIData_Army aidata = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID);
            if (aidata != null)
            {
                List <object> list = new List <object>();
                list.Add(this.TargetCity);
                if (this.TargetCity.MaximumUnitSlot > this.TargetCity.CurrentUnitSlot + aidata.Army.CurrentUnitSlot)
                {
                    return(base.TryCreateArmyMission("DefendCity_Bail", list));
                }
                if (aidata.Army.CurrentUnitSlot > 1)
                {
                    GameEntityGUID[] array = new GameEntityGUID[1];
                    for (int i = 0; i < aidata.Army.StandardUnits.Count; i++)
                    {
                        if (aidata.Army.StandardUnits[i].IsSettler && aidata.Army.StandardUnits[i].GetPropertyValue(SimulationProperties.Movement) > 0f)
                        {
                            array[0] = aidata.Army.StandardUnits[i].GUID;
                            break;
                        }
                    }
                    WorldPosition neighbourFirstAvailablePositionForArmyCreation = DepartmentOfDefense.GetNeighbourFirstAvailablePositionForArmyCreation(aidata.Army);
                    if (neighbourFirstAvailablePositionForArmyCreation.IsValid && array[0].IsValid)
                    {
                        OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, base.AIDataArmyGUID, array, neighbourFirstAvailablePositionForArmyCreation, null, false, true, true);
                        base.Commander.Empire.PlayerControllers.AI.PostOrder(order, out this.ticket, null);
                    }
                    return(false);
                }
                return(base.TryCreateArmyMission("ReachTarget", list));
            }
        }
        Diagnostics.Assert(AIScheduler.Services != null);
        IIntelligenceAIHelper service = AIScheduler.Services.GetService <IIntelligenceAIHelper>();

        Diagnostics.Assert(service != null);
        List <Region> list2 = new List <Region>();

        if (service.TryGetListOfRegionToExplore(base.Commander.Empire, 0.95f, ref list2))
        {
            foreach (Region region in list2)
            {
                if (AILayer_Exploration.IsRegionValidForExploration(base.Commander.Empire, region))
                {
                    return(base.TryCreateArmyMission("ExploreAt", new List <object>
                    {
                        region.Index
                    }));
                }
            }
            return(false);
        }
        return(false);
    }
    protected override bool TryComputeArmyMissionParameter()
    {
        if (this.RegionTarget == null)
        {
            base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
            return(false);
        }
        base.ArmyMissionParameters.Clear();
        if (base.AIDataArmyGUID == GameEntityGUID.Zero)
        {
            return(false);
        }
        this.POI = this.SelectPOI();
        if (this.POI == null)
        {
            base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
            return(false);
        }
        AICommander_Victory comm = base.Commander as AICommander_Victory;

        if (comm == null)
        {
            return(false);
        }
        Army  army          = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID).Army;
        int   num           = army.StandardUnits.Count((Unit x) => x.UnitDesign.Name.ToString().Contains(comm.VictoryDesign));
        float propertyValue = army.GetPropertyValue(SimulationProperties.Movement);

        if (propertyValue <= 0.01f)
        {
            base.State = TickableState.NoTick;
            return(false);
        }
        if (num > 5 || this.worldPositionningService.IsWaterTile(army.WorldPosition))
        {
            return(base.TryCreateArmyMission("VisitQuestRuinFinal", new List <object>
            {
                this.RegionTarget.Index,
                this.POI
            }));
        }
        if (num == 0)
        {
            return(base.TryCreateArmyMission("MajorFactionWarRoaming", new List <object>
            {
                this.RegionTarget.Index,
                true
            }));
        }
        if (num <= 0 || army.StandardUnits.Count - num <= 0)
        {
            List <AICommanderMission> list = comm.Missions.FindAll((AICommanderMission x) => x is AICommanderMission_VictoryRuinFinal && x.AIDataArmyGUID.IsValid);
            List <Army> list2 = new List <Army>();
            Func <Unit, bool> < > 9__4;
            foreach (AICommanderMission aicommanderMission in list)
            {
                Army army2 = this.aiDataRepository.GetAIData <AIData_Army>(aicommanderMission.AIDataArmyGUID).Army;
                if (army2 != army)
                {
                    IEnumerable <Unit> standardUnits = army2.StandardUnits;
                    Func <Unit, bool>  selector;
                    if ((selector = < > 9__4) == null)
                    {
                        selector = (< > 9__4 = ((Unit y) => y.UnitDesign.Name.ToString().Contains(comm.VictoryDesign)));
                    }
                    int num2 = standardUnits.Count(selector);
                    if (num2 > 0 && num2 < 6)
                    {
                        list2.Add(army2);
                    }
                }
            }
            int num3 = (int)base.Commander.Empire.GetPropertyValue(SimulationProperties.ArmyUnitSlot);
            Predicate <Unit> < > 9__5;
            foreach (Army army3 in list2)
            {
                if (this.worldPositionningService.GetDistance(army.WorldPosition, army3.WorldPosition) == 1 && this.worldPositionningService.IsWaterTile(army.WorldPosition) == this.worldPositionningService.IsWaterTile(army3.WorldPosition) && this.pathfindingService.IsTransitionPassable(army.WorldPosition, army3.WorldPosition, army, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreFogOfWar, null))
                {
                    float propertyValue2 = army3.GetPropertyValue(SimulationProperties.Movement);
                    if ((propertyValue > propertyValue2 || (propertyValue == propertyValue2 && army.GUID < army3.GUID) || (army.StandardUnits.Count >= num3 && propertyValue > 0.01f)) && army3.StandardUnits.Count < num3)
                    {
                        List <Unit>      list3 = army.StandardUnits.ToList <Unit>();
                        Predicate <Unit> match;
                        if ((match = < > 9__5) == null)
                        {
                            match = (< > 9__5 = ((Unit z) => z.UnitDesign.Name.ToString().Contains(comm.VictoryDesign)));
                        }
                        List <Unit> list4 = list3.FindAll(match);
                        int         num4  = list4.Count - 1;
                        while (num4 >= 0 && list4.Count + army3.StandardUnits.Count > num3)
                        {
                            list4.RemoveAt(num4);
                            num4--;
                        }
                        OrderTransferUnits order = new OrderTransferUnits(base.Commander.Empire.Index, army.GUID, army3.GUID, list4.ConvertAll <GameEntityGUID>((Unit unit) => unit.GUID).ToArray(), false);
                        Ticket             ticket;
                        base.Commander.Empire.PlayerControllers.Server.PostOrder(order, out ticket, new EventHandler <TicketRaisedEventArgs>(this.OrderTransferUnitToArmyTicketRaised));
                        return(true);
                    }
                    if (army.StandardUnits.Count < num3)
                    {
                        return(base.TryCreateArmyMission("ELCPWait", new List <object>()));
                    }
                }
            }
            int  num5  = int.MaxValue;
            Army army4 = null;
            foreach (Army army5 in list2)
            {
                int distance = this.worldPositionningService.GetDistance(army.WorldPosition, army5.WorldPosition);
                if (distance < num5)
                {
                    num5  = distance;
                    army4 = army5;
                }
            }
            if (army4 != null && army4.GUID > army.GUID && army4.GetPropertyValue(SimulationProperties.Movement) > 0.01f)
            {
                army4 = null;
            }
            if (army4 != null)
            {
                return(base.TryCreateArmyMission("ReachTarget", new List <object>
                {
                    army4
                }));
            }
            return(base.TryCreateArmyMission("ELCPWait", new List <object>()));
        }
        if (army.IsInEncounter || army.IsLocked)
        {
            return(base.TryCreateArmyMission("ELCPWait", new List <object>()));
        }
        WorldPosition validArmySpawningPosition = AILayer_ArmyRecruitment.GetValidArmySpawningPosition(army, this.worldPositionningService, this.pathfindingService);

        if (!validArmySpawningPosition.IsValid)
        {
            return(base.TryCreateArmyMission("MajorFactionWarRoaming", new List <object>
            {
                this.RegionTarget.Index,
                true
            }));
        }
        List <Unit> list5 = army.StandardUnits.ToList <Unit>().FindAll((Unit x) => !x.UnitDesign.Name.ToString().Contains(comm.VictoryDesign));
        OrderTransferGarrisonToNewArmy order2 = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, army.GUID, list5.ConvertAll <GameEntityGUID>((Unit unit) => unit.GUID).ToArray(), validArmySpawningPosition, StaticString.Empty, false, true, true);
        Ticket ticket2;

        base.Commander.Empire.PlayerControllers.Server.PostOrder(order2, out ticket2, new EventHandler <TicketRaisedEventArgs>(this.OrderSplitUnit));
        return(true);
    }
    protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters)
    {
        Army army;

        if (base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army) != AIArmyMission.AIArmyMissionErrorCode.None)
        {
            return(State.Failure);
        }
        if (this.currentTicket != null)
        {
            if (!this.currentTicket.Raised)
            {
                return(State.Running);
            }
            bool flag = this.currentTicket.PostOrderResponse == PostOrderResponse.PreprocessHasFailed || this.currentTicket.PostOrderResponse == PostOrderResponse.AuthenticationHasFailed;
            this.currentTicket = null;
            if (flag)
            {
                aiBehaviorTree.ErrorCode = 1;
                return(State.Failure);
            }
            return(State.Success);
        }
        else if (this.heroTicket != null)
        {
            if (!this.heroTicket.Raised)
            {
                return(State.Running);
            }
            if (this.heroTicket.PostOrderResponse != PostOrderResponse.Processed)
            {
                aiBehaviorTree.ErrorCode = 36;
                return(State.Failure);
            }
            this.heroTicket = null;
            return(State.Running);
        }
        else
        {
            if (!aiBehaviorTree.Variables.ContainsKey(this.DestinationVarName))
            {
                aiBehaviorTree.LogError("{0} not set", new object[]
                {
                    this.DestinationVarName
                });
                return(State.Failure);
            }
            WorldPosition worldPosition = (WorldPosition)aiBehaviorTree.Variables[this.DestinationVarName];
            if (!worldPosition.IsValid)
            {
                aiBehaviorTree.LogError("Destination is invalid.", new object[0]);
                aiBehaviorTree.ErrorCode = 2;
                return(State.Failure);
            }
            List <GameEntityGUID> list = new List <GameEntityGUID>();
            foreach (Unit unit in army.StandardUnits)
            {
                list.Add(unit.GUID);
            }
            if (list.Count == 0)
            {
                return(State.Success);
            }
            bool         flag2   = army.Hero != null;
            IGameService service = Services.GetService <IGameService>();
            Diagnostics.Assert(service != null);
            IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();
            Diagnostics.Assert(service2 != null);
            IPathfindingService service3 = service.Game.Services.GetService <IPathfindingService>();
            Diagnostics.Assert(service3 != null);
            City city = service2.GetRegion(worldPosition).City;
            if (city != null)
            {
                District district = service2.GetDistrict(worldPosition);
                if (district != null)
                {
                    GameEntityGUID destinationGuid = GameEntityGUID.Zero;
                    if (city.Camp != null && city.Camp.ContainsDistrict(district.GUID))
                    {
                        destinationGuid = city.Camp.GUID;
                    }
                    else if (District.IsACityTile(district))
                    {
                        destinationGuid = city.GUID;
                    }
                    if (destinationGuid.IsValid)
                    {
                        if (flag2)
                        {
                            if (!District.IsACityTile(district) || city.Hero != null)
                            {
                                this.UnassignHero(army);
                                return(State.Running);
                            }
                            list.Add(army.Hero.GUID);
                        }
                        OrderTransferUnits order = new OrderTransferUnits(army.Empire.Index, army.GUID, destinationGuid, list.ToArray(), false);
                        aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(order, out this.currentTicket, null);
                        return(State.Running);
                    }
                }
            }
            Army armyAtPosition = service2.GetArmyAtPosition(worldPosition);
            if (armyAtPosition != null)
            {
                if (flag2)
                {
                    if (armyAtPosition.Hero != null)
                    {
                        this.UnassignHero(army);
                        return(State.Running);
                    }
                    list.Add(army.Hero.GUID);
                }
                OrderTransferUnits order2 = new OrderTransferUnits(army.Empire.Index, army.GUID, armyAtPosition.GUID, list.ToArray(), false);
                aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(order2, out this.currentTicket, null);
                return(State.Running);
            }
            if (service3.IsTileStopable(worldPosition, army, (PathfindingFlags)0, null))
            {
                OrderTransferGarrisonToNewArmy order3 = new OrderTransferGarrisonToNewArmy(army.Empire.Index, army.GUID, list.ToArray(), worldPosition, StaticString.Empty, false, true, true);
                aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(order3, out this.currentTicket, null);
                return(State.Running);
            }
            aiBehaviorTree.LogError("No valid destination found.", new object[0]);
            aiBehaviorTree.ErrorCode = 2;
            return(State.Failure);
        }
    }
Пример #12
0
    private bool AskForArmy(bool mustAttack = false)
    {
        if (!base.AIDataArmyGUID.IsValid)
        {
            if (this.armySpawnTicket == null)
            {
                int maxValue = int.MaxValue;
                for (int i = 0; i < this.City.Districts.Count; i++)
                {
                    if (District.IsACityTile(this.City.Districts[i]))
                    {
                        Army armyAtPosition = this.worldPositionningService.GetArmyAtPosition(this.City.Districts[i].WorldPosition);
                        if (armyAtPosition != null && armyAtPosition.Empire == this.City.Empire)
                        {
                            int distanceToBesieger = this.GetDistanceToBesieger(this.City.Districts[i].WorldPosition);
                            if (distanceToBesieger < maxValue)
                            {
                                base.AIDataArmyGUID = armyAtPosition.GUID;
                            }
                            if (distanceToBesieger == 1)
                            {
                                return(false);
                            }
                        }
                    }
                }
                if (base.AIDataArmyGUID.IsValid)
                {
                    return(false);
                }
                WorldPosition      invalid            = WorldPosition.Invalid;
                PathfindingContext pathfindingContext = new PathfindingContext(this.City.GUID, this.City.Empire, this.City.StandardUnits);
                if (!DepartmentOfTheInterior.TryGetWorldPositionForNewArmyFromCity(this.City, this.pathfindingService, pathfindingContext, out invalid))
                {
                    return(false);
                }
                if (!base.AIDataArmyGUID.IsValid && this.City.StandardUnits.Count > 0)
                {
                    List <GameEntityGUID> list = new List <GameEntityGUID>();
                    for (int j = 0; j < this.City.StandardUnits.Count; j++)
                    {
                        if (this.City.StandardUnits[j].GetPropertyValue(SimulationProperties.Movement) > 0f && !this.City.StandardUnits[j].IsSettler)
                        {
                            list.Add(this.City.StandardUnits[j].GUID);
                        }
                    }
                    if (list.Count == 0)
                    {
                        return(false);
                    }
                    OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, this.City.GUID, list.ToArray(), invalid, null, false, true, true);
                    base.Commander.Empire.PlayerControllers.AI.PostOrder(order, out this.armySpawnTicket, null);
                }
            }
            else if (this.armySpawnTicket.Raised)
            {
                if (this.armySpawnTicket.PostOrderResponse == PostOrderResponse.Processed)
                {
                    OrderTransferGarrisonToNewArmy orderTransferGarrisonToNewArmy = this.armySpawnTicket.Order as OrderTransferGarrisonToNewArmy;
                    if (this.armySpawnTicket != null)
                    {
                        base.AIDataArmyGUID = orderTransferGarrisonToNewArmy.ArmyGuid;
                    }
                }
                this.armySpawnTicket = null;
            }
        }
        if (!base.AIDataArmyGUID.IsValid)
        {
            return(false);
        }
        List <object> list2 = new List <object>();

        list2.Add(this.City);
        if (mustAttack)
        {
            return(base.TryCreateArmyMission("DefendCity_BreakSiegeNow", list2));
        }
        return(base.TryCreateArmyMission("DefendCity_BreakSiege", list2));
    }
    protected override bool TryGetArmyData()
    {
        if (this.createFirstArmyTicket != null)
        {
            return(false);
        }
        if (base.AIDataArmyGUID.IsValid)
        {
            return(true);
        }
        if (this.currentTicket != null)
        {
            return(false);
        }
        IGameEntity gameEntity;

        if (!this.gameEntityRepositoryService.TryGetValue(this.SourceGuid, out gameEntity))
        {
            base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
            return(false);
        }
        for (int i = this.UnitGuids.Length - 1; i >= 0; i--)
        {
            AIData_Unit aidata_Unit;
            this.aiDataRepository.TryGetAIData <AIData_Unit>(this.UnitGuids[i], out aidata_Unit);
            if (aidata_Unit == null)
            {
                Diagnostics.LogWarning("[AICommanderMission_RegroupArmyAt] no AIData for Unit {0}", new object[]
                {
                    this.UnitGuids[i].ToString()
                });
            }
            else
            {
                if (aidata_Unit.IsUnitLocked() && !aidata_Unit.IsUnitLockedByMe(base.InternalGUID))
                {
                    WorldPosition worldPosition = WorldPosition.Invalid;
                    if (aidata_Unit.Unit.Garrison is IWorldPositionable)
                    {
                        worldPosition = (aidata_Unit.Unit.Garrison as IWorldPositionable).WorldPosition;
                    }
                    Diagnostics.LogWarning(string.Format("{1} {2} LOCKING: Unit shouldn't be in use, current unit state: {0}", aidata_Unit.GetLockingStateString(), base.Commander.Empire, worldPosition));
                    base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
                    return(false);
                }
                if (aidata_Unit.Unit.UnitDesign.Tags.Contains(DownloadableContent9.TagSolitary))
                {
                    Diagnostics.LogWarning("You cannot regroup Colossus or Solitary unit with something else.");
                    base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
                    return(false);
                }
            }
        }
        IGarrison garrison = gameEntity as IGarrison;

        if (garrison == null)
        {
            base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
            return(false);
        }
        if (this.AICommanderRegroupArmies != null && this.AICommanderRegroupArmies.RequestUnitListMessageID != 0UL)
        {
            RequestUnitListMessage requestUnitListMessage = base.Commander.AIPlayer.Blackboard.GetMessage(this.AICommanderRegroupArmies.RequestUnitListMessageID) as RequestUnitListMessage;
            if (requestUnitListMessage == null)
            {
                base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
                return(false);
            }
            requestUnitListMessage.ExecutionState = RequestUnitListMessage.RequestUnitListState.Regrouping;
        }
        bool flag = false;

        for (int j = 0; j < this.UnitGuids.Length; j++)
        {
            if (!garrison.ContainsUnit(this.UnitGuids[j]))
            {
                flag = true;
                break;
            }
        }
        if (flag)
        {
            List <GameEntityGUID> list = new List <GameEntityGUID>();
            for (int k = 0; k < this.UnitGuids.Length; k++)
            {
                if (garrison.ContainsUnit(this.UnitGuids[k]))
                {
                    list.Add(this.UnitGuids[k]);
                }
            }
            this.UnitGuids = list.ToArray();
        }
        if (this.UnitGuids.Length == 0)
        {
            base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
            return(false);
        }
        WorldPosition armyPosition = WorldPosition.Invalid;
        Army          army         = gameEntity as Army;

        if (army != null)
        {
            AIData_Army aidata = this.aiDataRepository.GetAIData <AIData_Army>(gameEntity.GUID);
            Diagnostics.Assert(aidata != null);
            if (army.GetPropertyValue(SimulationProperties.Movement) <= 0f)
            {
                return(false);
            }
            if (aidata.CommanderMission != null)
            {
                aidata.CommanderMission.Interrupt();
            }
            if (aidata.Army.IsInEncounter || aidata.Army.IsLocked)
            {
                return(false);
            }
            if (aidata.Army.StandardUnits.Count != this.UnitGuids.Length)
            {
                armyPosition = AILayer_ArmyRecruitment.GetValidArmySpawningPosition(aidata.Army, this.worldPositionningService, this.pathfindingService);
                int num = (int)base.Commander.Empire.GetPropertyValue(SimulationProperties.ArmyUnitSlot);
                if (aidata.Army.StandardUnits.Count > num)
                {
                    Array.Resize <GameEntityGUID>(ref this.UnitGuids, num);
                }
            }
            else
            {
                if (!aidata.AssignCommanderMission(this))
                {
                    base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
                    return(false);
                }
                base.AIDataArmyGUID = gameEntity.GUID;
                return(true);
            }
        }
        else if (gameEntity is Village)
        {
            Village village = gameEntity as Village;
            if (village.IsInEncounter)
            {
                return(false);
            }
            WorldPosition    worldPosition2   = village.WorldPosition;
            WorldOrientation worldOrientation = WorldOrientation.East;
            if (this.AICommanderRegroupArmies.FinalPosition.IsValid)
            {
                worldOrientation = this.worldPositionningService.GetOrientation(worldPosition2, this.AICommanderRegroupArmies.FinalPosition);
            }
            for (int l = 0; l < 6; l++)
            {
                WorldPosition neighbourTile = this.worldPositionningService.GetNeighbourTile(worldPosition2, worldOrientation, 1);
                if (DepartmentOfDefense.CheckWhetherTargetPositionIsValidForUseAsArmySpawnLocation(neighbourTile, PathfindingMovementCapacity.Ground | PathfindingMovementCapacity.Water) && this.pathfindingService.IsTransitionPassable(village.WorldPosition, neighbourTile, this.pathfindingContext, PathfindingFlags.IgnoreFogOfWar, null) && this.pathfindingService.IsTilePassable(neighbourTile, this.pathfindingContext, (PathfindingFlags)0, null) && this.pathfindingService.IsTileStopable(neighbourTile, this.pathfindingContext, (PathfindingFlags)0, null))
                {
                    if (this.worldPositionningService.GetArmyAtPosition(neighbourTile) == null)
                    {
                        armyPosition = neighbourTile;
                        break;
                    }
                }
                else
                {
                    worldOrientation = worldOrientation.Rotate(1);
                }
            }
        }
        else if (gameEntity is City)
        {
            City city = gameEntity as City;
            if (city.IsInEncounter)
            {
                return(false);
            }
            if (!DepartmentOfTheInterior.TryGetWorldPositionForNewArmyFromCity(city, this.pathfindingService, this.pathfindingContext, out armyPosition))
            {
                return(false);
            }
        }
        else
        {
            Diagnostics.LogError(string.Format("[AICommanderMission_RegroupArmyAt] The garrison {0} is not valid.", garrison.GUID));
        }
        if (armyPosition.IsValid)
        {
            if (army != null && army.WorldPath != null && army.WorldPath.Destination != army.WorldPosition)
            {
                OrderGoTo orderGoTo = new OrderGoTo(army.Empire.Index, army.GUID, army.WorldPosition);
                orderGoTo.Flags = (PathfindingFlags)0;
                base.Commander.Empire.PlayerControllers.AI.PostOrder(orderGoTo, out this.currentTicket, new EventHandler <TicketRaisedEventArgs>(this.MoveOrder_TicketRaised));
                if (this.currentTicket != null)
                {
                    return(false);
                }
                if (!this.orderExecuted)
                {
                    Diagnostics.LogError("[AICommanderMission_RegroupArmyAt] new cancelation move order was not executed, from {0} to {1}", new object[]
                    {
                        army.WorldPosition,
                        army.WorldPosition
                    });
                    return(false);
                }
            }
            for (int m = 0; m < this.UnitGuids.Length; m++)
            {
                AIData_Unit aidata_Unit2;
                this.aiDataRepository.TryGetAIData <AIData_Unit>(this.UnitGuids[m], out aidata_Unit2);
                if (aidata_Unit2 == null)
                {
                    Diagnostics.LogWarning("[AICommanderMission_RegroupArmyAt] no AIData for Unit {0}", new object[]
                    {
                        this.UnitGuids[m].ToString()
                    });
                }
                else if (!aidata_Unit2.IsUnitLockedByMe(base.InternalGUID))
                {
                    aidata_Unit2.TryLockUnit(base.InternalGUID, base.GetType().ToString(), AIData_Unit.AIDataReservationExtraTag.Regrouping, base.Commander.GetPriority(this));
                }
            }
            OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, this.SourceGuid, this.UnitGuids, armyPosition, "Regroup", false, true, true);
            base.Commander.Empire.PlayerControllers.Server.PostOrder(order, out this.createFirstArmyTicket, new EventHandler <TicketRaisedEventArgs>(this.OrderTransferUnitToNewArmyTicketRaised));
        }
        return(false);
    }
Пример #14
0
    protected override void ExecuteMainTask()
    {
        if (this.Fortress.StandardUnits.Count == 0)
        {
            base.BehaviorState = ArmyWithTask.ArmyBehaviorState.Sleep;
            base.State         = TickableState.NoTick;
            return;
        }
        float num = float.MaxValue;

        GameEntityGUID[] array = new GameEntityGUID[base.Garrison.StandardUnits.Count];
        for (int i = 0; i < base.Garrison.StandardUnits.Count; i++)
        {
            array[i] = base.Garrison.StandardUnits[i].GUID;
            float propertyValue = base.Garrison.StandardUnits[i].GetPropertyValue(SimulationProperties.Movement);
            if (num > propertyValue)
            {
                num = propertyValue;
            }
        }
        if (num < 2f)
        {
            base.BehaviorState = ArmyWithTask.ArmyBehaviorState.Sleep;
            base.State         = TickableState.NoTick;
            return;
        }
        if (base.CurrentMainTask == null)
        {
            base.State = TickableState.Optional;
            return;
        }
        WorldPosition armyPosition = WorldPosition.Invalid;
        Fortress      fortress     = base.Garrison as Fortress;

        for (int j = 0; j < 6; j++)
        {
            WorldPosition neighbourTile = this.worldPositionService.GetNeighbourTile(fortress.WorldPosition, (WorldOrientation)j, 1);
            if (DepartmentOfDefense.CheckWhetherTargetPositionIsValidForUseAsArmySpawnLocation(neighbourTile, PathfindingMovementCapacity.Water))
            {
                armyPosition = neighbourTile;
                break;
            }
        }
        if (!armyPosition.IsValid)
        {
            for (int k = 0; k < fortress.Facilities.Count; k++)
            {
                for (int l = 0; l < 6; l++)
                {
                    WorldPosition neighbourTile2 = this.worldPositionService.GetNeighbourTile(fortress.Facilities[k].WorldPosition, (WorldOrientation)l, 1);
                    if (DepartmentOfDefense.CheckWhetherTargetPositionIsValidForUseAsArmySpawnLocation(neighbourTile2, PathfindingMovementCapacity.Water))
                    {
                        armyPosition = neighbourTile2;
                        break;
                    }
                }
            }
        }
        OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Garrison.Empire.Index, base.Garrison.GUID, array, armyPosition, null, false, true, true);

        base.Garrison.Empire.PlayerControllers.AI.PostOrder(order);
        this.Unassign();
        this.WantToKeepArmyFitness.Reset();
        base.State         = TickableState.NoTick;
        base.BehaviorState = ArmyWithTask.ArmyBehaviorState.Succeed;
    }