The reflected-attack window (rules rev 25)
A FULL REFLECTION's returned spell is a fresh attack on its own caster — who, per the owner's ruling, gets a defender's counteraction window against it (absorb the blast, shield it, or FULL REFLECTION again: the ping-pong war ends when the cards run out). The reflection now settles into a new stack with the roles swapped and the damage pre-priced (numbers, amplifies, and surviving counters already applied); the blow returns to its sender unerringly, with no fresh hit rolls. onResolved effects run with the swapped roles, so a reflected IDIOT now afflicts its own caster. Earlier revisions land the blow instantly and stored games replay unchanged. Automatons price the incoming reflected damage off the stack; the attack modal announces 'Your own spell comes screaming back!' with the inbound total. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc
This commit is contained in:
co-authored by
Claude Fable 5
parent
dcaf358a93
commit
06faea0c79
@@ -727,14 +727,17 @@ function respond(view: GameView, style: AutomatonStyle, tier: TierTraits): Comma
|
||||
}
|
||||
|
||||
// An affliction's weight is its duration, not points it does not carry.
|
||||
const incoming = stack.attackCard
|
||||
? attackId === "stone-dead"
|
||||
// NUMBER times the stones in the victim's hand — our hand.
|
||||
? (stack.numberValue ?? 1) * view.yourHand.filter((c) => STONES.has(c.cardId)).length
|
||||
: affliction
|
||||
? Math.max(2, stack.numberValue ?? 2)
|
||||
: (atk ? atk.base + (atk.perNumber ? stack.numberValue ?? 1 : 0) : 2)
|
||||
: 1;
|
||||
// A reflected blow arrives pre-priced — its number is on the stack.
|
||||
const incoming = stack.reflectedBase
|
||||
? Math.max(stack.reflectedBase.damage, stack.reflectedBase.duration)
|
||||
: stack.attackCard
|
||||
? attackId === "stone-dead"
|
||||
// NUMBER times the stones in the victim's hand — our hand.
|
||||
? (stack.numberValue ?? 1) * view.yourHand.filter((c) => STONES.has(c.cardId)).length
|
||||
: affliction
|
||||
? Math.max(2, stack.numberValue ?? 2)
|
||||
: (atk ? atk.base + (atk.perNumber ? stack.numberValue ?? 1 : 0) : 2)
|
||||
: 1;
|
||||
if (stack.kind === "spell") {
|
||||
// REVERSE eats points; a pure duration offers it nothing.
|
||||
const reverse = find("reverse");
|
||||
|
||||
Reference in New Issue
Block a user