Six answers to the first wave of player feedback

The turn slip says 'turn spent' instead of counting phantom moves once
actions end; the attacking card (or the counter being countered) shows
in the respond slip so counters are chosen with eyes open; the absorb
chronicle line names the card it swallowed — which answers the KTXQ
mystery, where an automaton's ABSORB SPELL took Blind into its hand and
Reuse Spell rightly found nothing to retrieve. POWER ATTACK gains its
missing UI: attach it like any modifier and pick the life to burn.
Hand cards drag to reorder (browser-local arrangement over the
server's authoritative contents), and the left-hand layout scales its
two columns to the space without ever growing a scrollbar.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
This commit is contained in:
Eric Wagoner
2026-08-30 15:47:37 -04:00
co-authored by Claude Fable 5
parent e8a7fa1b73
commit 9aaccf4f30
2 changed files with 94 additions and 6 deletions
+1 -1
View File
@@ -45,7 +45,7 @@ export function humanize(e: GameEvent): string | null {
}
case "counteractionPlayed": return `${e.player} counters with ${cardDef(e.cardId).name}!`;
case "counterNullified": return `${cardDef(e.card.cardId).name} is nullified by Anti-Anti!`;
case "attackAbsorbedIntoHand": return `${e.player} absorbs the spell into their hand!`;
case "attackAbsorbedIntoHand": return `${e.player} absorbs ${cardDef(e.attackCard.cardId).name} into their hand — the card is theirs now!`;
case "attackResolved":
if (e.redirected) return `The spell is reflected back at ${e.attacker}!`;
if (e.fullyStopped) return `The attack is completely stopped.`;