Files
tianshu-engine/engine/types.ts
cocos02 937e45c203 feat: P1 core - seamless video switching, conditional branches, save/load
- 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
2026-06-07 16:48:52 +08:00

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'