Files
tianshu-engine/engine/types.ts
cocos02 319a379921 feat: P2 - QTE system, subtitles, save thumbnails
- 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
2026-06-07 19:35:14 +08:00

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'