protected override State Execute(QuestBehaviour questBehaviour, EventEmpireWorldTerraformed e, params object[] parameters)
 {
     if (!e.Reversible && base.CheckAgainstQuestInitiatorFilter(questBehaviour, e.TerraformingEmpire as global::Empire, base.QuestInitiatorFilter) && e.TerraformedTiles.Length != 0)
     {
         IGameService service = Services.GetService <IGameService>();
         World        world   = (service.Game as global::Game).World;
         IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();
         Diagnostics.Assert(service2 != null);
         for (int i = 0; i < e.TerraformedTiles.Length; i++)
         {
             QuestBehaviourTreeNode_Decorator_TerraformRegion.< > c__DisplayClass0_0 CS$ < > 8__locals1 = new QuestBehaviourTreeNode_Decorator_TerraformRegion.< > c__DisplayClass0_0();
             CS$ < > 8__locals1.region = service2.GetRegion(e.TerraformedTiles[i]);
             bool flag = true;
             int  k;
             int  j;
             for (j = 0; j < CS$ < > 8__locals1.region.WorldPositions.Length; j = k + 1)
             {
                 if (!service2.IsWaterTile(CS$ < > 8__locals1.region.WorldPositions[j]) && !service2.HasRidge(CS$ < > 8__locals1.region.WorldPositions[j]) && (!service2.ContainsTerrainTag(CS$ < > 8__locals1.region.WorldPositions[j], "TerrainTagVolcanic") || world.TemporaryTerraformations.Exists((World.TemporaryTerraformation tt) => tt.worldPosition == CS$ < > 8__locals1.region.WorldPositions[j])))
                 {
                     flag = false;
                     break;
                 }
                 k = j;
             }
             if (flag)
             {
                 this.RegionTerraformed = flag;
                 base.UpdateQuestVariable(questBehaviour, this.Output_RegionTerraformedVarName, this.RegionTerraformed);
                 return(State.Success);
             }
         }
     }
     return(State.Running);
 }
コード例 #2
0
 public void Initialize(global::Empire dataOwner, Continent continent, IWorldPositionningService worldPositionningService)
 {
     this.DataOwner                   = dataOwner;
     this.Regions                     = new List <Region>();
     this.EmpireWithRegion            = new List <global::Empire>();
     this.ColonizationPercentByEmpire = new List <float>();
     this.Continent                   = continent;
     for (int i = 0; i < continent.RegionList.Length; i++)
     {
         Region region = worldPositionningService.GetRegion(continent.RegionList[i]);
         this.Regions.Add(region);
         if (region.IsLand)
         {
             int landRegionCount = this.LandRegionCount;
             this.LandRegionCount = landRegionCount + 1;
         }
     }
     this.CostalRegionRatio = (float)continent.CostalRegionList.Length / (float)this.LandRegionCount;
     this.Type = AILayer_Colonization.ContinentData.ContinentType.Continent;
     if (this.LandRegionCount == 0)
     {
         this.Type = AILayer_Colonization.ContinentData.ContinentType.Water;
         return;
     }
     if (this.CostalRegionRatio > 0.8f)
     {
         this.Type = AILayer_Colonization.ContinentData.ContinentType.Island;
     }
 }
    private static bool ValidateTarget(Army myArmy, IGameEntity gameEntity, DepartmentOfForeignAffairs departmentOfForeignAffairs, bool canAttack, IGameEntityRepositoryService gameEntityRepositoryService, IWorldPositionningService worldPositionningService)
    {
        if (gameEntity == null)
        {
            return(false);
        }
        if (!gameEntityRepositoryService.Contains(gameEntity.GUID))
        {
            return(false);
        }
        if (departmentOfForeignAffairs != null)
        {
            IGarrison garrison = gameEntity as IGarrison;
            if (gameEntity is Kaiju)
            {
                garrison   = (gameEntity as Kaiju).GetActiveTroops();
                gameEntity = garrison;
            }
            IWorldPositionable worldPositionable = gameEntity as IWorldPositionable;
            Region             region            = worldPositionningService.GetRegion(worldPositionable.WorldPosition);
            if (garrison == null || worldPositionable == null)
            {
                return(false);
            }
            if (canAttack)
            {
                if (!departmentOfForeignAffairs.CanAttack(gameEntity) || garrison.Empire.Index == myArmy.Empire.Index)
                {
                    return(false);
                }
            }
            else if (!departmentOfForeignAffairs.IsEnnemy(garrison.Empire))
            {
                return(false);
            }
            if ((garrison.Empire is MinorEmpire || garrison is Village) && region != null && region.IsRegionColonized() && departmentOfForeignAffairs != null && departmentOfForeignAffairs.IsEnnemy(region.Owner))
            {
                return(false);
            }
        }
        Army army = gameEntity as Army;

        if (army != null)
        {
            if (myArmy.Empire is LesserEmpire && !(army.Empire is MajorEmpire))
            {
                return(false);
            }
            District district = worldPositionningService.GetDistrict(army.WorldPosition);
            if (district != null && district.Type != DistrictType.Exploitation && army.Empire == district.Empire)
            {
                return(false);
            }
            if (!myArmy.HasSeafaringUnits() && army.IsNaval)
            {
                return(false);
            }
        }
        return(true);
    }
