Сохраняем рекорд
Сохраняем данные игрока отдельно от конфигурации игры.
TypedStateStore предоставляет запись и чтение состояния через один декодер.
Сохраним лучший результат партии. Этот код выполняется после запуска движка с system.persistence.namespace: 'sdk-game':
import {
PersistentStorageAdapter, StorageNamespace, TypedStateStore,
} from '@gamedevland/engine/configs';
import { SchemaDecoder } from '@gamedevland/engine/validation';
const store = new TypedStateStore({
adapter: new PersistentStorageAdapter(),
namespace: new StorageNamespace('sdk-game'),
key: 'progress-v1',
decoder: SchemaDecoder.object({
bestScore: SchemaDecoder.number({ integer: true, min: 0 }),
}),
defaults: () => ({ bestScore: 0 }),
});
const progress = store.load();
store.save({ bestScore: Math.max(progress.bestScore, 100) });
Здесь сохраняем 100 очков. Во время игры результат передаст сервис прогресса.
load() возвращает значения по умолчанию, если записи нет, JSON повреждён или схема не подходит. save() сначала проверяет значение; неверные данные не должны тихо попадать в хранилище. clear() удаляет запись.
PersistentStorageAdapter работает с координатором сохранений, который движок подготавливает через system.persistence. Доступны также LocalStorageAdapter и IndexedDbStorageAdapter. Наличие нескольких хранилищ не означает, что к приложению добавлен собственный сервер синхронизации.
В Block Puzzle глобальный сервис прогресса использует репозиторий. Сервис сцены передаёт ему итог партии. Благодаря этому замена способа хранения не затрагивает расчёт очков и отображение результата.
При изменении формата потребуется явное решение о миграции или новом ключе. Суффикс v1 сам по себе миграцию не выполняет.