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

里程碑 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 往返逐字节比对通过
  • 反向写出的存档能被官方客户端正常加载,且角色无损
  • 对无法确认的字段保持原样保留字节,不做「看起来合理」的解析
No due date
100% Completed
#28 by troytt was closed 2026-09-23 01:12:13 +00:00 0 / 4