コード例 #4
0
    public override void ReadXml(XmlReader reader)
    {
        base.ReadXml(reader);
        IWorldPositionningService service = Services.GetService <IGameService>().Game.Services.GetService <IWorldPositionningService>();

        this.RegionTarget = service.GetRegion(base.RegionIndex);
    }
コード例 #5
0
ファイル: Kaiju.cs プロジェクト: LeaderEnemyBoss/ELCP
    public void MoveToRegion(WorldPosition position)
    {
        IGameService service = Services.GetService <IGameService>();

        if (service == null)
        {
            Diagnostics.LogError("Cannot retreive the gameService.");
            return;
        }
        IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();

        if (service2 == null)
        {
            Diagnostics.LogError("Cannot retreive the worldPositionningService.");
            return;
        }
        Region region = service2.GetRegion(position);

        if (region == null)
        {
            Diagnostics.LogError("Cannot retreive the region.");
            return;
        }
        Garrison    activeTroops = this.GetActiveTroops();
        List <Unit> list         = new List <Unit>();

        foreach (Unit unit in activeTroops.StandardUnits)
        {
            if (unit.SimulationObject.Tags.Contains(DownloadableContent16.TransportShipUnit))
            {
                list.Add(unit);
            }
        }
        if (list.Count > 0)
        {
            for (int i = 0; i < list.Count; i++)
            {
                list[i].SwitchToEmbarkedUnit(false);
            }
            if (this.OnArmyMode())
            {
                this.KaijuArmy.SetSails();
            }
        }
        this.MoveTo(position);
        if (this.OnArmyMode())
        {
            this.ChangeToGarrisonMode(false);
            return;
        }
        if (this.OnGarrisonMode())
        {
            this.LeaveCurrentRegion();
            this.OwnRegion(region);
        }
    }
コード例 #6
0
    public bool IsWorldPositionObstructingVision(WorldPosition observerPosition, WorldPosition tilePosition, int observerHeight, bool ignoreFog)
    {
        if (!observerPosition.IsValid || !tilePosition.IsValid)
        {
            return(true);
        }
        Diagnostics.Assert(this.elevationMap != null);
        if ((int)observerPosition.Row >= this.elevationMap.Height || (int)observerPosition.Column >= this.elevationMap.Width || (int)tilePosition.Row >= this.elevationMap.Height || (int)tilePosition.Column >= this.elevationMap.Width)
        {
            return(true);
        }
        sbyte b = this.elevationMap.GetValue(tilePosition);
        PathfindingMovementCapacity tileMovementCapacity = this.pathfindingService.GetTileMovementCapacity(observerPosition, (PathfindingFlags)0);
        bool  flag = tileMovementCapacity == PathfindingMovementCapacity.Water || tileMovementCapacity == PathfindingMovementCapacity.FrozenWater;
        sbyte b2   = (!flag) ? this.elevationMap.GetValue(observerPosition) : this.waterHeightMap.GetValue(observerPosition);

        if (this.ridgeMap.GetValue(tilePosition))
        {
            b = (sbyte)((int)b + (int)this.ridgeHeight);
        }
        IWorldPositionningService service = base.Game.GetService <IWorldPositionningService>();

        if (service == null)
        {
            return(false);
        }
        Region region = service.GetRegion(tilePosition);

        if (region != null && region.IsWasteland)
        {
            b = (sbyte)((int)b + (int)this.wastelandHeight);
        }
        if ((int)b - (int)b2 > observerHeight)
        {
            return(true);
        }
        if (service.GetDistance(tilePosition, observerPosition) <= 1)
        {
            return(false);
        }
        if (this.weatherService == null)
        {
            return(false);
        }
        if (region != null && region.IsOcean && !ignoreFog)
        {
            WeatherDefinition weatherDefinitionAtPosition = this.weatherService.GetWeatherDefinitionAtPosition(tilePosition);
            if (weatherDefinitionAtPosition != null && weatherDefinitionAtPosition.ObstructVisibility)
            {
                return(true);
            }
        }
        return(false);
    }
コード例 #7
0
    protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters)
    {
        Army army;

        if (base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army) > AIArmyMission.AIArmyMissionErrorCode.None)
        {
            return(State.Failure);
        }
        global::Empire empire = aiBehaviorTree.AICommander.Empire;

        if (empire == null)
        {
            aiBehaviorTree.ErrorCode = 10;
            return(State.Failure);
        }
        if (!(empire is MajorEmpire))
        {
            return(State.Failure);
        }
        IGameService service = Services.GetService <IGameService>();

        Diagnostics.Assert(service != null);
        IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();

        Diagnostics.Assert(service2 != null);
        Region region = service2.GetRegion(army.WorldPosition);

        if (region == null)
        {
            return(State.Failure);
        }
        bool flag = false;

        if (region != null && region.Owner == aiBehaviorTree.AICommander.Empire && !region.IsOcean)
        {
            flag = true;
        }
        if (flag)
        {
            if (this.Inverted)
            {
                return(State.Failure);
            }
            return(State.Success);
        }
        else
        {
            if (this.Inverted)
            {
                return(State.Success);
            }
            return(State.Failure);
        }
    }
