Exemplo n.º 1
0
    public Amplitude.Unity.Game.Orders.Order CreateArmyFromMixedArmy(BaseNavyArmy army)
    {
        if (!this.IsMixed(army))
        {
            return(null);
        }
        if (!base.HasMovementLeft(army))
        {
            return(null);
        }
        WorldPosition armyPosition = WorldPosition.Invalid;
        PathfindingMovementCapacity movementCapacity = PathfindingMovementCapacity.Water;

        for (int i = 0; i < 6; i++)
        {
            WorldPosition neighbourTile = this.worldPositionService.GetNeighbourTile(army.Garrison.WorldPosition, (WorldOrientation)i, 1);
            if (DepartmentOfDefense.CheckWhetherTargetPositionIsValidForUseAsArmySpawnLocation(neighbourTile, movementCapacity))
            {
                armyPosition = neighbourTile;
                break;
            }
        }
        bool flag = false;
        List <GameEntityGUID> list = new List <GameEntityGUID>();

        for (int j = 0; j < army.Garrison.StandardUnits.Count; j++)
        {
            if (flag == army.Garrison.StandardUnits[j].IsSeafaring)
            {
                list.Add(army.Garrison.StandardUnits[j].GUID);
            }
        }
        return(new OrderTransferGarrisonToNewArmy(army.Garrison.Empire.Index, army.Garrison.GUID, list.ToArray(), armyPosition, null, false, true, true));
    }
Exemplo n.º 2
0
    public override void Execute(Army army, global::PlayerController playerController, out Ticket ticket, EventHandler <TicketRaisedEventArgs> ticketRaisedEventHandler, params object[] parameters)
    {
        ticket = null;
        List <GameEntityGUID> list = new List <GameEntityGUID>();
        int num = 0;
        PathfindingMovementCapacity pathfindingMovementCapacity = PathfindingMovementCapacity.None;

        for (int i = 0; i < parameters.Length; i++)
        {
            if (parameters[i] is Unit)
            {
                Unit unit = parameters[i] as Unit;
                num += (int)unit.GetPropertyValue(SimulationProperties.UnitSlotCount);
                list.Add(unit.GUID);
                pathfindingMovementCapacity = unit.GenerateContext().MovementCapacities;
            }
            else
            {
                if (!(parameters[i] is IEnumerable <Unit>))
                {
                    return;
                }
                foreach (Unit unit2 in (parameters[i] as IEnumerable <Unit>))
                {
                    num += (int)unit2.GetPropertyValue(SimulationProperties.UnitSlotCount);
                    list.Add(unit2.GUID);
                    if (pathfindingMovementCapacity == PathfindingMovementCapacity.None)
                    {
                        pathfindingMovementCapacity = unit2.GenerateContext().MovementCapacities;
                    }
                    else
                    {
                        pathfindingMovementCapacity &= unit2.GenerateContext().MovementCapacities;
                    }
                }
            }
        }
        IGameService service = Services.GetService <IGameService>();
        IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();
        IPathfindingService       service3 = service.Game.Services.GetService <IPathfindingService>();
        bool flag  = false;
        bool flag2 = false;

        if (this.CanTransferTo(army, army.WorldPosition, ref flag, ref flag2, service2, num) && this.TransferTo(army, army.WorldPosition, list, service2, playerController, out ticket, ticketRaisedEventHandler))
        {
            return;
        }
        for (int j = 0; j < 6; j++)
        {
            WorldPosition neighbourTile = service2.GetNeighbourTile(army.WorldPosition, (WorldOrientation)j, 1);
            if (service3.IsTilePassable(neighbourTile, pathfindingMovementCapacity, (PathfindingFlags)0) && service3.IsTransitionPassable(army.WorldPosition, neighbourTile, pathfindingMovementCapacity, (PathfindingFlags)0))
            {
                if (this.CanTransferTo(army, neighbourTile, ref flag, ref flag2, service2, num) && this.TransferTo(army, neighbourTile, list, service2, playerController, out ticket, ticketRaisedEventHandler))
                {
                    return;
                }
            }
        }
    }
 public OrderUpdateCadastralMapClient(int empireIndex, City city, PathfindingMovementCapacity pathfindingMovementCapacity, CadastralMapOperation operation) : base(empireIndex)
 {
     if (city == null)
     {
         throw new ArgumentNullException("city");
     }
     this.CityGameEntityGUID          = city.GUID;
     this.PathfindingMovementCapacity = pathfindingMovementCapacity;
     this.Operation = operation;
 }
