Beispiel #1
0
        private static void CheckPoint(GameArea Area, List <Point> BlackAngles, Point point, Faction faction)
        {
            TerrainDetail terrainDetailByPosition = Session.Current.Scenario.GetTerrainDetailByPosition(point);

            if (terrainDetailByPosition != null)
            {
                if (terrainDetailByPosition.ViewThrough)
                {
                    if (faction != null)
                    {
                        Architecture architectureByPosition = Session.Current.Scenario.GetArchitectureByPosition(point);
                        if (!(architectureByPosition == null || architectureByPosition.Endurance <= 0 || faction.IsFriendlyWithoutTruce(architectureByPosition.BelongedFaction)))
                        {
                            BlackAngles.Add(point);
                            return;
                        }
                    }
                    if (!IsInBlackAngle(Area.Centre, BlackAngles, point))
                    {
                        Area.AddPoint(point);
                    }
                }
                else
                {
                    BlackAngles.Add(point);
                }
            }
        }
Beispiel #2
0
 private static void CheckPoint(GameArea Area, List<Point> BlackAngles, Point point, GameScenario Scenario, Faction faction)
 {
     TerrainDetail terrainDetailByPosition = Scenario.GetTerrainDetailByPosition(point);
     if (terrainDetailByPosition != null)
     {
         if (terrainDetailByPosition.ViewThrough)
         {
             if (faction != null)
             {
                 Architecture architectureByPosition = Scenario.GetArchitectureByPosition(point);
                 if (!(architectureByPosition == null || architectureByPosition.Endurance <= 0 || faction.IsFriendlyWithoutTruce(architectureByPosition.BelongedFaction)))
                 {
                     BlackAngles.Add(point);
                     return;
                 }
             }
             if (!IsInBlackAngle(Area.Centre, BlackAngles, point))
             {
                 Area.AddPoint(point);
             }
         }
         else
         {
             BlackAngles.Add(point);
         }
     }
 }
Beispiel #3
0
 public static GameArea GetArea(Point Centre, int Radius, bool Oblique)
 {
     GameArea area = new GameArea();
     List<float> list = new List<float>();
     area.Centre = Centre;
     for (int i = -Radius; i <= Radius; i++)
     {
         for (int j = -Radius; j <= Radius; j++)
         {
             if (Oblique)
             {
                 area.AddPoint(new Point(Centre.X + i, Centre.Y + j));
             }
             else if ((Math.Abs(i) + Math.Abs(j)) <= Radius)
             {
                 area.AddPoint(new Point(Centre.X + i, Centre.Y + j));
             }
         }
     }
     return area;
 }
Beispiel #4
0
        public static GameArea GetArea(Point Centre, int Radius, bool Oblique)
        {
            GameArea     area = new GameArea();
            List <float> list = new List <float>();

            area.Centre = Centre;
            for (int i = -Radius; i <= Radius; i++)
            {
                for (int j = -Radius; j <= Radius; j++)
                {
                    if (Oblique)
                    {
                        area.AddPoint(new Point(Centre.X + i, Centre.Y + j));
                    }
                    else if ((Math.Abs(i) + Math.Abs(j)) <= Radius)
                    {
                        area.AddPoint(new Point(Centre.X + i, Centre.Y + j));
                    }
                }
            }
            return(area);
        }
