本项目用于从 PAK 中导出配置数据、图标资源和反编译后的 Lua 源码。主流程默认输出目录为 output。
./run.sh --aes-file path/to/aes_key.txt \
--ipa path/to/app.ipa \
--app path/to/app_container \
--output path/to/output也可以直接传 64 位十六进制 AES key:
./run.sh 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef \
--ipa path/to/app.ipa \
--app path/to/app_container \
--output path/to/output或者用 @ 引用 key 文件:
./run.sh @path/to/aes_key.txt --ipa path/to/app.ipa --app path/to/app_container如果不传 --output,默认输出到当前项目的 output 目录。
Lua 单独执行,不会重复导出图片和数据。默认读取当前项目的 paks,输出到 output/scripts。
./lua.sh --aes-file path/to/aes_key.txt自定义 PAK 目录和输出目录:
./lua.sh --aes-file path/to/aes_key.txt \
--paks path/to/paks \
--output path/to/output/scripts如果没有传 --decompiler 或 --unluac-lib,脚本会自动准备本地工具:
- OpenJDK:
.tools/openjdk - unluac.jar:
.tools/unluac.jar
若只需要补导历史上容易失败的 Lua 文件,可执行:
./lua.sh --aes-file path/to/aes_key.txt --fix-known-lua默认导出完整 Lua 源码,写入 output/scripts/lua。luac 只作为反编译临时中间文件,不保留;不再生成 luasm。
./run.sh 执行时会依次完成:
- 检查
.NET SDK、uv或 Python、Node.js、unzip。 - 缺少运行环境时,优先在项目内准备本地环境。
- 从
--ipa和--app收集.pak。 - 解密并解包配置、表数据和图标资源。
- 生成
dataJSON,整理assetsWebP。 - 默认清理
temp中间目录。
path/to/output/
assets/
webp/
Game/
NewRoco/
Modules/
System/
Common/
Icon/
HeadIcon/
3001.webp
BigHeadIcon256/
3001.webp
Pet1024/
JL_*.webp
Pet256/
JL_*.webp
BagItem/
*.webp
BattleUI/
Raw/
Atlas/
SkillIcon/
...
data/
BinData/
*.json
tables/
*.json
pets/
*.json
Pets.json
PetAssetIndex.json
items.json
moves.json
SkillIconIndex.json
magic_items.json
PetSkillIndex.json
bloodline_index.json
handbook-rewards.json
types.json
scripts/
lua/
Common/
Core/
Data/
NewRoco/
*.lua
--aes-file path/to/aes_key.txt 从文件读取 AES key
--ipa path/to/app.ipa 从 IPA 收集基础 pak
--app path/to/app_container 从 App 容器收集补丁 pak
--output path/to/output 自定义输出目录
--language dir 本地化语言目录;不传时从 BinLocalize 实际目录自动选择
--keep-temp 保留 temp,方便排查中间产物
导出会优先读取 BinLocalize 下实际存在的本地化目录;当前 NRC 包通常是 dev_CN。如果手动传入的语言目录不存在,导出会回退到可用目录,否则物品和技能描述会是空值。
精灵图片不要按 ID 暴力拼路径,优先从 data/PetAssetIndex.json 或单个 data/pets/<id>.json 的 assets.preview、assets.head.normal、assets.portrait 读取。assets 只写入已实际导出的 WebP 路径,特殊形态会尽量使用配置图标、图鉴插图或 BigHeadIcon 中可用的一张作为 preview。
技能图片同理,优先从 data/SkillIconIndex.json 或 moves.json 的 assets.preferred 读取;若 BattleUI/Raw/Atlas/SkillIcon/<icon>.webp 不存在,会自动回退到 Common/Icon/SkillBase/<icon>_png.webp。
./lua.sh 额外支持:
--paks path/to/paks 指定已有 PAK 目录
--output path/to/output/scripts 指定 Lua 输出根目录
--decompiler path 指定 unluac-cli 或 unluac.jar
--unluac-lib path 指定 FModel native unluac 库
--jobs n 并发反编译数量,默认 CPU 核数
--timeout-ms n 单个 Lua 反编译超时,默认 120000
--contains text 只导出路径包含指定文本的 Lua,可重复
--fix-known-lua 只补导 ProtoEnum、BattleAttackPlayer、Utils/Extend
运行脚本需要:
.NET SDKuvNode.jsunzip
缺少环境时的处理方式:
.NET SDK不存在时,尝试安装到.tools/dotnet。uv存在时使用uv run python。uv不存在但有 Python 时,使用.venv。- Node.js 不存在但有 Homebrew 时,尝试
brew install node。
AES key 必须是 64 位十六进制字符串。key 文件中的换行和空白会被自动清理。
如果输出没有图片,脚本会直接失败。可以加 --keep-temp 后检查:
./run.sh --aes-file path/to/aes_key.txt \
--ipa path/to/app.ipa \
--app path/to/app_container \
--keep-temp然后查看:
temp/assets/webp/Game/NewRoco/Modules/System/Common/Icon
temp/assets/webp/Game/NewRoco/Modules/System/BattleUI/Raw/Atlas
temp/assets/webp/Game/NewRoco/Modules/System/Activity
temp/assets/webp/Game/NewRoco/Modules/Activity
temp/assets/webp/Game/NewRoco/Modules/**/Raw
temp/assets/webp/Game/NewRoco/Modules/**/RawRes
RAW WARN 表示少量非关键原始文件被跳过,通常不影响 BinData 和 WebP。asset 解码失败会导致脚本退出。