feat: editor services, stores, and graph improvements

This commit is contained in:
2026-06-14 17:46:34 +08:00
parent 271c909398
commit 82bfae0e1b
5 changed files with 291 additions and 371 deletions

View File

@@ -0,0 +1,46 @@
import type { GameData } from '@engine/types'
export function computeEdges(gameData: GameData): { id: string; source: string; target: string; label?: string }[] {
const result: { id: string; source: string; target: string; label?: string }[] = []
for (const [id, scene] of Object.entries(gameData.scenes)) {
if (scene.choices) {
let ci = 0
for (const c of scene.choices) {
if (c.targetScene) {
result.push({ id: `${id}_choice_${ci}`, source: id, target: c.targetScene, label: c.text.slice(0, 10) })
}
ci++
}
}
if (scene.nextScene) {
if (Array.isArray(scene.nextScene)) {
for (let ri = 0; ri < scene.nextScene.length; ri++) {
const r = scene.nextScene[ri]
if (r.targetScene) {
result.push({ id: `${id}_next_${ri}`, source: id, target: r.targetScene, label: r.conditions?.length ? '→ 条件' : '→ 默认' })
}
}
} else {
result.push({ id: `${id}_next`, source: id, target: scene.nextScene, label: '→' })
}
}
if (scene.qte) {
if (scene.qte.successScene)
result.push({ id: `${id}_qte_s`, source: id, target: scene.qte.successScene, label: 'QTE成功' })
if (scene.qte.failScene)
result.push({ id: `${id}_qte_f`, source: id, target: scene.qte.failScene, label: 'QTE失败' })
}
if (scene.hotspots) {
for (const h of scene.hotspots) {
if (h.targetScene) {
result.push({ id: `${id}_hs_${h.id}`, source: id, target: h.targetScene, label: h.label.slice(0, 10) })
}
}
}
}
return result
}
export function computeSceneNodes(gameData: GameData): { id: string; label: string }[] {
return Object.values(gameData.scenes).map(s => ({ id: s.id, label: s.id }))
}