Exemplo n.º 1
0
    public void FillTargets(Army army, List <IGameEntity> gameEntities, ref List <StaticString> failureFlags)
    {
        if (army == null)
        {
            throw new ArgumentNullException("army");
        }
        IGameService service = Services.GetService <IGameService>();

        if (service == null)
        {
            return;
        }
        global::Game x = service.Game as global::Game;

        if (x == null)
        {
            return;
        }
        IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();

        Diagnostics.Assert(service2 != null);
        for (int i = 0; i < 6; i++)
        {
            WorldPosition neighbourTile = service2.GetNeighbourTile(army.WorldPosition, (WorldOrientation)i, 1);
            Region        region        = service2.GetRegion(neighbourTile);
            if (region != null && region.Kaiju != null)
            {
                Kaiju kaiju = region.Kaiju;
                if (this.IsKaijuValidForTame(army, kaiju, ref failureFlags, true) && !gameEntities.Contains(kaiju))
                {
                    gameEntities.Add(kaiju);
                }
            }
            Army armyAtPosition = service2.GetArmyAtPosition(neighbourTile);
            if (armyAtPosition != null && armyAtPosition is KaijuArmy)
            {
                KaijuArmy kaijuArmy = armyAtPosition as KaijuArmy;
                if (kaijuArmy != null)
                {
                    Kaiju kaiju2 = kaijuArmy.Kaiju;
                    if (kaiju2 != null && kaiju2.OnArmyMode() && !kaiju2.IsStunned() && !gameEntities.Contains(kaiju2))
                    {
                        gameEntities.Add(kaijuArmy.Kaiju);
                    }
                }
            }
        }
    }
Exemplo n.º 2
0
 private bool CanToggleOverDevice(Army army, TerraformDevice device, ref List <StaticString> failureFlags)
 {
     if (army == null || device == null || device.Empire == army.Empire)
     {
         failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
         return(false);
     }
     if (device.DismantlingArmy != null)
     {
         if (device.DismantlingArmy == army)
         {
             return(true);
         }
         failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
         return(false);
     }
     else
     {
         IGameService service = Services.GetService <IGameService>();
         Diagnostics.Assert(service != null);
         IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();
         Diagnostics.Assert(service2 != null);
         Army armyAtPosition = service2.GetArmyAtPosition(device.WorldPosition);
         if (device != null && device.DismantlingArmy == null && armyAtPosition != null && device.Empire.Index != army.Empire.Index)
         {
             failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
             return(false);
         }
         if (device.Empire != army.Empire && army.Empire is MajorEmpire && !(device.Empire is LesserEmpire))
         {
             DiplomaticRelation diplomaticRelation = army.Empire.GetAgency <DepartmentOfForeignAffairs>().DiplomaticRelations[device.Empire.Index];
             if (diplomaticRelation != null && diplomaticRelation.State != null && (diplomaticRelation.State.Name == DiplomaticRelationState.Names.Alliance || diplomaticRelation.State.Name == DiplomaticRelationState.Names.Peace))
             {
                 failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
                 return(false);
             }
         }
         IPathfindingService service3 = service.Game.Services.GetService <IPathfindingService>();
         Diagnostics.Assert(service3 != null);
         PathfindingFlags flags = PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreOtherEmpireDistrict | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnoreSieges | PathfindingFlags.IgnoreKaijuGarrisons;
         if (!service3.IsTransitionPassable(army.WorldPosition, device.WorldPosition, army, flags, null))
         {
             failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
             return(false);
         }
         return(true);
     }
 }
