floppy-diskСистема сохранений

Система сохранений предоставляет систему хранения данных в формате ключ-значение для сохранения прогресса и настроек игрока между сессиями.

Система сохранения — это простой хранилище ключ-значение. Вы задаёте ему строковый ключ (например "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 случай как «начать заново со значениями по умолчанию».

Версионирование сохранений (безопасная миграция старых данных)

Если вы когда-нибудь измените формат сохранения, храните version ключ и переносите старые сохранения вперёд.

Сохранение для всей игры (общее для всех)

Сохранение для всей игры общее для всей игры, а не по игрокам.

circle-info

Используйте Save.increment_game_int для счётчиков, которые могут одновременно обновлять несколько игроков (убийства, заходы, сыгранные раунды и т. д.).

Распространённые шаблоны

Булевы значения

Сохраняйте булевы значения как 0/1:

Именование ключей

Ключи — это просто строки, так что выбирайте названия, которые потом не будут конфликтовать:

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

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

Если у вас несколько игр, связанных через родительство игр (хаб + мини-игры), см. Кросс-игровые продукты/данные о том, как можно делиться данными сохранения.

Дополнительные API

Последнее обновление