Correct 15 cards against photos of the actual 6e card faces

Eric spotted mismatches between the 5e-database-derived card data and
his physical 6e cards (photos IMG_4688-4690). All 15 texts are now
verbatim from the faces. Four were mechanical, now fixed in the
engine: BLIND's 6e text adds "engage in combat" — blinded punches
flail on a die roll; PICK LOCK's face states "This is not a spell" —
the lock cards and thrown weapons are physical actions NO SPELL cannot
silence; MIST-BODY passes doors and drifts through thornbushes but
does NOT pass the maze's stone walls (was backwards); WALL OF FIRE's
counteraction mode stops a Waterbolt (previously deferred). Metadata:
UGLY is L.O.S.-marked, MASTER KEY is NEUTRAL/ADJACENT, WIZARDBLADE
and PICK LOCK carry ADJACENT markings (new `adjacent` field), LARGE
ROCK is rethrowable by any player (already engine behavior),
BRAINSTONE's face has no corner type. 84 tests passing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Eric Wagoner
2026-08-15 21:58:17 -04:00
co-authored by Claude Fable 5
parent 1924114b6d
commit 5a0003f4ce
8 changed files with 200 additions and 49 deletions
+17 -8
View File
@@ -297,14 +297,23 @@ describe("control effects", () => {
type: "cast", instanceId: mist.instanceId, numberInstanceIds: ["number-3#N"],
});
// Misted wizard walks through a wall if one is adjacent.
const view = boardView(state);
const d = state.players.find((p) => p.id === defender)!;
for (const side of SIDES) {
const k = edgeKey(d.position, side);
if (view.edges[k] === "wall" && view.cells[cellKey(neighbor(d.position, side))]) {
state = must(state, defender, { type: "move", direction: side });
break;
// Mist passes through locked DOORS but NOT the maze's stone walls.
{
const view = boardView(state);
const d = state.players.find((p) => p.id === defender)!;
const doorEntry = Object.entries(view.edges).find(([, st]) => st === "door")!;
const [kind, coords] = doorEntry[0].split(":") as [string, string];
const [dx, dy] = coords.split(",").map(Number) as [number, number];
d.position = { x: dx, y: dy };
state = must(state, defender, { type: "move", direction: kind === "V" ? "E" : "S" });
for (const side of SIDES) {
const k = edgeKey(state.players.find((p) => p.id === defender)!.position, side);
const view2 = boardView(state);
if (view2.edges[k] === "wall" &&
view2.cells[cellKey(neighbor(state.players.find((p) => p.id === defender)!.position, side))]) {
expect(applyCommand(state, defender, { type: "move", direction: side }).ok).toBe(false);
break;
}
}
}
state = must(state, defender, { type: "endTurn", draw: 0 });