Skip to content

存档、偏好设置和回滚

Galgo 提供 slot 存档、全局偏好设置和对话回滚。存档系统面向剧情进度;画廊和成就属于全局解锁状态。

SaveSystem

创建引擎时会自动创建 SaveSystem

go
galgo.Config{
    SaveDir: "./saves",
}

默认存档文件:

text
saves/
  save_1.json
  save_2.json
  ...
  gallery.json

设置页或快捷按钮里的 SAVELOAD 会调用内部保存/读取逻辑。

SaveConfig

config.SaveConfig 控制存档目录和 slot 数:

go
SaveCfg: config.SaveConfig{
    SaveDir:  "./saves",
    MaxSlots: 6,
}

如果 SaveCfg.MaxSlots 为 0,引擎会使用 config.DefaultSaveConfig(SaveDir)

EngineState 内容

EngineState 保存:

  • 当前节点 ID。
  • 当前 Step 下标。
  • 当前背景 key/path。
  • 当前立绘状态。
  • 当前 BGM key/path。
  • 变量表。
  • 历史记录。
  • 回滚状态。

这意味着保存后再读取,剧情会回到对应节点和步骤,背景、立绘、变量和历史记录也会恢复。

自定义保存

可以手动拿到状态:

go
state := engine.GetSaveState()
err := engine.SaveSystem.Save(1, state)

读取:

go
state, err := engine.SaveSystem.Load(1)
if err == nil {
    engine.LoadSaveState(state)
}

多数游戏不需要直接调用这些方法,使用内置保存/读取页面即可。

变量和存档

变量表会随存档保存。适合保存剧情分支、好感度、玩家名、临时流程状态:

go
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 会推入回滚状态。

玩家打开历史页后,点击历史记录项会尝试回滚。成功后当前菜单关闭,剧情状态恢复。

如果回滚栈里没有对应状态,引擎会显示提示:

text
Cannot rollback past this point

回滚设计建议

不要在可回滚的对话前后做不可逆外部操作,例如写文件、发网络请求、触发平台成就。如果必须做,建议在 Callback 中判断变量,确保重复执行不会造成问题。

例如:

go
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)

Released under the project license.