跳转至

存档系统

职责

存档系统把世界持久化为带版本 JSON 与辅助文件,包括 game/global state、avatar/NPC、 monster、overmap、submap、vehicle、item、activity、faction、mission、map memory 和 Mod 顺序,同时读取仍受支持的旧表示。

入口点

从 src/savegame.cpp、src/savegame_json.cpp、src/savegame_legacy.cpp 开始。常量 savegame_version、解析后的 savegame_loading_version、顶层 game load/store,以及各 类型 serialize / deserialize 对构成兼容边界。

数据所有权

每个运行时 owner 序列化自己的持久状态,world directory 拥有文件集合。save 层协调 记录,但不能成为第二运行时 owner;cache、pointer、window 与局部坐标视图读取后重建。

依赖

保存依赖 filesystem/path API、JSON archive、worldfactory、map/overmap 存储、每个持久 子系统的 serializer、ID、Mod order 与 migration/default 逻辑。

生命周期

新世界使用当前版本;保存写入版本标记与记录;读取识别 stored version,应用字段默认/ legacy 转换,重连 ID 与所有权,重建缓存,然后返回活跃世界。

不变量

读取受支持旧字段不能破坏数据;对象只由 owner 序列化一次;ID 与绝对坐标稳定;失败 写入不能伪装成完整存档;只有具备有意迁移支持时才提升版本。

扩展点

序列化放在 owning type 旁,使用命名字段和安全默认,仅在必要时增加显式版本 migration。 不能保存 raw pointer 或派生 cache。

序列化

本子系统本身就是序列化契约。字段变化必须说明 writer、reader、default、影响旧版本、 移除期限与往返证据;删除/重命名必须提供兼容策略。

测试

使用聚焦 serializer/world 测试和可用旧存档 fixture,验证当前往返、缺失字段、错误输入 处理和被触及最旧版本。

性能

save/load 会遍历大量世界状态并大量分配。保持 streaming 边界,避免二次复杂度 ID 重连, 用大型世界测量且不能用计时掩盖失败。

CCB 差异

CCB 当前版本与 legacy reader 只对 CCB 权威。复制上游 serializer 前必须比较字段历史、 Mod migration 与 world layout。

技术债务

兼容逻辑分散在类型 serializer 与版本检查。每个新例外应局部化并记录,不能把宽格式 重写与无关修改混在一起。