Beispiel #5
0
        public static GameArea GetArea(Point Centre, int Radius, bool Oblique)
        {
            GameArea     area = new GameArea();
            List <float> list = new List <float>();

            area.Centre = Centre;
            if (Oblique)
            {
                for (int i = Centre.X - Radius; i <= Centre.X + Radius; i++)
                {
                    for (int j = Centre.Y - Radius; j <= Centre.Y + Radius; j++)
                    {
                        area.AddPoint(new Point(i, j));
                    }
                }
            }
            else
            {
                for (int i = -Radius; i <= Radius; i++)
                {
                    if (i <= 0)
                    {
                        for (int j = -Radius - i; j <= i + Radius; j++)
                        {
                            area.AddPoint(new Point(Centre.X + i, Centre.Y + j));
                        }
                    }
                    else
                    {
                        for (int j = i - Radius; j <= Radius - i; j++)
                        {
                            area.AddPoint(new Point(Centre.X + i, Centre.Y + j));
                        }
                    }
                }
            }
            return(area);
        }
 public GameArea GetDayArea(Troop troop, int Days)
 {
     GameArea area = new GameArea();
     openDictionary.Clear();
     openList.Clear();
     closeDictionary.Clear();
     closeList.Clear();
     GameSquare square = new GameSquare();
     square.Position = troop.Position;
     this.AddToCloseList(square);
     int num = troop.Movability * Days;
     int movabilityLeft = troop.MovabilityLeft;
     //int num3 = troop.RealMovability * Days;
     troop.MovabilityLeft = num;
     MilitaryKind kind = troop.Army.Kind;
     do
     {
         CheckAdjacentSquares(square, troop.Position, false, kind);
         if (this.openList.Count == 0)
         {
             break;
         }
         square = this.AddToCloseList();
         if (square == null)
         {
             break;
         }
         if (num >= square.G)
         {
             if (!troop.Scenario.PositionIsTroop(square.Position))
             {
                 area.AddPoint(square.Position);
             }
         }
         else
         {
             break;
         }
         if (closeList.Count > 2500 || closeDictionary.Count > 2500) break;
     } while (true);
     troop.MovabilityLeft = movabilityLeft;
     saveLastPath();
     openDictionary.Clear();
     openList.Clear();
     closeDictionary.Clear();
     closeList.Clear();
     return area;
 }
 public static GameArea GetArea(Point Centre, int Radius, bool Oblique)
 {
     GameArea area = new GameArea();
     List<float> list = new List<float>();
     area.Centre = Centre;
     if (Oblique)
     {
         for (int i = Centre.X - Radius; i <= Centre.X + Radius; i++)
         {
             for (int j = Centre.Y - Radius; j <= Centre.Y + Radius; j++)
             {
                 area.AddPoint(new Point(i, j));
             }
         }
     }
     else
     {
         for (int i = -Radius; i <= Radius; i++)
         {
             if (i <= 0)
             {
                 for (int j = -Radius - i; j <= i + Radius; j++)
                 {
                     area.AddPoint(new Point(Centre.X + i, Centre.Y + j));
                 }
             }
             else
             {
                 for (int j = i - Radius; j <= Radius - i; j++)
                 {
                     area.AddPoint(new Point(Centre.X + i, Centre.Y + j));
                 }
             }
         }
     }
     return area;
 }
 public GameArea GetSpyArchitectureArea()
 {
     GameArea area = new GameArea();
     foreach (Architecture architecture in base.Scenario.Architectures)
     {
         if ((architecture.BelongedFaction != null) && (architecture.BelongedFaction != this.BelongedFaction))
         {
             foreach (Point point in architecture.ArchitectureArea.Area)
             {
                 area.AddPoint(point);
             }
         }
     }
     return area;
 }
 public GameArea GetRealTroopEnterableArea(Troop troop)
 {
     GameArea area = new GameArea();
     foreach (Point point in this.GetTroopEnterableArea(troop).Area)
     {
         //if (!base.Scenario.PositionIsTroop(point))
         //{
         area.AddPoint(point);
         //}
     }
     return area;
 }
 public GameArea GetJailBreakArchitectureArea()
 {
     GameArea area = new GameArea();
     foreach (Architecture architecture in base.Scenario.Architectures)
     {
         if (architecture.BelongedFaction != null && !this.IsFriendly(architecture.BelongedFaction) && architecture.HasFactionCaptive(this.BelongedFaction))
         {
             foreach (Point point in architecture.ArchitectureArea.Area)
             {
                 area.AddPoint(point);
             }
         }
     }
     return area;
 }
 public GameArea GetGossipArchitectureArea()
 {
     GameArea area = new GameArea();
     foreach (Architecture architecture in base.Scenario.Architectures)
     {
         if ((((architecture.BelongedFaction != null) && !this.IsFriendly(architecture.BelongedFaction)) && architecture.HasPerson()) && this.BelongedFaction.IsArchitectureKnown(architecture))
         {
             foreach (Point point in architecture.ArchitectureArea.Area)
             {
                 area.AddPoint(point);
             }
         }
     }
     return area;
 }
 public GameArea GetConvincePersonArchitectureArea()
 {
     GameArea area = new GameArea();
     //Label_0121:
     foreach (Architecture architecture in base.Scenario.Architectures)
     {
         if (architecture.BelongedFaction == this.BelongedFaction)
         {
             if (!architecture.HasCaptive() && !architecture.HasNoFactionPerson())
             {
                 //goto Label_0121;
                 continue;
             }
             foreach (Point point in architecture.ArchitectureArea.Area)
             {
                 area.AddPoint(point);
             }
         }
         else
         {
             if ((!architecture.HasPerson() && !architecture.HasNoFactionPerson()) || !this.BelongedFaction.IsArchitectureKnown(architecture))
             {
                 continue;
             }
             foreach (Point point in architecture.ArchitectureArea.Area)
             {
                 area.AddPoint(point);
             }
         }
     }
     return area;
 }
 public GameArea GetAllContactArea()
 {
     GameArea area = new GameArea();
     foreach (Point point in this.ContactArea.Area)
     {
         area.AddPoint(point);
     }
     foreach (Point point in this.ArchitectureArea.Area)
     {
         area.AddPoint(point);
     }
     return area;
 }
 public GameArea GetAIRoutewayEndPoints(Architecture a, bool nowater)
 {
     GameArea area = new GameArea();
     if (!this.IsFriendly(a.BelongedFaction))
     {
         foreach (Point point in this.ContactArea.Area)
         {
             if (a.IsRoutewayPossible(point) && (!nowater || (base.Scenario.GetTerrainKindByPosition(point) != TerrainKind.水域)))
             {
                 area.AddPoint(point);
             }
         }
     }
     if (area.Count == 0)
     {
         foreach (Point point in this.GetRoutewayStartArea().Area)
         {
             if (a.IsRoutewayPossible(point) && (!nowater || (base.Scenario.GetTerrainKindByPosition(point) != TerrainKind.水域)))
             {
                 area.AddPoint(point);
             }
         }
     }
     if (area.Count == 0)
     {
         foreach (Point point in this.LongViewArea.Area)
         {
             if (a.IsRoutewayPossible(point))
             {
                 area.AddPoint(point);
             }
         }
     }
     return area;
 }
 private GameArea GetLandTroopMovableArea()
 {
     GameArea a = new GameArea();
     foreach (Point i in this.ArchitectureArea.Area)
     {
         if (base.Scenario.GetTerrainDetailByPositionNoCheck(i).ID != 6)
         {
             a.AddPoint(i);
         }
         else
         {
             TerrainKind t1 = base.Scenario.GetTerrainKindByPosition(new Point(i.X - 1, i.Y));
             TerrainKind t2 = base.Scenario.GetTerrainKindByPosition(new Point(i.X + 1, i.Y));
             TerrainKind t3 = base.Scenario.GetTerrainKindByPosition(new Point(i.X, i.Y - 1));
             TerrainKind t4 = base.Scenario.GetTerrainKindByPosition(new Point(i.X, i.Y + 1));
             if (t1 != TerrainKind.水域 && t1 != TerrainKind.无)
             {
                 a.AddPoint(i);
             }
             else if (t2 != TerrainKind.水域 && t2 != TerrainKind.无)
             {
                 a.AddPoint(i);
             }
             else if (t3 != TerrainKind.水域 && t3 != TerrainKind.无)
             {
                 a.AddPoint(i);
             }
             else if (t4 != TerrainKind.水域 && t4 != TerrainKind.无)
             {
                 a.AddPoint(i);
             }
         }
     }
     return a;
 }
