Files
jev-match-game/src/engine/progress.ts
T

54 lines
1.4 KiB
TypeScript

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;
}
}