SuperAPI AI 工具集

console-levels

编程与开发

查看项目

更新于 10-23 10:58

技能介绍

用途

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。

工作流程概要

  1. 扫描光盘,记录最大文件、类型、熵值和发现的目录表。熵值低于 7.5 比特/字节且有目录表时通常可拆分;处处高于 7.5 则可能是压缩或加密,需先在 ELF 中定位解压逻辑。
  2. 通过移植运行时进入关卡,用 files 查看日志中该时刻查找的文件,或用 strings 检索代码引用的文件名。
  3. 使用 unpack 拆包到 console/levels/<NAME>。
  4. 用 diff 对比两个关卡或修改前后字节,并结合 Ghidra 分析加载器,理解字节含义。
  5. 编辑 files/ 下的条目文件,尽量保持大小不变。
  6. 使用 repack 重新打包并读回校验。
  7. 关闭运行时,备份原归档后把重打包文件复制回提取的光盘目录,再试玩验证。

适用场景

适用于自行拥有并自行抓取的 PS2 游戏光盘,希望以数据方式替换或修改关卡内容,同时利用移植运行时直接按文件名和实际大小读取提取目录、免去重建 ISO 的工作流。

限制与注意

  • 每个游戏的关卡格式各不相同;本工具只提供文件地图、归档拆分和字节差异信息。关卡内部字节含义需逐游戏通过差异对比、游戏内修改前后对比以及 Ghidra 中分析加载器来推断。
  • 压缩或加密归档需要先在该游戏代码中找到其解压器。
  • 仅能工作在用户自己拥有并自行抓取的光盘上,不应下载 ISO、ELF 或 BIOS 文件,也不应协助寻找或索取这些文件。
  • 拆包文件、关卡数据、模型、纹理和光盘本身不应发布;分享时应以补丁或脚本形式让用户作用于自己的文件。
  • datascan.py 从不写入光盘文件夹,复制重打包文件需由用户自行完成并保留原始备份。
  • 与 Sony 无关联,PlayStation 是 Sony Interactive Entertainment 的商标。
  • 与图形(TIM2 纹理)、声音(VAG 与音库)、物理/代码修改、测试相关的工作分别交由对应的其他技能处理。