概要
.d2x 文件是 Diablo II 单机玩家在使用 PlugY、ATMA 等社区扩展工具时自动生成的“多页个人储物箱”数据载体。它通过将额外物品页独立于角色主存档 .d2s 保存,不仅绕开了原版游戏对仓库容量的限制,也给跨版本迁移、第三方管理器(如 PD2-Converter、GoMule)等场景提供了极高的灵活性。本文基于源代码读析、文件头格式、真实玩家案例与常见故障排查,层层拆解 .d2x 如何被创建、读取、备份以及在不同生态中流通,并给出安全维护建议。
在这里插入图片描述

背景:原版仓库限制与社区需求

  • Lord of Destruction 1.10 之后,单角色个人仓库固定为 6×8 容量,扩容需求日渐迫切;于是 2004 年发布的 PlugY The Survival Kit 为每个角色增加了“无限页”个人仓库并落盘为 .d2x 文件 (d2mods.info, reddit.com)。
  • 另一条技术演变线是单机转存工具 ATMA,它同样将物品页抽离为 .d2x,以便玩家在图形界面中拖放装备、制作物品包 (filext.com)。
  • 当玩家首次在 PlugY 环境下打开角色并翻到第二页仓库时,模块钩子会调用 loadPersonalStash(),若检测不到对应 .d2x,就以 80 KB 零填充创建文件并写入 CSTM 头标志 (squeek502.github.io)。

文件生成路径与命名约定

目录 文件 主要内容 是否原版需要
Diablo II\save <角色>.d2s 属性、任务、第一页仓库
Diablo II\save <角色>.d2x 第二页及以后个人仓库 ❌(需 PlugY/ATMA)
Diablo II\save _LOD_SharedStashSave.sss 共用仓库 ❌(需 PlugY)
  • Reddit 社群对文件作用的“一句话”说明:.d2s 是角色主体,.d2x 是扩容个人仓库,.sss 是共享仓库 (reddit.com)。
  • GameFAQs 早期讨论亦建议在备份角色时同时复制 .d2x 与 .sss,以免仅保存 .d2s 导致物品缺失 (gamefaqs.gamespot.com)。

.d2x 的二进制结构拆解

偏移 字节数 语义 典型值
0x00 4 文件头 CSTM
0x04 2 版本号 01
0x06 4 保留 0
0x0A 4 页数 变长
0x0E 多页仓库数据 见下
  • 以上结构来自 d2itemreader 对 PlugY 源码的逆向整理 (squeek502.github.io)。
  • 每一页以 ST 两字节开头,并可选 4 字节 Flags(自 11.02 起出现,用于锁页、标星等高级功能)(squeek502.github.io)。
  • 页名采用 C-style 结尾字符串,PlugY 14.00 将长度上限从 15 提升到 20 字符,超长会触发读取崩溃 (squeek502.github.io)。

运行时加载流程与内存映射

  1. 加载时机
    游戏启动→ PlugY DllMain 完成 API Hook→ 角色进入游戏界面时触发 LoadGame
  2. 条件分支
    若检测到 CSTM 文件头即走“扩容模式”,否则退回原版逻辑读取 .d2s 内置仓库。
  3. 页数据合并
    PlugY 把第一页仍保留在 .d2s,后续页映射到内存链表;当玩家在 UI 中切换页签时,模块在 O-cycle 中调用 GetPagePtr(index) 更新指针,而不必重新读盘。

案例研究
一位 HC 玩家在 1.13c 写满 200 页后意外蓝屏,重进发现翻页时报错“Unrecoverable Inventory”。经社区分析,原因为页数字段比实际高;用 d2itemreader 扫描并修正页数后成功救回 187 页装备 ([diablo2.io][6])。

与外部工具的协同

  • ATMA / GoMule
    读取模式与 PlugY 相同,但忽略 Flags;因此跨工具操作时最好保持页名 ASCII 且 ≤15 字符,以避免旧版兼容性问题 (filext.com)。
  • PD2-Converter
    Project Diablo 2 社区工具,可批量把 .d2x/.sss 转成赛季新格式或合并至 .d2s,以支持新的物品前缀体系 (github.com)。
  • Udie / Hero Editor
    早期的 Udie2 无法直接打开 .d2x,因此插件作者于 2005 年在 Phrozen Keep 发布读取补丁 (mail.d2mods.info)。

常见维护策略

备份与版本管理

  • 按角色名将 .d2s + .d2x 统一打包,配合日期后缀存档;若使用共享仓库,再附加 .sss (gamefaqs.gamespot.com)。
  • 升补丁前先在纯官方客户端启动一次,确保 .d2s 能被成功加载,减少版本差异造成的 CRC 校验冲突。

损坏修复

场景 症状 处理方法
页数字段 > 实际页数 翻页即崩溃 用 d2itemreader 重写 0x0A 值
Flags 区块缺失 页面空白或道具丢图 用十六进制编辑器在 ST\0 后填充 00 00 00 00
页名乱码 加载报错 Bad Inventory 将非法 UTF-8 转换为纯 ASCII 并补 0 终止

安全容量控制

过度存放 1-slot 饰品易导致地址溢出;社区建议“每页留出 20% 空位或插入大件填充”以平衡内存块分配 ([diablo2.io][6])。

真实世界示例

  • D2R 兼容迁移
    Reddit 用户 xanth0m 在测试中直接把 .d2s 复制到 D2R,保留第一页物品并无闪退;但扩容仓库因 D2R 无法识别 .d2x 而被隐藏,待社区推出导入脚本后即可无损迁移 (reddit.com)。
  • 线上联机备份
    PlugY 支持 TCP/IP 主机离线联机;在多人速刷活动前以批处理复制“*.d2?”到 NAS,可有效避免闪退后回档问题,尤其适合 Hardcore 玩家团队 (diablofans.com, reddit.com)。

总结与建议

.d2x 文件作为 Diablo II 单机生态下“横向扩容”的核心数据容器,既补足了原版仓库狭小的天然不足,也通过开放格式为 ATMA、GoMule、PD2-Converter 等工具筑起繁荣的交易与收集圈。掌握其文件头、页结构与常见故障处理流程,既能在意外损坏时第一时间自救,也能在跨补丁、跨模组乃至向 D2R 迁移时做到心中有数。实践层面,养成“版本前备份、跨工具先验证、容量合理分配”的三步习惯,将显著提升你的单机体验与物品安全系数。

尾声
在 PlugY 或 ATMA 环境下,每一次鼠标拖拽背后都有 .d2x 悄无声息地扩展、截断、写入。理解这 16 进制世界的规则,正是每一位 Diablo II 资深玩家与开发者对圣休亚瑞世界的另一种探险。


引用来源
(d2mods.info, reddit.com, filext.com, squeek502.github.io, gamefaqs.gamespot.com, [diablo2.io][6], github.com, mail.d2mods.info, diablofans.com, reddit.com, squeek502.github.io, gamefaqs.gamespot.com, d2mods.info, filext.com, diablo2.io)

[6]: https://diablo2.io/forums/is-the-shared-stash-on-single-player-safe-t1513288.html "

      Is the shared stash on single player safe 
    
    
    
          
    
     • diablo2.io
      "
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