コード例 #8
0
 public override State CheckCondition(QuestBehaviour questBehaviour, GameEvent gameEvent, params object[] parameters)
 {
     this.Initialize(questBehaviour);
     if (this.RegionIndex != -1)
     {
         IGameService service = Services.GetService <IGameService>();
         Diagnostics.Assert(service != null);
         if (service.Game as global::Game == null)
         {
             return(State.Failure);
         }
         IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();
         global::Empire            empire;
         if (gameEvent != null)
         {
             empire = (gameEvent.Empire as global::Empire);
         }
         else
         {
             empire = questBehaviour.Initiator;
         }
         DepartmentOfDefense agency = empire.GetAgency <DepartmentOfDefense>();
         if (this.CheckAllArmies)
         {
             for (int i = 0; i < agency.Armies.Count; i++)
             {
                 if ((int)service2.GetRegionIndex(agency.Armies[i].WorldPosition) == this.RegionIndex)
                 {
                     return(State.Success);
                 }
             }
         }
         else
         {
             Army army = agency.GetArmy(this.ArmyGuid);
             if (army == null)
             {
                 return(State.Failure);
             }
             Region region = service2.GetRegion(army.WorldPosition);
             if (region == null)
             {
                 return(State.Failure);
             }
             if (this.RegionIndex == region.Index)
             {
                 return(State.Success);
             }
         }
     }
     return(State.Failure);
 }
コード例 #9
0
ファイル: Kaiju.cs プロジェクト: LeaderEnemyBoss/ELCP
    private void ReleaseKaijuArmyActions()
    {
        DepartmentOfDefense  agency = this.Empire.GetAgency <DepartmentOfDefense>();
        SimulationDescriptor value  = this.SimulationDescriptorDatabase.GetValue(DepartmentOfTheInterior.ArmyStatusBesiegerDescriptorName);

        this.KaijuArmy.RemoveDescriptor(value);
        if (this.KaijuArmy.IsEarthquaker)
        {
            this.KaijuArmy.SetEarthquakerStatus(false, false, null);
        }
        if (this.KaijuArmy.PillageTarget.IsValid)
        {
            DepartmentOfDefense.StopPillage(this.KaijuArmy);
        }
        if (this.KaijuArmy.IsAspirating)
        {
            agency.StopAspirating(this.KaijuArmy);
        }
        if (this.KaijuArmy.IsDismantlingDevice)
        {
            ITerraformDeviceRepositoryService service = this.gameService.Game.Services.GetService <ITerraformDeviceRepositoryService>();
            TerraformDevice device = service[this.KaijuArmy.DismantlingDeviceTarget] as TerraformDevice;
            agency.StopDismantelingDevice(this.KaijuArmy, device);
        }
        if (this.KaijuArmy.IsDismantlingCreepingNode)
        {
            CreepingNode creepingNode = null;
            if (this.gameEntityRepositoryService.TryGetValue <CreepingNode>(this.KaijuArmy.DismantlingCreepingNodeTarget, out creepingNode))
            {
                agency.StopDismantelingCreepingNode(this.KaijuArmy, creepingNode);
            }
        }
        IWorldPositionningService service2 = this.gameService.Game.Services.GetService <IWorldPositionningService>();
        Region region = service2.GetRegion(this.KaijuArmy.WorldPosition);

        if (region.City != null && region.City.Empire != this.Empire)
        {
            DepartmentOfTheInterior agency2 = region.City.Empire.GetAgency <DepartmentOfTheInterior>();
            if (agency2 != null)
            {
                if (region.City.BesiegingEmpire == this.Empire && agency2.NeedToStopSiege(region.City))
                {
                    agency2.StopSiege(region.City);
                }
                agency2.StopNavalSiege(region.City, this.KaijuArmy);
            }
            IVisibilityService service3 = this.gameService.Game.Services.GetService <IVisibilityService>();
            service3.NotifyVisibilityHasChanged(this.Empire);
        }
    }
