From 140e7b5faf0ecc37fe1dff72637977d820e417e4 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 2 Feb 2026 16:19:40 +0000 Subject: [PATCH] fix: update getEntitiesWith to handle Selectable component queries SelectionSystem queries for entities using getEntitiesWith('Transform', 'Selectable'), but RenderStateWorldAdapter was only returning entities for 'Unit' or 'Transform' alone queries. This caused the selection system to receive no entities when trying to select. Updated getEntitiesWith to properly handle Selectable queries: - ('Transform', 'Selectable') now returns both units and buildings - Explicit conditions for when to include units, buildings, and resources - Added documentation for supported query patterns https://claude.ai/code/session_01VWGwpnz8yMDkYjicbv2dZ7 --- src/engine/workers/RenderStateAdapter.ts | 34 +++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/engine/workers/RenderStateAdapter.ts b/src/engine/workers/RenderStateAdapter.ts index e106fc73..59d216fd 100644 --- a/src/engine/workers/RenderStateAdapter.ts +++ b/src/engine/workers/RenderStateAdapter.ts @@ -768,26 +768,48 @@ export class RenderStateWorldAdapter implements IWorldProvider { /** * Get all entities with the specified components (simplified version) + * Handles common query patterns: + * - ('Unit') or ('Unit', 'Transform', ...) → units + * - ('Building') or ('Building', 'Transform', ...) → buildings + * - ('Resource') or ('Resource', 'Transform') → resources + * - ('Transform', 'Selectable') → units + buildings (selection queries) + * - ('Transform') alone → units only (legacy) */ public getEntitiesWith(...componentTypes: string[]): IEntity[] { const results: IEntity[] = []; - // Check for Unit queries - if (componentTypes.includes('Unit') || (componentTypes.includes('Transform') && componentTypes.length === 1)) { + const hasUnit = componentTypes.includes('Unit'); + const hasBuilding = componentTypes.includes('Building'); + const hasResource = componentTypes.includes('Resource'); + const hasSelectable = componentTypes.includes('Selectable'); + const hasTransform = componentTypes.includes('Transform'); + + // Units: return when querying for Unit, Selectable (without Building/Resource filter), + // or Transform alone (legacy) + const includeUnits = hasUnit || + (hasSelectable && !hasBuilding && !hasResource) || + (hasTransform && componentTypes.length === 1); + + // Buildings: return when querying for Building, or Selectable (without Unit/Resource filter) + const includeBuildings = hasBuilding || + (hasSelectable && !hasUnit && !hasResource); + + // Resources: return when querying for Resource + const includeResources = hasResource; + + if (includeUnits) { for (const adapter of this.unitEntities.values()) { results.push(adapter); } } - // Check for Building queries - if (componentTypes.includes('Building')) { + if (includeBuildings) { for (const adapter of this.buildingEntities.values()) { results.push(adapter); } } - // Check for Resource queries - if (componentTypes.includes('Resource')) { + if (includeResources) { for (const adapter of this.resourceEntities.values()) { results.push(adapter); }