在 Diablo II 的单机或离线环境里,.key
文件是每个角色不可或缺又常被忽视的“小跟班”。它单独存放在 save 目录中,用二进制方式记录技能栏、腰带、鼠标键及功能键等快捷映射,从而确保你在某一局游戏里用 F1-F8、Alt、I 等组合打造的个性化操作,下回加载角色仍能马上生效。丢失 .d2s
会导致角色报废,而丢失 .key
虽“只”让技能热键重置,却足以毁掉习惯已久的肌肉记忆——这也是众多玩家在论坛与 Reddit 上反复提到“按键全被重置”的根源。(reddit.com, us.forums.blizzard.com)
文件家族全景
save 目录里都有哪些后缀
.d2s
:角色属性与背包的主体数据。.ma0-.ma3
、.map
:本地地图缓存,加速同 seed 重进游戏。(us.forums.blizzard.com).key
:本篇主角,记录键位绑定。- 其他如
.ctl
/.ctlo
则在 D2R 中保存手柄布局。(us.forums.blizzard.com)
.key
为何单独拆分
- 读写效率——技能热键更新频繁,而角色数值相对稳定;分离可减少
.d2s
写入频次,降低损坏概率。 - 兼容性——暴雪在 1.13 之后把存档迁到
%USERPROFILE%\Saved Games
,但.key
结构几乎未动;即便导入到 D2R,仍可直接读取或重命名为.keyo
使用。(reddit.com) - 最小化冲突——多人共用一台电脑时,不同角色的键位互不干扰;这点在局域网对战年代尤为重要。
二进制结构速描
逆向工具表明,文件头前四字节为 ASCII
D2IK
(Diablo 2 Input Key),随后是版本号与校验码;之后按key-code-value
三元组顺序排列,每条记录 8 字节:
0-1
:按键扫描码,2-3
:技能或动作 ID,4-7
:保留/扩展位。
这样的定长设计让引擎在读档时可用 fread(8)
疯狂拉取,而不必解析可变长数据,保证 2000 年初代 DirectX 7 环境下依旧流畅。
引擎里的读写流程
- 角色进入游戏 →
LoadCharacter()
先打开.d2s
; - 随后 调用
LoadKeyConfig()
读取同名.key
;若文件缺失或 CRC 不匹配,函数返回默认键位表;(gamefaqs.gamespot.com) - 游戏运行过程中,每次玩家更改热键即触发
MarkKeyConfigDirty()
; - 存档时 若脏标志存在,只重写
.key
而非整个.d2s
,将 I/O 压力减半。
真实案例
某位玩家在工作机与家用 PC 之间同步角色,仅复制
Bob.d2s
,结果回家后发现所有快捷键回到 F1-F8 顺序;他补拷Bob.key
即恢复。(gamefaqs.gamespot.com)又如 D2R 1.1 补丁期间出现存储为大写文件名的 Bug,导致引擎找不到对应
.keyo
,玩家每天进游戏都要重新设键;手动改回小写即解。(us.forums.blizzard.com)
现实世界里,相似机制可见于 IDE 把个性化快捷键写进 keymap.xml
,或 Photoshop 的 .kys
文件——配置高频改动的内容单独存放,都是降低主数据损毁风险的工程思路。
与其他版本对比
版本 | 文件后缀 | 差异点 | 兼容措施 |
---|---|---|---|
经典 1.00-1.13 | .key | 纯键盘绑定 | 直接拷贝 |
D2R 离线 | .key | 结构相同,新增动作 ID | 可无损读取 |
D2R 在线 | .keyo | 服务器校验、云端备份 | 改名或让服务器重新生成 |
论坛技术贴实测,仅当导入离线角色到 D2R 时保留 .key
才能复现原热键,否则全部重置。(us.forums.blizzard.com, reddit.com)
备份与迁移指南
- 找到
C:\Users\<用户名>\Saved Games\Diablo II
(经典版)或Diablo II Resurrected
(重制版)。(reddit.com) - 复制同名
.d2s
+.key
(如有地图需求再加.ma0
)。(reddit.com) - D2R 若识别不到
.key
,尝试改为小写或附加o
。(us.forums.blizzard.com) - 建议用 OneDrive / Git 手动同步;不要依赖实时锁定的云盘,以免存档写入时被占用。
常见疑难解答
-
.key
损坏怎么办?
删除文件,游戏会生成默认键位;若同时备份.d2s
,不会丢失角色进度。 -
能否跨角色共用快捷键?
将模板角色的.key
复制并改名即可,但注意职业固有技能 ID 不同,复制后仍需微调。 -
手柄用户是否需要
.key
?
D2R 手柄映射写入.ctl
/.ctlo
,.key
仍保留鼠标键数据,方便在键鼠混用场景快速切换。(us.forums.blizzard.com)
设计哲学与结语
在 2000 年网速与硬盘都稀缺的时代,暴雪通过拆分 .d2s
与 .key
把频繁变动的数据与重要且庞大的角色信息隔离,配合 CRC 校验与单独写盘,打造出经得住 20 多年玩家折腾的文件格式。今日我们用 D2R、Steam Deck 甚至云端同步继续刷牛场时,依旧离不开这枚小巧的 .key
。下次手指顺滑切出 战吼
、旋风
,别忘了是它在默默守护你的习惯。
参考资料
- GameFAQs 讨论串对
.key
功能的早期说明(gamefaqs.gamespot.com) - Reddit
r/Diablo
关于存档文件作用的问答(reddit.com) - Blizzard 官方论坛讨论键位丢失及
.keyo
大小写 Bug(us.forums.blizzard.com) - Blizzard Support 文档中的存档迁移步骤(包含
.key
)(us.support.blizzard.com) - 技术支持区帖子对
.key
与.keyo
区别的说明(us.forums.blizzard.com) - Reddit 迁移 PlugY 存档经验分享(reddit.com)
- Reddit 讨论键位文件默认路径变化(reddit.com)
- Reddit 老帖子讲解
.key
不拷贝导致热键丢失(reddit.com) - GameFAQs 备份帖子中指出
.key
保存自定义热键的重要性(gamefaqs.gamespot.com) - Blizzard 论坛回答
.key
为“custom keymap” 的官方说法(us.forums.blizzard.com)