From 95efe2d4834df7a154bd52b280ac44d73d48ca6f Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Mon, 11 May 2026 21:25:39 +0200 Subject: [PATCH] Add migration test for NPC targetability in scene documents --- .../serialization/scene-document-json.test.ts | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/tests/serialization/scene-document-json.test.ts b/tests/serialization/scene-document-json.test.ts index 1db9294c..26f906eb 100644 --- a/tests/serialization/scene-document-json.test.ts +++ b/tests/serialization/scene-document-json.test.ts @@ -2658,6 +2658,57 @@ describe("scene document JSON", () => { ); }); + it("migrates pre-NPC-targeting documents by preserving click-linked NPC targetability", () => { + const linkedNpc = createNpcEntity({ + id: "entity-npc-linked", + actorId: "actor-linked" + }); + const silentNpc = createNpcEntity({ + id: "entity-npc-silent", + actorId: "actor-silent" + }); + const soundEmitter = createSoundEmitterEntity({ + id: "entity-sound-chime", + audioAssetId: "asset-audio-chime" + }); + const document = createEmptySceneDocument({ + name: "Legacy NPC Targeting Scene" + }); + document.entities[linkedNpc.id] = linkedNpc; + document.entities[silentNpc.id] = silentNpc; + document.entities[soundEmitter.id] = soundEmitter; + document.interactionLinks["link-npc-sound"] = createPlaySoundInteractionLink({ + id: "link-npc-sound", + sourceEntityId: linkedNpc.id, + trigger: "click", + targetSoundEmitterId: soundEmitter.id + }); + + const legacyDocument = JSON.parse( + serializeSceneDocument(document) + ) as Record; + const legacyEntities = legacyDocument.entities as Record< + string, + Record + >; + legacyDocument.version = FOLIAGE_BLOCKER_MASKS_SCENE_DOCUMENT_VERSION; + delete legacyEntities[linkedNpc.id]?.targetable; + delete legacyEntities[silentNpc.id]?.targetable; + + const migratedDocument = parseSceneDocumentJson( + JSON.stringify(legacyDocument) + ); + + expect(migratedDocument.entities[linkedNpc.id]).toMatchObject({ + kind: "npc", + targetable: true + }); + expect(migratedDocument.entities[silentNpc.id]).toMatchObject({ + kind: "npc", + targetable: false + }); + }); + it("migrates pre-entity-transform NPCs and trigger volumes to explicit transform defaults", () => { const triggerVolume = createTriggerVolumeEntity({ id: "entity-trigger-legacy-transform",