# 素材来源与版本说明

本作是《Wolfenstein 3D》（德军总部 3D）的非官方同屏双人合作改编。墙面、敌人、武器、物品、BJ 头像、状态栏、标题画面、数字音效和第一章地图均来自原版 **WL1 共享版数据**，通过格式解码提取，保留原始像素与调色板；没有使用生成式图片替代原作素材。

## 来源

- [共享版数据与格式解码参考](https://github.com/imjasonh/wolf3d/tree/2b93eff87859dbda738de086e76ae2cb748b8025/fixtures/wl1)：该目录的 PROVENANCE.md 说明了数据的镜像来源。
- [上游数据镜像](https://github.com/ccie18473/wolf4rust)。
- [id Software 发布的原始引擎源码](https://github.com/id-Software/wolf3d)：用于核对精灵编号、界面位置和音效映射等。
- [原始数据文件校验值](./provenance.json)：列出八个输入文件的大小及 SHA-256，包含用于读取音效优先级的 `audiohed.wl1` 和 `audiot.wl1`。

本版本使用第一章的十张原始地图，以及共享版实际包含的图形和全部 20 个数字音效（VSWAP 序号 0–15、20–22、32），包含 `YEAHSND` 胜利喊声。音效优先级来自 AUDIOT 的 AdLib `SoundCommon` 头，名称顺序依据 `AUDIOWL6.H`。数字音效采用全局单路优先级仲裁，敌人和门的左右声道衰减依据 `WL_GAME.C` 原版定位表；双人时选择听得最响的存活玩家。双人分屏、合作交互与网页控制属于本改编的新增实现，不能视为原版游戏行为的完整复现。

原作图形、音频、地图及商标的权利仍归 id Software 和相关权利人所有。“共享版”不表示素材可以不受限制地重新使用或分发；本作不声称取得额外授权，也不代表或得到权利人的认可。

本站源码保存了 `tools/extract-wolf.mjs`、可独立运行的 `tools/extract-sounds.mjs` 和 `tools/ORIGINAL-ASSETS.md`，用于记录可复现的提取步骤与验证结果。未运行或发布原版 EXE。


## AdLib 音效与 IMF 音乐

本次另从 AUDIOT 提取了全部 87 个 AdLib 音效和共享版实际包含的 11 首音乐。`audiohed.wl1` 提供 chunk 边界，名称顺序来自 `AUDIOWL6.H`：

- 音效 chunk 87–173：`u32le length + u16le priority + Instrument(16) + u8 block + data[length]`。小于 23 字节、零长度、数据越界或 `mSus | cSus == 0` 都会报错；标签尾巴忽略。`wolf-data.json.adlibSounds` 保存优先级、block、32 位小写 hex 乐器和小写 hex 数据。
- 音乐 chunk 261–287：`u16le length + IMF[length]`。长度零表示共享版缺失；chunk 小于两字节、长度不是四的倍数、数据越界都会报错。每个 IMF 事件是 `u8 寄存器 + u8 值 + u16le 延迟`。`music/*.imf` 只保存事件，不带长度字和标签，JSON 用去掉 `_MUS` 的原名映射相对路径。
- 全部校验都先于写出，各文件继续使用临时文件加 rename。20 个原有 WAV 和 `provenance.json` 与更新前逐字节相同，原有 JSON 字段不变。

`opl.js` 是原创、无依赖的 YM3812 数值仿真，参考 Yamaha 的 [YM3812 数据手册](https://www.ardent-tool.com/datasheets/Yamaha_YM3812.pdf)及项目规格中的芯片公式。logsin/exp 表由数学公式生成，未移植第三方仿真器代码或表，也未使用 GPL/LGPL 仿真器代码。实现九路双算子、包络、KSL/KSR、四种波形、反馈、FM/加法连接和颤音/振颤，原生采样率为 `3579545 / 72`。包络采用经时间标定的数值模型，不声称与芯片逐时钟完全一致；节奏模式和 CSM 未实现。

音效与音乐驱动依据原版 `ID_SD.C/H` 的寄存器写入顺序，在 700 Hz tick 先服务 IMF，再每五个 tick 服务一次 140 Hz 音效。音乐循环忽略最后一个事件的延迟，结算曲等待 AdLib 音效结束再开始。浏览器优先使用 AudioWorklet，失败时降级到已连接的 ScriptProcessor，二者共享同一引擎并线性重采样，输出增益为 0.9。关卡、菜单、暂停及结算曲遵循 `WL_PLAY.C`、`WL_MENU.C/H`、`WL_INTER.C`；音乐和音效分别开关。

没有数字采样的原版音效进入独立的单路 AdLib 优先级声道，拾取等事件已替换方波占位音。双人新增映射为：救起队友播放 `HEALTH2SND`，电梯等待队友播放 `NOWAYSND`。文件大小、提取格式和运行时细节见项目中的 `tools/ORIGINAL-ASSETS.md`。
