import type { GameStateData } from '@rpg/engine';
import type { AreaId } from '../data/locations';
import { START_MINUTES } from '../systems/Clock';
/**
* Формат сейва: область, позиция героя, сериализованное состояние прохождения,
* сумка и время суток. У старых сейвов нет `version`/`items` — normalizeSave
* дорастает их.
*/
export const SAVE_VERSION = 4;
/** Откуда герой вошёл в область (для переходов kind 'return'). */
export interface ReturnToData {
area: AreaId;
entry: { x: number; y: number };
}
export interface SaveData {
version: number;
/** В какой области герой (фолбэк 'meadows' для старых сейвов). */
area: string;
pos: { x: number; y: number };
state: GameStateData;
/** Содержимое сумки: itemId -> количество. */
items: Record<string, number>;
/** Время суток в минутах (v4; нет — старт 8:00). */
clock?: { minutes: number } | null;
/** Откуда вошли в область (v3; null/undefined — вход не через переход). */
returnTo?: ReturnToData | null;
savedAt: number;
}
/** Дополнить сейв старого формата до текущего (без записи). */
export function normalizeSave(save: SaveData): SaveData {
if (save.version === SAVE_VERSION) return save;
// v1/v2: area зовётся location, returnTo ещё нет; v3: clock ещё нет.
const legacy = save as SaveData & { location?: string };
return {
...save,
version: SAVE_VERSION,
area: save.area ?? legacy.location ?? 'meadows',
returnTo: save.returnTo ?? null,
items: save.items ?? {},
clock: save.clock ?? { minutes: START_MINUTES }
};
}