Reimplemented Pathfinder to use A* instead of spawning an entity

#closes 788
This commit is contained in:
Wofsauge committed 2025-02-26 22:45:15 +01:00
1 parent db406cacbf
commit da9eb2b3dd
6 files changed
+318 -10

No files matched your search

+77
View File
@@ -0,0 +1,77 @@
local Heap = {}
Heap.__index = Heap
local function findLowest( a, b )
return a < b
end
local function newHeap( template, compare )
return setmetatable( {
Data = {},
Compare = compare or findLowest,
Size = 0
}, template )
end
local function sortUp( heap, index )
if index <= 1 then return end
local pIndex = index % 2 == 0 and index / 2 or ( index - 1 ) / 2
if not heap.Compare( heap.Data[pIndex], heap.Data[index] ) then
heap.Data[pIndex], heap.Data[index] = heap.Data[index], heap.Data[pIndex]
sortUp( heap, pIndex )
end
end
local function sortDown( heap, index )
local leftIndex, rightIndex, minIndex
leftIndex = index * 2
rightIndex = leftIndex + 1
if rightIndex > heap.Size then
if leftIndex > heap.Size then return
else minIndex = leftIndex end
else
if heap.Compare( heap.Data[leftIndex], heap.Data[rightIndex] ) then minIndex = leftIndex
else minIndex = rightIndex end
end
if not heap.Compare( heap.Data[index], heap.Data[minIndex] ) then
heap.Data[index], heap.Data[minIndex] = heap.Data[minIndex], heap.Data[index]
sortDown( heap, minIndex )
end
end
function Heap:Empty()
return self.Size == 0
end
function Heap:Clear()
self.Data, self.Size, self.Compare = {}, 0, self.Compare or findLowest
return self
end
function Heap:Push( item )
if item then
self.Size = self.Size + 1
self.Data[self.Size] = item
sortUp( self, self.Size )
end
return self
end
function Heap:Pop()
local root
if self.Size > 0 then
root = self.Data[1]
self.Data[1] = self.Data[self.Size]
self.Data[self.Size] = nil
self.Size = self.Size - 1
if self.Size > 1 then
sortDown( self, 1 )
end
end
return root
end
return setmetatable( Heap, { __call = function( self, ... ) return newHeap( self, ... ) end } )