From 5351e345c33e432b6b2c06bcabc510259d98e663 Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Mon, 17 Aug 2026 22:39:46 -0400 Subject: [PATCH] Object-ness comes from the card face, not a parallel list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 'This is most certainly an object' (WIZARDBLADE's FAQ) — and the card data already says so: every physical item bears the OBJECT subtype on its face. isMovableObject now reads it from there, retiring the hand-kept list — which had missed MASTER KEY and HANDFUL OF TACKS, both object-marked. Ungated: no stored ledger holds a swap or drop this widens (verified against production), and refused commands are never recorded. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc --- packages/engine/src/game.ts | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/engine/src/game.ts b/packages/engine/src/game.ts index 91c7fca..1ce1aff 100644 --- a/packages/engine/src/game.ts +++ b/packages/engine/src/game.ts @@ -5689,18 +5689,15 @@ function doPickUpObject(prev: GameState, instanceId: string): CommandResult { } /** - * Physical, droppable objects beyond the object-type stones. Rulebook: - * "Movable objects include magic stones, treasure chests, the dagger, the - * large rock, and the wizardblade" — plus the expansion wands, which the - * rules expect to change hands ("its remaining charges go with it"; - * charges are keyed by instance, so they travel automatically). + * A physical, droppable object is anything the card face marks as one — + * the object-typed stones, and attack/neutral cards bearing the OBJECT + * subtype (dagger, rock, wizardblade — "this is most certainly an object", + * per its FAQ — the wands, the master key, the handful of tacks). Wand + * charges are keyed by instance, so they travel with a traded wand. */ -const MOVABLE_OBJECT_CARD_IDS = new Set([ - "dagger", "large-rock", "wizardblade", ...WAND_CARD_IDS, -]); - export function isMovableObject(cardId: string): boolean { - return cardDef(cardId).cardType === "object" || MOVABLE_OBJECT_CARD_IDS.has(cardId); + const def = cardDef(cardId); + return def.cardType === "object" || (def.subtypes?.includes("object") ?? false); } function doDropObject(prev: GameState, instanceId: string): CommandResult {