Exemplo n.º 4
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);
    }
Exemplo n.º 5
0
    public void OverridePathfindingCost(WorldPosition worldPosition, PathfindingMovementCapacity movementCapacity, ref float cost)
    {
        int weatherValueAtPosition = (int)this.GetWeatherValueAtPosition(worldPosition);

        if (weatherValueAtPosition == 0)
        {
            return;
        }
        WeatherDefinition weatherDefinition = null;

        for (int i = 0; i < this.weatherDefinitions.Length; i++)
        {
            if (this.weatherDefinitions[i].Value == weatherValueAtPosition)
            {
                weatherDefinition = this.weatherDefinitions[i];
                break;
            }
        }
        if (weatherDefinition == null)
        {
            Diagnostics.LogError("In OverrideCostByWeatherEffectsPathfindingRule, Fail getting weather definition.");
            return;
        }
        PathfindingRule rule = weatherDefinition.GetRule();

        if (rule == null)
        {
            return;
        }
        if ((movementCapacity & PathfindingMovementCapacity.Water) == PathfindingMovementCapacity.None)
        {
            cost = float.PositiveInfinity;
        }
        else
        {
            int currentTileHeigh = (int)this.worldPositionService.GetTerrainHeight(worldPosition);
            cost = rule.GetCost(movementCapacity, currentTileHeigh);
        }
    }
Exemplo n.º 6
0
    public void ComputeFarestPositionInList(WorldPosition[] listOfPosition, WorldPosition origin, PathfindingMovementCapacity pathfindingCapacity, out WorldPosition final)
    {
        WorldPosition worldPosition = WorldPosition.Invalid;

        if (listOfPosition.Length > 0)
        {
            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>();
            float num = 0f;
            for (int i = 0; i < listOfPosition.Length; i++)
            {
                if (service3.IsTilePassable(listOfPosition[i], pathfindingCapacity, (PathfindingFlags)0) && service3.IsTileStopable(listOfPosition[i], pathfindingCapacity, (PathfindingFlags)0))
                {
                    float num2 = (float)service2.GetDistance(listOfPosition[i], origin);
                    if (num2 > num)
                    {
                        worldPosition = listOfPosition[i];
                        num           = num2;
                    }
                }
            }
        }
        final = worldPosition;
    }