Beispiel #16
0
 public GameArea GetContactArea(bool oblique, GameScenario scen, bool waterOnly, bool landOnly)
 {
     GameArea area = new GameArea();
     Dictionary<Point, object> dictionary = new Dictionary<Point, object>();
     foreach (Point point2 in this.Area)
     {
         bool ok = true;
         if (waterOnly && scen.GetTerrainDetailByPositionNoCheck(point2).ID != 6)
         {
             ok = false;
         }
         if (landOnly && scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6)
         {
             ok = false;
         }
         if (ok)
         {
             dictionary.Add(point2, null);
         }
     }
     foreach (Point point2 in this.Area)
     {
         Point key = new Point(point2.X - 1, point2.Y);
         if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
         {
             dictionary.Add(key, null);
             area.AddPoint(key);
         }
         key = new Point(point2.X + 1, point2.Y);
         if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
         {
             dictionary.Add(key, null);
             area.AddPoint(key);
         }
         key = new Point(point2.X, point2.Y - 1);
         if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
         {
             dictionary.Add(key, null);
             area.AddPoint(key);
         }
         key = new Point(point2.X, point2.Y + 1);
         if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
         {
             dictionary.Add(key, null);
             area.AddPoint(key);
         }
         if (oblique)
         {
             key = new Point(point2.X - 1, point2.Y - 1);
             if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
             {
                 dictionary.Add(key, null);
                 area.AddPoint(key);
             }
             key = new Point(point2.X + 1, point2.Y - 1);
             if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
             {
                 dictionary.Add(key, null);
                 area.AddPoint(key);
             }
             key = new Point(point2.X - 1, point2.Y + 1);
             if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
             {
                 dictionary.Add(key, null);
                 area.AddPoint(key);
             }
             key = new Point(point2.X + 1, point2.Y + 1);
             if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
             {
                 dictionary.Add(key, null);
                 area.AddPoint(key);
             }
         }
     }
     return area;
 }
 public GameArea GetAllAvailableArea(bool Square)
 {
     GameArea area = new GameArea();
     foreach (Point point in this.ContactArea.Area)
     {
         if (base.Scenario.IsPositionEmpty(point))
         {
             area.AddPoint(point);
         }
     }
     foreach (Point point in this.ArchitectureArea.Area)
     {
         if (!base.Scenario.PositionIsTroop(point))
         {
             area.AddPoint(point);
         }
     }
     return area;
 }
