Three more cautions: the un-grabbed chest, the biting ground, the starved draw

Ending a turn on a treasure nobody picked up now asks first (unless the
auto-grab preference is about to take it, or the grab would be refused —
laden arms, weakness, spent actions, glue, a locked safe, or your own
home where the chest already scores; the view learns gluedCells and
openSafes so the check is honest). Stepping onto ground that bites —
thornbush, tacks, pit, ooze — warns with the exact price, unless you are
mist. And the sticky draw picker no longer quietly starves anyone: a
draw below what would fit asks too.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Eric Wagoner
2026-08-23 11:04:05 -04:00
co-authored by Claude Fable 5
parent 6e1ccb0195
commit ef921a0c2b
2 changed files with 43 additions and 1 deletions
+6
View File
@@ -57,6 +57,10 @@ export interface GameView {
/** Duration spells in play (public knowledge). */
sustained: SustainedEffect[];
squareContents: Record<string, SquareContent>;
/** Cells whose contents are glued down (public: the cast was seen). */
gluedCells: Record<string, true>;
/** Safes standing open (their combination entered this turn). */
openSafes: string[];
groundObjects: Record<string, CardInstance[]>;
doorStates: Record<string, "jammed" | "removed">;
/** Accumulated attack damage per edge (public — cracks show). */
@@ -144,6 +148,8 @@ export function viewFor(state: GameState, playerId: PlayerId): GameView {
pendingDiscard: state.pendingDiscard,
sustained: state.sustained.map((s) => ({ ...s })),
squareContents: { ...state.squareContents },
gluedCells: { ...state.gluedCells },
openSafes: [...state.openSafes],
groundObjects: Object.fromEntries(
Object.entries(state.groundObjects).map(([k, v]) => [k, [...v]]),
),