Ask the automatons: the council of three offers hints from your seat

The owner's idea for teaching novices: a hints button runs all three
temperaments' brains against YOUR view — the same cards and board you
see, nothing hidden — and each says what it would do in your robes.
The Hunter (eyes on the gold), the Berserker (eyes on the blood), the
Worrier (eyes on the exits). Available on your turn and while under
fire (counter advice included); purely advisory, computed client-side,
nothing dispatched. hints.ts translates any Command into plain words.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0138A8CjeQRpvzKxuMfz1Bqc
This commit is contained in:
Eric Wagoner
2026-08-18 02:19:32 -04:00
co-authored by Claude Fable 5
parent 5ac1c9ed70
commit b1f03fee81
2 changed files with 136 additions and 0 deletions
+36
View File
@@ -949,6 +949,14 @@
illusionPrompt = null;
}
// The council of three: what each temperament would do from your seat.
let councilHints = $state<import("./hints").TableHint[] | null>(null);
async function askCouncil() {
if (!view) return;
const { tableHints } = await import("./hints");
councilHints = tableHints(view);
}
let pickChoice = $state(false);
function pickUp() {
if (treasuresHere.length > 1) { pickChoice = true; return; }
@@ -1630,6 +1638,21 @@
<div class="peek-note">{creatureStats(commandedCreature)}</div>
</div>
{/if}
{#if councilHints}
<div class="slip council">
<div class="council-head">The council considers your position…
<button class="hint-cancel" onclick={() => (councilHints = null)}>enough</button>
</div>
{#each councilHints as h (h.name)}
<div class="council-row">
<span class="council-name">{h.glyph} {h.name}</span>
<span class="council-mood">({h.mood})</span>
{h.advice}
</div>
{/each}
<button class="stamp tiny" onclick={askCouncil}>ask again</button>
</div>
{/if}
{#if actionsSpent}
{#if view.turn.drawForbidden}
<div class="slip urgent">Your own bolt has left you reeling — the rest of this turn is lost, and no cards come with it.</div>
@@ -1766,6 +1789,7 @@
{/if}
</span>
<button class="stamp tiny" onclick={pass}>let it resolve</button>
<button class="stamp tiny" onclick={askCouncil}>🎓 hints</button>
{/if}
{#if youMustDiscard}
<span class="hint-alert">Hand over the limit — mark cards and discard.</span>
@@ -1939,6 +1963,7 @@
<button class="stamp" class:primary={punchWallMode} disabled={view.turn.attackUsed && !punchWallMode}
onclick={() => (punchWallMode = !punchWallMode)}>
{punchWallMode ? "Click the wall to punch — or cancel" : "Punch a wall…"}</button>
<button class="stamp" onclick={askCouncil}>🎓 Ask the automatons</button>
<button class="stamp" onclick={startDiscardMode}>Discard cards</button>
<label class="inline draw-pick">
draw
@@ -2354,6 +2379,17 @@
.stamp.big { font-size: 0.95rem; padding: 0.6rem 1.3rem; }
.stamp.tiny { font-size: 0.62rem; padding: 0.22rem 0.5rem; box-shadow: 1px 1px 0 rgba(0,0,0,0.3); }
.stamp.discard-one { background: #8a7a5e; }
.slip.council { background: #ece4f1; border-color: #7a6f9a; }
.council-head {
font-weight: 700;
display: flex;
justify-content: space-between;
align-items: baseline;
margin-bottom: 0.25rem;
}
.council-row { margin: 0.2rem 0; }
.council-name { font-weight: 700; }
.council-mood { color: #8a7a5e; font-size: 0.72rem; }
.stamp:focus-visible { outline: 2px solid #d8b23a; outline-offset: 2px; }
.game {