Esito che vale e si salva appena deciso, per tutti i minigiochi (anche tornando al titolo dalla schermata del risultato); briscola: uscire durante il conteggio non perde più la vittoria; tressette: si esce ai 21 col primo evento che ci porta, accusa compresa (prima vinceva sempre Andrea se ci arrivavano tutte e due), il carico che fa vincere si dà anche se è il 2, accuse che non escono dal tavolo, convenzioni scritte nell'aiuto; scopa: primiera valutata per quel che migliora, finale esatto a mazzo finito, presa sulla tavola al rilascio con scelta e conferma, frecce e Invio sempre sulla presa scelta. Tastiera: Invio e Spazio giocano sempre la carta scelta. Tavola descritta a parole. Classi CSS comuni ai tre giochi. Video: player nel gioco (pulsante «Guarda il video» nel «Come si gioca», compare quando il video esiste), video/narra.py per la voce del narratore, pezzi comuni dei copioni e il copione della briscola; scaletta in video/SCALETTA-CARTE.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A1dxvtsZx8NE9fwjXUNDBr
77 lines
3.9 KiB
JavaScript
77 lines
3.9 KiB
JavaScript
// Copione del video «Come si gioca: la briscola» (video/SCALETTA-CARTE.md, clip 1).
|
|
// Giro: video/narra.py, poi rec.mjs come in video/SCALETTA.md, poi video/monta.py <cartella> --tutorial.
|
|
import { c, sleep, setup as base, regista } from "./tutorial-comune.mjs";
|
|
|
|
export const title = { it: "Come si gioca · la briscola", en: "Come si gioca · la briscola" };
|
|
export const cues = [
|
|
c("dove", "All'oratorio della Pieve, alle tavolate, c'è il giocatore di carte: per giocare basta parlarci"),
|
|
c("mazzo", "Prima si sceglie il mazzo: le carte toscane, con gobbo, donna e regio, oppure le napoletane"),
|
|
c("livello", "Poi quanto deve giocare forte: alla bona, seria, o a fassi male"),
|
|
c("tavolo", "In basso le tue tre carte, in alto quelle coperte dell'avversario. A sinistra il mazzo, con la briscola girata sotto: quel seme comanda"),
|
|
c("presa", "Si gioca una carta per uno. Prende la briscola più alta; se non ce ne sono, la carta più alta del seme di chi è uscito"),
|
|
c("punti", "Contano l'Asso, undici punti, il tre, dieci, il regio quattro, la donna tre e il gobbo due. Le altre sono lisci e non valgono niente"),
|
|
c("pesca", "Chi prende pesca per primo ed esce alla mano dopo. E non c'è l'obbligo di rispondere al seme"),
|
|
c("consiglio", "Un consiglio: su un liscio rispondi con un liscio, e i carichi dell'avversario prendili con una briscola piccola"),
|
|
c("tastiera", "Si gioca toccando la carta, oppure coi pulsanti sotto il tavolo, o con le frecce e Invio"),
|
|
c("conto", "Finito il mazzo si contano le prese, una carta alla volta. Vince chi arriva a sessantuno punti, e sessanta a sessanta è patta"),
|
|
c("fine", "Poi si torna all'oratorio, e si può chiedere la rivincita. Buona briscola!"),
|
|
];
|
|
|
|
export const setup = base;
|
|
|
|
export async function run(d) {
|
|
const p = d.page, r = regista(d, "tutorial-briscola");
|
|
await r.ascolta();
|
|
await r.vaiA("oratorio", [470, 300]);
|
|
await r.cue("dove");
|
|
await r.parlaCon("giocatore_carte");
|
|
await r.scegli("Una briscola?");
|
|
await r.cue("mazzo");
|
|
await r.scegli("Con le toscane.");
|
|
await r.cue("livello");
|
|
await r.scegli("Seria.");
|
|
// Una mano fissa, la stessa a ogni ripresa.
|
|
await p.evaluate(async () => {
|
|
const { newBriscola } = await import("/src/engine/briscola.js");
|
|
game.closeup = { id: "briscola", ...newBriscola(91421, { level: "seria", deck: "toscane" }) };
|
|
});
|
|
await sleep(800);
|
|
await r.cue("tavolo");
|
|
await r.muovi([150, 160], 1.0); await sleep(600); await r.muovi([320, 280], 1.0);
|
|
|
|
// Una carta di Andrea: quella che sceglierebbe un giocatore attento, cliccata davvero sul tavolo.
|
|
const gioca = async () => {
|
|
for (let i = 0; i < 400; i++) {
|
|
const s = await p.evaluate(async () => {
|
|
const { canPlay } = await import("/src/engine/briscola.js");
|
|
return game.closeup?.step === "result" || game.closeup?.step === "count" ? "fine" : canPlay(game.closeup) && !game.speech ? "tocca" : "aspetta";
|
|
});
|
|
if (s === "fine") return false;
|
|
if (s === "tocca") break;
|
|
await sleep(150);
|
|
}
|
|
const i = await p.evaluate(async () => {
|
|
const { observation, attentive } = await import("/src/engine/briscola.js");
|
|
return attentive(observation(game.closeup, "player"));
|
|
});
|
|
await r.clicca([176 + i * 102 + 42, 290], 0.7);
|
|
return true;
|
|
};
|
|
const giocane = async (n) => { for (let k = 0; k < n; k++) if (!(await gioca())) return; };
|
|
|
|
await r.cue("presa"); await giocane(2);
|
|
await r.cue("punti"); await giocane(2);
|
|
await r.cue("pesca"); await giocane(2);
|
|
await r.cue("consiglio"); await giocane(2);
|
|
await r.cue("tastiera"); await giocane(20);
|
|
await p.waitForFunction(() => game.closeup?.step === "count", null, { timeout: 60000 });
|
|
await r.cue("conto");
|
|
await p.waitForFunction(() => game.closeup?.step === "result", null, { timeout: 60000 });
|
|
await sleep(2500);
|
|
await r.cue("fine");
|
|
await d.click(p.locator("#closeup-close"), 0.6);
|
|
await r.fermi(800);
|
|
await r.fine();
|
|
await r.salvaAudio();
|
|
}
|