import type { Flags } from './flags'; /** * 剧情进度持久化(真机刷新/热更新恢复用)。 * 引擎位置本来只在内存里,权限弹窗等引发的页面刷新会让玩家回到开头—— * 每次状态迁移后把当前位置落盘,启动时恢复。 */ export interface ProgressSnapshot { sessionId: string; chapterId: string; nodeId: string; /** 分支变量随位置一起持久化,恢复后条件文本渲染不断档 */ flags: Flags; } export interface ProgressStore { save(p: ProgressSnapshot): void; load(): ProgressSnapshot | null; } const PROGRESS_KEY = 'jev-dating-match.progress.v1'; /** 浏览器 / Tauri WKWebView 通用:localStorage。 */ export class LocalStorageProgressStore implements ProgressStore { save(p: ProgressSnapshot): void { try { localStorage.setItem(PROGRESS_KEY, JSON.stringify(p)); } catch { // 隐私模式等写不进去的场景:静默降级为不持久化,不影响游玩 } } load(): ProgressSnapshot | null { try { const raw = localStorage.getItem(PROGRESS_KEY); return raw ? (JSON.parse(raw) as ProgressSnapshot) : null; } catch { return null; } } } /** verify / 测试用内存实现 */ export class MemoryProgressStore implements ProgressStore { private snap: ProgressSnapshot | null = null; save(p: ProgressSnapshot): void { this.snap = p; } load(): ProgressSnapshot | null { return this.snap; } }