From 8c10b9280d36cb409e07f8dfb12abf58ad39ada0 Mon Sep 17 00:00:00 2001 From: sudhir Date: Wed, 29 Apr 2026 13:09:26 +0530 Subject: [PATCH] Exclude spawn points from level duplication --- .../editor/src/lib/level-duplication.test.ts | 31 +++++++++++++++++++ packages/editor/src/lib/level-duplication.ts | 5 +-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/packages/editor/src/lib/level-duplication.test.ts b/packages/editor/src/lib/level-duplication.test.ts index 539e2164..a8e57ef2 100644 --- a/packages/editor/src/lib/level-duplication.test.ts +++ b/packages/editor/src/lib/level-duplication.test.ts @@ -6,6 +6,7 @@ import { type AnyNodeId, BuildingNode, LevelNode, + SpawnNode, WallNode, } from '@pascal-app/core/schema' import { buildLevelDuplicateCreateOps } from './level-duplication' @@ -38,4 +39,34 @@ describe('buildLevelDuplicateCreateOps', () => { expect(sourceLevel.parentId).toBeNull() expect(levelCreateOp?.parentId).toBe(building.id) }) + + test('does not copy spawn points from the source level', () => { + const building = BuildingNode.parse({}) + const spawn = SpawnNode.parse({ parentId: 'level_source' }) + const level = LevelNode.parse({ + id: 'level_source', + level: 0, + parentId: building.id, + children: [spawn.id], + }) + const nodes = { + [building.id]: { ...building, children: [level.id] }, + [level.id]: level, + [spawn.id]: spawn, + } as Record + + const { createOps, newLevelId } = buildLevelDuplicateCreateOps({ + nodes, + level, + levels: [level], + preset: 'everything', + }) + + const copiedLevel = createOps.find((op) => op.node.id === newLevelId)?.node as + | LevelNode + | undefined + + expect(createOps.some((op) => op.node.type === 'spawn')).toBe(false) + expect(copiedLevel?.children).toEqual([]) + }) }) diff --git a/packages/editor/src/lib/level-duplication.ts b/packages/editor/src/lib/level-duplication.ts index a243bd7d..277e650f 100644 --- a/packages/editor/src/lib/level-duplication.ts +++ b/packages/editor/src/lib/level-duplication.ts @@ -7,7 +7,7 @@ export type LevelDuplicatePreset = | 'structure-materials' | 'structure-furniture' -const REFERENCE_NODE_TYPES = new Set(['scan', 'guide']) +const NON_DUPLICABLE_NODE_TYPES = new Set(['scan', 'guide', 'spawn']) const STRUCTURAL_NODE_TYPES = new Set([ 'level', 'wall', @@ -24,8 +24,9 @@ const STRUCTURAL_NODE_TYPES = new Set([ ]) function shouldKeepNode(node: AnyNode, preset: LevelDuplicatePreset) { + if (NON_DUPLICABLE_NODE_TYPES.has(node.type)) return false if (preset === 'everything') return true - if (preset === 'structure-furniture') return !REFERENCE_NODE_TYPES.has(node.type) + if (preset === 'structure-furniture') return true if (preset === 'structure' || preset === 'structure-materials') { return STRUCTURAL_NODE_TYPES.has(node.type) }