Exemplo n.º 7
0
    private void ELCPDisconnect(Region Region, PathfindingMovementCapacity movementCapacity, bool cityAboutToBeDestroyed)
    {
        Diagnostics.Assert(this.roads != null);
        Diagnostics.Assert(Region != null);
        List <ushort> list  = new List <ushort>();
        List <short>  list2 = new List <short>();

        for (int i = 0; i < this.roads.Count; i++)
        {
            if (this.roads[i] != null && (Region.Index == (int)this.roads[i].FromRegion || Region.Index == (int)this.roads[i].ToRegion))
            {
                list2.AddOnce(this.roads[i].FromRegion);
                list2.AddOnce(this.roads[i].ToRegion);
                if (!cityAboutToBeDestroyed && (movementCapacity & PathfindingMovementCapacity.Ground) == PathfindingMovementCapacity.Ground)
                {
                    short regionIndex = this.roads[i].ToRegion;
                    if ((int)this.roads[i].ToRegion == Region.Index)
                    {
                        regionIndex = this.roads[i].FromRegion;
                    }
                    Region region = this.WorldPositionningService.GetRegion((int)regionIndex);
                    if (region != null)
                    {
                        Diagnostics.Assert(region.City != null);
                        Diagnostics.Assert(region.City.CadastralMap != null);
                        if ((region.City.CadastralMap.ConnectedMovementCapacity & PathfindingMovementCapacity.Ground) == PathfindingMovementCapacity.Ground)
                        {
                            if (this.RoadModified != null)
                            {
                                this.RoadModified(this, new RoadEventArgs((ushort)i, this.roads[i]));
                                goto IL_1AF;
                            }
                            goto IL_1AF;
                        }
                    }
                }
                this.roads[i].PathfindingMovementCapacity &= ~movementCapacity;
                if (this.roads[i].PathfindingMovementCapacity == PathfindingMovementCapacity.None)
                {
                    list.Add((ushort)i);
                    ((ICadasterService)this).Unregister((ushort)i);
                    Diagnostics.Assert(this.roads[i] == null);
                }
            }
            IL_1AF :;
        }
        list2.Remove((short)Region.Index);
        if (list2.Count > 0)
        {
            Diagnostics.Assert(this.WorldPositionningService != null);
            for (int j = 0; j < list2.Count; j++)
            {
                Region region2 = this.WorldPositionningService.GetRegion((int)list2[j]);
                if (region2 != null && region2.City != null && region2.City.CadastralMap.Roads != null)
                {
                    List <ushort> list3 = region2.City.CadastralMap.Roads.Except(list).ToList <ushort>();
                    region2.City.CadastralMap.Roads = list3;
                }
            }
        }
    }
