Skip to content

Latest commit

 

History

History
166 lines (129 loc) · 11.6 KB

remix-client-comparison.md

File metadata and controls

166 lines (129 loc) · 11.6 KB

Remix O2Jam 与 O2Lazer 对照

维护状态(2026-10-06):历史交叉证据;不覆盖韩服主参考及后续用户选定规则。 文档职责与最新状态入口见索引。

检查日期:2026-10-04。本轮只增加对照记录,没有修改玩法、音频或客户端 DLL。 用户随后指定 O2JamO2 与 Classic 为主要行为参考;本包作为交叉证据, 目标优先级与合并差异见 韩服双客户端对照。 本文的“当前 O2Lazer”表格为初次检查时的快照;随后 C02–C05 已获授权对齐, C06 随后采用用户选定的游玩重播策略,2026-10-05 C01 改为连续不对称区间、C07 暂缓;现状见合并对照和行为规范。

证据范围

参考目录为 E:\RemixO2jam。目录内没有游戏源码;本次检查文件结构、PE 信息、 OJN 数据,并追踪 OTwo.exe 的 x86 指令与调用链。没有启动登录器或游戏, 没有登录账号,也没有改动参考目录。

项目 本次参考
游戏程序 OTwo.exe,2,056,192 字节,PE32/x86 原生程序
SHA-256 e132d89302c17df4a3a4c70d1a669ab9b0994634ec4f9b17aab60ccdb8f1d39b
PE ImageVersion 0.1423
PE 时间戳 2005-12-08 14:12:22 UTC;仅为头信息,不能据此确定发行来源
登录器 Remix O2Jam登录器.exe,文件版本 2.5.4.22
附带窗口补丁 dgVoodoo / DDrawCompat 图形兼容组件

下面的“确认”是指这份磁盘上主程序的静态执行路径可以确认,不等于已经在 Remix 运行环境中完成验收。没有发现独立的 O2Hook DLL,但登录器是否会在启动时修改 游戏程序仍未确认。结论不能直接推广到所有官方 OTwo 版本。

文中地址是该主程序的虚拟地址,ImageBase 为 0x400000。反汇编等本地诊断材料 保留在忽略的 .artifacts 中;仓库不包含参考客户端或其资源。

已确认的共同点

项目 对照结果 主程序证据
判定单位 谱面位置采用每小节 192 ticks;COOL / GOOD 为 6 / 18 ticks,单点与长条头 BAD 为 25 ticks 0x4800a8、0x48021c–0x480233、0x481adb–0x481b01
基础分数 COOL 200 + 10 × 当前 Jam;GOOD 100 + 5 × 当前 Jam;BAD 4;MISS -10 且不低于 0 0x47f38b–0x47f3e4、0x47f4e6、0x47f526–0x47f544
分数结算次序 本次命中先按已有 Jam 计分,再更新 Jam 0x47f38b–0x47f45a
Combo 表现 第一击显示 0,第二击显示 1;BAD / MISS 断连 0x47f3f5–0x47f409;原程序使用计数减一,我们使用内部 -1 哨兵,两者正常游玩表现一致
血量 上限 1000;EX +3/+2/-10/-50,NX +2/+1/-7/-40,HX +1/0/-5/-30 0x47f720–0x47f7a8、0x46b620
普通药丸规则 15 次连续 COOL 获得药丸,上限 5;药丸可将 BAD 按 COOL 计分 0x47e5d1–0x47e62a、0x47e710–0x47e74b;特殊状态 6 禁用药丸,具体模式尚未确认
长条端点 头与尾分别计分;漏头会产生头 MISS 与尾 MISS;普通 BAD 头结束长条 0x481b3d–0x481b91、0x481c71–0x481ceb
KS 身份 谱面引用减一;背景样本追加 1000 偏移;零号样本不替换成其他样本 0x47f260;对应当前 OjnReader 的编号映射
长条音频 普通判定回调播放头 KS,尾不另播 KS 0x47e633–0x47e648 等回调中的尾标志检查

当前实现位置: 判定、 分数/血量/Jam/药丸、 长条规则、 格式解码。

