Система сохранений предоставляет систему хранения данных в формате ключ-значение для сохранения прогресса и настроек игрока между сессиями.
Система сохранения — это простой хранилище ключ-значение. Вы задаёте ему строковый ключ (например "xp"), и он сохраняет значение, которое останется там и в следующий раз, когда игрок зайдёт в игру.
Есть два вида данных сохранения:
Сохранение игрока: личные данные одного игрока (XP, улучшения, настройки, инвентарь и т. д.)
Сохранение для всей игры: общее для всех в игре (мировые рекорды, настройки сервера, глобальные счётчики и т. д.)
Не используйте систему сохранения для хранения покупок, которые игроки сделали за sparks. Используйте API покупок/продуктов вместо этого.
Быстрый старт (сохранить + загрузить стат)
Самый распространённый шаблон:
Загружайте сохранённые значения в 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
Всегда указывайте разумное значение по умолчанию при чтении. У новых игроков ещё не будет ключей, и get_* вернёт ваше значение по умолчанию.
Сохранение «более крупных» данных (JSON)
Если у вас есть небольшой набор полей (например, прогресс + разблокированные вещи), часто удобнее сохранить его как один JSON-блок.
Только поля, помеченные @ao_serialize , сохраняются.
Save.try_get_json возвращает false если ключ не существует или JSON-строка имеет неверный формат. Если ключ существует, но структура изменилась (добавлены новые поля, удалены старые поля), он возвращает true с отсутствующими полями, заполненными нулями. Рассматривайте false случай как «начать заново со значениями по умолчанию».
Версионирование сохранений (безопасная миграция старых данных)
Если вы когда-нибудь измените формат сохранения, храните version ключ и переносите старые сохранения вперёд.
Сохранение для всей игры (общее для всех)
Сохранение для всей игры общее для всей игры, а не по игрокам.
Используйте Save.increment_game_int для счётчиков, которые могут одновременно обновлять несколько игроков (убийства, заходы, сыгранные раунды и т. д.).
Распространённые шаблоны
Булевы значения
Сохраняйте булевы значения как 0/1:
Именование ключей
Ключи — это просто строки, так что выбирайте названия, которые потом не будут конфликтовать:
"xp", "level", "selected_skin"
"tycoon.cash", "tycoon.upgrades.mouth_level"
Если у вас несколько игр, связанных через родительство игр (хаб + мини-игры), см. Кросс-игровые продукты/данные о том, как можно делиться данными сохранения.