From 711ec0c600702944c6638e9dcdb8a55e8a2f49b9 Mon Sep 17 00:00:00 2001 From: reaperrr Date: Fri, 17 Jul 2015 23:58:45 +0200 Subject: [PATCH] Minor pathfinder changes --- .../Pathfinder/BasePathSearch.cs | 2 +- .../Pathfinder/CellInfoLayerManager.cs | 2 +- OpenRA.Mods.Common/Pathfinder/Constants.cs | 2 ++ OpenRA.Mods.Common/Pathfinder/PathGraph.cs | 35 +++++++++---------- OpenRA.Mods.Common/Traits/World/PathFinder.cs | 2 +- 5 files changed, 21 insertions(+), 22 deletions(-) diff --git a/OpenRA.Mods.Common/Pathfinder/BasePathSearch.cs b/OpenRA.Mods.Common/Pathfinder/BasePathSearch.cs index bbb597841a..5ca616f2b6 100644 --- a/OpenRA.Mods.Common/Pathfinder/BasePathSearch.cs +++ b/OpenRA.Mods.Common/Pathfinder/BasePathSearch.cs @@ -81,7 +81,7 @@ namespace OpenRA.Mods.Common.Pathfinder if (string.IsNullOrEmpty(id)) { var builder = new StringBuilder(); - builder.Append(this.Graph.Actor.ActorID); + builder.Append(Graph.Actor.ActorID); while (!startPoints.Empty) { var startpoint = startPoints.Pop(); diff --git a/OpenRA.Mods.Common/Pathfinder/CellInfoLayerManager.cs b/OpenRA.Mods.Common/Pathfinder/CellInfoLayerManager.cs index 5badfe959e..a78a783cf1 100644 --- a/OpenRA.Mods.Common/Pathfinder/CellInfoLayerManager.cs +++ b/OpenRA.Mods.Common/Pathfinder/CellInfoLayerManager.cs @@ -97,7 +97,7 @@ namespace OpenRA.Mods.Common.Pathfinder { defaultCellInfoLayer = CellLayer.CreateInstance( - mpos => new CellInfo(int.MaxValue, int.MaxValue, mpos.ToCPos(map as Map), CellStatus.Unvisited), + mpos => new CellInfo(int.MaxValue, int.MaxValue, mpos.ToCPos(map), CellStatus.Unvisited), new Size(map.MapSize.X, map.MapSize.Y), map.TileShape); } diff --git a/OpenRA.Mods.Common/Pathfinder/Constants.cs b/OpenRA.Mods.Common/Pathfinder/Constants.cs index 57036a4116..f3e0573afa 100644 --- a/OpenRA.Mods.Common/Pathfinder/Constants.cs +++ b/OpenRA.Mods.Common/Pathfinder/Constants.cs @@ -25,5 +25,7 @@ namespace OpenRA.Mods.Common.Pathfinder /// a unit took to move one cell diagonally) /// public const int DiagonalCellCost = 177; + + public const int InvalidNode = int.MaxValue; } } diff --git a/OpenRA.Mods.Common/Pathfinder/PathGraph.cs b/OpenRA.Mods.Common/Pathfinder/PathGraph.cs index bdd1177b9c..4336184890 100644 --- a/OpenRA.Mods.Common/Pathfinder/PathGraph.cs +++ b/OpenRA.Mods.Common/Pathfinder/PathGraph.cs @@ -23,7 +23,7 @@ namespace OpenRA.Mods.Common.Pathfinder /// /// Gets all the Connections for a given node in the graph /// - ICollection GetConnections(CPos position); + IEnumerable GetConnections(CPos position); /// /// Retrieves an object given a node in the graph @@ -73,8 +73,6 @@ namespace OpenRA.Mods.Common.Pathfinder readonly MobileInfo mobileInfo; CellLayer cellInfo; - public const int InvalidNode = int.MaxValue; - public PathGraph(CellLayer cellInfo, MobileInfo mobileInfo, Actor actor, World world, bool checkForBlocked) { this.cellInfo = cellInfo; @@ -102,7 +100,7 @@ namespace OpenRA.Mods.Common.Pathfinder new[] { new CVec(1, -1), new CVec(1, 0), new CVec(-1, 1), new CVec(0, 1), new CVec(1, 1) }, }; - public ICollection GetConnections(CPos position) + public IEnumerable GetConnections(CPos position) { var previousPos = cellInfo[position].PreviousPos; @@ -116,7 +114,7 @@ namespace OpenRA.Mods.Common.Pathfinder { var neighbor = position + directions[i]; var movementCost = GetCostToNode(neighbor, directions[i]); - if (movementCost != InvalidNode) + if (movementCost != Constants.InvalidNode) validNeighbors.AddLast(new GraphConnection(position, neighbor, movementCost)); } @@ -127,17 +125,17 @@ namespace OpenRA.Mods.Common.Pathfinder { int movementCost; if (mobileInfo.CanEnterCell( - World as World, - Actor as Actor, + World, + Actor, destNode, out movementCost, - IgnoredActor as Actor, + IgnoredActor, checkConditions) && !(CustomBlock != null && CustomBlock(destNode))) { return CalculateCellCost(destNode, direction, movementCost); } - return InvalidNode; + return Constants.InvalidNode; } int CalculateCellCost(CPos neighborCPos, CVec direction, int movementCost) @@ -148,7 +146,13 @@ namespace OpenRA.Mods.Common.Pathfinder cellCost = (cellCost * 34) / 24; if (CustomCost != null) - cellCost += CustomCost(neighborCPos); + { + var customCost = CustomCost(neighborCPos); + if (customCost == Constants.InvalidNode) + return Constants.InvalidNode; + + cellCost += customCost; + } // directional bonuses for smoother flow! if (LaneBias != 0) @@ -184,15 +188,8 @@ namespace OpenRA.Mods.Common.Pathfinder public CellInfo this[CPos pos] { - get - { - return cellInfo[pos]; - } - - set - { - cellInfo[pos] = value; - } + get { return cellInfo[pos]; } + set { cellInfo[pos] = value; } } } } diff --git a/OpenRA.Mods.Common/Traits/World/PathFinder.cs b/OpenRA.Mods.Common/Traits/World/PathFinder.cs index 25d96aea35..70e71fcfc6 100644 --- a/OpenRA.Mods.Common/Traits/World/PathFinder.cs +++ b/OpenRA.Mods.Common/Traits/World/PathFinder.cs @@ -93,7 +93,7 @@ namespace OpenRA.Mods.Common.Traits // This assumes that the SubCell does not change during the path traversal var tilesInRange = world.Map.FindTilesInCircle(targetCell, range.Length / 1024 + 1) .Where(t => (world.Map.CenterOfCell(t) - target).LengthSquared <= range.LengthSquared - && mi.CanEnterCell(self.World as World, self as Actor, t)); + && mi.CanEnterCell(self.World, self, t)); // See if there is any cell within range that does not involve a cross-domain request // Really, we only need to check the circle perimeter, but it's not clear that would be a performance win