From f44a58e35866e317eeb4f54a24c0de48d1595d91 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Tue, 9 Dec 2014 18:42:25 -0700 Subject: [PATCH] Fixes the heap fix. --- code/defines/procs/AStar.dm | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/code/defines/procs/AStar.dm b/code/defines/procs/AStar.dm index e28a159c6a..1aef60bf05 100644 --- a/code/defines/procs/AStar.dm +++ b/code/defines/procs/AStar.dm @@ -59,17 +59,35 @@ PriorityQueue proc/Dequeue() if(!queue.len) - return + return 0 return Remove(1) - proc/Remove(index) + proc/Remove(var/index) if(index > queue.len) - return + return 0 var/thing = queue[index] - queue.Cut(index, index + 1) + queue.Swap(index, queue.len) + queue.Cut(queue.len) + if(index < queue.len) + FixQueue(index) return thing + proc/FixQueue(var/index) + var/child = 2 * index + var/item = queue[index] + + while(child <= queue.len) + if(child < queue.len && call(comparison_function)(queue[child], queue[child + 1]) > 0) + child++ + if(call(comparison_function)(item, queue[child]) > 0) + queue[index] = queue[child] + index = child + else + break + child = 2 * index + queue[index] = item + proc/List() return queue.Copy()