Skip to content

Latest commit

 

History

History
160 lines (133 loc) · 12 KB

o2jamo2-client-comparison.md

File metadata and controls

160 lines (133 loc) · 12 KB

O2JamO2 安装包行为对照

维护状态(2026-10-06):历史主程序证据;修正前项目列仅为快照,当前行为以玩法规范为准。 文档职责与最新状态入口见索引。

检查日期:2026-10-04。参考文件为 E:\Downloads\O2JamO2.zip。 本轮只做静态对照与文档整理,没有修改玩法、音频或已安装的 ruleset DLL。 用户随后指定 O2JamO2 与 Classic 两份客户端为主要参考;合并结果与当前完整读取检查 见 韩服双客户端对照。本文保留 O2JamO2 单包的证据记录。 本文对照表记录修正前项目。随后 C02–C05 已授权对齐,C06 采用用户选定的游玩重播策略,2026-10-05 C01 改为连续不对称区间、C07 暂缓; 当前实现状态以合并对照与行为规范为准。 同日随后建立了本机 Identity 环境,用户确认原客户端可以游玩;运行环境、资源校验 和验证边界见本地对照环境。下文的未运行说明指初次静态检查。

身份与检查范围

外层 ZIP 只有 O2JamO2_Setup.exe。它包含 InstallShield 安装数据,实际游戏主程序为 其中的 OTwo.exe。读取过程在内存中解析安装目录、解压选定成员,校验长度与安装包记录的 MD5,然后解析 PE、字符串和指令。没有启动安装器、游戏或更新程序,也没有将 EXE/DLL 成员落盘。忽略目录 .artifacts 只保存检查脚本及派生的目录、元数据和指令清单。 安装数据布局核对了 unshield 的格式定义 及其 成员读取实现。

对象 大小 SHA-256
O2JamO2.zip 397,083,790 712768e1802819648180e88169a19e7fe88e06f6590435c9cfc329dfcf6be592
OTwo.exe 2,998,272 2c8ac19bc26a7e1cfde527f5871c22b14fcc5473137101f4be849435d99b3102
O2Jam.exe 200,704 a4033ae16d2d3660f503cbb521509e25fe51b284f69a1985a1f5a299c422a3ed
O2JamPatchClient.exe 712,704 41dd46e40bd4f4186239f070a9882417bbfe98113f255f75e58bbf9490ea4c52
O2Net32.dll 53,248 190b66db08fe057635645d10aca11deaaf933dab3c4316300d6dca1e6c7298d3

OTwo 为原生 x86 程序;PE 时间字段为 2008-06-17 00:28:25 UTC,ImageVersion 为 0.0。 PDB 路径包含 O2Jam_Client(2005),注册表路径包含 O2JamO2,网络地址指向历史 O2Jam 服务。时间字段和这些字符串用于识别这一构建,不能证明文件来源或官方完整性。 VersionInfo2.dat 内容为 1.08 1.69 5.89 3.34,未确定四个数对应的组件,不能直接将其 作为主程序版本号。

安装目录没有 DPJAM 的 O2Hook2.dll、代理 dsound.dll、O2GraphicExt.dll 或其配置。 主程序直接导入 DirectSound、DirectInput 和 DirectDraw。相较于带增强补丁的 DPJAM, 这份包可作为另一份不含上述补丁组件的基线;不能据此排除在线更新或其他运行时变化。 它与 Remix 的 OTwo 不是同一二进制,函数位置和生成代码均有明显变化。

历史身份与参考权重

用户补充这份安装包据称来自当年的韩服原版。包内 O2JamO2 注册表路径、 game1.o2jam.com 服务地址及历史构建信息,与 O2JamO2 客户端谱系吻合。 CXO2 / Mozart.Encore 作者的研究记录 将 O2JamO2 归为 Nowcom 的早期 O2Jam Classic 客户端; 当前服务器兼容表 又区分 v5.89 的 O2JamO2 Beta、v6.65 的 O2JamO2 与 v7.55 的 O2Jam Classic。 因此“来自韩服历史客户端谱系”有证据支持,但具体发行阶段仍需确认。 不能仅用 VersionInfo2.dat 中的 5.89 判断 Beta/正式阶段,早期研究记录中的版本命名 也与当前兼容表存在变化。

