Files
leggenda-del-regolo/docs/BRISCOLA.md
T

130 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Briscola all’oratorio
Implementazione del 26 ottobre 2026. ES modules statici, nessun build step.
## Partita e comandi
Il giocatore di carte è un personaggio inventato e provvisorio, seduto a destra alle tavolate
dell’oratorio: **[DA ANDREA: chi è]**. Il dialogo offre «Alla bona», «Seria», «A fassi male»;
dopo una partita conclusa offre la rivincita. `briscola_vinta` ricorda una vittoria e
`briscola_giocata` abilita la rivincita anche dopo sconfitta o patta. Nessuno dei due flag
serve alla soluzione dell’avventura.
Un clic o tocco su una carta la gioca al rilascio sullo stesso bersaglio. Nessuna carica.
Le frecce e 1–2–3 scelgono, Invio gioca, Esc esce. I tre pulsanti con nome e seme
offrono bersagli aggiuntivi e accesso tramite Tab. I comandi di tiro degli altri minigiochi
rimangono separati; in `MINIGAMES` pressione, rilascio, annullamento e mira sono opzionali.
Mazzo da 40 carte, 120 punti, distribuzione alternata e mazziere deterministico dal seed.
La briscola è in fondo al mazzo e compresa nel contatore. Chi prende pesca prima e riapre;
non esiste obbligo di seme. La presa resta visibile 1,25 secondi. Solo dopo la ventesima
presa si contano tutte le carte, una ogni 0,35 secondi, mostrando carta ingrandita,
incremento e totale. A 60–60 il risultato è patta. Il risultato resta fino all’uscita.
## Avversari e taratura
`observation` espone soltanto la propria mano, le carte pubbliche, i conteggi e l’eventuale
briscola pescata dall’altro. Non passa la mano avversaria, l’ordine del mazzo o il seed della
distribuzione. «Alla bona» sceglie casualmente; «Seria» scarta lisci, conserva briscole e
prende carichi con quelle piccole. «A fassi male» ricostruisce le carte non viste, confronta
le mosse su 40 distribuzioni possibili e simula seguiti giocati con buon senso. Sono ipotesi,
non la distribuzione effettiva. A mazzo finito il complemento delle carte pubbliche e della
propria mano identifica l’altra mano: da quel momento usa minimax esatto fino alla fine.
Comando riproducibile: `node tools/calibrate_briscola.mjs 1000`.
Semi `Math.imul(i, 2654435761) >>> 0`, i da 1 a 1000, stessi mazzi per ogni livello.
Andrea usa sempre `attentive`, l’euristica di riferimento; dà le carte 496 volte su 1000.
| Livello | Vittorie Andrea | Vittorie avversario | Patte | Punti medi Andrea |
| --- | ---: | ---: | ---: | ---: |
| Alla bona | 847 (84,7%) | 144 (14,4%) | 9 (0,9%) | 79,159 |
| Seria | 481 (48,1%) | 494 (49,4%) | 25 (2,5%) | 59,952 |
| A fassi male | 359 (35,9%) | 621 (62,1%) | 20 (2,0%) | 55,628 |
Queste percentuali misurano il confronto con quell’automatismo, non con giocatori umani.
## Grafica e audio
Due mazzi, scelti nel dialogo («Con le toscane» / «Con le napoletane»): stesse regole e stessi id, cambiano
nomi e disegni (`DECKS` e `DECK_CARDS` in `briscola.js`; la scelta è il flag `carte_napoletane`).
- **Toscane** (predefinite): semi francesi cuori, mattoni, fiori, picche; figure gobbo, donna e regio (il regio
sempre con la corona). Numerali senza numeri, semi disposti come nel mazzo vero e capovolti nella metà bassa;
figure intere col seme e la lettera (G, D, R) in alto a sinistra. Riferimento: `assets/raw/carte/toscane-riferimento.png`.
- **Napoletane**: monete, coppe, lame ricurve incrociate, bastoni nodosi; fante, cavallo e re. Valore nell’angolo
e seme scritto per non affidarsi solo al colore.
Tutto disegnato via canvas, in pixel art originale.
I bersagli della mano sono 84×120 pixel a 640×360. Dorso con serpentello coronato e cornice
simmetrica; tavolino di legno e panno, mano avversaria coperta, mazzo e mucchietti delle prese.
Sprite generato con lo **strumento immagini integrato**, poi preparato con
`slice_sprites.py --alpha --fixed-grid --cols 2 --rows 2` e `prepare_character.py`.
Pose: `sit`, `talk`, `laugh`, `shuffle`. Foglio originale in
`assets/raw/giocatore-carte-sheet.png`; prompt completo in
`prompts/personaggi/giocatore-carte-sheet.txt` (entrambi esclusi da git).
Effetti Web Audio `card-slide`, `card-tap`, `card-shuffle`, collegati allo stesso volume,
muto e pausa degli altri effetti. Il colpo accompagna l’arrivo della carta dopo lo scorrimento.
13 nuove battute XTTS (4 Andrea, 9 giocatore), con indice e durate aggiornati.
Per generarle senza GPU/rete, `tools/voci_xtts.py` accetta `XTTS_DEVICE=cpu` e
`XTTS_MODEL_DIR` con la cartella del modello già scaricato; le impostazioni predefinite
rimangono quelle del progetto. Non è stata verificata all’ascolto la pronuncia delle nuove voci.
## Verifica e limiti della sessione
**`npm test`: passato.** Regole, determinismo, conservazione delle 40 carte e dei 120 punti,
pescata, ultima briscola, fine mazzo, patta, livelli, accesso negato ai dati nascosti,
minimax confrontato con un oracolo esaustivo, renderer puro, input geometrico,
dialoghi/flag/rivincita e audio. Passano anche i test precedenti e la soluzione completa.
`npm run browser` e `npm run browser:briscola` sono stati lanciati ma **bloccati dall’ambiente**:
`PermissionError: [Errno 1] Operation not permitted` alla creazione del socket del server.
Anche l’avvio isolato di Chromium fallisce con `sandbox_host_linux.cc:41`,
`shutdown: Operation not permitted`. Non è stato possibile verificare l’interfaccia reale
con Playwright né produrre schermate desktop/telefono.
Il test `tests/briscola.browser.mjs` è pronto: partite complete con mouse, touch e tastiera
su desktop e telefono verticale, più touch orizzontale; pausa, muto, gesto annullato,
conteggio, risultato e rivincita. Accelera solo le attese tramite `game.update`, senza
giocare carte di Andrea direttamente nel motore. Salva in `/tmp/regolo-shots/briscola-*.png`.
Le misure Web Audio dei tre nuovi suoni sono comprese nel collaudo browser multimedia.
Anteprime **offline, non schermate browser**, prodotte e ispezionate nella sessione:
- `/tmp/regolo-shots/briscola-offline-carte.png`
- `/tmp/regolo-shots/briscola-offline-tavolo.png`
- `/tmp/regolo-shots/briscola-offline-risultato.png`
## File
Nuovi: `src/engine/briscola.js`, `src/engine/briscola-render.js`,
`assets/characters/giocatore-carte.png`, `assets/characters/giocatore-carte.json`,
`tests/briscola.test.mjs`, `tests/briscola-render.test.mjs`, `tests/briscola.browser.mjs`,
`tools/calibrate_briscola.mjs`, questo documento e 13 MP3 elencati qui sotto.
Modificati: `src/engine/game.js`, `src/engine/render.js`, `src/engine/soundscape.js`,
`src/main.js`, `src/story/story.js`, `index.html`, `style.css`, `package.json`,
`tests/story.test.mjs`, `tests/multimedia.test.mjs`, `tests/multimedia.browser.mjs`,
`tools/voci.json`, `tools/voci_xtts.py`, `assets/voices/index.json`.
Nuovi file in `assets/voices/`:
```text
andrea-6e63dafda1.mp3
andrea-71f3bff8a0.mp3
andrea-b851b9ed26.mp3
andrea-d2f285f610.mp3
giocatore_carte-12f97003ec.mp3
giocatore_carte-13af2e2331.mp3
giocatore_carte-43e76cf11b.mp3
giocatore_carte-6ce98bce81.mp3
giocatore_carte-729b3344da.mp3
giocatore_carte-8dfadb4acc.mp3
giocatore_carte-9c07caaab4.mp3
giocatore_carte-a8846bfa7b.mp3
giocatore_carte-f1f219bd1c.mp3
```
`docs/STATO.md` invariato. Nessun commit, tag o push.