- VideoManager: A/B dual-buffered video with crossfade transitions and candidate preloading - Engine: condition-based choice filtering, ChoiceSystem timer, resumeScene for save/load - SceneManager: getCandidateUrls for preloading next scenes - SaveSystem: Dexie.js IndexedDB multi-slot save/load - ChoiceSystem: timed choices with countdown and auto-default on timeout - GamePlayer: dual video elements with crossfade CSS - ChoicePanel: timer progress bar and countdown text - SaveLoadMenu: save/load UI component - App.vue: menu trigger, dual video refs, save/load integration - gameStore: timer state, saves list - demo.json: conditional choice example (secret ending, requires trust >= 80) - ROADMAP: mark P1 as completed
74 lines
1.3 KiB
TypeScript
74 lines
1.3 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'
|
|
| 'videoEnd'
|
|
| 'choiceTimeout'
|