From bbc981cd71cdad38c17dcaf820a9dd0788fcd046 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Tue, 14 Apr 2026 21:48:28 +0200 Subject: [PATCH] Add support for startDialogue action in runtime scene build and tests --- src/runtime-three/runtime-scene-build.ts | 2 + tests/domain/build-runtime-scene.test.ts | 47 +++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/runtime-three/runtime-scene-build.ts b/src/runtime-three/runtime-scene-build.ts index 2788e04f..ac3afd64 100644 --- a/src/runtime-three/runtime-scene-build.ts +++ b/src/runtime-three/runtime-scene-build.ts @@ -1596,6 +1596,8 @@ export function buildRuntimeSceneFromDocument( case "playSound": case "stopSound": return enabledEntityIds.has(link.action.targetSoundEmitterId); + case "startDialogue": + return document.dialogues.dialogues[link.action.dialogueId] !== undefined; case "control": switch (link.action.effect.target.kind) { case "entity": diff --git a/tests/domain/build-runtime-scene.test.ts b/tests/domain/build-runtime-scene.test.ts index e706a0e0..3e487d1f 100644 --- a/tests/domain/build-runtime-scene.test.ts +++ b/tests/domain/build-runtime-scene.test.ts @@ -27,7 +27,11 @@ import { createTeleportTargetEntity, createTriggerVolumeEntity } from "../../src/entities/entity-instances"; -import { createTeleportPlayerInteractionLink, createToggleVisibilityInteractionLink } from "../../src/interactions/interaction-links"; +import { + createStartDialogueInteractionLink, + createTeleportPlayerInteractionLink, + createToggleVisibilityInteractionLink +} from "../../src/interactions/interaction-links"; import { createProjectScheduleRoutine } from "../../src/scheduler/project-scheduler"; import { createModelInstance } from "../../src/assets/model-instances"; import { createProjectAssetStorageKey, type AudioAssetRecord } from "../../src/assets/project-assets"; @@ -339,9 +343,32 @@ describe("buildRuntimeSceneFromDocument", () => { sourceEntityId: interactable.id, trigger: "click", targetEntityId: teleportTarget.id + }), + "link-interactable-dialogue": createStartDialogueInteractionLink({ + id: "link-interactable-dialogue", + sourceEntityId: interactable.id, + trigger: "click", + dialogueId: "dialogue-warning" + }), + "link-trigger-dialogue": createStartDialogueInteractionLink({ + id: "link-trigger-dialogue", + sourceEntityId: triggerVolume.id, + trigger: "enter", + dialogueId: "dialogue-warning" }) } }; + document.dialogues.dialogues["dialogue-warning"] = { + id: "dialogue-warning", + title: "Warning", + lines: [ + { + id: "dialogue-line-warning-1", + speakerName: "Operator", + text: "The generator is unstable." + } + ] + }; document.world.background = { mode: "image", assetId: imageAsset.id, @@ -725,6 +752,15 @@ describe("buildRuntimeSceneFromDocument", () => { targetEntityId: "entity-teleport-target-main" } }, + { + id: "link-interactable-dialogue", + sourceEntityId: "entity-interactable-console", + trigger: "click", + action: { + type: "startDialogue", + dialogueId: "dialogue-warning" + } + }, { id: "link-teleport", sourceEntityId: "entity-trigger-door", @@ -743,6 +779,15 @@ describe("buildRuntimeSceneFromDocument", () => { targetBrushId: "brush-room-floor", visible: false } + }, + { + id: "link-trigger-dialogue", + sourceEntityId: "entity-trigger-door", + trigger: "enter", + action: { + type: "startDialogue", + dialogueId: "dialogue-warning" + } } ]); expect(runtimeScene.playerStart).toEqual({