From 5cf0461e55087db56ddf8f638416ac3aa0a0955d Mon Sep 17 00:00:00 2001 From: cocos02 Date: Sun, 14 Jun 2026 19:42:26 +0800 Subject: [PATCH] chore: App.vue updates for player and editor --- editor/App.vue | 2 +- src/App.vue | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/editor/App.vue b/editor/App.vue index be2da32..532ce75 100644 --- a/editor/App.vue +++ b/editor/App.vue @@ -49,7 +49,7 @@ function importJSON() { } function testScene(id: string) { - window.open('/?scene=' + id, '_blank') + window.open('/?scene=/scenes/demo.json&startScene=' + id, '_blank') } async function onFileSelected(e: Event) { diff --git a/src/App.vue b/src/App.vue index 2d0e1db..5110db8 100644 --- a/src/App.vue +++ b/src/App.vue @@ -81,7 +81,49 @@ async function init() { if (store.introVideo) { introWatched.value = await isSceneWatched('__intro__') + const params = new URLSearchParams(location.search) + if (params.get('startScene')) { + showIntro.value = false + handleStartFromScene(params.get('startScene')!) + return + } showIntro.value = true + } else { + const params = new URLSearchParams(location.search) + const startSceneId = params.get('startScene') + if (startSceneId) { + handleStartFromScene(startSceneId) + } + } +} + +function handleStartFromScene(sceneId: string) { + started.value = true + applyQteParams() + const ch = engine.sceneManager.chapters.find(c => { + const reachable = new Set() + const queue = [c.startScene] + while (queue.length > 0) { + const id = queue.shift()! + if (reachable.has(id)) continue + const sc = engine.sceneManager.getScene(id) + if (!sc) continue + reachable.add(id) + if (sc.choices) for (const ch2 of sc.choices) if (ch2.targetScene) queue.push(ch2.targetScene) + if (sc.nextScene) { + if (Array.isArray(sc.nextScene)) for (const r of sc.nextScene) if (r.targetScene) queue.push(r.targetScene) + else queue.push(sc.nextScene) + } + if (sc.qte) { if (sc.qte.successScene) queue.push(sc.qte.successScene); if (sc.qte.failScene) queue.push(sc.qte.failScene) } + if (sc.hotspots) for (const h of sc.hotspots) if (h.targetScene) queue.push(h.targetScene) + } + return reachable.has(sceneId) + }) + if (ch) { + engine.startAtScene(ch.id, sceneId) + } else { + const scene = engine.sceneManager.getScene(sceneId) + if (scene) engine.goToScene(scene) } }