维护状态(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。当前具体差异和后续顺序以合并对照为准。 后续按已选定的双客户端目标,用短判定/计分序列验收。长条颜色、裁切、消失动画,以及 输入延迟、暂停、听感和运行时更新仍需实际观察,不能由本报告代替。