コード例 #10
0
    private bool CanTransferTo(Army army, WorldPosition worldPosition, ref bool atLeastOneNeighbourgCityWithNotEnoughSlotsLeft, ref bool atLeastOneNeighbourgVillageWithNotEnoughSlotsLeft, IWorldPositionningService worldPositionningService, int transferringUnitSlot)
    {
        Region region = worldPositionningService.GetRegion(worldPosition);

        if (region.City != null && region.City.Empire == army.Empire)
        {
            int i = 0;
            while (i < region.City.Districts.Count)
            {
                if (region.City.Districts[i].Type != DistrictType.Exploitation && region.City.Districts[i].Type != DistrictType.Improvement && worldPosition == region.City.Districts[i].WorldPosition)
                {
                    if (transferringUnitSlot + region.City.CurrentUnitSlot > region.City.MaximumUnitSlot)
                    {
                        atLeastOneNeighbourgCityWithNotEnoughSlotsLeft = true;
                        break;
                    }
                    if (army.WorldPosition == worldPosition)
                    {
                        return(true);
                    }
                    if (region.City.BesiegingEmpireIndex < 0 || (army.Hero != null && army.Hero.CheckUnitAbility(UnitAbility.UnitAbilityAllowAssignationUnderSiege, -1)))
                    {
                        return(true);
                    }
                    break;
                }
                else
                {
                    i++;
                }
            }
        }
        if (region != null && region.MinorEmpire != null)
        {
            BarbarianCouncil agency = region.MinorEmpire.GetAgency <BarbarianCouncil>();
            if (agency != null)
            {
                Village villageAt = agency.GetVillageAt(worldPosition);
                if (villageAt != null && villageAt.HasBeenConverted && villageAt.Converter == army.Empire)
                {
                    if (transferringUnitSlot + villageAt.CurrentUnitSlot <= villageAt.MaximumUnitSlot)
                    {
                        return(true);
                    }
                    atLeastOneNeighbourgVillageWithNotEnoughSlotsLeft = true;
                }
            }
        }
        return((region != null && region.City != null && region.City.Camp != null && worldPosition == region.City.Camp.WorldPosition && region.City.Camp.Empire == army.Empire && transferringUnitSlot + region.City.Camp.CurrentUnitSlot <= region.City.Camp.MaximumUnitSlot) || (region != null && region.Kaiju != null && region.Kaiju.KaijuGarrison != null && worldPosition == region.Kaiju.KaijuGarrison.WorldPosition && region.Kaiju.Empire.Index == army.Empire.Index && DepartmentOfScience.IsTechnologyResearched(army.Empire, "TechnologyDefinitionMimics1") && transferringUnitSlot + region.Kaiju.KaijuGarrison.CurrentUnitSlot <= region.Kaiju.KaijuGarrison.MaximumUnitSlot));
    }
コード例 #11
0
ファイル: Kaiju.cs プロジェクト: LeaderEnemyBoss/ELCP
    public bool CanChangeToGarrisonMode()
    {
        if (this.OnGarrisonMode())
        {
            return(false);
        }
        if (this.IsStunned())
        {
            return(false);
        }
        IWorldPositionningService service = this.GameService.Game.Services.GetService <IWorldPositionningService>();
        Region region = service.GetRegion(this.KaijuArmy.WorldPosition);

        return(region == null || region.Owner == null);
    }
コード例 #12
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);
                    }
                }
            }
        }
    }
コード例 #13
0
ファイル: Kaiju.cs プロジェクト: LeaderEnemyBoss/ELCP
 public void SetGarrison(KaijuGarrison kaijuGarrison)
 {
     kaijuGarrison.Empire = this.Empire;
     kaijuGarrison.Kaiju  = this;
     this.KaijuGarrison   = kaijuGarrison;
     this.KaijuGarrison.StandardUnitCollectionChange += this.KaijuGarrison_StandardUnitCollectionChange;
     if (!this.OnArmyMode())
     {
         IWorldPositionningService service = this.GameService.Game.Services.GetService <IWorldPositionningService>();
         Region region = service.GetRegion(this.KaijuGarrison.WorldPosition);
         this.Region                   = region;
         this.Region.KaijuEmpire       = this.KaijuEmpire;
         this.Region.KaijuGarrisonGUID = this.KaijuGarrison.GUID;
         this.Empire.AddChild(kaijuGarrison);
     }
 }
コード例 #14
0
    protected bool AreTradeRoutesPossibleWithEmpire()
    {
        IGameService service = Services.GetService <IGameService>();

        Diagnostics.Assert(service != null);
        Diagnostics.Assert(service.Game != null);
        Diagnostics.Assert(service.Game is global::Game);
        IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();

        Diagnostics.Assert(service2 != null);
        Diagnostics.Assert(this.DiplomaticRelation != null && this.DiplomaticRelation.State != null);
        if (!this.DiplomaticRelation.HasActiveAbility(DiplomaticAbilityDefinition.TradeRoute))
        {
            return(false);
        }
        Func <City, bool> func = delegate(City city)
        {
            if (city.CadastralMap.ConnectedMovementCapacity == PathfindingMovementCapacity.None)
            {
                return(false);
            }
            if (city.BesiegingEmpireIndex != -1)
            {
                return(false);
            }
            int num = Mathf.FloorToInt(city.GetPropertyValue(SimulationProperties.MaximumNumberOfTradeRoutes));
            return(num > 0);
        };

        foreach (City city2 in this.Empire.GetAgency <DepartmentOfTheInterior>().Cities)
        {
            if (func(city2))
            {
                foreach (Region.Border border in city2.Region.Borders)
                {
                    Region region = service2.GetRegion(border.NeighbourRegionIndex);
                    if (region.City != null && region.City.Empire.Index == this.EmpireWhichReceives.Index && func(region.City))
                    {
                        return(true);
                    }
                }
            }
        }
        return(false);
    }
