Amplify announces itself
Room 9BBV's "impossible" 14-point powerthrust was an archmage playing correctly: 2 + 5, AMPLIFIED. The engine's math was honest and its narration was not — neither the log line nor the attack modal mentioned the amplify, so a legal kill read as a bug. The spellCast event now carries its amplify count, the chronicle says "casts Powerthrust with a 5, AMPLIFIED, at Kestrel", and the modal's power line shows "powered by a 5 — AMPLIFIED ×2" while there is still time to respect it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
b4adb97536
commit
028ff813f3
@@ -483,7 +483,8 @@ export type GameEvent =
|
|||||||
| { type: "moved"; player: PlayerId; from: Cell; to: Cell; direction: Side; via: "step" | "warp" | "passWall" }
|
| { type: "moved"; player: PlayerId; from: Cell; to: Cell; direction: Side; via: "step" | "warp" | "passWall" }
|
||||||
| { type: "numberPlayedForMovement"; player: PlayerId; card: CardInstance; value: number; newAllowance: number }
|
| { type: "numberPlayedForMovement"; player: PlayerId; card: CardInstance; value: number; newAllowance: number }
|
||||||
| { type: "punched"; attacker: PlayerId; target: PlayerId; at: Cell }
|
| { type: "punched"; attacker: PlayerId; target: PlayerId; at: Cell }
|
||||||
| { type: "spellCast"; caster: PlayerId; card: CardInstance; cardId: string; numberCards: CardInstance[]; numberValue: number | null; from: Cell; target: PlayerId | null; targetCell: Cell | null }
|
| { type: "spellCast"; caster: PlayerId; card: CardInstance; cardId: string; numberCards: CardInstance[]; numberValue: number | null; from: Cell; target: PlayerId | null; targetCell: Cell | null;
|
||||||
|
/** AMPLIFY cards attached (each doubles). */ amplifies?: number }
|
||||||
| { type: "counteractionPlayed"; player: PlayerId; card: CardInstance; cardId: string; against: string }
|
| { type: "counteractionPlayed"; player: PlayerId; card: CardInstance; cardId: string; against: string }
|
||||||
| { type: "counterNullified"; player: PlayerId; card: CardInstance; by: CardInstance }
|
| { type: "counterNullified"; player: PlayerId; card: CardInstance; by: CardInstance }
|
||||||
| { type: "attackAbsorbedIntoHand"; player: PlayerId; attackCard: CardInstance }
|
| { type: "attackAbsorbedIntoHand"; player: PlayerId; attackCard: CardInstance }
|
||||||
@@ -4496,6 +4497,7 @@ function doCast(prev: GameState, cmd: Extract<Command, { type: "cast" }>): Comma
|
|||||||
cardId: inHand.cardId,
|
cardId: inHand.cardId,
|
||||||
numberCards: mods.numbers,
|
numberCards: mods.numbers,
|
||||||
numberValue: mods.magnitude.numberValue,
|
numberValue: mods.magnitude.numberValue,
|
||||||
|
amplifies: mods.amplifies.length,
|
||||||
from: caster.position,
|
from: caster.position,
|
||||||
target: target.id,
|
target: target.id,
|
||||||
targetCell: target.position,
|
targetCell: target.position,
|
||||||
|
|||||||
@@ -1091,8 +1091,11 @@
|
|||||||
{:else}
|
{:else}
|
||||||
<div class="attack-card"><Card card={view.stack.attackCard} /></div>
|
<div class="attack-card"><Card card={view.stack.attackCard} /></div>
|
||||||
{/if}
|
{/if}
|
||||||
{#if view.stack.numberValue != null}
|
{#if view.stack.numberValue != null || view.stack.amplifyFactor > 1}
|
||||||
<div class="attack-power">powered by a {view.stack.numberValue}</div>
|
<div class="attack-power">
|
||||||
|
{view.stack.numberValue != null ? `powered by a ${view.stack.numberValue}` : ""}
|
||||||
|
{view.stack.amplifyFactor > 1 ? ` — AMPLIFIED ×${view.stack.amplifyFactor}` : ""}
|
||||||
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
{:else if view.stack.defenderId === view.you}
|
{:else if view.stack.defenderId === view.you}
|
||||||
<div class="attack-fist">👊 a bare-knuckled punch</div>
|
<div class="attack-fist">👊 a bare-knuckled punch</div>
|
||||||
|
|||||||
@@ -39,8 +39,9 @@ export function humanize(e: GameEvent): string | null {
|
|||||||
case "punched": return `${e.attacker} punches ${e.target}!`;
|
case "punched": return `${e.attacker} punches ${e.target}!`;
|
||||||
case "spellCast": {
|
case "spellCast": {
|
||||||
const num = e.numberValue ? ` with a ${e.numberValue}` : "";
|
const num = e.numberValue ? ` with a ${e.numberValue}` : "";
|
||||||
|
const amp = e.amplifies ? `, AMPLIFIED${e.amplifies > 1 ? ` ×${2 ** e.amplifies}` : ""},` : "";
|
||||||
const at = e.target ? ` at ${e.target}` : "";
|
const at = e.target ? ` at ${e.target}` : "";
|
||||||
return `${e.caster} casts ${cardDef(e.cardId).name}${num}${at}.`;
|
return `${e.caster} casts ${cardDef(e.cardId).name}${num}${amp}${at}.`;
|
||||||
}
|
}
|
||||||
case "counteractionPlayed": return `${e.player} counters with ${cardDef(e.cardId).name}!`;
|
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 "counterNullified": return `${cardDef(e.card.cardId).name} is nullified by Anti-Anti!`;
|
||||||
|
|||||||
Reference in New Issue
Block a user