Beispiel #18
0
        public static GameArea GetViewArea(Point Centre, int Radius, bool Oblique, GameScenario Scenario, Faction faction)
        {
            GameArea     area        = new GameArea();
            List <Point> blackAngles = new List <Point>();

            area.Centre = Centre;
            if (Radius < 0)
            {
                return(area);
            }
            if (Radius == 0)
            {
                area.AddPoint(Centre);
                return(area);
            }
            for (int i = 0; i <= Radius; i++)
            {
                int num2;
                if (i == 0)
                {
                    num2 = 0;
                    while (num2 <= Radius)
                    {
                        if (num2 != 0)
                        {
                            CheckPoint(area, blackAngles, new Point(Centre.X, Centre.Y + num2), Scenario, faction);
                            CheckPoint(area, blackAngles, new Point(Centre.X, Centre.Y - num2), Scenario, faction);
                        }
                        else
                        {
                            area.AddPoint(Centre);
                        }
                        num2++;
                    }
                }
                else
                {
                    int num3 = i;
                    if (Oblique)
                    {
                        num3 = 0;
                    }
                    num2 = 0;
                    while (num2 <= (Radius - num3))
                    {
                        CheckPoint(area, blackAngles, new Point(Centre.X + i, Centre.Y + num2), Scenario, faction);
                        if (num2 != 0)
                        {
                            CheckPoint(area, blackAngles, new Point(Centre.X + i, Centre.Y - num2), Scenario, faction);
                        }
                        num2++;
                    }
                    for (num2 = 0; num2 <= (Radius - num3); num2++)
                    {
                        CheckPoint(area, blackAngles, new Point(Centre.X - i, Centre.Y + num2), Scenario, faction);
                        if (num2 != 0)
                        {
                            CheckPoint(area, blackAngles, new Point(Centre.X - i, Centre.Y - num2), Scenario, faction);
                        }
                    }
                }
            }

            return(area);
        }
Beispiel #19
0
        public GameArea GetContactArea(bool oblique, GameScenario scen, bool waterOnly, bool landOnly)
        {
            GameArea area = new GameArea();
            Dictionary <Point, object> dictionary = new Dictionary <Point, object>();

            foreach (Point point2 in this.Area)
            {
                bool ok = true;
                if (waterOnly && scen.GetTerrainDetailByPositionNoCheck(point2).ID != 6)
                {
                    ok = false;
                }
                if (landOnly && scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6)
                {
                    ok = false;
                }
                if (ok)
                {
                    dictionary.Add(point2, null);
                }
            }
            foreach (Point point2 in this.Area)
            {
                Point key = new Point(point2.X - 1, point2.Y);
                if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
                {
                    dictionary.Add(key, null);
                    area.AddPoint(key);
                }
                key = new Point(point2.X + 1, point2.Y);
                if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
                {
                    dictionary.Add(key, null);
                    area.AddPoint(key);
                }
                key = new Point(point2.X, point2.Y - 1);
                if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
                {
                    dictionary.Add(key, null);
                    area.AddPoint(key);
                }
                key = new Point(point2.X, point2.Y + 1);
                if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
                {
                    dictionary.Add(key, null);
                    area.AddPoint(key);
                }
                if (oblique)
                {
                    key = new Point(point2.X - 1, point2.Y - 1);
                    if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
                    {
                        dictionary.Add(key, null);
                        area.AddPoint(key);
                    }
                    key = new Point(point2.X + 1, point2.Y - 1);
                    if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
                    {
                        dictionary.Add(key, null);
                        area.AddPoint(key);
                    }
                    key = new Point(point2.X - 1, point2.Y + 1);
                    if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
                    {
                        dictionary.Add(key, null);
                        area.AddPoint(key);
                    }
                    key = new Point(point2.X + 1, point2.Y + 1);
                    if (!dictionary.ContainsKey(key) && (!waterOnly || scen.GetTerrainDetailByPositionNoCheck(point2).ID == 6))
                    {
                        dictionary.Add(key, null);
                        area.AddPoint(key);
                    }
                }
            }
            return(area);
        }
        private int RoutewayPathBuilder_OnGetCost(Point position, out float consumptionRate)
        {
            GameArea singleton = new GameArea();
            singleton.AddPoint(position);
            singleton.Centre = position;

            consumptionRate = 0f;
            if (!base.Scenario.PositionOutOfRange(position))
            {
                int dist = (int)Math.Ceiling(Math.Min(Math.Min(base.Scenario.GetDistance(singleton, this.pathFinder.startingArchitecture.ArchitectureArea),
                    base.Scenario.GetDistance(singleton, this.pathFinder.targetArchitecture.ArchitectureArea)), 20));
                if (dist > 4)
                {
                    for (int i = -dist; i <= dist; ++i)
                    {
                        for (int j = Math.Abs(i) - dist; j <= dist - Math.Abs(i); ++j)
                        {
                            Point loc = new Point(position.X + i, position.Y + j);
                            Architecture landedArch = base.Scenario.GetArchitectureByPosition(loc);

                            if (landedArch != null && landedArch != this.pathFinder.startingArchitecture && landedArch != this.pathFinder.targetArchitecture)
                            {
                                return 1000;
                            }
                        }
                    }
                }

                TerrainDetail terrainDetailByPositionNoCheck = base.Scenario.GetTerrainDetailByPositionNoCheck(position);
                if (terrainDetailByPositionNoCheck != null)
                {
                    Architecture landedArch = base.Scenario.GetArchitectureByPosition(position);
                    if (landedArch != null && landedArch != this.pathFinder.startingArchitecture && landedArch != this.pathFinder.targetArchitecture)
                    {
                        return 1000;
                    }
                    else if (landedArch == null)
                    {
                        if (this.pathFinder.MultipleWaterCost && !base.Scenario.IsWaterPositionRoutewayable(position))
                        {
                            return 1000;
                        }
                        if (this.pathFinder.MustUseWater && (terrainDetailByPositionNoCheck.ID != 6))
                        {
                            return 1000;
                        }
                    }
                    return 1;
                }
            }
            return 0x3e8;
        }
