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 startScene: string variables: Record } export interface ChoiceRecord { sceneId: string choiceIndex: number choiceText: string } export interface SaveData { slot: number timestamp: number currentScene: string variables: Record flags: string[] history: ChoiceRecord[] thumbnail?: string } export type EngineEvent = | 'sceneChange' | 'choiceRequest' | 'choiceTimer' | 'gameEnd' | 'qteTrigger' | 'videoEnd' | 'choiceTimeout'