The Alter Ego casts from its own square; the first-stride cue leaves the maze
Randy raised his double, selected it, and could cast nothing through it: the card's whole point — "it may use any of the spells in your hand, and you need not be in its L.O.S." — had never been wired. A cast may now name the double, and the double's square becomes the spell's origin: sight, reach, the launch point the reel films, and the direction a knockback or rout pushes. The hand, the attack, and every answer to it stay the caster's. Spells that move the caster's own body — a goat's charge, a swap — do not travel through it. On the board, the double's sight lights the eligible squares; selecting the double and then a card aims from where it stands. A test hides the caster and fires through the double. The first-stride caption sat on the maze and hid the walls beside the wizard; it now stands above the board with a color chip for "you." Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Jm2auWk6RP71CjaAb4FMoG
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
5f58a0955a
commit
10d5c5815d
@@ -35,7 +35,6 @@
|
||||
markedCells = null,
|
||||
litCells = null,
|
||||
spotCells = [],
|
||||
spotCaption = null,
|
||||
markedSector = null,
|
||||
ghostSlots = null,
|
||||
onGhostClick,
|
||||
@@ -70,8 +69,6 @@
|
||||
litCells?: Set<string> | null;
|
||||
/** The step light's squares: a pulsing rim on each. */
|
||||
spotCells?: string[];
|
||||
/** One line hung above a square — the first stride's cue. */
|
||||
spotCaption?: { cell: { x: number; y: number }; text: string } | null;
|
||||
/** Origin of a picked-up 5x5 sector: the whole sector outlines as taken. */
|
||||
markedSector?: { x: number; y: number } | null;
|
||||
/** Empty 5x5 slot origins a sector may land on — drawn as dashed ground
|
||||
@@ -697,17 +694,6 @@
|
||||
{@const sy = Number(key.split(",")[1])}
|
||||
<rect x={sx * CELL + 3} y={sy * CELL + 3} width={CELL - 6} height={CELL - 6} class="spot-cell" rx="5" />
|
||||
{/each}
|
||||
{#if spotCaption}
|
||||
{@const cols = Math.max(...Object.keys(view.board.cells).map((k) => Number(k.split(",")[0]))) + 1}
|
||||
{@const cw = spotCaption.text.length * 6.6 + 20}
|
||||
{@const cx = Math.min(Math.max(spotCaption.cell.x * CELL + CELL / 2, cw / 2 + 4), cols * CELL - cw / 2 - 4)}
|
||||
{@const above = spotCaption.cell.y > 0}
|
||||
{@const cy = above ? spotCaption.cell.y * CELL - 14 : (spotCaption.cell.y + 1) * CELL + 14}
|
||||
<g class="spot-caption" transform={`translate(${cx}, ${cy})`}>
|
||||
<rect x={-cw / 2} y={-12} width={cw} height={24} rx="12" />
|
||||
<text x="0" y="4">{spotCaption.text}</text>
|
||||
</g>
|
||||
{/if}
|
||||
<!-- FEAR's bubble: the three-space diamond, through walls, wrapping the rim -->
|
||||
{#each fearAura as key (key)}
|
||||
{@const bx = Number(key.split(",")[0])}
|
||||
@@ -865,15 +851,6 @@
|
||||
0%, 100% { opacity: 0.35; }
|
||||
50% { opacity: 1; }
|
||||
}
|
||||
.spot-caption { pointer-events: none; }
|
||||
.spot-caption rect { fill: rgba(28, 22, 12, 0.92); stroke: #f2cf5b; stroke-width: 1.5; }
|
||||
.spot-caption text {
|
||||
fill: #f7ecc8;
|
||||
font-size: 12px;
|
||||
font-family: "Oswald", "Helvetica Neue", Arial, sans-serif;
|
||||
letter-spacing: 0.02em;
|
||||
text-anchor: middle;
|
||||
}
|
||||
.marked-cell {
|
||||
fill: rgba(211, 133, 43, 0.18);
|
||||
stroke: #d3852b;
|
||||
|
||||
Reference in New Issue
Block a user