Beispiel #21
0
 public static GameArea GetViewArea(Point Centre, int Radius, bool Oblique, GameScenario Scenario, Faction faction)
 {
     GameArea area = new GameArea();
     List<Point> blackAngles = new List<Point>();
     area.Centre = Centre;
     if (Radius < 0)
         return area;
     if (Radius == 0)
     {
         area.AddPoint(Centre);
         return area;
     }
     for (int i = 0; i <= Radius; i++)
     {
         int num2;
         if (i == 0)
         {
             num2 = 0;
             while (num2 <= Radius)
             {
                 if (num2 != 0)
                 {
                     CheckPoint(area, blackAngles, new Point(Centre.X, Centre.Y + num2), Scenario, faction);
                     CheckPoint(area, blackAngles, new Point(Centre.X, Centre.Y - num2), Scenario, faction);
                 }
                 else
                 {
                     area.AddPoint(Centre);
                 }
                 num2++;
             }
         }
         else
         {
             int num3 = i;
             if (Oblique)
             {
                 num3 = 0;
             }
             num2 = 0;
             while (num2 <= (Radius - num3))
             {
                 CheckPoint(area, blackAngles, new Point(Centre.X + i, Centre.Y + num2), Scenario, faction);
                 if (num2 != 0)
                 {
                     CheckPoint(area, blackAngles, new Point(Centre.X + i, Centre.Y - num2), Scenario, faction);
                 }
                 num2++;
             }
             for (num2 = 0; num2 <= (Radius - num3); num2++)
             {
                 CheckPoint(area, blackAngles, new Point(Centre.X - i, Centre.Y + num2), Scenario, faction);
                 if (num2 != 0)
                 {
                     CheckPoint(area, blackAngles, new Point(Centre.X - i, Centre.Y - num2), Scenario, faction);
                 }
             }
         }
     }
     
     return area;
 }
 public GameArea GetAllAvailableArea(bool Square)
 {
     GameArea area = new GameArea();
     foreach (Point point in this.ContactArea.Area)
     {
         if (base.Scenario.IsPositionEmpty(point) && base.Scenario.GetTerrainDetailByPosition(point) != null && base.Scenario.GetTerrainDetailByPosition(point).RoutewayConsumptionRate < 1)
         {
             area.AddPoint(point);
         }
     }
     foreach (Point point in this.ArchitectureArea.Area)
     {
         if (!base.Scenario.PositionIsTroop(point) && base.Scenario.GetTerrainDetailByPosition(point) != null && base.Scenario.GetTerrainDetailByPosition(point).RoutewayConsumptionRate < 1)
         {
             area.AddPoint(point);
         }
     }
     return area;
 }
