fix: 进度持久化与断点恢复 + VoiceInput 权限/异常加固 + Jev 故障优雅降级

This commit is contained in:
Jayway Liu
2026-10-03 18:30:36 +08:00
parent b0c7ef2daf
commit e854b4e610
6 changed files with 258 additions and 31 deletions
+53
View File
@@ -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;
}
}