Exemplo n.º 8
0
 ushort[] ICadasterService.Connect(City city, PathfindingMovementCapacity movementCapacity, bool proxied)
 {
     if (city == null)
     {
         throw new ArgumentNullException("city");
     }
     if ((movementCapacity & PathfindingMovementCapacity.Water) == PathfindingMovementCapacity.Water)
     {
         StaticString  type  = new StaticString("DistrictImprovement");
         StaticString  y     = new StaticString("DistrictImprovementDocks");
         WorldPosition start = WorldPosition.Invalid;
         for (int i = 0; i < city.Districts.Count; i++)
         {
             District district = city.Districts[i];
             if (district.Type == DistrictType.Improvement && district.GetDescriptorNameFromType(type) == y)
             {
                 start = district.WorldPosition;
                 break;
             }
         }
         if (!start.IsValid)
         {
             return(null);
         }
         DepartmentOfForeignAffairs agency = city.Empire.GetAgency <DepartmentOfForeignAffairs>();
         this.OceanPathfindingWorldContext.RegionIndexList.Clear();
         this.OceanPathfindingWorldContext.RegionIndexList.Add((int)this.WorldPositionningService.GetRegionIndex(city.WorldPosition));
         for (int j = 0; j < city.Region.Borders.Length; j++)
         {
             Region region = this.WorldPositionningService.GetRegion(city.Region.Borders[j].NeighbourRegionIndex);
             if (region.Owner == null || !(region.Owner is MajorEmpire) || region.Owner.Index == city.Empire.Index || agency.GetDiplomaticRelation(region.Owner).HasActiveAbility(DiplomaticAbilityDefinition.TradeRoute))
             {
                 this.OceanPathfindingWorldContext.RegionIndexList.Add(city.Region.Borders[j].NeighbourRegionIndex);
             }
         }
         Diagnostics.Assert(city.CadastralMap != null);
         Diagnostics.Assert((city.CadastralMap.ConnectedMovementCapacity & PathfindingMovementCapacity.Water) == PathfindingMovementCapacity.Water);
         List <ushort> list  = new List <ushort>();
         List <Region> list2 = new List <Region>();
         List <Region> list3 = new List <Region>();
         list3.Add(city.Region);
         int k = 0;
         int l = 2;
         while (l > 0)
         {
             l--;
             list2.AddRange(list3);
             list3.Clear();
             while (k < list2.Count)
             {
                 Region region2 = list2[k];
                 for (int m = 0; m < region2.Borders.Length; m++)
                 {
                     short  regionIndex = (short)region2.Borders[m].NeighbourRegionIndex;
                     Region region3     = this.WorldPositionningService.GetRegion((int)regionIndex);
                     if (region3 != null && !list2.Contains(region3))
                     {
                         if (region3.City != null)
                         {
                             Diagnostics.Assert(region3.City.CadastralMap != null);
                             if ((region3.City.CadastralMap.ConnectedMovementCapacity & PathfindingMovementCapacity.Water) == PathfindingMovementCapacity.Water)
                             {
                                 for (int n = 0; n < region3.City.Districts.Count; n++)
                                 {
                                     District district2 = region3.City.Districts[n];
                                     if (district2.Type == DistrictType.Improvement && district2.GetDescriptorNameFromType(type) == y)
                                     {
                                         PathfindingFlags pathfindingFlags = PathfindingFlags.IgnoreAll;
                                         pathfindingFlags &= ~PathfindingFlags.IgnoreMovementCapacities;
                                         pathfindingFlags &= ~PathfindingFlags.IgnorePOI;
                                         PathfindingContext pathfindingContext = new PathfindingContext(GameEntityGUID.Zero, city.Empire, PathfindingMovementCapacity.Water);
                                         pathfindingContext.RefreshProperties(1f, 1f, false, false, 1f, 1f);
                                         bool flag = false;
                                         if (!this.OceanPathfindingWorldContext.RegionIndexList.Contains(region2.Borders[m].NeighbourRegionIndex))
                                         {
                                             flag = true;
                                             this.OceanPathfindingWorldContext.RegionIndexList.Add(region2.Borders[m].NeighbourRegionIndex);
                                         }
                                         PathfindingResult pathfindingResult = this.PathfindingService.FindPath(pathfindingContext, start, district2.WorldPosition, PathfindingManager.RequestMode.Default, this.OceanPathfindingWorldContext, pathfindingFlags, null);
                                         if (flag)
                                         {
                                             this.OceanPathfindingWorldContext.RegionIndexList.Remove(region2.Borders[m].NeighbourRegionIndex);
                                         }
                                         if (pathfindingResult == null)
                                         {
                                             pathfindingResult = this.PathfindingService.FindPath(pathfindingContext, start, district2.WorldPosition, PathfindingManager.RequestMode.Default, null, pathfindingFlags, null);
                                         }
                                         if (pathfindingResult != null)
                                         {
                                             ushort item = this.Reserve(new Road
                                             {
                                                 FromRegion     = (short)city.Region.Index,
                                                 ToRegion       = (short)region3.Index,
                                                 WorldPositions = pathfindingResult.GetCompletePath().ToArray <WorldPosition>(),
                                                 PathfindingMovementCapacity = PathfindingMovementCapacity.Water
                                             });
                                             list.Add(item);
                                         }
                                     }
                                 }
                             }
                         }
                         if (region3.IsOcean)
                         {
                             list3.AddOnce(region3);
                         }
                         else
                         {
                             list2.Insert(k, region3);
                             k++;
                         }
                     }
                 }
                 k++;
             }
         }
         this.OceanPathfindingWorldContext.RegionIndexList.Clear();
         return(list.ToArray());
     }
     else
     {
         if (city.Region.Borders != null)
         {
             List <ushort> list4 = new List <ushort>();
             for (int num = 0; num < city.Region.Borders.Length; num++)
             {
                 short  regionIndex2 = (short)city.Region.Borders[num].NeighbourRegionIndex;
                 Region region4      = this.WorldPositionningService.GetRegion((int)regionIndex2);
                 if (region4 != null && region4.City != null)
                 {
                     if (proxied)
                     {
                         if ((movementCapacity & PathfindingMovementCapacity.Ground) != PathfindingMovementCapacity.Ground)
                         {
                             goto IL_75D;
                         }
                         Diagnostics.Assert(region4.City.CadastralMap != null);
                         if ((region4.City.CadastralMap.ConnectedMovementCapacity & PathfindingMovementCapacity.Ground) != PathfindingMovementCapacity.Ground)
                         {
                             goto IL_75D;
                         }
                     }
                     bool flag2 = false;
                     if (region4.City.CadastralMap.Roads != null)
                     {
                         for (int num2 = 0; num2 < region4.City.CadastralMap.Roads.Count; num2++)
                         {
                             ushort num3 = region4.City.CadastralMap.Roads[num2];
                             Road   road = this.roads[(int)num3];
                             if (road != null && (city.Region.Index == (int)road.FromRegion || city.Region.Index == (int)road.ToRegion) && (road.PathfindingMovementCapacity & movementCapacity) != PathfindingMovementCapacity.None)
                             {
                                 if (this.RoadModified != null)
                                 {
                                     this.RoadModified(this, new RoadEventArgs(num3, road));
                                 }
                                 flag2 = true;
                                 list4.Add(num3);
                             }
                         }
                     }
                     if (!flag2)
                     {
                         PathfindingFlags pathfindingFlags2 = PathfindingFlags.IgnoreAll;
                         pathfindingFlags2 &= ~PathfindingFlags.IgnoreMovementCapacities;
                         pathfindingFlags2 &= ~PathfindingFlags.IgnorePOI;
                         pathfindingFlags2 &= ~PathfindingFlags.IgnoreRoad;
                         PathfindingContext pathfindingContext2 = new PathfindingContext(GameEntityGUID.Zero, city.Empire, movementCapacity);
                         pathfindingContext2.RefreshProperties(1f, 1f, false, false, 1f, 1f);
                         pathfindingContext2.RemoveMovementCapacity(PathfindingMovementCapacity.FrozenWater);
                         Diagnostics.Assert(this.pathfindingWorldContext != null && this.pathfindingWorldContext.RegionIndexList != null && this.pathfindingWorldContext.RegionIndexList.Count == 2);
                         this.pathfindingWorldContext.RegionIndexList[0] = (int)this.WorldPositionningService.GetRegionIndex(city.WorldPosition);
                         this.pathfindingWorldContext.RegionIndexList[1] = (int)this.WorldPositionningService.GetRegionIndex(region4.City.WorldPosition);
                         PathfindingResult pathfindingResult2 = this.PathfindingService.FindPath(pathfindingContext2, city.WorldPosition, region4.City.WorldPosition, PathfindingManager.RequestMode.Default, this.pathfindingWorldContext, pathfindingFlags2, null);
                         if (pathfindingResult2 == null)
                         {
                             pathfindingFlags2 |= PathfindingFlags.IgnorePOI;
                             pathfindingResult2 = this.PathfindingService.FindPath(pathfindingContext2, city.WorldPosition, region4.City.WorldPosition, PathfindingManager.RequestMode.Default, this.pathfindingWorldContext, pathfindingFlags2, null);
                         }
                         if (pathfindingResult2 != null)
                         {
                             ushort item2 = this.Reserve(new Road
                             {
                                 FromRegion     = (short)city.Region.Index,
                                 ToRegion       = (short)region4.Index,
                                 WorldPositions = pathfindingResult2.GetCompletePath().ToList <WorldPosition>().ToArray(),
                                 PathfindingMovementCapacity = movementCapacity
                             });
                             list4.Add(item2);
                         }
                     }
                 }
                 IL_75D :;
             }
             return(list4.ToArray());
         }
         return(null);
     }
 }
