fix: 进度持久化与断点恢复 + VoiceInput 权限/异常加固 + Jev 故障优雅降级
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user