feat: live mental-game rituals in Cash mode
Brian's own rituals (mined from his logs) become first-class, live tools instead of post-hoc recap sections: - Scar Note — instructive mistakes with the punt/cooler/standard distinction. - Confidence Bank — good process, banked regardless of result. - Alligator Blood — invokable adversity state; she suggests it when he's card-dead/short/stuck, and her coaching register shifts while it's on (live state injected into context per-turn via chat._mode_state_note). - Reset — tilt circuit-breaker; mental marker only, stats stay continuous. poker_rituals table + log_ritual/list_rituals/set_alligator/alligator_active; 4 tools added to the Cash toolset and taught in the mode card; HUD gains a 🐊 banner + Confidence Bank + Scar Notes panels; recap grounded via _rituals_block. tests/test_modes.py +5 ritual tests; 41 green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -61,6 +61,23 @@
|
||||
.tag { font-size: .7rem; color: var(--mid); border: 1px solid var(--border); border-radius: 999px; padding: 1px 7px; }
|
||||
.villain b { color: var(--text); } .villain .cat { color: var(--mid); font-size: .78rem; }
|
||||
.note-meta { color: var(--fade); font-size: .72rem; }
|
||||
|
||||
/* Rituals */
|
||||
.gator {
|
||||
display: flex; align-items: center; gap: 12px; background: #1a2e10;
|
||||
border: 1px solid #3c6b1e; border-radius: 14px; padding: 14px 16px; margin-bottom: 14px;
|
||||
}
|
||||
.gator .ico { font-size: 1.7rem; }
|
||||
.gator b { color: #b6e88a; } .gator .sub { color: #8fbf6a; font-size: .82rem; }
|
||||
.scar-cls {
|
||||
font-size: .68rem; text-transform: uppercase; letter-spacing: .4px; border-radius: 999px;
|
||||
padding: 1px 7px; border: 1px solid var(--border); margin-left: 6px;
|
||||
}
|
||||
.scar-cls.punt { color: var(--low); border-color: var(--low); }
|
||||
.scar-cls.cooler { color: var(--mid); border-color: var(--mid); }
|
||||
.scar-cls.standard { color: var(--fade); }
|
||||
.card.scar { border-color: #4a2222; } .card.scar .label { color: #d98a8a; }
|
||||
.card.conf { border-color: #234a23; } .card.conf .label { color: var(--good); }
|
||||
.empty { color: var(--fade); font-size: .92rem; }
|
||||
.err { color: var(--low); text-align: center; padding: 30px; }
|
||||
.big-empty { text-align: center; padding: 50px 20px; color: var(--fade); }
|
||||
@@ -139,11 +156,20 @@
|
||||
const villains = data.villains || [];
|
||||
const notes = data.notes || [];
|
||||
const stats = data.stats || {};
|
||||
const rituals = data.rituals || {};
|
||||
const scars = rituals.scars || [];
|
||||
const confidence = rituals.confidence || [];
|
||||
const resets = rituals.resets || [];
|
||||
|
||||
const title = [s.stakes, s.game].filter(Boolean).join(' ') || 'Session';
|
||||
const tagBits = Object.entries(stats.tags || {}).map(([k,v]) => `${k}×${v}`).join(' · ');
|
||||
|
||||
root.innerHTML = `
|
||||
${rituals.alligator ? `<div class="gator">
|
||||
<span class="ico">🐊</span>
|
||||
<div><b>Alligator Blood</b><div class="sub">refuse to die · no forced miracles · make them beat you correctly</div></div>
|
||||
</div>` : ''}
|
||||
|
||||
<div class="card">
|
||||
<div class="sess-top">
|
||||
<span class="sess-title">${esc(title)}</span>
|
||||
@@ -154,6 +180,7 @@
|
||||
<span class="chip">in <b>${money(s.buy_in_total)}</b></span>
|
||||
<span class="chip">${esc(s.format || 'cash')}</span>
|
||||
<span class="chip"><b>${hands.length}</b> hands</span>
|
||||
${resets.length ? `<span class="chip">🔄 <b>${resets.length}</b> reset${resets.length>1?'s':''}</span>` : ''}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -180,6 +207,23 @@
|
||||
: '<p class="empty">No hands logged yet.</p>'}
|
||||
</div>
|
||||
|
||||
<div class="card conf">
|
||||
<p class="label">💰 Confidence Bank</p>
|
||||
${confidence.length ? `<ul class="rows">${confidence.slice().reverse().map(c => `
|
||||
<li>${esc(c.content)}${c.hand_id ? ` · <a class="hand" style="display:inline" href="/hand/${c.hand_id}">hand</a>` : ''}
|
||||
<div class="note-meta">${ago(c.at)}</div></li>`).join('')}</ul>`
|
||||
: '<p class="empty">Nothing banked yet — disciplined plays land here.</p>'}
|
||||
</div>
|
||||
|
||||
<div class="card scar">
|
||||
<p class="label">🩹 Scar Notes</p>
|
||||
${scars.length ? `<ul class="rows">${scars.slice().reverse().map(sc => `
|
||||
<li>${esc(sc.content)}${sc.classification ? `<span class="scar-cls ${esc(sc.classification)}">${esc(sc.classification)}</span>` : ''}
|
||||
${sc.hand_id ? ` · <a class="hand" style="display:inline" href="/hand/${sc.hand_id}">hand</a>` : ''}
|
||||
<div class="note-meta">${ago(sc.at)}</div></li>`).join('')}</ul>`
|
||||
: '<p class="empty">No scars logged — mistakes to study land here.</p>'}
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<p class="label">Villains seen</p>
|
||||
${villains.length ? `<ul class="rows">${villains.map(v => `
|
||||
|
||||
Reference in New Issue
Block a user