[M13] .d2s 存档互通:读写官方存档 #28

Closed
opened 2026-09-15 06:36:02 +00:00 by troytt · 0 comments
Owner

里程碑 M13 · 重要程度 ★★★★☆ · 风险 中高 · 依赖:M8, M10, M11
完整路线图见 ROADMAP.md


背景

Master 明确要求支持读取真实 .d2s 存档并与官方游戏互通。

当前 src/game/save.ts 只解析 签名 / 版本 / 名字 / 职业 / 等级 / 校验和,
其余段原样保留字节(这是对的——见下方铁律)。

为什么排在 M11 之后

.d2s 的数据段涵盖:

段 依赖的里程碑
角色属性(stats) M9
全部 30 个技能的加点(skills) M11
背包 / 身上 / 腰带 / 仓库的全部物品(items) M10
任务进度(quests) M14
传送点解锁状态(waypoints) M8
雇佣兵 / 尸体 / 铁傀儡 M7

没有 M8 / M10 / M11 就无法做有意义的往返。

改动清单

  • [MODIFY] src/game/save.ts —— 逐段实现:
    • header(765 B)
    • quests(298 B)
    • waypoints(81 B)
    • npc(51 B)
    • stats(变长位域)
    • skills(32 B)
    • items(变长位域)
    • corpse / mercenary / iron golem
  • [NEW] src/formats/d2s-bits.ts —— 物品段是位对齐而非字节对齐的变长编码,需要独立的位读写器
  • [NEW] scripts/verify-d2s.ts —— 往返差分:读入真实存档 → 解析 → 重新序列化 → 逐字节与原文件比对

⚠️ 安全约束

铁律 8:解码器宁可拒绝也不猜。

猜错的 .d2s 解码器会静默产出坏存档,而坏存档可能损坏 Master 的真实角色。

在往返比对逐字节通过之前,写入路径必须默认禁用。

校验和必须重算正确,否则官方客户端拒绝加载。

验收

  • 用本引擎读取官方 1.13c 存档,角色属性 / 技能 / 背包完全正确
  • scripts/verify-d2s.ts 往返逐字节比对通过
  • 反向写出的存档能被官方客户端正常加载,且角色无损
  • 对无法确认的字段保持原样保留字节,不做「看起来合理」的解析
> **里程碑 M13** · 重要程度 ★★★★☆ · 风险 中高 · 依赖:M8, M10, M11 > 完整路线图见 [`ROADMAP.md`](https://git.projectdiablo2.cn/troytt/diablo2-web/src/branch/main/ROADMAP.md) --- ## 背景 Master 明确要求支持读取真实 `.d2s` 存档并与官方游戏互通。 当前 `src/game/save.ts` 只解析 **签名 / 版本 / 名字 / 职业 / 等级 / 校验和**, 其余段**原样保留字节**(这是对的——见下方铁律)。 ## 为什么排在 M11 之后 `.d2s` 的数据段涵盖: | 段 | 依赖的里程碑 | |---|---| | 角色属性(stats) | M9 | | **全部 30 个技能的加点**(skills) | **M11** | | **背包 / 身上 / 腰带 / 仓库的全部物品**(items) | **M10** | | **任务进度**(quests) | M14 | | **传送点解锁状态**(waypoints) | **M8** | | 雇佣兵 / 尸体 / 铁傀儡 | M7 | 没有 M8 / M10 / M11 就无法做有意义的往返。 ## 改动清单 - **[MODIFY] `src/game/save.ts`** —— 逐段实现: - `header`(765 B) - `quests`(298 B) - `waypoints`(81 B) - `npc`(51 B) - `stats`(变长位域) - `skills`(32 B) - `items`(变长位域) - `corpse` / `mercenary` / `iron golem` - **[NEW] `src/formats/d2s-bits.ts`** —— 物品段是**位对齐**而非字节对齐的变长编码,需要独立的位读写器 - **[NEW] `scripts/verify-d2s.ts`** —— **往返差分**:读入真实存档 → 解析 → 重新序列化 → **逐字节与原文件比对** ## ⚠️ 安全约束 > **铁律 8:解码器宁可拒绝也不猜。** > > 猜错的 `.d2s` 解码器会**静默产出坏存档**,而坏存档可能损坏 Master 的真实角色。 > > **在往返比对逐字节通过之前,写入路径必须默认禁用。** 校验和必须重算正确,否则官方客户端拒绝加载。 ## 验收 - [ ] 用本引擎读取官方 1.13c 存档,角色属性 / 技能 / 背包完全正确 - [ ] `scripts/verify-d2s.ts` 往返逐字节比对通过 - [ ] 反向写出的存档能被官方客户端正常加载,且角色无损 - [ ] 对无法确认的字段保持原样保留字节,不做「看起来合理」的解析
troytt added this to the [M13] .d2s 存档互通:读写官方存档 milestone 2026-09-17 07:23:20 +00:00
Sign in to join this conversation.
No Label
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: troytt/diablo2-web#28
No description provided.