console-physics 是 jakeschincariol/console-skill 中的物理调校技能(Physics Tuner),用于寻找并修改决定游戏运动手感的关键数值,例如最高速度、重力、抓地力、跳跃高度和帧率。
用途 PS2 游戏的物理运算使用单精度浮点(EE 的 FPU 不支持双精度),因此最高速度、重力或跳跃冲量通常是某个 32 位浮点值:要么存放在 ELF 的数据段,要么由两条指令直接内联进代码。该工具负责找出候选值,由 PCSX2 验证哪一个才是真正的目标,再交由 /console-mod 把最终值构建进移植版本。
主要能力
- scan:同时扫描数据段浮点值和 lui/ori/mtc1 常量,支持 --value 指定数值、--tol 放宽容差、--limit 限制结果数。
- fps:列出帧率相关候选值(1/60、1/30、60、30、PAL 50/25 等)。
- patch:对指定地址写入新的浮点值,打印出对应的 pnach 行,代码常量还会打印两条指令补丁。
- 通用参数:--json 输出 JSON;--place 0|1|2 指定 pnach 放置位置(数据默认 0,代码默认 1);--exact 在单个 lui 无法容纳新值时拒绝而非取整。
使用方式 调用示例(命令原样保留): python3 "${CLAUDE_SKILL_DIR}/tune.py" scan SLUS_203.12 --value 9.8 python3 "${CLAUDE_SKILL_DIR}/tune.py" scan SLUS_203.12 --value 9.8 --tol 0.05 python3 "${CLAUDE_SKILL_DIR}/tune.py" fps SLUS_203.12 python3 "${CLAUDE_SKILL_DIR}/tune.py" patch SLUS_203.12 --addr 0x0034A2C0 --float 12.5 其中 ${CLAUDE_SKILL_DIR} 是本技能所在目录。
推荐流程:先根据手感描述猜测数值(如“车太慢”对应最高速度、加速度、阻力系数),以游戏中可见的数值为起点;执行 scan,命中过多时按段(物理常量多在 .rodata/.lit4 或 mtc1 附近代码)或读取指令缩小范围,命中为零时放宽 --tol、尝试其他单位;扫描无法定位时,在 PCSX2 调试器中搜索内存浮点值,在游戏中改变状态(跳跃、刹车)后再次搜索,再对该地址下写入断点查看计算代码;找到后先在 PCSX2 中用 patch 生成 pnach 行验证,一次只改一个值并记录变化;最后用 /console-mod 将代码常量写入游戏 TOML(重新运行 ps2_recomp)或通过 override 固化。
读取与写入 工具只读取游戏主 ELF 的数据字、代码、段和 $gp;只向标准输出打印命中、周围指令、pnach 行、TOML 块和 override 写入内容,不修改任何文件,由用户或 /console-mod 决定放置位置。
浮点在 PS2 ELF 中的形式
- 数据段中的字(.data、.rodata、.lit4、.sdata):如 0x411CCCCD 表示 9.8,报告 DATA 及读取它的 lwc1/lw 指令,patch 输出一行 pnach 及 override 写入。
- 代码内联:lui $v0, 0x411C + ori $v0, $v0, 0xCCCD + mtc1 $v0, $f12,报告 CODE 及周围指令,输出两行 pnach 和两个指令补丁。
- lui + addiu:低半部分符号扩展,CODE 形式,高半部分需按进位调整。
- 单个 lui:适用于低半部分为零的值(1.0、0.5、12.5、60.0),输出一个词;若新值需要低半部分则取整到最近可表示值并返回退出码 1。
- 运行时设定:BSS、堆中为零填充,ELF 中无对应值,需 place 1 的 pnach 行配合 /console-mod 的帧挂钩。
典型目标
- 最高速度、加速度:最高速限制和每帧增量,常为按帧计算(km/h 除以帧率)。
- 重力、跳跃高度:负的每帧速度增量与跳跃冲量,跳跃高度随冲量平方增长。
- 抓地力、摩擦力:每帧应用的略小于 1.0 的乘数(0.95、0.98),小改动影响很大。
- 伤害:更多是整数,需在 RAM 中查找。
- 摄像机 FOV:0.75 至 1.3 附近或焦距 1.0 至 2.0,宽屏相关交给 /console-graphics 的 widescreen.py。
- 帧率:fps 列出的是候选而非答案;许多游戏用 vsync 等待计数(如等 2 次 vsync 得 30fps)控制节奏,扫描看不到该整数;60fps 解锁还需游戏逻辑按帧时间缩放,否则速度翻倍。
限制
- 游戏运行时计算出的值(来自车辆数据文件、关卡脚本、菜单设置)不在 ELF 中,需在 RAM 中查找并修改设置它的代码或文件。
- 单位通常不明显:9.8 可能存为 980、0.163(每帧)或 588(60fps 下每秒平方)。
- 帧率解锁往往不止一个数值。
- 共享常量被多处读取时(patch 会警告),修改会影响所有读取处。
- 仅用于用户自己拥有、从自有光盘转储的游戏;不得下载或寻找 ISO、ELF、BIOS 文件。
- 不得发布游戏本体内容,只分享 pnach 行、TOML 补丁和 override 文件。
- 与 Sony 无关联,PlayStation 是 Sony Interactive Entertainment 的商标。
相关技能 /console-mod 用于将验证后的值固化进移植版;/console-graphics 处理摄像机宽高比与宽屏;/console-tester 用于试玩修改并确认没有破坏其他内容。