コード例 #15
0
    protected virtual bool CanMoveTo(GameInterface gameInterface, WorldPosition destination)
    {
        IWorldPositionningService service = gameInterface.Game.Services.GetService <IWorldPositionningService>();
        Region region = service.GetRegion(this.army.WorldPosition);

        if (region == null || !region.BelongToEmpire(this.army.Empire) || region.City == null || region.City.BesiegingEmpire == null)
        {
            return(true);
        }
        bool flag  = region.City.Districts.Any((District match) => match.Type != DistrictType.Exploitation && match.WorldPosition == this.army.WorldPosition);
        bool flag2 = region.City.Districts.Any((District match) => match.Type != DistrictType.Exploitation && match.WorldPosition == destination);

        if (flag)
        {
            return(flag2);
        }
        return(!flag2);
    }
コード例 #16
0
ファイル: UnitListPanel.cs プロジェクト: LeaderEnemyBoss/ELCP
    private bool CanSellUnitsAndExplain()
    {
        this.SellButtonPriceLabel.AgeTransform.Visible = false;
        if (this.IsOtherEmpire || !this.DepartmentOfScience.CanTradeUnits(false))
        {
            return(false);
        }
        if (this.selectedUnits.Count == 0)
        {
            this.SellButton.AgeTooltip.Content = "%ArmyEmptySelectionDescription";
            return(false);
        }
        this.SellComputeCandidates();
        if (this.salableUnits.Count == 0)
        {
            this.SellButton.AgeTooltip.Content = "%SellTabNoCandidateDescription";
            return(false);
        }
        if (ELCPUtilities.UseELCPUnitSelling && this.Garrison is Army)
        {
            IWorldPositionningService service = base.GameService.Game.Services.GetService <IWorldPositionningService>();
            Army   army   = this.Garrison as Army;
            Region region = service.GetRegion(army.WorldPosition);
            if (region == null || region.Owner != army.Empire)
            {
                this.SellButton.AgeTooltip.Content = "%SellTabNotInOwnRegionDescription";
                return(false);
            }
        }
        float  num           = this.TotalSellPriceOfSalableUnits();
        string text          = GuiFormater.FormatStock(num, DepartmentOfTheTreasury.Resources.EmpireMoney, 0, true);
        string formattedLine = GuiFormater.FormatInstantCost(this.Garrison.Empire, num, DepartmentOfTheTreasury.Resources.EmpireMoney, true, 1);

        this.SellButtonPriceLabel.Text = text;
        this.SellButtonPriceLabel.AgeTransform.Visible = true;
        AgeUtils.CleanLine(formattedLine, ref this.monochromaticFormat);
        if (!this.Garrison.IsInEncounter)
        {
            this.SellButton.AgeTooltip.Content = string.Format(AgeLocalizer.Instance.LocalizeString("%SellTabOKDescription"), this.monochromaticFormat);
            return(true);
        }
        this.SellButton.AgeTooltip.Content = AgeLocalizer.Instance.LocalizeString("%ArmyLockedInBattleDescription");
        return(false);
    }
コード例 #17
0
    private Village GetVillageFromPointOfInterest(PointOfInterest pointOfInterest, IWorldPositionningService worldPositionningService = null)
    {
        if (worldPositionningService == null)
        {
            IGameService service = Services.GetService <IGameService>();
            Diagnostics.Assert(service != null);
            Diagnostics.Assert(service.Game != null);
            worldPositionningService = service.Game.Services.GetService <IWorldPositionningService>();
            Diagnostics.Assert(worldPositionningService != null);
        }
        Region region = worldPositionningService.GetRegion(pointOfInterest.WorldPosition);

        if (region != null && region.MinorEmpire != null)
        {
            BarbarianCouncil agency = region.MinorEmpire.GetAgency <BarbarianCouncil>();
            return(agency.GetVillageAt(pointOfInterest.WorldPosition));
        }
        return(null);
    }
コード例 #18
0
    internal void AddVillage(Village village)
    {
        if (village.Empire != null && village.Empire != base.Empire)
        {
            Diagnostics.LogError("The barbarian council was asked to add a village (guid: {0}, empire: {1}) but it is still bound to another empire.", new object[]
            {
                village.GUID,
                village.Empire.Name
            });
            return;
        }
        village.Empire = (global::Empire)base.Empire;
        IWorldPositionningService service = this.GameService.Game.Services.GetService <IWorldPositionningService>();
        Region region = service.GetRegion(village.WorldPosition);

        village.Region = region;
        int num = this.villages.BinarySearch((Village match) => match.GUID.CompareTo(village.GUID));

        if (num >= 0)
        {
            Diagnostics.LogWarning("The barbarian council was asked to add a village (guid #{0}) but it is already present in its list of villages.", new object[]
            {
                village.GUID
            });
            return;
        }
        this.villages.Insert(~num, village);
        if (village.HasBeenPacified)
        {
            this.PacifyVillage(village, null);
        }
        base.Empire.AddChild(village);
        if (village.HasBeenConverted)
        {
            foreach (Unit simulationObjectWrapper in village.Units)
            {
                village.PointOfInterest.AddChild(simulationObjectWrapper);
            }
        }
    }
