用途
console-levels 是 console-skill 中的“关卡设计器”技能,面向已从 PS2 光盘提取出的文件夹结构(典型内容包括 ELF、IRX 模块和若干大型数据归档)。它的目标是先为游戏数据绘制一张可读的文件地图,再提供一条进入关卡数据的通道:识别每个文件是什么、在归档内部找到目录表、把归档拆成可单独编辑的文件,并在编辑后重新打包,使游戏运行时仍能正常读取。
主要能力
- 扫描:
scan子命令扫描已提取的光盘目录,输出文件大小、类型、熵值以及发现的目录表信息,支持--sort size、--embedded、--min-size N等参数。 - 运行日志分析:
files读取运行时日志,提取[sceCdSearchFile:ok]和sceCdSearchFile failed:行,按顺序列出移植运行时查找过的光盘文件。 - 拆包:
unpack根据归档格式拆出条目。AFS 格式可精确解析;其他归档使用置信度不低于 0.6 的目录表猜测,低于该置信度时拒绝并说明原因;可用--layout、--header、--force-toc等参数强制指定布局。 - 差异对比:
diff比较两个关卡文件或同一文件修改前后的差异,支持--as f32查看坐标、--as u16|u32查看计数与 ID,以及--gap N、--max N。 - 字符串检索:
strings在 ELF 或其他文件中搜索文件名(如.bin、.afs、stage、map 等),支持--encoding ascii|sjis|utf16le|all。 - 重新打包:
repack依据index.json恢复归档。默认--layout auto会尽量让仍能放入原槽位的条目保持在原偏移;条目超出槽位时按原对齐方式重算偏移并重写目录表,并给出提示。--layout keep在游戏代码硬编码偏移时拒绝移动任何条目。每次重新打包都会读回校验。
使用方式
技能目录由 ${CLAUDE_SKILL_DIR} 表示,典型命令包括:
python3 "${CLAUDE_SKILL_DIR}/datascan.py" scan console/disc/ --sort size --embedded
python3 "${CLAUDE_SKILL_DIR}/datascan.py" files console/runs/<newest>.log
python3 "${CLAUDE_SKILL_DIR}/datascan.py" unpack console/disc/DATA/STAGE.AFS --out console/levels/STAGE
python3 "${CLAUDE_SKILL_DIR}/datascan.py" diff console/levels/STAGE/files/0003_ST01.DAT console/levels/STAGE/files/0004_ST02.DAT --as f32
python3 "${CLAUDE_SKILL_DIR}/datascan.py" strings console/disc/SLUS_203.12 --grep .afs
python3 "${CLAUDE_SKILL_DIR}/datascan.py" repack console/levels/STAGE --out console/levels/STAGE.AFS
退出码约定:0 表示成功;1 表示需要注意(未找到目录表、条目超出槽位、光盘文件缺失;对 diff 而言表示输入不同);2 表示输入有误。所有子命令均可使用 --json。
读写范围
- 已提取的光盘文件夹:只读,
scan、unpack、strings、diff均不会修改它。 - 运行时日志(
console/runs/*.log):由files读取。 console/levels/<NAME>/files/:按归档顺序编号的拆出条目(如0003_ST01.DAT)。console/levels/<NAME>/index.json:记录格式、目录布局、对齐、偏移、槽位大小与哈希,供repack使用。_header.bin与_extra_*.bin:保留归档头字节及条目之外的字节,以保证重打包精确。repack的--out输出:重建的归档,默认拒绝覆盖已存在文件,除非加--force。
工作流程概要
- 扫描光盘,记录最大文件、类型、熵值和发现的目录表。熵值低于 7.5 比特/字节且有目录表时通常可拆分;处处高于 7.5 则可能是压缩或加密,需先在 ELF 中定位解压逻辑。
- 通过移植运行时进入关卡,用
files查看日志中该时刻查找的文件,或用strings检索代码引用的文件名。 - 使用
unpack拆包到console/levels/<NAME>。 - 用
diff对比两个关卡或修改前后字节,并结合 Ghidra 分析加载器,理解字节含义。 - 编辑
files/下的条目文件,尽量保持大小不变。 - 使用
repack重新打包并读回校验。 - 关闭运行时,备份原归档后把重打包文件复制回提取的光盘目录,再试玩验证。
适用场景
适用于自行拥有并自行抓取的 PS2 游戏光盘,希望以数据方式替换或修改关卡内容,同时利用移植运行时直接按文件名和实际大小读取提取目录、免去重建 ISO 的工作流。
限制与注意
- 每个游戏的关卡格式各不相同;本工具只提供文件地图、归档拆分和字节差异信息。关卡内部字节含义需逐游戏通过差异对比、游戏内修改前后对比以及 Ghidra 中分析加载器来推断。
- 压缩或加密归档需要先在该游戏代码中找到其解压器。
- 仅能工作在用户自己拥有并自行抓取的光盘上,不应下载 ISO、ELF 或 BIOS 文件,也不应协助寻找或索取这些文件。
- 拆包文件、关卡数据、模型、纹理和光盘本身不应发布;分享时应以补丁或脚本形式让用户作用于自己的文件。
datascan.py从不写入光盘文件夹,复制重打包文件需由用户自行完成并保留原始备份。- 与 Sony 无关联,PlayStation 是 Sony Interactive Entertainment 的商标。
- 与图形(TIM2 纹理)、声音(VAG 与音库)、物理/代码修改、测试相关的工作分别交由对应的其他技能处理。