不属于 lazer 取舍的玩法差异

编号 参考主程序 当前 O2Lazer 影响
C01 位置整数化 时间转换为谱面位置后,截断成整数 tick,再比较距离 对连续谱面位置直接比较距离 相同的 6/18/25 常量仍可能得到不同判定,主要发生在边界附近
C02 释放 BAD 边界 长条释放也是 25 ticks 释放为 24 ticks 一部分释放在参考程序为 BAD,我们为 MISS;还叠加 C01 的影响
C03 Jam 晋级边界 COOL +2、GOOD +1,累计进度必须严格超过 50 × (当前 Jam + 1) COOL +4、GOOD +2,进度达到 100 就晋级并取余 从初始状态连续 COOL,第 26 击后参考程序才获得第一 Jam,我们在第 25 击后获得;后续加分时点不同
C04 药丸救回后的连 COOL 进度 BAD 先清零连续 COOL,消耗药丸后直接调用 COOL 计分,不走普通 COOL 的药丸进度增长 救回结果为 COOL,并计入下一轮连续 COOL 进度 救回后参考程序还需 15 次真正 COOL 才得下一颗,我们只需 14 次
C05 药丸救回长条头 头可按 COOL 计分,但长条控制仍检查原始 BAD,立即给尾 MISS 长条控制检查药丸转换后的 COOL,允许继续按住并判尾 同一输入可能出现“COOL 头 + MISS 尾”与“COOL 头 + 正常判尾”的区别

C01 的调用链是 0x48195d–0x48196b → 时间/位置插值 0x4825c0 → 向零截断转换 0x4b87d8。对非负位置,截断等价于 floor。 对于整数 tick 端点 T,参考程序的 COOL 条件相当于:

T - 6 <= position < T + 7

我们当前的条件是 T - 6 <= position <= T + 6。因此参考程序晚侧可多出接近一 tick; BPM 120 时一 tick 约 10.42 ms。这里指谱面位置量化,并非要求改用整数毫秒。 精准的 lazer 时钟与兼容整数 tick 的判定策略可以并存。

C02 对应释放分支 0x4819a6–0x4819dc,其中 BAD 常量明确为 0x19。

C03 的阈值表由 0x47f160–0x47f180 建成 50, 100, 150, ...。 0x47f43d–0x47f445 在进度小于或等于阈值时跳过晋级。原程序采用累计阈值, 不能表述成“每一级都需要 26 个 COOL”。从初始状态连续 26 COOL 的纯计分序列, 参考路径为 5200 分,当前策略为 5210 分;这不是更换基础分数公式造成的。

C04 对应 0x47e710–0x47e74b:清零连续 COOL、消耗药丸、直接调用 0x47f300 的 COOL 计分分支,没有重新进入普通 COOL 的进度处理。

C05 对应 0x481b05–0x481ba4:先调用包含药丸处理的判定回调,返回后仍比较 保存的原始 BAD 标志。它反映两个状态处理路径之间的次序差异。若决定兼容,应该在 Core 明确区分计分结果与长条继续条件,而不是让 drawable 再做一次判定。

这些结果与当前依照 CXO2 等参考制定的规则存在冲突。本轮不将参考程序的规则自动 提升为所有版本的统一规则,也不更改当前默认值。需要先决定项目要复现哪个版本, 再用运行结果固定验收用例。

音频差异

C06 同一 KS 的再次触发

0x472f20–0x473032 为每个样本编号取一个固定缓冲区。缓冲区仍在播放时,先停止, 再开始新播放;0x46fd60 调用 DirectSound 的 Stop / SetCurrentPosition(0), 0x46fcf0 随后调用 Play。也就是说,同一编号的快速重复会切断旧声音; 不同编号仍可同时播放。不能据此推断普通长条松手会切断头 KS。

当前 预览音轨 为每个 KS 事件取得新播放通道; 资源宿主 将原生 sample store 的并发设为 32。游玩与预览因而允许同一 KS 的声音重叠, 超过并发上限时仍受音频后端约束。这可能改变快速重复音符的听感,属于需要明确选择的 声音策略;它不是复用 lazer 音频后端必然带来的限制。

