mirror of
https://github.com/Qsgs-Fans/FreeKill.git
synced 2024-11-16 11:42:45 +08:00
59 lines
1.4 KiB
Lua
59 lines
1.4 KiB
Lua
|
--- 用于从on_use/on_effect等函数自动生成AI推理用的模拟流程
|
|||
|
|
|||
|
---@class AIParser
|
|||
|
local AIParser = {}
|
|||
|
|
|||
|
---@type table<string, string[]> 文件名-lines
|
|||
|
local loaded_files = {}
|
|||
|
|
|||
|
local function getLines(filename)
|
|||
|
if loaded_files[filename] then return loaded_files[filename] end
|
|||
|
if UsingNewCore then
|
|||
|
if filename:startsWith("./lua") then
|
|||
|
filename = "./packages/freekill-core/" .. filename
|
|||
|
end
|
|||
|
FileIO.cd("../..")
|
|||
|
end
|
|||
|
|
|||
|
local t = {}
|
|||
|
for line in io.lines(filename) do
|
|||
|
table.insert(t, line)
|
|||
|
end
|
|||
|
loaded_files[filename] = t
|
|||
|
|
|||
|
if UsingNewCore then
|
|||
|
FileIO.cd("packages/freekill-core")
|
|||
|
end
|
|||
|
return t
|
|||
|
end
|
|||
|
|
|||
|
local function getFunctionSource(fn)
|
|||
|
local info = debug.getinfo(fn, "S")
|
|||
|
local lines = getLines(info.short_src)
|
|||
|
return table.slice(lines, info.linedefined, info.lastlinedefined + 1)
|
|||
|
end
|
|||
|
|
|||
|
-- 最简单替换:breakEvent改成return
|
|||
|
function AIParser.parseEventFunc(fn)
|
|||
|
local sources = getFunctionSource(fn)
|
|||
|
local parsed = {}
|
|||
|
for i, line in ipairs(sources) do
|
|||
|
if i == 1 then
|
|||
|
table.insert(parsed, "return function(self)")
|
|||
|
else
|
|||
|
if line:find(":breakEvent%(") then
|
|||
|
line = "return true"
|
|||
|
end
|
|||
|
table.insert(parsed, line)
|
|||
|
end
|
|||
|
end
|
|||
|
return load(table.concat(parsed, '\n'))()
|
|||
|
end
|
|||
|
|
|||
|
function AIParser.parseEventWrapper(wrapperFn)
|
|||
|
local sources = getFunctionSource(wrapperFn)
|
|||
|
print(table.concat(sources, "\n"))
|
|||
|
end
|
|||
|
|
|||
|
return AIParser
|