Beispiel #23
0
        private bool BuildThreeTierPath(MilitaryKind kind)
        {
            bool path = false;
            if (!this.HasPath)
            {
                if (this.BelongedFaction != null && !base.Scenario.IsPlayer(this.BelongedFaction) && this.TargetArchitecture == null && !this.IsViewingWillArchitecture() &&
                    this.TargetTroop == null && this.BelongedLegion != null && this.BelongedLegion.Kind == LegionKind.Offensive)
                {
                    MilitaryKind trueKind = this.Army.KindID == 28 ? this.Army.RealMilitaryKind : this.Army.Kind;
                    List<Point> refPath = null;
                    bool aapUsable = this.StartingArchitecture.GetAllContactArea().Area.Contains(this.Position);
                    if (aapUsable && base.Scenario.pathCache.ContainsKey(new PathCacheKey(this.StartingArchitecture, this.WillArchitecture, trueKind)))
                    {
                        refPath = base.Scenario.pathCache[new PathCacheKey(this.StartingArchitecture, this.WillArchitecture, trueKind)];
                    }
                    if (refPath != null && refPath.Count > 0 && aapUsable)
                    {
                        path = ConstructTruePath(refPath, kind);
                    }
                    else if (refPath == null && (this.StartingArchitecture != this.WillArchitecture || !aapUsable))
                    {
                        Point? p1;
                        Point? p2;
                        // 出发建筑的点应该包括建筑邻近的点
                        GameArea startingArea = new GameArea();
                        foreach (Point p in this.StartingArchitecture.ContactArea.Area)
                            startingArea.AddPoint(p);
                        foreach (Point p in this.StartingArchitecture.ArchitectureArea.Area)
                            startingArea.AddPoint(p);
                        startingArea.Centre = this.StartingArchitecture.ArchitectureArea.Centre;

                        GameArea willArea = new GameArea();
                        foreach (Point p in this.WillArchitecture.ArchitectureArea.Area)
                            willArea.AddPoint(p);
                        willArea.Centre = this.WillArchitecture.ArchitectureArea.Centre;

                        base.Scenario.GetClosestPointsBetweenTwoAreas(startingArea, willArea, out p1, out p2);
                        if (p1.HasValue && p2.HasValue)
                        {
                            bool ftPath = this.pathFinder.GetFirstTierPath(p1.Value, p2.Value, kind);
                            if (ftPath)
                            {
                                if (this.FirstTierPath != null && this.FirstTierPath.Count > 0)
                                {
                                    // 去除多余的点
                                    int i = 0;
                                    while (startingArea.HasPoint(this.FirstTierPath[i]))
                                    {
                                        i++;
                                        if (i >= this.FirstTierPath.Count)
                                        {
                                            i = this.FirstTierPath.Count - 1;
                                            break;
                                        }
                                    }
                                    this.FirstTierPath.RemoveRange(0, i);
                                    i = this.FirstTierPath.Count - 1;
                                    while (willArea.HasPoint(this.FirstTierPath[i]))
                                    {
                                        i--;
                                        if (i < 0)
                                        {
                                            i = 0;
                                            break;
                                        }
                                    }
                                    this.FirstTierPath.RemoveRange(i + 1, this.FirstTierPath.Count - i - 1);

                                    if (aapUsable)
                                    {
                                        base.Scenario.pathCache[new PathCacheKey(this.StartingArchitecture, this.WillArchitecture, this.Army.Kind)] = this.FirstTierPath;
                                    }
                                    path = ConstructTruePath(this.FirstTierPath, kind);
                                }
                                else
                                {
                                    if (aapUsable)
                                    {
                                        base.Scenario.pathCache[new PathCacheKey(this.StartingArchitecture, this.WillArchitecture, this.Army.Kind)] = new List<Point>();
                                    }
                                }
                            }
                        }
                    }
                    else if (refPath == null || (refPath.Count == 0 && this.Army.Kind.Type != MilitaryType.水军))
                    {
                        this.StartingArchitecture.actuallyUnreachableArch.Add(this.WillArchitecture);
                        this.GoBack();
                        return false;
                    }
                }

                if (!path)
                {
                    this.EnableOneAdaptablility = true;
                    bool flag2 = false;
                    if ((this.BelongedFaction != null) && !GameObject.Chance(0x21))
                    {
                        flag2 = true;
                        foreach (Troop troop in this.BelongedFaction.Troops)
                        {
                            if (!((troop == this) || troop.Destroyed))
                            {
                                base.Scenario.SetPenalizedMapDataByPosition(troop.Position, this.RealMovability);
                            }
                        }
                    }
                    path = this.pathFinder.GetPath(this.Position, this.Destination, kind);
                    if ((this.BelongedFaction != null) && flag2)
                    {
                        foreach (Troop troop in this.BelongedFaction.Troops)
                        {
                            if (!((troop == this) || troop.Destroyed))
                            {
                                base.Scenario.ClearPenalizedMapDataByPosition(troop.Position);
                            }
                        }
                    }
                    this.EnableOneAdaptablility = false;
                    if ((this.ThirdTierPath != null) && (this.SecondTierPath == null))
                    {
                        if (!path)
                        {
                            path = this.pathFinder.GetSecondTierPath(this.Position, this.GetSecondTierDestinationFromThirdTier(kind), kind);
                        }
                        else
                        {
                            this.pathFinder.GetSecondTierPath(this.Position, this.GetSecondTierDestinationFromThirdTier(kind), kind);
                        }
                    }
                    if ((this.SecondTierPath != null) && (this.FirstTierPath == null))
                    {
                        if (!path)
                        {
                            path = this.pathFinder.GetFirstTierPath(this.Position, this.GetFirstTierDestinationFromSecondTier(kind), kind);
                        }
                        else
                        {
                            this.pathFinder.GetFirstTierPath(this.Position, this.GetFirstTierDestinationFromSecondTier(kind), kind);
                        }
                    }
                }
                if (this.FirstTierPath != null)
                {
                    if (this.FirstTierPath.Count > 1)
                    {
                        this.HasPath = true;
                    }
                    cannotFindRouteRounds = 0;
                    return path;
                }
                if (this.Status != TroopStatus.一般)
                {
                    cannotFindRouteRounds = 0;
                    return path;
                }
                if (((((this.BelongedFaction != null) && (this.BelongedLegion != null)) && ((this.BelongedLegion.Kind == LegionKind.Offensive) && (this.StartingArchitecture != null))) &&
                    (this.StartingArchitecture.BelongedFaction == this.BelongedFaction)) && this.StartingArchitecture.ViewTroop(this) && (this.BelongedLegion.Troops.Count == 1))
                {
                    Routeway existingRouteway = this.StartingArchitecture.GetExistingRouteway(this.BelongedLegion.WillArchitecture);
                    if (existingRouteway != null)
                    {
                        base.Scenario.RemoveRouteway(existingRouteway);
                    }
                    Point key = new Point(this.StartingArchitecture.ID, this.BelongedLegion.WillArchitecture.ID);
                    if (!this.BelongedFaction.ClosedRouteways.ContainsKey(key))
                    {
                        this.BelongedFaction.ClosedRouteways.Add(key, null);
                    }
                }
                if (this.CanEnter() && this.Army.Kind.Movability > 1)
                {
                    if (base.Scenario.IsPlayer(this.BelongedFaction) && this.TargetArchitecture != null)
                    {
                        if (this.mingling == "入城" && this.Position == this.minglingweizhi)
                        {
                            this.Enter(this.TargetArchitecture);
                        }
                    }
                    else
                    {
                        this.Enter();
                    }
                    cannotFindRouteRounds = 0;
                    return path;
                }
                if (cannotFindRouteRounds > 5)
                {
                    this.GoBack();
                }
                else
                {
                    cannotFindRouteRounds++;
                }
                if (this.OnPathNotFound != null)
                {
                    this.OnPathNotFound(this);
                }
            }
            return path;
        }
 public GameArea GetAvailableContactArea(bool Square)
 {
     GameArea area = new GameArea();
     foreach (Point point in this.ContactArea.Area)
     {
         if (base.Scenario.IsPositionEmpty(point))
         {
             area.AddPoint(point);
         }
     }
     if (area.Count > 0)
     {
         return area;
     }
     return null;
 }
