floppy-disk保存系统

保存系统提供了一个键值数据存储系统,用于在不同会话之间持久保存玩家进度和偏好。

Save 系统是一个简单的 键值存储。你给它一个字符串键(例如 "xp"),它会存储一个值,并且在玩家下次加入时这个值还会保留在那里。

保存数据有两种类型:

  • 玩家保存:某个玩家的个人数据(XP、升级、设置、库存等)

  • 全局保存:游戏中的所有人共享(世界纪录、服务器设置、全局计数器等)

circle-exclamation

快速开始(保存 + 加载一个状态)

最常见的模式是:

  • 在以下位置加载已保存的值 ao_start

  • 每当值改变时再次保存

Player :: class : Player_Base {
    xp: s64;
    level: s64;

    ao_start :: method() {
        // 新玩家会使用默认值
        xp    = Save.get_int(this, "xp", 0);
        level = Save.get_int(this, "level", 1);
    }
}

add_xp :: proc(player: Player, amount: s64) {
    player.xp += amount;

    // ... 你的升级逻辑写在这里 ...

    // 值变化时立即保存
    Save.set_int(player, "xp", player.xp);
    Save.set_int(player, "level", player.level);
}

玩家保存(每玩家数据)

玩家保存的作用范围是单个玩家。每个玩家都有自己独立的键/值数据。

支持的类型:

  • 字符串: Save.set_string / Save.get_string

  • 整数(s64): Save.set_int / Save.get_int (注意:当前值在内部会被截断为 32 位)

  • 浮点数(f64): Save.set_f64 / Save.get_f64

  • JSON(高级): Save.set_json / Save.try_get_json

circle-info

读取时始终提供一个合理的默认值。新玩家还没有这些键, get_* 会返回你的默认值。

保存“更大”的数据(JSON)

如果你有一小组字段(比如进度 + 已解锁内容),通常把它作为一个 JSON 数据块来保存会更好。

只有带有 @ao_serialize 标记的字段会被保存。

circle-info

Save.try_get_json 在以下情况下返回 false :如果键不存在,或者 JSON 字符串格式不正确。如果键存在但结构已更改(新增字段、删除旧字段),则返回 true 并将缺失字段补零。把 false 这种情况视为“使用默认值重新开始”。

保存版本控制(安全迁移旧数据)

如果你以后更改了保存格式,请保留一个 版本 键,并将旧保存数据向前迁移。

全局保存(所有人共享)

全局保存是整个游戏共享的,不是按玩家区分的。

circle-info

使用 Save.increment_game_int 适用于多个玩家可能同时更新的计数器(击杀、加入、已进行回合等)。

常见模式

布尔值

将布尔值保存为 0/1:

键命名

键只是字符串,所以请选择以后不会冲突的名称:

  • "xp", "level", "selected_skin"

  • "tycoon.cash", "tycoon.upgrades.mouth_level"

如果你通过游戏父子关系连接了多个游戏(大厅 + 小游戏),请参阅 跨游戏产品/数据 了解保存数据如何共享。

其他 API

最后更新于