54 lines
1.4 KiB
TypeScript
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;
|
|
}
|
|
}
|