Exemplo n.º 9
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;
        PathfindingMovementCapacity pathfindingMovementCapacity = PathfindingMovementCapacity.None;

        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;
                }
                if (unit.SimulationObject.Tags.Contains(DownloadableContent16.SeafaringUnit))
                {
                    failureFlags.Add(ArmyAction.NoCanDoWhileSeafaring);
                    return(false);
                }
                num2 += (int)unit.GetPropertyValue(SimulationProperties.UnitSlotCount);
                num++;
                pathfindingMovementCapacity = unit.GenerateContext().MovementCapacities;
            }
            else
            {
                if (!(parameters[i] is IEnumerable <Unit>))
                {
                    failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
                    return(false);
                }
                foreach (Unit unit2 in (parameters[i] as IEnumerable <Unit>))
                {
                    if (unit2.Garrison == null)
                    {
                        failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
                        return(false);
                    }
                    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;
                    }
                    if (unit2.SimulationObject.Tags.Contains(DownloadableContent16.SeafaringUnit))
                    {
                        if (!failureFlags.Contains(ArmyAction.NoCanDoWhileSeafaring))
                        {
                            failureFlags.Add(ArmyAction.NoCanDoWhileSeafaring);
                        }
                    }
                    else
                    {
                        num2 += (int)unit2.GetPropertyValue(SimulationProperties.UnitSlotCount);
                        num++;
                        float propertyValue = unit2.GetPropertyValue(SimulationProperties.Movement);
                        if (propertyValue < num3)
                        {
                            num3 = propertyValue;
                        }
                        if (pathfindingMovementCapacity == PathfindingMovementCapacity.None)
                        {
                            pathfindingMovementCapacity = unit2.GenerateContext().MovementCapacities;
                        }
                        else
                        {
                            pathfindingMovementCapacity &= unit2.GenerateContext().MovementCapacities;
                        }
                    }
                }
            }
        }
        if (failureFlags.Contains(ArmyAction.NoCanDoWhileSeafaring))
        {
            if (num == 0)
            {
                failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
            }
            return(false);
        }
        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;

        if (this.CanTransferTo(army, army.WorldPosition, ref flag2, ref flag3, service2, num2))
        {
            return(true);
        }
        for (int j = 0; j < 6; j++)
        {
            WorldPosition neighbourTile = service2.GetNeighbourTile(army.WorldPosition, (WorldOrientation)j, 1);
            if (service3.IsTilePassable(neighbourTile, pathfindingMovementCapacity, (PathfindingFlags)0) && service3.IsTransitionPassable(army.WorldPosition, neighbourTile, pathfindingMovementCapacity, (PathfindingFlags)0))
            {
                if (this.CanTransferTo(army, neighbourTile, ref flag2, ref flag3, service2, num2))
                {
                    return(true);
                }
            }
        }
        if (flag2 || flag3)
        {
            failureFlags.Add(ArmyAction_TransferUnits.NotEnoughSlotsInNeighbouringGarrisonForTransfer);
        }
        else
        {
            failureFlags.Add(ArmyAction_TransferUnits.NoNeighbouringCityAvailable);
        }
        return(false);
    }
