保存备份

保存备份

存档文件自动滚动备份,并在读取游戏界面增加“备份”标签页。恢复时会连同MOD数据一并还原,实现快照即可完整复原所有内容。

SaveBackups

模组化的游戏有时会损坏存档。本模组会持续保留存档的滚动副本,并允许你在游戏内恢复任意一版。

Load Game 界面的 Save Info 面板上会出现一个 Backups 按钮。它会列出该存档的所有备份,包括创建时间及内容概要,每一行都带有恢复(Restore)和删除(Delete)选项。

备份面板

img

每份备份文件中的金钱、岛屿和游玩时间都会被读取出来,因此你可以直接判断需要哪个备份,而不是仅凭时间戳去猜测。

何时进行备份

每次游戏保存时(包括五分钟自动保存)都会自动进行备份;当你选择一个存档进行加载时同样会备份,因此你始终保留着本次游戏开始时的状态。你也可以通过 立即备份 按钮随时手动备份。

完全相同的存档会被跳过,因此挂机不会让历史记录堆满相同内容的副本。这意味着你保留下来的槽位都是真正不同的状态。

恢复安全可靠

恢复操作会首先为当前文件创建一个备份,标记为手动备份,因此恢复操作本身也是可撤销的。如果选错了备份,你也不会丢失任何东西。

手动备份永远不会被自动删除。只有自动备份会进行轮换,保留最新的几个。这一点很重要:如果手动备份也被清理,那么出错后的几次自动保存可能会悄悄删除你所依赖的良好副本。

该模组也拒绝备份或恢复空文件,因为空存档通常是损坏的表现,将其复制到你的历史记录中会毁掉你需要的备份。

模组数据同样包含在内

有些模组会将自身的存档数据保存在单独的文件中。如果只回滚原版存档,你最终会得到一个不匹配的世界:基础状态来自快照,模组状态却来自当前。

因此,快照会将存档任何已注册的模组文件保存在一起,并作为一个整体进行恢复。含有模组数据的行会带有 + 标记和数量。将鼠标悬停在上方可以查看该快照中具体包含哪些模组。

悬停查看模组文件数量

img

如果你恢复的快照对应模组已经不在安装列表中,存档仍会照常恢复,面板会告诉你哪些数据被跳过了。

保留重要的备份

每一行都有一个星标。点击后该备份会被固定到列表顶部,并且无论之后堆积多少自动保存,它都不会被删除以腾出空间。

收藏的备份固定在顶部

img

这适用于你想回来继续游玩的存档:安装高风险模组之前的进度,或你确认状态良好的档。取消星标后它将重新加入正常的轮换,手动删除仍然正常可用。

写给模组作者

如果你的模组为每个存档写入独立文件,只需两行代码即可让它加入每次快照。

添加一个软依赖,使你的模组在没有 SaveBackups 时仍能运行:

[BepInDependency("dazed.howtofish.savebackups", BepInDependency.DependencyFlags.SoftDependency)]

即使 API 不再需要这个特性,也值得添加该特性标记。BepInEx 会按插件 ID 顺序启动插件,如果没有它,你的模组很可能会在本模组之前启动。

然后在 Awake 中注册,为给定的存档名称返回绝对路径,如果该存档没有对应文件则返回 null:

SaveBackups.Companions.Register(
    "yourmodid",
    "Your Mod Name",
    saveName => Path.Combine(
        Paths.ConfigPath,
        "YourMod",
        "Saves",
        SaveBackups.Companions.SanitiseSaveName(saveName) + ".json"));

传入的存档名称与游戏存储时完全一致,包括标点符号。如果你的文件名基于清理过的名称,请调用 SaveBackups.Companions.SanitiseSaveName,而不要自己编写规则,这样你的文件名始终与本模组查找的名称一致。

这就是完整的集成流程。SaveBackups 在快照时复制文件,在恢复时写回文件,并根据需要创建目录。文件缺失是正常情况,不会被视为错误。

如果你完全不想引用 SaveBackups,所有调用都可以通过反射针对 SaveBackups.Companions 类型完成。注册前请检查 IsAvailable 确认类型是否正确解析。

文件存放位置

%USERPROFILE%\AppData\LocalLow\Dazed Games\How to Fish\SaveBackups\<存档名称>\<时间戳>\
    save.txt
    companion.<modid>.json
    snapshot.json

这些文件只是真实文件的直接副本,因此你也可以手动复制回来。菜单中的 打开文件夹 可以直接带你到该目录。

1.1.0 版本之前创建的备份是单个文件而非文件夹。这些备份仍会被列出并能够恢复,作为仅存档快照。不会有任何数据迁移或重写。

配置

BepInEx/config/dazed.howtofish.savebackups.cfg

设置项 默认值 功能说明
BackupOnSave true 每次保存时进行备份,包括自动保存
BackupOnLoad true 当选择存档进行加载时进行备份
SkipUnchanged true 不存储与最新备份完全相同的副本
MaxAutomaticBackups 10 每个存档保留的自动备份数量。0 表示保留全部
MaxPreRestoreBackups 5 每个存档保留的安全快照数量,在每次恢复前自动创建。0 表示保留全部
BackupsPerPage 6 每页显示的备份数量。使用底部的箭头访问更早的备份
ButtonGap 14 存档信息面板上删除、加载和备份按钮之间的间距
DeferCapture true 在帧结束时复制文件,以便模组数据与存档同步捕获

磁盘占用很小。存档文件体积小,10 个存档备份通常远小于 1MB。

注意事项

单人游戏和托管存档均可正常工作,因为这些是服务器的存档文件。只有主机才有这些文件,因此加入他人的游戏时没有可备份的内容。

在复制之前不会覆盖任何文件,也不会修改任何游戏文件。移除模组后,你的存档保持原样,备份文件夹可随意删除。