存档、偏好设置和回滚
Galgo 提供 slot 存档、全局偏好设置和对话回滚。存档系统面向剧情进度;画廊和成就属于全局解锁状态。
SaveSystem
创建引擎时会自动创建 SaveSystem:
galgo.Config{
SaveDir: "./saves",
}默认存档文件:
saves/
save_1.json
save_2.json
...
gallery.json设置页或快捷按钮里的 SAVE、LOAD 会调用内部保存/读取逻辑。
SaveConfig
config.SaveConfig 控制存档目录和 slot 数:
SaveCfg: config.SaveConfig{
SaveDir: "./saves",
MaxSlots: 6,
}如果 SaveCfg.MaxSlots 为 0,引擎会使用 config.DefaultSaveConfig(SaveDir)。
EngineState 内容
EngineState 保存:
- 当前节点 ID。
- 当前 Step 下标。
- 当前背景 key/path。
- 当前立绘状态。
- 当前 BGM key/path。
- 变量表。
- 历史记录。
- 回滚状态。
这意味着保存后再读取,剧情会回到对应节点和步骤,背景、立绘、变量和历史记录也会恢复。
自定义保存
可以手动拿到状态:
state := engine.GetSaveState()
err := engine.SaveSystem.Save(1, state)读取:
state, err := engine.SaveSystem.Load(1)
if err == nil {
engine.LoadSaveState(state)
}多数游戏不需要直接调用这些方法,使用内置保存/读取页面即可。
变量和存档
变量表会随存档保存。适合保存剧情分支、好感度、玩家名、临时流程状态:
engine.SetVariable("aria_affection", 3)
engine.SetVariable("player_name", "Haruto")不建议把大对象、文件句柄、函数、图片对象放进变量表,因为它需要 JSON 序列化。
全局解锁状态
画廊和成就保存在 gallery.json。它独立于单个 slot:
- 解锁过的 CG 不会因为读旧档而丢失。
- 解锁过的 BGM 不会因为读旧档而丢失。
- 成就同理。
这符合大多数视觉小说的画廊行为。
Preferences
config.Preferences 保存玩家偏好:
- BGM 音量。
- SE 音量。
- Voice 音量。
- 文字速度。
- 全屏设置。
- 语言。
偏好设置由 PreferencesManager 管理。当前引擎已有设置页组件直接改运行时值;如果需要持久化偏好,可以扩展保存/加载调用。
回滚
回滚用于从历史记录回到之前的对话状态。对话 Step 和输入 Step 会推入回滚状态。
玩家打开历史页后,点击历史记录项会尝试回滚。成功后当前菜单关闭,剧情状态恢复。
如果回滚栈里没有对应状态,引擎会显示提示:
Cannot rollback past this point回滚设计建议
不要在可回滚的对话前后做不可逆外部操作,例如写文件、发网络请求、触发平台成就。如果必须做,建议在 Callback 中判断变量,确保重复执行不会造成问题。
例如:
galgo.Callback(func(e *galgo.Engine) bool {
if e.GetBoolVar("achievement_synced", false) {
return false
}
e.UnlockAchievement("chapter_1")
e.SetVariable("achievement_synced", true)
return false
})存档兼容性
如果后续版本改变变量结构或节点 ID,旧存档可能无法回到预期剧情。建议:
- 节点 ID 一旦发布尽量不改。
- 变量名一旦发布尽量不改。
- 删除节点前考虑旧存档迁移。
- 新增变量时提供默认值读取,例如
GetBoolVar("flag", false)。