コード例 #1
0
        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);
        }
コード例 #2
0
        protected void SwapElements(int i, int j)
        {
            RegionLinkQueueEntry2 value = innerList[i];

            innerList[i] = innerList[j];
            innerList[j] = value;
        }
コード例 #3
0
        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;
            }
        }
コード例 #4
0
        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);
        }