Add tests for interaction link triggers and dialogue starts

This commit is contained in:
2026-04-14 21:27:33 +02:00
parent 163ca929ad
commit 651567fbfc

View File

@@ -624,6 +624,73 @@ describe("RuntimeInteractionSystem", () => {
expect(dispatches).toEqual(["link-start-dialogue:dialogue-console"]);
});
it("treats interactable dialogue links as click interactions even when the stored trigger is non-click", () => {
const runtimeScene = createRuntimeSceneFixture();
runtimeScene.dialogues.dialogues["dialogue-console"] = {
id: "dialogue-console",
title: "Console",
lines: [
{
id: "dialogue-line-console-1",
speakerName: "System",
text: "Console online."
}
]
};
runtimeScene.interactionLinks = [
createStartDialogueInteractionLink({
id: "link-start-dialogue-console",
sourceEntityId: "entity-interactable-console",
trigger: "enter",
dialogueId: "dialogue-console"
})
];
const interactionSystem = new RuntimeInteractionSystem();
const prompt = interactionSystem.resolveClickInteractionPrompt(
{
x: 0,
y: 1.6,
z: 0
},
{
x: 0,
y: 1.6,
z: 0
},
{
x: 0,
y: 0,
z: 1
},
runtimeScene
);
expect(prompt).toEqual(
expect.objectContaining({
sourceEntityId: "entity-interactable-console",
prompt: "Use Console"
})
);
const dispatches: string[] = [];
interactionSystem.dispatchClickInteraction(
"entity-interactable-console",
runtimeScene,
createDispatcher({
startDialogue: (dialogueId, source) => {
dispatches.push(
`${source?.kind}:${source?.sourceEntityId}:${source?.trigger}:${dialogueId}`
);
}
})
);
expect(dispatches).toEqual([
"interactionLink:entity-interactable-console:enter:dialogue-console"
]);
});
it("dispatches trigger-volume dialogue starts once on enter", () => {
const runtimeScene = createRuntimeSceneFixture();
runtimeScene.dialogues.dialogues["dialogue-threshold"] = {
@@ -679,6 +746,52 @@ describe("RuntimeInteractionSystem", () => {
expect(dispatches).toEqual(["link-trigger-dialogue:dialogue-threshold"]);
});
it("treats trigger-volume dialogue links authored with click as enter interactions", () => {
const runtimeScene = createRuntimeSceneFixture();
runtimeScene.dialogues.dialogues["dialogue-threshold"] = {
id: "dialogue-threshold",
title: "Threshold",
lines: [
{
id: "dialogue-line-threshold-1",
speakerName: null,
text: "Welcome."
}
]
};
runtimeScene.interactionLinks = [
createStartDialogueInteractionLink({
id: "link-trigger-dialogue-click",
sourceEntityId: "entity-trigger-main",
trigger: "click",
dialogueId: "dialogue-threshold"
})
];
const dispatches: string[] = [];
const interactionSystem = new RuntimeInteractionSystem();
interactionSystem.updatePlayerPosition(
{
x: 0,
y: 0,
z: 0
},
runtimeScene,
createDispatcher({
startDialogue: (dialogueId, source) => {
dispatches.push(
`${source?.kind}:${source?.sourceEntityId}:${source?.trigger}:${dialogueId}`
);
}
})
);
expect(dispatches).toEqual([
"interactionLink:entity-trigger-main:click:dialogue-threshold"
]);
});
it("treats the player body segment as entering a trigger volume, not just the feet point", () => {
const runtimeScene = createRuntimeSceneFixture();
runtimeScene.entities.triggerVolumes = [