Exemplo n.º 3
0
    public District GetValidDistrictToTarget(Army army = 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);
        for (int i = 0; i < this.districts.Count; i++)
        {
            District district = this.districts[i];
            if (District.IsACityTile(district))
            {
                for (int j = 0; j < 6; j++)
                {
                    WorldPosition neighbourTile = service2.GetNeighbourTile(district.WorldPosition, (WorldOrientation)j, 1);
                    if (!service2.IsWaterTile(neighbourTile))
                    {
                        if (army == null || service3.IsTileStopable(neighbourTile, army, PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnoreZoneOfControl, null))
                        {
                            for (int k = 0; k < this.districts.Count; k++)
                            {
                                District district2 = this.districts[k];
                                if (district2.WorldPosition == neighbourTile)
                                {
                                    if (service3.IsTransitionPassable(district2.WorldPosition, district.WorldPosition, PathfindingMovementCapacity.Ground, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnoreZoneOfControl | PathfindingFlags.IgnoreSieges))
                                    {
                                        Army armyAtPosition = service2.GetArmyAtPosition(district2.WorldPosition);
                                        if (armyAtPosition == null || armyAtPosition == army)
                                        {
                                            return(district2);
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
        return(this.districts[0]);
    }
 private bool CanToggleOverCreepingNode(Army army, CreepingNode creepingNode, ref List <StaticString> failureFlags)
 {
     if (army == null || creepingNode == null || creepingNode.Empire == army.Empire)
     {
         failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
         return(false);
     }
     if (creepingNode.DismantlingArmy != null)
     {
         if (creepingNode.DismantlingArmy == army)
         {
             return(true);
         }
         failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
         return(false);
     }
     else
     {
         IGameService service = Services.GetService <IGameService>();
         Diagnostics.Assert(service != null);
         IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();
         Diagnostics.Assert(service2 != null);
         Army armyAtPosition = service2.GetArmyAtPosition(creepingNode.WorldPosition);
         if (creepingNode != null && creepingNode.DismantlingArmy == null && armyAtPosition != null && creepingNode.Empire.Index != army.Empire.Index)
         {
             failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
             return(false);
         }
         if (creepingNode.Empire != army.Empire && army.Empire is MajorEmpire)
         {
             DiplomaticRelation diplomaticRelation = army.Empire.GetAgency <DepartmentOfForeignAffairs>().DiplomaticRelations[creepingNode.Empire.Index];
             if (diplomaticRelation != null && diplomaticRelation.State != null && (diplomaticRelation.State.Name == DiplomaticRelationState.Names.Alliance || diplomaticRelation.State.Name == DiplomaticRelationState.Names.Peace || diplomaticRelation.State.Name == DiplomaticRelationState.Names.Truce))
             {
                 failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
                 return(false);
             }
         }
         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);
        }
    }
    public override bool CanExecute(Army army, ref List <StaticString> failureFlags, params object[] parameters)
    {
        if (!base.CanExecute(army, ref failureFlags, parameters))
        {
            return(false);
        }
        if (army.HasCatspaw)
        {
            failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
            return(false);
        }
        int   num  = 0;
        int   num2 = 0;
        float num3 = float.MaxValue;
        bool  flag = false;

        for (int i = 0; i < parameters.Length; i++)
        {
            if (parameters[i] is Unit)
            {
                Unit unit = parameters[i] as Unit;
                if (unit.UnitDesign != null && unit.UnitDesign.Tags.Contains(DownloadableContent9.TagSolitary))
                {
                    failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
                    return(false);
                }
                if ((unit.UnitDesign != null && unit.UnitDesign.Tags.Contains(Kaiju.LiceUnitTag)) || unit.UnitDesign.Tags.Contains(Kaiju.MonsterUnitTag))
                {
                    flag = true;
                }
                num2 += (int)unit.GetPropertyValue(SimulationProperties.UnitSlotCount);
                num++;
            }
            else
            {
                if (!(parameters[i] is IEnumerable <Unit>))
                {
                    failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
                    return(false);
                }
                foreach (Unit unit2 in (parameters[i] as IEnumerable <Unit>))
                {
                    if (unit2.UnitDesign != null && unit2.UnitDesign.Tags.Contains(DownloadableContent9.TagSolitary))
                    {
                        failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
                        return(false);
                    }
                    if ((unit2.UnitDesign != null && unit2.UnitDesign.Tags.Contains(Kaiju.LiceUnitTag)) || unit2.UnitDesign.Tags.Contains(Kaiju.MonsterUnitTag))
                    {
                        flag = true;
                    }
                    num2 += (int)unit2.GetPropertyValue(SimulationProperties.UnitSlotCount);
                    num++;
                    float propertyValue = unit2.GetPropertyValue(SimulationProperties.Movement);
                    if (propertyValue < num3)
                    {
                        num3 = propertyValue;
                    }
                }
            }
        }
        if (num == 0)
        {
            failureFlags.Add(ArmyAction_TransferUnits.NoUnitSelectedForTransfer);
            return(false);
        }
        if (num3 == 0f)
        {
            failureFlags.Add(ArmyAction_TransferUnits.NotEnoughMovementToTransfer);
            return(false);
        }
        if (flag)
        {
            failureFlags.Add(ArmyAction_TransferUnits.UntransferableUnitSelectedForTransfer);
            return(false);
        }
        IGameService service = Services.GetService <IGameService>();
        IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();
        IPathfindingService       service3 = service.Game.Services.GetService <IPathfindingService>();
        bool flag2 = false;
        bool flag3 = false;
        PathfindingMovementCapacity pathfindingMovementCapacity = army.GenerateContext().MovementCapacities;

        for (int j = 0; j < parameters.Length; j++)
        {
            if (parameters[j] is Unit)
            {
                pathfindingMovementCapacity = (parameters[j] as Unit).GenerateContext().MovementCapacities;
            }
            else if (parameters[j] is IEnumerable <Unit> )
            {
                pathfindingMovementCapacity = PathfindingMovementCapacity.All;
                foreach (Unit unit3 in (parameters[j] as IEnumerable <Unit>))
                {
                    if (unit3.Garrison != null)
                    {
                        pathfindingMovementCapacity &= unit3.GenerateContext().MovementCapacities;
                    }
                }
            }
        }
        for (int k = 0; k < 6; k++)
        {
            bool          flag4         = false;
            WorldPosition neighbourTile = service2.GetNeighbourTile(army.WorldPosition, (WorldOrientation)k, 1);
            if (service3.IsTilePassable(neighbourTile, pathfindingMovementCapacity, (PathfindingFlags)0) && service3.IsTransitionPassable(army.WorldPosition, neighbourTile, army, PathfindingFlags.IgnoreArmies, null) && service3.IsTileStopable(neighbourTile, pathfindingMovementCapacity, PathfindingFlags.IgnoreArmies))
            {
                Region region = service2.GetRegion(neighbourTile);
                if (region.City != null && this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.Army)
                {
                    for (int l = 0; l < region.City.Districts.Count; l++)
                    {
                        if (region.City.Districts[l].Type != DistrictType.Exploitation && neighbourTile == region.City.Districts[l].WorldPosition)
                        {
                            if (this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.Army)
                            {
                                if (num2 + region.City.CurrentUnitSlot <= region.City.MaximumUnitSlot)
                                {
                                    return(true);
                                }
                                flag2 = true;
                            }
                            flag4 = true;
                            break;
                        }
                    }
                }
                if (this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.Army && flag2)
                {
                    failureFlags.Add(ArmyAction_TransferUnits.NotEnoughSlotsInNeighbouringGarrisonForTransfer);
                }
                Army armyAtPosition = service2.GetArmyAtPosition(neighbourTile);
                if (armyAtPosition != null && this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.City && armyAtPosition.Empire == army.Empire && !armyAtPosition.HasCatspaw)
                {
                    if (armyAtPosition.SimulationObject.Tags.Contains(KaijuArmy.ClassKaijuArmy) && !DepartmentOfScience.IsTechnologyResearched(army.Empire, "TechnologyDefinitionMimics1"))
                    {
                        failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
                        return(false);
                    }
                    if (num2 + armyAtPosition.CurrentUnitSlot <= armyAtPosition.MaximumUnitSlot)
                    {
                        return(true);
                    }
                    flag3 = true;
                }
                else if (!flag4 && this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.City && armyAtPosition == null && num != army.StandardUnits.Count && service3.IsTileStopable(neighbourTile, army, (PathfindingFlags)0, null))
                {
                    return(true);
                }
            }
        }
        if (this.AllowedTransferTarget > ArmyAction_TransferUnits.AllowedTransferTargetType.City && flag3)
        {
            failureFlags.Add(ArmyAction_TransferUnits.NotEnoughSlotsInNeighbouringArmyForTransfer);
        }
        if (this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.Army)
        {
            failureFlags.Add(ArmyAction_TransferUnits.NoNeighbouringCityAvailable);
        }
        if (this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.City)
        {
            failureFlags.Add(ArmyAction_TransferUnits.NoNeighbouringArmyAvailable);
        }
        ArmyAction_TransferUnits.AllowedTransferTargetType allowedTransferTarget = this.AllowedTransferTarget;
        return(false);
    }