Exemplo n.º 10
0
 protected void SpawnArmy(QuestBehaviour questBehaviour)
 {
     if (!string.IsNullOrEmpty(this.ArmyDroplist))
     {
         IGameService service = Services.GetService <IGameService>();
         if (service == null || service.Game == null)
         {
             Diagnostics.LogError("Failed to retrieve the game service.");
             return;
         }
         global::Game game = service.Game as global::Game;
         if (game == null)
         {
             Diagnostics.LogError("Failed to cast gameService.Game to Game.");
             return;
         }
         IDatabase <Droplist> database = Databases.GetDatabase <Droplist>(false);
         if (database == null)
         {
             return;
         }
         string text = this.ArmyDroplist;
         if (this.ArmyDroplistSuffix != string.Empty)
         {
             text = text + "_" + this.ArmyDroplistSuffix;
         }
         Droplist droplist;
         if (!database.TryGetValue(text, out droplist))
         {
             Diagnostics.LogError("Cannot retrieve drop list '{0}' in quest definition '{1}'", new object[]
             {
                 text,
                 questBehaviour.Quest.QuestDefinition.Name
             });
             return;
         }
         if (!string.IsNullOrEmpty(this.EmpireArmyOwnerVarName))
         {
             global::Empire empire = null;
             object         obj;
             if (questBehaviour.TryGetQuestVariableValueByName <object>(this.EmpireArmyOwnerVarName, out obj))
             {
                 if (obj is global::Empire)
                 {
                     empire = (obj as global::Empire);
                 }
                 else if (obj is int)
                 {
                     empire = game.Empires[(int)obj];
                 }
                 if (empire != null)
                 {
                     this.EmpireArmyOwner = empire;
                 }
             }
         }
         global::Empire empire2 = this.EmpireArmyOwner;
         if (empire2 == null || empire2 is LesserEmpire || this.UseBehaviorInitiatorEmpire)
         {
             empire2 = questBehaviour.Initiator;
         }
         if (this.UseBehaviorInitiatorEmpire)
         {
             this.EmpireArmyOwner = questBehaviour.Initiator;
         }
         if (this.EmpireArmyOwner is MajorEmpire && (this.EmpireArmyOwner as MajorEmpire).ELCPIsEliminated)
         {
             return;
         }
         Droplist droplist2;
         DroppableArmyDefinition droppableArmyDefinition = droplist.Pick(empire2, out droplist2, new object[0]) as DroppableArmyDefinition;
         if (droppableArmyDefinition != null)
         {
             int num = 0;
             if (this.ScaleWithMaxEra)
             {
                 num = DepartmentOfScience.GetMaxEraNumber() - 1;
             }
             int val = 0;
             IDatabase <AnimationCurve> database2 = Databases.GetDatabase <AnimationCurve>(false);
             AnimationCurve             animationCurve;
             if (database2 != null && database2.TryGetValue(QuestBehaviourTreeNode_Action_SpawnArmy.questUnitLevelEvolution, out animationCurve))
             {
                 float propertyValue = questBehaviour.Initiator.GetPropertyValue(SimulationProperties.GameSpeedMultiplier);
                 val = (int)animationCurve.EvaluateWithScaledAxis((float)game.Turn, propertyValue, 1f);
                 val = Math.Max(0, Math.Min(100, val));
             }
             num = Math.Max(num, val);
             StaticString[]         array     = Array.ConvertAll <string, StaticString>(droppableArmyDefinition.UnitDesigns, (string input) => input);
             bool                   flag      = false;
             IDatabase <UnitDesign> database3 = Databases.GetDatabase <UnitDesign>(false);
             for (int i = 0; i < array.Length; i++)
             {
                 UnitDesign unitDesign;
                 if (database3.TryGetValue(array[i], out unitDesign) && unitDesign != null && unitDesign.Tags.Contains(DownloadableContent16.TagSeafaring))
                 {
                     flag = true;
                     break;
                 }
             }
             IEnumerable <WorldPosition> enumerable = null;
             questBehaviour.TryGetQuestVariableValueByName <WorldPosition>(this.ForbiddenSpawnLocationVarName, out enumerable);
             List <WorldPosition>      list     = this.SpawnLocations.ToList <WorldPosition>().Randomize(null);
             IWorldPositionningService service2 = game.Services.GetService <IWorldPositionningService>();
             IPathfindingService       service3 = game.Services.GetService <IPathfindingService>();
             Diagnostics.Assert(service2 != null);
             WorldPosition worldPosition = WorldPosition.Invalid;
             if (!questBehaviour.Quest.QuestDefinition.IsGlobal)
             {
                 PathfindingMovementCapacity pathfindingMovementCapacity = PathfindingMovementCapacity.Water;
                 if (!flag)
                 {
                     pathfindingMovementCapacity |= PathfindingMovementCapacity.Ground;
                 }
                 for (int j = 0; j < list.Count; j++)
                 {
                     WorldPosition worldPosition2 = list[j];
                     if (DepartmentOfDefense.CheckWhetherTargetPositionIsValidForUseAsArmySpawnLocation(worldPosition2, pathfindingMovementCapacity))
                     {
                         if (enumerable != null)
                         {
                             if (enumerable.Contains(worldPosition2))
                             {
                                 goto IL_330;
                             }
                             this.AddPositionToForbiddenSpawnPosition(questBehaviour, worldPosition2);
                         }
                         worldPosition = worldPosition2;
                         break;
                     }
                     IL_330 :;
                 }
                 if (!service3.IsTileStopable(worldPosition, PathfindingMovementCapacity.Ground | PathfindingMovementCapacity.Water, PathfindingFlags.IgnoreFogOfWar))
                 {
                     worldPosition = WorldPosition.Invalid;
                 }
                 if (!worldPosition.IsValid && list.Count > 0)
                 {
                     List <WorldPosition>  list2 = new List <WorldPosition>();
                     Queue <WorldPosition> queue = new Queue <WorldPosition>();
                     worldPosition = list[0];
                     bool flag2 = false;
                     if (worldPosition.IsValid)
                     {
                         flag2 = service2.IsWaterTile(worldPosition);
                     }
                     do
                     {
                         if (queue.Count > 0)
                         {
                             worldPosition = queue.Dequeue();
                         }
                         for (int k = 0; k < 6; k++)
                         {
                             WorldPosition neighbourTileFullCyclic = service2.GetNeighbourTileFullCyclic(worldPosition, (WorldOrientation)k, 1);
                             if (!list2.Contains(neighbourTileFullCyclic) && list2.Count < 19)
                             {
                                 queue.Enqueue(neighbourTileFullCyclic);
                                 list2.Add(neighbourTileFullCyclic);
                             }
                         }
                         if (!DepartmentOfDefense.CheckWhetherTargetPositionIsValidForUseAsArmySpawnLocation(worldPosition, pathfindingMovementCapacity) || !service3.IsTileStopable(worldPosition, PathfindingMovementCapacity.Ground | PathfindingMovementCapacity.Water, PathfindingFlags.IgnoreFogOfWar) || flag2 != service2.IsWaterTile(worldPosition))
                         {
                             worldPosition = WorldPosition.Invalid;
                         }
                     }while (worldPosition == WorldPosition.Invalid && queue.Count > 0);
                 }
                 if (!worldPosition.IsValid)
                 {
                     string   format = "Cannot find a valid position to spawn on: {0}";
                     object[] array2 = new object[1];
                     array2[0] = string.Join(",", list.Select(delegate(WorldPosition position)
                     {
                         WorldPosition worldPosition3 = position;
                         return(worldPosition3.ToString());
                     }).ToArray <string>());
                     Diagnostics.LogError(format, array2);
                     return;
                 }
             }
             OrderSpawnArmy orderSpawnArmy;
             if (worldPosition.IsValid)
             {
                 list.Clear();
                 list.Add(worldPosition);
                 WorldOrientation worldOrientation = WorldOrientation.East;
                 for (int l = 0; l < 6; l++)
                 {
                     WorldPosition neighbourTile = service2.GetNeighbourTile(worldPosition, worldOrientation, 1);
                     bool          flag3         = flag == service2.IsWaterTile(neighbourTile);
                     if (neighbourTile.IsValid && flag3 && service3.IsTileStopable(worldPosition, PathfindingMovementCapacity.Ground | PathfindingMovementCapacity.Water, PathfindingFlags.IgnoreFogOfWar))
                     {
                         list.Add(neighbourTile);
                     }
                     worldOrientation = worldOrientation.Rotate(1);
                 }
                 orderSpawnArmy = new OrderSpawnArmy(this.EmpireArmyOwner.Index, list.ToArray(), num, true, this.CanMoveOnSpawn, true, questBehaviour.Quest.QuestDefinition.IsGlobal || this.ForceGlobalArmySymbol, array);
             }
             else
             {
                 orderSpawnArmy = new OrderSpawnArmy(this.EmpireArmyOwner.Index, list.ToArray(), num, true, this.CanMoveOnSpawn, true, questBehaviour.Quest.QuestDefinition.IsGlobal || this.ForceGlobalArmySymbol, array);
             }
             orderSpawnArmy.GameEntityGUID = this.ArmyGUID;
             Diagnostics.Log("Posting order: {0} at {1}", new object[]
             {
                 orderSpawnArmy.ToString(),
                 worldPosition
             });
             if (!string.IsNullOrEmpty(this.TransferResourceName) && this.TransferResourceAmount > 0)
             {
                 Ticket ticket;
                 this.EmpireArmyOwner.PlayerControllers.Server.PostOrder(orderSpawnArmy, out ticket, new EventHandler <TicketRaisedEventArgs>(this.OrderSpawnArmy_TicketRaised));
                 return;
             }
             this.EmpireArmyOwner.PlayerControllers.Server.PostOrder(orderSpawnArmy);
         }
     }
 }
    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);
    }