Chaos aims at no one
The client always offered CHAOS from the hint bar without a target, and the engine refused it: "attack spells target a player". Not this one — cast bare, it sweeps every other living wizard into the pile, each offered their FULL SHIELD sit-out in turn order from the caster. No stack forms; full shields only ever excluded a player from the storm, so the queue is the whole defense. The older player-targeted form stays accepted, so stored games replay unchanged. The scramble joins the chronicle's notable events — a turn that redeals every hand earns its eye. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015RCWSTnb1KYTPyL4GmhGnF
This commit is contained in:
co-authored by
Claude Fable 5
parent
168e57ab91
commit
805fb09782
@@ -4933,6 +4933,28 @@ function doCast(prev: GameState, cmd: Extract<Command, { type: "cast" }>): Comma
|
||||
}
|
||||
return { ok: true, state, events: events2 };
|
||||
}
|
||||
// CHAOS aims at no one: cast bare, it sweeps every other living
|
||||
// wizard into the pile, each offered their FULL SHIELD sit-out in
|
||||
// turn order. (Full shields only exclude; nothing in the set cancels
|
||||
// a zero-point storm, so the queue is the whole defense.) The older
|
||||
// player-targeted form is still accepted below, so stored games
|
||||
// replay unchanged.
|
||||
if (inHand.cardId === "chaos" && (!cmd.target || cmd.target.kind !== "player")) {
|
||||
consumeCast(state, caster, inHand, mods, false);
|
||||
if (state.turn.attackUsed) state.turn.secondAttackUsed = true;
|
||||
state.turn.attackUsed = true;
|
||||
state.lastSpellUsed[caster.id] = inHand.cardId;
|
||||
const events: GameEvent[] = [{
|
||||
type: "spellCast", caster: caster.id, card: inHand, cardId: inHand.cardId,
|
||||
numberCards: mods.numbers, numberValue: mods.magnitude.numberValue,
|
||||
from: caster.position, target: null, targetCell: null,
|
||||
}];
|
||||
const queue = turnOrderFrom(state, caster.id).filter((id) =>
|
||||
id !== caster.id && state.players.find((p) => p.id === id)!.alive);
|
||||
state.chaosPending = { casterId: caster.id, excluded: [], queue };
|
||||
finishChaosIfReady(state, events);
|
||||
return { ok: true, state, events };
|
||||
}
|
||||
if (!cmd.target || cmd.target.kind !== "player") return err("attack spells target a player");
|
||||
if (cmd.target.playerId === caster.id) return err("you cannot attack yourself");
|
||||
const target = state.players.find((p) => p.id === (cmd.target as { playerId: PlayerId }).playerId);
|
||||
|
||||
Reference in New Issue
Block a user