Rev 12: vanishing and water answer the call to arms

INVISIBLE's corner reads NEUTRAL/COUNTERACTION, and ANTI-ANTI's own
face names it an escape — yet the engine refused it at the door. Now
it counters: the vanishing goes up mid-stack (duration from a NUMBER
card riding the counteract command), the attacker's 1-in-4 hit roll
happens at resolution, the spell lingers after the exchange, and
ANTI-ANTI cannot pin it. WATERWALL — "Acts as counteraction to
FIREBALL" — now mirrors WALL OF FIRE's waterbolt-stopping role and
counts as a total stop. WALL OF FIRE itself joins the total-stop set
at rev 12 only: stored rev-10/11 games bounced after it and replay so.

While responding, tapping a number card holds it to ride the next
counter (unless a displayed Shieldstone makes the number itself the
counteraction, as before). The automatons learn the trick too: vanish
when the blow is heavy and the shields are spent, and never waste
ANTI-ANTI against an escape.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Eric Wagoner
2026-08-16 21:07:47 -04:00
co-authored by Claude Fable 5
parent fb2266b401
commit 4d8584ae44
6 changed files with 141 additions and 16 deletions
+14 -1
View File
@@ -108,6 +108,9 @@
const attackingCreature = $derived(
view?.stack?.creatureId ? view.creatures.find((c) => c.id === view!.stack!.creatureId) ?? null : null,
);
const myShieldstoneDisplayed = $derived(
view?.players.find((p) => p.id === view.you)?.displayed.some((c) => c.cardId === "shieldstone") ?? false,
);
const youMustDiscard = $derived(view != null && view.pendingDiscard === view.you);
const youMustShield = $derived(view?.chaosPending?.queue[0] === view?.you && view != null);
/** Picking up an object ends the turn's actions: the hand goes quiet until
@@ -283,7 +286,17 @@
selectedCard = card; // then click the escape square
return;
}
dispatch({ type: "counteract", instanceId: card.instanceId });
// A number can ride a counter (INVISIBLE's duration) — unless a
// displayed Shieldstone makes the number itself the counteraction.
if (youMustRespond && isNumberCard(card.cardId) && !myShieldstoneDisplayed) {
attachedNumber = attachedNumber?.instanceId === card.instanceId ? null : card;
return;
}
dispatch({
type: "counteract", instanceId: card.instanceId,
...(attachedNumber ? { numberInstanceIds: [attachedNumber.instanceId] } : {}),
});
attachedNumber = null;
return;
}
if (youMustDiscard || discardMode || discardSelection.size > 0) {