2025-06-04 05:02:57 +08:00

110 lines
2.9 KiB
Plaintext

FunctionAstrolabe = {}
FunctionAstrolabe.SearchType =
{
Path = 1,
Gold = 2,
Count = 3
}
local noneIdx = 0
local invaildIdx = -1
local origin = 10000
function FunctionAstrolabe.GetPath(globalID, searchType)
local activated = AstrolabeProxy.Instance:GetActivePointsMap()
return FunctionAstrolabe.BFS(globalID, activated, searchType)
end
local parent = nil
local astrolabeID = 0
local starID = 0
local id = 0
local connects = {}
local star = nil
local floor = math.floor
local visited = {}
local queue = {}
function FunctionAstrolabe.BFS(fpIdx, activated, searchType)
if activated[fpIdx] then return nil end
local tableAstrolabe = Table_Astrolabe
local AssemblePath = FunctionAstrolabe.AssemblePath
local ReuseAllNode = FunctionAstrolabe.ReuseAllNode
local bordData = FunctionAstrolabe.bordData
local Proxy = AstrolabeProxy.Instance
local CheckPlateIsUnlock = AstrolabeProxy.Instance.CheckPlateIsUnlock
local head = 0
local last = 1
queue[last] = fpIdx
visited[fpIdx] = noneIdx
while last > head do
head = head + 1
parent = queue[head]
astrolabeID = floor(parent / origin)
starID = parent % origin
star = tableAstrolabe[astrolabeID].stars[starID]
for i=1, #star do
--1 innerConnect
--2 outterConnect
connects = star[i]
for k=1, #connects do
id = connects[k]
if id < origin then id = id + astrolabeID * origin end
if id == origin or activated[id] then
local path = AssemblePath(visited, id, parent)
ReuseAllNode(visited)
return path
end
if (not visited[id] or visited[id] == invaildIdx) and CheckPlateIsUnlock(Proxy, floor(id / origin, bordData)) then
visited[id] = parent
last = last + 1
queue[last] = id
end
end
end
end
ReuseAllNode(visited)
return nil
end
function FunctionAstrolabe.AssemblePath(visited, firstIdx, parentIdx)
local path = { firstIdx }
while parentIdx > 0 do
path[#path + 1] = parentIdx
parentIdx = visited[parentIdx]
end
--------------------LogStart------------------
-- local str = ""
-- for _,v in pairs(path) do
-- str = str .. v .. "\n"
-- end
-- Debug.Log(str)
--------------------LogEnd--------------------
return path
end
function FunctionAstrolabe.ReuseAllNode(visited)
for k,_ in pairs(visited) do
visited[k] = invaildIdx
end
end
function FunctionAstrolabe.ClearCache()
visited = {}
connects = {}
queue = {}
star = nil
end
FunctionAstrolabe.bordData = nil;
function FunctionAstrolabe.SetBordData(bordData)
FunctionAstrolabe.bordData = bordData;
end
function FunctionAstrolabe.ReSetBordData()
FunctionAstrolabe.SetBordData(nil)
end