コード例 #19
0
    private bool TransferTo(Army army, WorldPosition worldPosition, List <GameEntityGUID> units, IWorldPositionningService worldPositionningService, global::PlayerController playerController, out Ticket ticket, EventHandler <TicketRaisedEventArgs> ticketRaisedEventHandler)
    {
        Region         region         = worldPositionningService.GetRegion(worldPosition);
        GameEntityGUID gameEntityGUID = GameEntityGUID.Zero;

        ticket = null;
        if (region.MinorEmpire != null)
        {
            BarbarianCouncil agency = region.MinorEmpire.GetAgency <BarbarianCouncil>();
            if (agency != null)
            {
                Village villageAt = agency.GetVillageAt(worldPosition);
                if (villageAt != null)
                {
                    gameEntityGUID = villageAt.GUID;
                }
            }
        }
        if (region.City != null && region.City.Camp != null && gameEntityGUID == GameEntityGUID.Zero && region.City.Camp.WorldPosition == worldPosition)
        {
            gameEntityGUID = region.City.Camp.GUID;
        }
        if (region.City != null && gameEntityGUID == GameEntityGUID.Zero)
        {
            gameEntityGUID = region.City.GUID;
        }
        if (region.Kaiju != null && region.Kaiju.KaijuGarrison != null && gameEntityGUID == GameEntityGUID.Zero && DepartmentOfScience.IsTechnologyResearched(army.Empire, "TechnologyDefinitionMimics1") && region.Kaiju.KaijuGarrison.WorldPosition == worldPosition)
        {
            gameEntityGUID = region.Kaiju.KaijuGarrison.GUID;
        }
        if (gameEntityGUID != GameEntityGUID.Zero)
        {
            OrderTransferUnits order = new OrderTransferUnits(army.Empire.Index, army.GUID, gameEntityGUID, units.ToArray(), false);
            playerController.PostOrder(order, out ticket, ticketRaisedEventHandler);
            return(true);
        }
        return(false);
    }
コード例 #20
0
 private void GenerateRetrofitUnitMessage(AICommander commander)
 {
     for (int i = 0; i < commander.Missions.Count; i++)
     {
         IGameService service = Services.GetService <IGameService>();
         Diagnostics.Assert(service != null);
         IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();
         Diagnostics.Assert(service2 != null);
         AICommanderMissionWithRequestArmy aicommanderMissionWithRequestArmy = commander.Missions[i] as AICommanderMissionWithRequestArmy;
         AIData_Army aidata_Army;
         if (aicommanderMissionWithRequestArmy != null && (aicommanderMissionWithRequestArmy.Completion == AICommanderMission.AICommanderMissionCompletion.Initializing || aicommanderMissionWithRequestArmy.Completion == AICommanderMission.AICommanderMissionCompletion.Pending || aicommanderMissionWithRequestArmy.Completion == AICommanderMission.AICommanderMissionCompletion.Running) && aicommanderMissionWithRequestArmy.AIDataArmyGUID.IsValid && aicommanderMissionWithRequestArmy.AllowRetrofit && this.aiDataRepository.TryGetAIData <AIData_Army>(aicommanderMissionWithRequestArmy.AIDataArmyGUID, out aidata_Army))
         {
             bool   flag   = true;
             Region region = service2.GetRegion(aidata_Army.Army.WorldPosition);
             if (region == null || region.Owner != aidata_Army.Army.Empire)
             {
                 flag = false;
             }
             float       num   = 0f;
             bool        flag2 = false;
             AIData_Unit unitData;
             for (int j = 0; j < aidata_Army.Army.StandardUnits.Count; j++)
             {
                 if (this.aiDataRepository.TryGetAIData <AIData_Unit>(aidata_Army.Army.StandardUnits[j].GUID, out unitData) && unitData.RetrofitData.MayRetrofit && unitData.RetrofitData.MilitaryPowerDifference > 0f)
                 {
                     flag2 = true;
                     num  += unitData.RetrofitData.MilitaryPowerDifference;
                 }
             }
             if (flag2)
             {
                 float propertyValue = aidata_Army.Army.GetPropertyValue(SimulationProperties.MilitaryPower);
                 float num2;
                 bool  flag3;
                 bool  flag4;
                 aicommanderMissionWithRequestArmy.ComputeNeededArmyPower(out num2, out flag3, out flag4);
                 float num3 = commander.GetPriority(aicommanderMissionWithRequestArmy);
                 if (num <= 0f)
                 {
                     num3 = AILayer.Boost(num3, -0.9f);
                 }
                 else if (!flag3 && propertyValue < num2)
                 {
                     num3 = AILayer.Boost(num3, 0.2f);
                 }
                 DepartmentOfForeignAffairs agency = base.AIEntity.Empire.GetAgency <DepartmentOfForeignAffairs>();
                 Predicate <EvaluableMessage_RetrofitUnit> < > 9__0;
                 for (int k = 0; k < aidata_Army.Army.StandardUnits.Count; k++)
                 {
                     if (this.aiDataRepository.TryGetAIData <AIData_Unit>(aidata_Army.Army.StandardUnits[k].GUID, out unitData) && unitData.RetrofitData.MayRetrofit && unitData.RetrofitData.MilitaryPowerDifference > 0f)
                     {
                         Blackboard <BlackboardLayerID, BlackboardMessage> blackboard = commander.AIPlayer.Blackboard;
                         BlackboardLayerID blackboardLayerID = BlackboardLayerID.Empire;
                         BlackboardLayerID layerID           = blackboardLayerID;
                         Predicate <EvaluableMessage_RetrofitUnit> filter;
                         if ((filter = < > 9__0) == null)
                         {
                             filter = (< > 9__0 = ((EvaluableMessage_RetrofitUnit match) => match.ElementGuid == unitData.Unit.GUID));
                         }
                         EvaluableMessage_RetrofitUnit evaluableMessage_RetrofitUnit = blackboard.FindFirst <EvaluableMessage_RetrofitUnit>(layerID, filter);
                         if (evaluableMessage_RetrofitUnit == null || evaluableMessage_RetrofitUnit.State != BlackboardMessage.StateValue.Message_InProgress)
                         {
                             evaluableMessage_RetrofitUnit = new EvaluableMessage_RetrofitUnit(unitData.Unit.GUID);
                             commander.AIPlayer.Blackboard.AddMessage(evaluableMessage_RetrofitUnit);
                         }
                         float num4 = 0f;
                         for (int l = 0; l < unitData.RetrofitData.RetrofitCosts.Length; l++)
                         {
                             if (unitData.RetrofitData.RetrofitCosts[l].ResourceName == DepartmentOfTheTreasury.Resources.EmpireMoney)
                             {
                                 num4 += unitData.RetrofitData.RetrofitCosts[l].Value;
                             }
                         }
                         if (agency.IsInWarWithSomeone() && unitData.RetrofitData.MilitaryPowerDifference > unitData.Unit.UnitDesign.Context.GetPropertyValue(SimulationProperties.MilitaryPower) && flag && this.diplomacyLayer != null && this.diplomacyLayer.GetMilitaryPowerDif(false) < 0.5f * propertyValue)
                         {
                             evaluableMessage_RetrofitUnit.SetInterest(1f, 1f);
                         }
                         else
                         {
                             evaluableMessage_RetrofitUnit.SetInterest(this.retrofitGlobalPriority, num3);
                         }
                         evaluableMessage_RetrofitUnit.UpdateBuyEvaluation("Retrofit", 0UL, num4, (int)BuyEvaluation.MaxTurnGain, 0f, 0UL);
                         evaluableMessage_RetrofitUnit.TimeOut = 1;
                     }
                 }
             }
         }
     }
 }
