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