Skip to content

Commit

Permalink
add: 添加合成script.bin的示例脚本 #89
Browse files Browse the repository at this point in the history
  • Loading branch information
wendal committed Feb 28, 2023
1 parent c373a68 commit 8582717
Showing 1 changed file with 126 additions and 0 deletions.
126 changes: 126 additions & 0 deletions tools/luadb/luadb_maker.lua
@@ -0,0 +1,126 @@
--[[
luadb maker, for script.bin
-- 使用说明
1. 需要打包的文件存放到 disk 目录
2. 用luatos.exe luadb_maker.lua 执行本脚本
3. 然后就会生成script.bin
-- 工作流程
1. 遍历disk目录,得到列表
2. 对.lua文件进行luac编译
3. 按luadb格式合成文件
运行所需要的程序:
1. luatos.exe, 可通过bsp/win32编译, 也可以从github action获取现成的
2. luac536.exe 与原版luac.exe的区别是启用了 `#define LUA_32BITS`
]]

-- 存放脚本和其他资源文件的目录,不能带子文件夹
script_dir = "disk"
-- 是否保留全部
debug_all = false

-- 遍历文件, io.lsdir应该也行
local function lsdir(path, files, shortname)
local exe = io.popen("dir /b " .. (shortname and " " or " /s ") .. path)
if exe then
for line in exe:lines() do
table.insert(files, line)
end
exe:close()
end
end

-- 封装一下调用本地程序的逻辑
local function oscall(cmd, quite, cwd)
if cwd and Base_CWD then
lfs.chdir(cwd)
end
if tool_debug then
log.info("cmd", cmd)
end
local exe = io.popen(cmd)
if exe then
for line in exe:lines() do
if not quite then
log.info("cmd", line)
end
end
exe:close()
end
if cwd and Base_CWD then
lfs.chdir(Base_CWD)
end
end

-- TLD格式打包, Tag - Len - data
function TLD(buff, T, D)
buff:pack("bb", T, D:len())
buff:write(D)
end

-----------------------
--- 开始正式的逻辑
-----------------------

-- 获取disk目录下的全部文件列表
local files = {}
lsdir(script_dir, files, true)
oscall("mkdir tmp")

-- 创建所需的缓冲区
local buff = zbuff.create(1024*1024)
local magic = string.char(0x5A, 0xA5, 0X5A, 0xA5)

-- 先写入magic
--buff:pack("bbbbbb", 0x01, 0x04, 0XA5, 0x5A, 0xA5, 0x5A)
TLD(buff, 0x01, magic)

-- 然后是版本号, 当前是2
--buff:write(string.char(0x02, 0x02, 0x00, 0x02))
TLD(buff, 0x02, string.char(0x00, 0x02))

-- head长度,固定长度
buff:write(string.char(0x03, 0x04))
buff:pack("I", 0x12)

-- 文件数量, 按实际情况的
buff:write(string.char(0x04, 0x02))
buff:pack("H", #files)

-- CRC值, 虽然有,但实际不校验
buff:write(string.char(0xFE, 0x02))
buff:pack("H", 0xFFFF)

-- 如果是lua文件,转luac,然后添加
-- 如果是其他文件,直接添加
for _, value in ipairs(files) do
TLD(buff, 0x01, magic)
if value:endsWith(".lua") then
TLD(buff, 0x02, value .. "c")
-- 内置的dump也能用. 不过得考虑size_t和32bit是否启用的问题
-- local lf = loadfile(script_dir .. "\\" .. value)
-- local data = string.dump(lf, value == "main.lua" or debug_all)
io.popen("luac536.exe -s -o tmp.luac " .. script_dir .. "\\" .. value):read("*a")
local data = io.readFile("tmp.luac")
TLD(buff, 0x03, pack.pack("I", #data))
TLD(buff, 0xFE, string.char(0xFF, 0xFF))
buff:write(data)
else
TLD(buff, 0x02, value)
TLD(buff, 0x03, io.fileSize(script_dir .. "\\" .. value))
TLD(buff, 0xFE, string.char(0xFF, 0xFF))
buff:write(io.readFile( script_dir .. "\\" .. value))
end
end

-- 最后获取全部数据
local data = buff:toStr(0, buff:seek(0, zbuff.SEEK_CUR))
log.info("target size", #data)

-- 写入目标文件
io.writeFile("script.bin", data)

-- 收工
os.exit(0)

0 comments on commit 8582717

Please sign in to comment.