Beispiel #25
0
 public GameArea GetHighestFightingForceArea(GameArea sourceArea)
 {
     if (sourceArea == null || sourceArea.Count == 0)
     {
         return null;
     }
     int num = -2147483648;
     GameArea area = new GameArea();
     foreach (Point point in sourceArea.Area)
     {
         PersonList originalPersons = this.Persons;
         Troop troop = CreateSimulateTroop(this.Candidates, this.Army, point);
         int fightingForce = troop.FightingForce;
         troop.Destroy(true, false);
         if (fightingForce > num)
         {
             num = fightingForce;
             area.Area.Clear();
             area.AddPoint(point);
         }
         else if (fightingForce == num)
         {
             area.AddPoint(point);
         }
         foreach (Person p in originalPersons)
         {
             p.LocationTroop = this;
         }
     }
     return area;
 }
 public GameArea GetDestroyArchitectureArea()
 {
     GameArea area = new GameArea();
     foreach (Architecture architecture in base.Scenario.Architectures)
     {
         if (!this.IsFriendly(architecture.BelongedFaction))
         {
             foreach (Point point in architecture.ArchitectureArea.Area)
             {
                 area.AddPoint(point);
             }
         }
     }
     return area;
 }
Beispiel #27
0
        public GameArea GetruchengArea(bool friendly)
        {
            GameArea area = new GameArea();


            foreach (Architecture architecture in base.Scenario.Architectures)
            {
                if (this.IsFriendly(architecture.BelongedFaction) == friendly)
                {
                    foreach (Point point in architecture.ArchitectureArea.Area)
                    {
                        area.AddPoint(point);
                    }
                }
            }

            return area;
        }
 public GameArea GetInstigateArchitectureArea()
 {
     GameArea area = new GameArea();
     foreach (Architecture architecture in base.Scenario.Architectures)
     {
         if (architecture.Kind.HasDomination && !this.IsFriendly(architecture.BelongedFaction))
         {
             foreach (Point point in architecture.ArchitectureArea.Area)
             {
                 area.AddPoint(point);
             }
         }
     }
     return area;
 }