本轮没有找到可与本地 SHA-256 比对的官方发布记录,不能认证这份 ZIP 是未经修改的 官方原始安装包。用户现已指定本包与 Classic 为主要行为参考,应优先参考两份本地 二进制中可追溯的直接证据,并以 Remix 作交叉核对;DPJAM 的增强补丁行为单独记录。 这种参考顺序不自动改变当前项目策略,也不将这一构建的规则推广到所有韩服版本。

初次检查的核心规则:三份客户端与项目

表中所有客户端结论均为所提供文件的静态路径,未通过实际输入验收。 DPJAM 列以其默认 O2Hook2 判定路径为准,未开固定 BPM 判定、自动演奏或谱面变换。

项目 O2JamO2 Remix DPJAM 补丁 初次检查时 O2Lazer
判定位置 浮点位置向零截成整数 同左 同左 连续积分位置
COOL / GOOD 整数距离 ≤6 / ≤18 同左 同左 连续距离 ≤6 / ≤18
单点/长条头 BAD 整数距离 ≤25 同左 同左 连续距离 ≤25
长条释放 BAD 整数距离 ≤25 同左 整数距离 ≤24 连续距离 ≤24
基础计分 COOL 200+10×Jam;GOOD 100+5×Jam;BAD 4;MISS -10,最低 0 同左 同左 同左
Combo 显示 第一击 0、第二击 1 同左 同左 正常表现一致
初始连续 COOL 的第一 Jam 第 26 击后晋级,下一击开始享受加分 同左 同左 第 25 击后晋级
药丸救回后连 COOL 进度 清零后仍为 0,不计救回这一击 同左 同左 救回后进度为 1
药丸救回 BAD 长条头 头按 COOL 计分,尾仍强制 MISS 同左 同左 按转换后的 COOL 允许继续判尾
EX/NX/HX 血量增减表 +3/+2/-10/-50;+2/+1/-7/-40;+1/0/-5/-30 同左 同左 同左

这份构建再次支持整数位置、严格 Jam 阈值及药丸/长条顺序的差异。 释放 25 则与 Remix 相同,说明 24 不能仅凭 DPJAM 补丁推广为所有 OTwo 的行为。 此表保留初次检查状态;后续 C02–C05、KS 重触发及连续不对称判定的授权修改,以行为规范和汇总报告为准。

指令证据

  • 位置与窗口:0x52dbd5 调用 0x5314e0 做时间到谱面位置的插值; 0x52dbda–0x52dc04 设置 x87 向零舍入并转为整数。 对非负位置相当于 floor。释放分支 0x52dc86–0x52dcb3 在距离大于 6/18/25 时 才进入下一档,故包含 25;头分支 0x52e185–0x52e1a9 同样包含 6/18/25。 对整数端点 T,COOL 连续位置区间为 T-6 <= position < T+7,初次检查时项目为 T-6 <= position <= T+6;2026-10-05 改为连续不对称区间。无需为复现这种边界而替换 lazer 的音频时钟。
  • Jam 与计分:0x52868b–0x5286a3 建立 50、100、150…的累计阈值表。 COOL/GOOD 在 0x5289e9–0x528a73 先计分、再增加 2/1 的进度; 0x528afb–0x528b08 在进度不超过阈值时跳过晋级。因此第 25 个 COOL 到 50 时 尚未晋级,第 26 个到 52 后才晋级。这不是每一档都固定需要 26 个 COOL。 从全新状态连续 26 COOL,本客户端为 5200,当前项目为 5210。
  • Combo:0x528a78–0x528a99 增加内部计数后减一显示。项目内部 -1 哨兵的 正常显示语义与之相同,无需仅为整数存储方式不同而改动。
  • 药丸:0x5271dd–0x52723e 在普通模式满 15 连 COOL 时加药丸,上限 5。 BAD 分支 0x5274b0–0x5274f2 先清零连 COOL,再消耗药丸并直接调用 COOL 计分。 它不经过正常 COOL 分支,所以救回不会成为下一轮进度的第一击。
  • BAD 长条头:判定回调可以消耗药丸,但调用者在 0x52e28c 仍检查保存的原始 BAD,并在 0x52e2e8–0x52e34b 标记/回调尾 MISS。不能仅按头部显示 COOL 推断 长条已经转为可正常完成的状态。
  • 血量表:0x5292d0–0x52939c 与上述 EX/NX/HX 数值一致。 2026-10-05 的零血专项对照已区分普通、Couple、 教程场景,确认房间字段 0 的 EX/NX/HX 分流、普通统计更新及剩余药丸 BAD 例外。 任务、最终通过语义与完整原版实机时序仍待验证。用户随后明确选择 EX 完整数据 记录、血量锁零及曲终 F,原版局部冻结不再是项目目标;当前实现与验收见专项对照。

