Типизированное состояние10 / 12

Сохраняем рекорд

Сохраняем данные игрока отдельно от конфигурации игры.

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 очков. Во время игры результат передаст сервис прогресса.

Файл конфигурацииboard.json → ConfigStore → размеры поля
Состояние игрокаTypedStateStore → адаптер → рекорд
Ключ sdk-game:progress-v1 отделяет данные проекта и версию структуры.

load() возвращает значения по умолчанию, если записи нет, JSON повреждён или схема не подходит. save() сначала проверяет значение; неверные данные не должны тихо попадать в хранилище. clear() удаляет запись.

PersistentStorageAdapter работает с координатором сохранений, который движок подготавливает через system.persistence. Доступны также LocalStorageAdapter и IndexedDbStorageAdapter. Наличие нескольких хранилищ не означает, что к приложению добавлен собственный сервер синхронизации.

В Block Puzzle глобальный сервис прогресса использует репозиторий. Сервис сцены передаёт ему итог партии. Благодаря этому замена способа хранения не затрагивает расчёт очков и отображение результата.

При изменении формата потребуется явное решение о миграции или новом ключе. Суффикс v1 сам по себе миграцию не выполняет.

Источники ↗

Block Puzzle · BlockPuzzlePlayerProgressService.ts↗Сервис прогресса игры.