コード例 #21
0
    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);
    }
コード例 #22
0
    public override bool CanExecute(Army army, ref List <StaticString> failureFlags, params object[] parameters)
    {
        this.lastConvertCostDescription = string.Empty;
        if (!base.CanExecute(army, ref failureFlags, parameters))
        {
            return(false);
        }
        if (army.IsNaval)
        {
            failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
            return(false);
        }
        IGameService service = Services.GetService <IGameService>();

        if (service == null)
        {
            failureFlags.Add(ArmyAction.NoCanDoWhileSystemError);
            return(false);
        }
        global::Game x = service.Game as global::Game;

        if (x == null)
        {
            failureFlags.Add(ArmyAction.NoCanDoWhileSystemError);
            return(false);
        }
        IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();

        if (service2 == null)
        {
            failureFlags.Add(ArmyAction.NoCanDoWhileSystemError);
            return(false);
        }
        if (parameters == null)
        {
            failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
            return(false);
        }
        if (parameters.Length == 0)
        {
            failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
            return(false);
        }
        List <Village> list = new List <Village>();

        for (int i = 0; i < parameters.Length; i++)
        {
            if (parameters[i] is Village)
            {
                list.Add(parameters[i] as Village);
            }
            else if (parameters[i] is List <IGameEntity> )
            {
                List <IGameEntity> list2 = parameters[i] as List <IGameEntity>;
                for (int j = 0; j < list2.Count; j++)
                {
                    if (list2[j] is Village)
                    {
                        list.Add(parameters[i] as Village);
                    }
                    else if (list2[j] is PointOfInterest)
                    {
                        PointOfInterest pointOfInterest = list2[j] as PointOfInterest;
                        Region          region          = service2.GetRegion(pointOfInterest.WorldPosition);
                        if (region != null && region.MinorEmpire != null)
                        {
                            BarbarianCouncil agency    = region.MinorEmpire.GetAgency <BarbarianCouncil>();
                            Village          villageAt = agency.GetVillageAt(pointOfInterest.WorldPosition);
                            if (villageAt != null)
                            {
                                list.Add(villageAt);
                            }
                        }
                    }
                }
            }
        }
        if (list.Count == 0)
        {
            failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
            return(false);
        }
        if (!this.ArmyCanConvert(army, failureFlags))
        {
            return(false);
        }
        DepartmentOfTheTreasury agency2 = army.Empire.GetAgency <DepartmentOfTheTreasury>();

        for (int k = list.Count - 1; k >= 0; k--)
        {
            if (!this.CanConvertVillage(army, list[k], agency2, failureFlags))
            {
                list.RemoveAt(k);
            }
        }
        if (list.Count == 0)
        {
            return(false);
        }
        ArmyAction.FailureFlags.Clear();
        return(true);
    }
