- QTESystem: trigger detection via timeupdate, multi-key matching, timeout handling - QTEOverlay: SVG countdown ring + key prompts + success/fail animation - Engine: integrate QTE (timeupdate check, conditional branching, effect application) - Subtitles: WebVTT parsing + synchronized subtitle rendering - GamePlayer: overlay QTE and subtitle components - SaveSystem: DB v2 with thumbnail field, canvas snapshot at 320x180 JPEG - SaveLoadMenu: thumbnail preview for save slots - VideoManager: getActiveVideoElement() for canvas capture - App.vue: QTE/subtitle integration, thumbnail capture on save - stores: QTE state management, save list with thumbnails - demo.json: QTE scene (right_door), subtitles, new event types - ROADMAP: mark P2 as completed
76 lines
1.4 KiB
TypeScript
76 lines
1.4 KiB
TypeScript
export interface SceneNode {
|
|
id: string
|
|
videoUrl: string
|
|
subtitleUrl?: string
|
|
choices?: Choice[]
|
|
qte?: QTEDefinition
|
|
nextScene?: string
|
|
onEnter?: Effect[]
|
|
}
|
|
|
|
export interface Choice {
|
|
text: string
|
|
targetScene: string
|
|
conditions?: Condition[]
|
|
effects?: Effect[]
|
|
timeLimit?: number // 单位:秒,超时后自动选择第一项
|
|
}
|
|
|
|
export interface Condition {
|
|
variable: string
|
|
op: '>' | '<' | '>=' | '<=' | '==' | '!=' | 'hasFlag'
|
|
value: number | string | boolean
|
|
}
|
|
|
|
export interface Effect {
|
|
type: 'set' | 'add' | 'toggleFlag' | 'triggerEvent'
|
|
target: string
|
|
value?: number | string | boolean
|
|
}
|
|
|
|
export interface QTEDefinition {
|
|
triggerTime: number
|
|
prompt: string
|
|
keys: string[]
|
|
timeLimit: number
|
|
successScene: string
|
|
failScene: string
|
|
effects?: {
|
|
success: Effect[]
|
|
fail: Effect[]
|
|
}
|
|
}
|
|
|
|
export interface GameData {
|
|
scenes: Record<string, SceneNode>
|
|
startScene: string
|
|
variables: Record<string, number>
|
|
}
|
|
|
|
export interface ChoiceRecord {
|
|
sceneId: string
|
|
choiceIndex: number
|
|
choiceText: string
|
|
}
|
|
|
|
export interface SaveData {
|
|
slot: number
|
|
timestamp: number
|
|
currentScene: string
|
|
variables: Record<string, number>
|
|
flags: string[]
|
|
history: ChoiceRecord[]
|
|
thumbnail?: string
|
|
}
|
|
|
|
export type EngineEvent =
|
|
| 'sceneChange'
|
|
| 'choiceRequest'
|
|
| 'choiceTimer'
|
|
| 'gameEnd'
|
|
| 'qteTrigger'
|
|
| 'qteTimer'
|
|
| 'qteResult'
|
|
| 'videoEnd'
|
|
| 'choiceTimeout'
|