По ARCHITECTURE.md: реестр независимых секций, JSON с ключом на секцию. Ключи — явные строковые константы, а не имена классов: релизная сборка минифицирует имена и молча потеряла бы все сохранения. - ISaveSection, SaveManager, IStorage + MemoryStorage - CocosStorage: единственный файл модуля, знающий про движок; при отказе хранилища уходит в память, а не роняет игру - StatsSection: сыграно/побед/поражений/ничьих, текущая и лучшая серия - терпимая загрузка: битый JSON, чужая версия, сломанная секция или отвалившееся хранилище не ломают остальное - проверка чистоты расширена на modules/ со списком адаптеров Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
26 lines
891 B
TypeScript
26 lines
891 B
TypeScript
/**
|
|
* One independently saved slice of player progress.
|
|
*
|
|
* ARCHITECTURE.md asks for a save built from several classes, each handling its
|
|
* own part, keyed by the class. The key here is an explicit string rather than
|
|
* `constructor.name` on purpose: release builds minify class names, and a
|
|
* renamed class would silently orphan every existing save.
|
|
*/
|
|
export interface ISaveSection {
|
|
/** Stable identifier. Never change it once a build has shipped. */
|
|
readonly key: string;
|
|
|
|
/** Current contents as a JSON-safe value. */
|
|
save(): unknown;
|
|
|
|
/**
|
|
* Restores from a previously saved value. Must tolerate anything — an older
|
|
* shape, a newer shape, or outright rubbish — by falling back to defaults
|
|
* rather than throwing.
|
|
*/
|
|
load(data: unknown): void;
|
|
|
|
/** Returns to the state of a player who has never played. */
|
|
reset(): void;
|
|
}
|