Mist shields its wizard from creatures; a glued square turns with its sector; Waterbolt splits the power it is cast with

Three of Ramses's reports from KFJL:
- Rev 28: MIST-BODY's "may not attack or be attacked" holds against
  creatures. A wraith's or democratic monster's touch, a fire imp's
  scorch, and an ordered troll/skeleton/shadow blow all pass the mist by;
  older games keep the strike their ledgers recorded. The automaton no
  longer orders its creatures at a misted wizard.
- ROTATE and RELOCATE SECTOR threw while GLUE was down: GLUE keeps its
  cell's key in the sustained effect's edge slot, and the remap read it
  as an edge. It maps as a cell now (the throw never reached a ledger,
  so this ships ungated).
- WATERBOLT's damage/knockback split was sized by the NUMBER's face; the
  engine weighs POWERSTONE's +1 and AMPLIFY's doubling, so a 5 behind a
  powerstone was refused for not totalling 6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Eric Wagoner
2026-10-21 19:54:43 -04:00
co-authored by Claude Opus 5.5
parent 3368a92cf5
commit 8dcdfd2415
5 changed files with 109 additions and 5 deletions
+11 -2
View File
@@ -692,7 +692,14 @@
if (selectedDef.los) return "Choose a target · lit squares are in your sight";
return `${selectedDef.name} · its panel offers the choices`;
});
const numberTotal = $derived(attachedNumber ? cardDef(attachedNumber.cardId).value! : 1);
/** The spell's power as the engine weighs it: the NUMBER's face, +1 for
* a displayed POWERSTONE, doubled per AMPLIFY riding along. WATERBOLT's
* split must total exactly this, or the cast is refused. */
const numberTotal = $derived.by(() => {
const stone = view?.players.find((p) => p.id === view.you)?.displayed.some((c) => c.cardId === "powerstone") ? 1 : 0;
const face = attachedNumber ? cardDef(attachedNumber.cardId).value! + stone : 1;
return face * 2 ** attachedMods.filter((m) => m.cardId === "amplify").length;
});
function dispatch(command: Parameters<typeof net.command>[0]) {
if (local.active) local.command(command);
@@ -854,6 +861,7 @@
attachedMods = attachedMods.some((m) => m.instanceId === card.instanceId)
? attachedMods.filter((m) => m.instanceId !== card.instanceId)
: [...attachedMods, card];
wbDamage = numberTotal;
return;
}
if (selectedCard?.instanceId === card.instanceId) {
@@ -1372,7 +1380,8 @@
};
withMods(cmd);
if (selectedCard.cardId === "waterbolt") {
cmd.params = { damage: wbDamage, knockback: numberTotal - wbDamage };
const damage = Math.min(Math.max(0, wbDamage), numberTotal);
cmd.params = { damage, knockback: numberTotal - damage };
}
if (NAMED_CARDS.has(selectedCard.cardId)) {
const id = nameToCardId(nameInput);