Beispiel #29
0
 public GameArea GetHighestFightingForceArea(GameArea sourceArea)
 {
     if (sourceArea == null)
     {
         return null;
     }
     int num = -2147483648;
     GameArea area = new GameArea();
     foreach (Point point in sourceArea.Area)
     {
         int fightingForce = CreateSimulateTroop(this.Persons, this.Army, point).FightingForce;
         if (fightingForce > num)
         {
             num = fightingForce;
             area.Area.Clear();
             area.AddPoint(point);
         }
         else if (fightingForce == num)
         {
             area.AddPoint(point);
         }
     }
     return area;
 }
        public GameArea GetPersonTransferArchitectureArea()
        {
            GameArea area = new GameArea();

            foreach (Architecture architecture in this.BelongedFaction.Architectures)
            {

                if (architecture == this)
                {
                    continue;
                }

                foreach (Point point in architecture.ArchitectureArea.Area)
                {
                    area.AddPoint(point);
                }

            }
            return area;
        }
Beispiel #31
0
 private Point? GetRoutewayWaterOrientation(Routeway routeway, Architecture des)
 {
     GameArea area = new GameArea();
     foreach (Point point in des.ContactArea.Area)
     {
         TerrainDetail terrainDetailByPosition = base.Scenario.GetTerrainDetailByPosition(point);
         if ((terrainDetailByPosition != null) && (terrainDetailByPosition.ID == 6))
         {
             if (routeway.GetPoint(point) != null)
             {
                 continue;
             }
             area.AddPoint(point);
         }
     }
     if (area.Count > 0)
     {
         return new Point?(base.Scenario.GetClosestPoint(area, this.Position));
     }
     return null;
 }
 public GameArea GetRoutewayStartPoints()
 {
     GameArea area = new GameArea();
     foreach (Point point in this.GetRoutewayStartArea().Area)
     {
         if (this.IsRoutewayPossible(point))
         {
             area.AddPoint(point);
         }
     }
     if (area.Count == 0)
     {
         foreach (Point point in this.ContactArea.Area)
         {
             if (this.IsRoutewayPossible(point))
             {
                 area.AddPoint(point);
             }
         }
     }
     if (area.Count == 0)
     {
         foreach (Point point in this.LongViewArea.Area)
         {
             if (this.IsRoutewayPossible(point))
             {
                 area.AddPoint(point);
             }
         }
     }
     return area;
 }
Beispiel #33
0
 public GameArea GetSetFireArea()
 {
     GameArea area = new GameArea();
     foreach (Point point in this.StratagemArea.Area)
     {
         if (base.Scenario.IsPositionEmpty(point) && base.Scenario.IsFireVaild(point, false, MilitaryType.步兵))
         {
             area.AddPoint(point);
         }
     }
     if (area.Count > 0)
     {
         return area;
     }
     return null;
 }
 public GameArea GetTroopEnterableArea(Troop troop)
 {
     GameArea area = new GameArea();
     foreach (Point point in this.ArchitectureArea.Area)
     {
         if (base.Scenario.GetWaterPositionMapCost(troop.Army.Kind.Type, point) < 3500)
         {
             area.AddPoint(point);
         }
     }
     foreach (Point point in this.ContactArea.Area)
     {
         if (troop.IsMovableOnPosition(point) && (base.Scenario.GetWaterPositionMapCost(troop.Army.Kind.Type, point) < 3500))
         {
             area.AddPoint(point);
         }
     }
     return area;
 }
Beispiel #35
0
 public GameArea GetTargetArea(bool friendly, bool architectureTarget)
 {
     GameArea area = new GameArea();
     foreach (Troop troop in base.Scenario.Troops)
     {
         if (((this.BelongedFaction == null) && this.ViewArea.HasPoint(troop.Position)) || (((this.BelongedFaction != null) && this.BelongedFaction.IsPositionKnown(troop.Position)) && (this.IsFriendly(troop.BelongedFaction) == friendly)))
         {
             area.AddPoint(troop.Position);
         }
     }
     if (architectureTarget)
     {
         foreach (Architecture architecture in base.Scenario.Architectures)
         {
             if (this.IsFriendly(architecture.BelongedFaction) == friendly)
             {
                 foreach (Point point in architecture.ArchitectureArea.Area)
                 {
                     area.AddPoint(point);
                 }
             }
         }
     }
     return area;
 }