public RegionLinkQueueEntry2 Pop() { RegionLinkQueueEntry2 result = innerList[0]; int num = 0; int count = innerList.Count; innerList[0] = innerList[count - 1]; innerList.RemoveAt(count - 1); count = innerList.Count; while (true) { int num2 = num; int num3 = 2 * num + 1; int num4 = num3 + 1; if (num3 < count && CompareElements(num, num3) > 0) { num = num3; } if (num4 < count && CompareElements(num, num4) > 0) { num = num4; } if (num == num2) { break; } SwapElements(num, num2); } return(result); }
protected void SwapElements(int i, int j) { RegionLinkQueueEntry2 value = innerList[i]; innerList[i] = innerList[j]; innerList[j] = value; }
public void Push(RegionLinkQueueEntry2 item) { int num = innerList.Count; innerList.Add(item); while (num != 0) { int num2 = (num - 1) / 2; if (CompareElements(num, num2) < 0) { SwapElements(num, num2); num = num2; continue; } break; } }
public static bool GetRegionDistance(RegionCostCalculator __instance, ref int __result, Region region, out RegionLink minLink) { if (regionMinLink(__instance).TryGetValue(region.id, out minLink)) { __result = distances(__instance)[minLink]; return(false); } FastPriorityQueueRegionLinkQueueEntry2 queue; if (!queueDict.TryGetValue(__instance, out queue)) { queue = new FastPriorityQueueRegionLinkQueueEntry2(new DistanceComparer2()); } while (queue.Count != 0) { RegionLinkQueueEntry2 regionLinkQueueEntry = queue.Pop(); int num = distances(__instance)[regionLinkQueueEntry.Link]; if (regionLinkQueueEntry.Cost != num) { continue; } Region otherRegion = regionLinkQueueEntry.Link.GetOtherRegion(regionLinkQueueEntry.From); if (otherRegion == null || !otherRegion.valid) { continue; } int num2 = 0; if (otherRegion.door != null) { num2 = PathFinder.GetBuildingCost(otherRegion.door, traverseParms(__instance), traverseParms(__instance).pawn); if (num2 == int.MaxValue) { continue; } //num2 += OctileDistance(1, 0); num2 += funcOctileDistance(__instance, 1, 0); } int minPathCost = __instance.RegionMedianPathCost(otherRegion); for (int i = 0; i < otherRegion.links.Count; i++) { RegionLink regionLink = otherRegion.links[i]; if (regionLink == null || regionLink.GetOtherRegion(otherRegion) == null || regionLink == regionLinkQueueEntry.Link || !regionLink.GetOtherRegion(otherRegion).type.Passable()) { continue; } //int val = (otherRegion.door != null) ? num2 : RegionLinkDistance(regionLinkQueueEntry.Link, regionLink, minPathCost); int val = (otherRegion.door != null) ? num2 : funcRegionLinkDistanceRRI(__instance, regionLinkQueueEntry.Link, regionLink, minPathCost); val = Math.Max(val, 1); int num3 = num + val; //int estimatedPathCost = MinimumRegionLinkDistance(destinationCell, regionLink) + num3; int estimatedPathCost = funcMinimumRegionLinkDistance(__instance, destinationCell(__instance), regionLink) + num3; if (distances(__instance).TryGetValue(regionLink, out int value)) { if (num3 < value) { distances(__instance)[regionLink] = num3; if (!queueDict.TryGetValue(__instance, out queue)) { queue = new FastPriorityQueueRegionLinkQueueEntry2(new DistanceComparer2()); } queue.Push(new RegionLinkQueueEntry2(otherRegion, regionLink, num3, estimatedPathCost)); } } else { if (!queueDict.TryGetValue(__instance, out queue)) { queue = new FastPriorityQueueRegionLinkQueueEntry2(new DistanceComparer2()); } distances(__instance).Add(regionLink, num3); queue.Push(new RegionLinkQueueEntry2(otherRegion, regionLink, num3, estimatedPathCost)); } } if (!regionMinLink(__instance).ContainsKey(otherRegion.id)) { regionMinLink(__instance).Add(otherRegion.id, regionLinkQueueEntry.Link); if (otherRegion == region) { minLink = regionLinkQueueEntry.Link; __result = regionLinkQueueEntry.Cost; return(false); } } } __result = 10000; return(false); }