import type { GameData, SceneNode, Choice, Condition } from '../types' export class SceneManager { private scenes: Record = {} private startScene: string = '' load(data: GameData) { this.scenes = data.scenes this.startScene = data.startScene } getScene(id: string): SceneNode | undefined { return this.scenes[id] } getStartScene(): SceneNode { const scene = this.scenes[this.startScene] if (!scene) throw new Error(`Start scene "${this.startScene}" not found`) return scene } getAllSceneIds(): string[] { return Object.keys(this.scenes) } getCandidateTargetIds(scene: SceneNode, evaluateCondition: (conds?: Condition[]) => boolean): string[] { const targets: string[] = [] if (scene.choices) { for (const choice of scene.choices) { if (!choice.conditions || evaluateCondition(choice.conditions)) { if (!targets.includes(choice.targetScene)) { targets.push(choice.targetScene) } } } } if (scene.nextScene && !targets.includes(scene.nextScene)) { targets.push(scene.nextScene) } return targets } getCandidateUrls(scene: SceneNode, evaluateCondition: (conds?: Condition[]) => boolean): string[] { return this.getCandidateTargetIds(scene, evaluateCondition) .map(id => this.scenes[id]?.videoUrl) .filter((url): url is string => !!url) } }