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

  • Вещественное (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 больше не соответствует вашей структуре. Рассматривайте это как «начать заново с значениями по умолчанию».

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

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

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

Сохранение для всей игры разделяется по всей игре, а не для каждого игрока отдельно.

circle-info

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

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

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

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

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

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

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

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

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

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