コード例 #23
0
    public void FillTargets(Army army, List <IGameEntity> targets, ref List <StaticString> failureFlags)
    {
        if (targets == null)
        {
            targets = new List <IGameEntity>();
        }
        IGameService service = Services.GetService <IGameService>();

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

        Diagnostics.Assert(service2 != null);
        IPathfindingService service3 = service.Game.Services.GetService <IPathfindingService>();

        Diagnostics.Assert(service2 != null);
        base.ListNearbyVillages(army);
        if (base.PointsOfInterest.Count != 0)
        {
            for (int i = base.PointsOfInterest.Count - 1; i >= 0; i--)
            {
                PointOfInterest pointOfInterest = base.PointsOfInterest[i];
                if (pointOfInterest.PointOfInterestImprovement != null && (pointOfInterest.Empire == null || pointOfInterest.Empire.Index != army.Empire.Index))
                {
                    Region region = service2.GetRegion(pointOfInterest.WorldPosition);
                    if (region != null && region.MinorEmpire != null)
                    {
                        Village village = region.MinorEmpire.GetAgency <BarbarianCouncil>().Villages.FirstOrDefault((Village iterator) => iterator.WorldPosition == pointOfInterest.WorldPosition);
                        if (village != null)
                        {
                            targets.Add(village);
                        }
                    }
                }
            }
        }
        List <WorldPosition> list = new List <WorldPosition>();

        for (int j = 0; j < 6; j++)
        {
            WorldPosition neighbourTile = service2.GetNeighbourTile(army.WorldPosition, (WorldOrientation)j, 1);
            if (neighbourTile.IsValid && service3.IsTransitionPassable(army.WorldPosition, neighbourTile, army, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreOtherEmpireDistrict | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnoreZoneOfControl | PathfindingFlags.IgnorePOI | PathfindingFlags.IgnoreSieges | PathfindingFlags.IgnoreKaijuGarrisons, null))
            {
                list.Add(neighbourTile);
            }
        }
        List <int> list2 = new List <int>();

        for (int k = 0; k < list.Count; k++)
        {
            Region region2 = service2.GetRegion(list[k]);
            if (region2 != null && !list2.Contains(region2.Index))
            {
                list2.Add(region2.Index);
                KaijuEmpire kaijuEmpire = region2.KaijuEmpire;
                if (kaijuEmpire != null)
                {
                    KaijuCouncil agency = kaijuEmpire.GetAgency <KaijuCouncil>();
                    if (agency != null)
                    {
                        Kaiju kaiju = agency.Kaiju;
                        if (kaiju != null && kaiju.OnGarrisonMode())
                        {
                            KaijuGarrison kaijuGarrison = kaiju.KaijuGarrison;
                            if (kaijuGarrison != null && list.Contains(kaijuGarrison.WorldPosition))
                            {
                                targets.Add(kaijuGarrison);
                            }
                        }
                    }
                }
                if (region2.City != null && region2.City.Empire != null && region2.City.Empire.Index != army.Empire.Index)
                {
                    for (int l = 0; l < region2.City.Districts.Count; l++)
                    {
                        District district = region2.City.Districts[l];
                        if (list.Contains(district.WorldPosition) && district.Type != DistrictType.Exploitation)
                        {
                            targets.Add(district);
                        }
                    }
                    if (region2.City.Camp != null && list.Contains(region2.City.Camp.WorldPosition))
                    {
                        targets.Add(region2.City.Camp);
                    }
                }
            }
        }
        global::Game game = service.Game as global::Game;

        if (game == null)
        {
            return;
        }
        for (int m = 0; m < game.Empires.Length; m++)
        {
            if (m != army.Empire.Index)
            {
                DepartmentOfDefense agency2 = game.Empires[m].GetAgency <DepartmentOfDefense>();
                if (agency2 != null)
                {
                    for (int n = 0; n < agency2.Armies.Count; n++)
                    {
                        Army army2 = agency2.Armies[n];
                        if (list.Contains(army2.WorldPosition))
                        {
                            if (army2 is KaijuArmy)
                            {
                                KaijuArmy kaijuArmy = army2 as KaijuArmy;
                                if (kaijuArmy != null && !kaijuArmy.Kaiju.OnArmyMode())
                                {
                                    goto IL_389;
                                }
                            }
                            targets.Add(army2);
                        }
                        IL_389 :;
                    }
                }
                DepartmentOfTheInterior agency3 = game.Empires[m].GetAgency <DepartmentOfTheInterior>();
                if (agency3 != null)
                {
                    for (int num = 0; num < agency3.TamedKaijuGarrisons.Count; num++)
                    {
                        KaijuGarrison kaijuGarrison2 = agency3.TamedKaijuGarrisons[num];
                        if (kaijuGarrison2 != null)
                        {
                            Kaiju kaiju2 = kaijuGarrison2.Kaiju;
                            if (kaiju2 != null && kaiju2.OnGarrisonMode() && list.Contains(kaijuGarrison2.WorldPosition))
                            {
                                targets.Add(kaijuGarrison2);
                            }
                        }
                    }
                }
            }
        }
    }
    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);
        }
    }