音频

键音编号翻译位于 0x5287f9–0x52881b:原始编号减一,背景样本另加 1000。 普通长条尾不会再次走头部 KS 播放路径。这些没有提供推翻项目现有编号映射或零 KS 处置的理由。

声音调度 0x50d210–0x50d373 根据样本编号取得已有缓冲区;重复触发时先停止,随后 从缓冲区起点播放。停止/重置位于 0x5082a0–0x5082f6,播放位于 0x5081f0–0x50827e。它与 Remix 的同编号单缓冲区策略一致。 当前项目每次事件取得新通道,允许同 KS 重叠;这是独立播放策略,应单独决定。

音量/声像分支 0x50d270–0x50d35f 也延续旧曲线: 声像为 (pan-8)×375 的 DirectSound 衰减值;音量按 KS/BG 设置值与 nibble 结合后 转为分贝衰减。例如设置值 255、音量 nibble 8 对应 -15 dB,而项目映射为 50% 线性增益。 单位、数值例与项目路径详见 Remix 音频对照。 本轮未测量实际输出响度、暂停行为、预览同步或回放跳转。

谱面与资源覆盖

安装柜中有 340 个描述项,含安装器自身与空占位;游戏载荷为其中 315 个成员。 所读取的 149 份 OJN 和 156 份音频库均通过成员长度/MD5 校验。

  • OJN:148 份以 new 加密封装,一份为普通 Tutorial。 按当前 OjnReader.decryptIfNeeded 的逆序/XOR 步骤还原后,149 份均得到 ojn 头部, 三个难度的事件块边界均可遍历。版本字段为 147 份 2.9、一份 2.0、一份 2.7。 后续以当前 Formats/Core 源码检查时,149 份和全部 447 难度槽均成功读取; 全难度与指定难度的音符/BPM 序列一致,头尾时间转换均为有限值。 这不等于 lazer 导入或逐事件原客户端行为已经验收。
  • 难度与事件:447 个难度槽位中 445 个有可演奏节点;可演奏通道有 7574 个长条头, BPM 通道有 3300 个非零事件。统计中的空槽仍是空槽,不视为缺失 KS 的证据。
  • 网格:出现 1/3/4/6/8/12/16/24/32/192,均能整除 192,没有发现非单位小节长度。 主程序 0x52a771–0x52a7b3 拒绝超过 192 槽,并采用整数 192 / 槽数。 此包仍未覆盖不整除网格、超过 192 槽或变小节长度的鲁棒性情况。
  • 音频容器:147 份 M30、5 份 OJM、4 份 OMC。M30 版本字段均为 0x30000, 139 份编码标志 0、8 份标志 16;项目已有 M30 标志 16 的 nami 解码路径。 后续使用当前 OjmReader 提取/解密 36,443 个样本,均具有 RIFF/OggS 头部, 未发生读取异常;没有试听或验证音频后端输出,不能宣称所有声音均通过验收。

Avatar、Interface、Playing、音乐目录及更新程序属于独立客户端范围。登录、房间、任务、 商城等功能不能直接列为 custom ruleset 的缺陷。包内没有 DPJAM 增强组件,亦不以字符串 搜索未命中某个命令来断言原程序绝无相应用途。

对后续工作的影响

目前需要决定的仍是 Remix 对照的 C01–C07,没有新增理由 推翻项目分层:判定/Jam/药丸/长条规则归 Core;音频参数与重复播放策略归接入层和 Host; 绘制与专用 Jam/药丸 HUD 归 Presentation;格式解码保持独立。

加入 Classic 后,两份主要参考在上述 C01–C07 一致;释放 24 属于 DPJAM 补丁路径, 不能优先于两份韩服主程序的释放 25。当前具体差异和后续顺序以合并对照为准。 后续按已选定的双客户端目标,用短判定/计分序列验收。长条颜色、裁切、消失动画,以及 输入延迟、暂停、听感和运行时更新仍需实际观察,不能由本报告代替。