C07 谱面音量与声像

双方对音量 nibble 0 都使用最大默认值,对声像 nibble 0 都使用居中默认值。 非默认值的换算不同:

参数 参考主程序 当前 O2Lazer
音量 先与独立 KS/BG 设置值结合,再转为 DirectSound 的分贝衰减 nibble / 16,舍入为整数百分比,再作为线性增益
声像 (pan - 8) × 375,作为百分之一分贝的左右衰减 将 1–15 线性映射为 -1–1 的 Balance

计算位于 0x472f66–0x472ff7,音量常量 0x4d1038 为 100 / (16 × 255)。 在参考 KS/BG 设置值为 255 时,音量 nibble 8 对应 -1500,即 -15 dB; 按振幅换算约为 0.178。我们得到 50%,即线性增益 0.5。该例只比较参数映射, 没有测量最终设备输出或响度。

DirectSound 的单位和声像含义参见 Microsoft 的 SetVolume 与 SetPan。 原程序的 pan 1/15 对应左右 ±26.25 dB 衰减,而我们对应 Balance 两端,不能当作 同一声像曲线。若以后复现这种混音,只需要准确翻译音频参数,仍可使用 lazer 原生后端。

本次没有发现需要推翻 KS 编号映射的证据。此前确认的缺失零号 KS 处理应保留。

格式、功能与分层

  • 包内只有 3 个 OJN 文件,教程重复了一份,实际只有两份不同输入。它们均为 OJN 2.9、标准七键通道,所有事件网格都可整除 192。本次未证明整个 Remix 曲库已兼容。
  • Ch12/o2ma1114.ojn 含大量长条和 BPM 变化,适合作为后续边界验收材料; EX/NX/HX 等级分别为 45/35/40,难度槽位不应按等级大小重新排列。
  • 我们的格式模块还处理加密 OJN 和 OJM/OMC/M30;这属于当前读取能力,不能仅凭 此包推断参考程序支持或不支持其中所有格式。
  • 原程序存在 Jam 数字/效果的资源引用与显示调用。我们已有 Jam、药丸状态,专用 HUD 尚未完成,已列入路线图 R09。这是表现功能待补项;具体布局、动画与药丸图示仍需实看。
  • 登录、频道、房间、任务与 Avatar 等资源属于独立客户端的产品范围。 不能把缺少整套大厅与账号系统算作 custom ruleset 的玩法兼容缺陷。

Mania Score、Mod、PP 资格、准确率/评级、等级颜色、osu! 皮肤与选图交互, 以及原生成绩/正式回放和暂停/跳转协议,都是项目已经选择的 lazer 接入路线。 它们不列入上面的 C01–C07 差异项。

现有分层足以承载对照发现:C01–C05 属于独立 Core 的规则策略,C06–C07 属于 接入层的音频参数翻译与 Host 音频播放策略,Jam/药丸 HUD 属于 Presentation。 格式解码保持独立;判定不会因需要兼容原程序而必须迁回 drawable 或 Harmony 补丁。

尚不能确定的部分与后续验收

  1. 登录器运行时是否改变主程序的判定/音频路径;应先记录运行时模块与对应程序版本。
  2. EX 血量耗尽后每项状态是否冻结,以及特殊任务状态的行为。主程序含多个模式条件, 不以单个计分分支推导完整失败规则。
  3. 长条漏头、早松、正常判尾后的颜色、裁切、移动、消失时机。资源和状态标志不能替代逐帧实看。
  4. 预览与暂停的实际语义、输入延迟和帧稳定性。静态检查不能证明性能或听觉同步一致。
  5. 超过 192 槽或不能整除 192 的 OJN 网格、异常长条和缺失样本。当前提供的两份不同 OJN 没覆盖这些情况,不能当作鲁棒性验收。

建议先验收 C05(有药丸时 BAD 长条头)与 C01/C02(判定边界),随后固定 C03/C04 的短计分序列,最后比较 C06/C07 的重复 KS 与混音。以上用例全部明确后, 再决定采用统一目标版本还是隔离成兼容策略;本轮尚未确定更换默认规则。