Il GP di Fortezza: gara dei cinquantini attorno alle mura (pista di Codex dalla planimetria, sterzo, acceleratori, miscela, buche, presentazione dei piloti coi motorini dalle foto); Via Liguri Magelli col Trappola, la targa della Ghiacciomobile e il Betino in cima alla salita; l'Arcu lancia la sfida dal Trappola e ha la voce nuova (Andrea)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECdCPptNRwbVzjzHbohi
This commit is contained in:
2026-10-28 19:55:16 +01:00
co-authored by Claude Opus 5.5
parent c96dec4692
commit 800a82045d
79 changed files with 1205 additions and 67 deletions
+108 -10
View File
@@ -2,10 +2,13 @@
// Testi, personaggi ed enigmi sono provvisori e verranno sostituiti con i ricordi di Andrea (docs/PROGETTO.md).
// Le forme in `art` sono segnaposto disegnati sopra lo sfondo (vecchietti, squama, catena) in attesa degli sprite.
import { ambience } from './ambience.js';
import { piloti } from './piloti.js';
// Gli indizi del Trebbio per la catena della torcia (dopo le impronte, finché la torcia non c'è): uno per tappa,
// dalla più avanti alla prima.
const castello = say => [{ say, who: 'castello' }];
// Prima del GP di Fortezza l'Arcu va a prendere il Betino in cima alla salita (Andrea, 28 ottobre).
const rincorsa = level => [{ say: 'Aspettate: prendo la rincorsa, che il Betino s\'accende solo in discesa.', who: 'arcu', pose: 'point' }, { closeup: 'gara', level }];
const torchHints = [{
if: 'has:chiavetta',
then: castello('Una chiavetta piccola apre una cosa piccola. All\'area feste c\'è una casetta che aspetta.'),
@@ -184,6 +187,26 @@ export const story = {
quit: [{ say: 'Lascio la canna ai ragazzi. Il lago non scappa, il palio sì.' }],
draw: [],
},
// Il GP di Fortezza (idea di Andrea, 28 ottobre): tre giri coi cinquantini attorno alle mura, gas e sterzo come
// nelle vecchie gare da sala giochi viste dall'alto. Chi corre sta in piloti.js. [DA ANDREA: le battute; la musica]
gara: {
type: 'gara', music: 'assets/audio/gara.mp3', // di Andrea (Suno)
picture: 'assets/closeups/gp-fortezza.png', // Codex, dalla planimetria di Andrea; la strada è il tracciato
// Corre solo chi ha dato il consenso (`consenso: null` vuol dire «da chiedere»: per ora Puntella).
riders: piloti.filter(p => p.consenso !== null),
names: { player: 'Andrea', cpu: 'gli altri' },
win: [
{ say: 'Primo! E col Fifty di serie, o quasi.' },
{ say: 'Si rifà! Questa un vale, avevo la catena lenta.', who: 'arcu', pose: 'shrug' },
{ set: 'gara_vinta' },
],
lose: [
{ say: 'Ho preso tutta la polvere di quelli davanti.' },
{ say: 'Il Fifty è bono. È chi ci sta sopra.', who: 'arcu', pose: 'laugh' },
],
quit: [{ say: 'Lascio stare. Il Fifty mi serve intero, per il palio.' }],
draw: [],
},
// Il biliardo del Circolo 4 Maggio contro l'Ing. Tozzi: cinque birilli, un colpo a testa, si va a 20. [DA ANDREA: le sue battute]
biliardo: {
type: 'biliardo',
@@ -2059,19 +2082,11 @@ export const story = {
people: [
{ who: 'arcu', at: [418, 292], facing: -1, idle: 'stand', talk: ['talk', 'explain'], blink: 'blink', every: 4.2 },
// Oggetti statici: ordinati per profondità come la macchina del tempo, senza voce.
// Con la depth della scena misurano circa 78 e 160 px; restano sopra il bordo di walk.
{ who: 'betino', at: [480, 263], size: 0.767, idle: 'idle', talk: [] },
// Con la depth della scena misura circa 160 px; resta sopra il bordo di walk. (Il Betino dell'Arcu sta in
// cima alla salita di Via Liguri Magelli, Andrea 28 ottobre.)
{ who: 'ghiacciomobile', at: [176, 286], size: 0.986, idle: 'idle', talk: [] },
],
hotspots: [
{
id: 'betino', name: 'il Betino', box: [441, 212, 78, 51], at: [480, 282], face: 'up', default: 'look',
// Il motorino di Andrea (sprite di Codex, 26 ottobre); la battuta è sua.
actions: {
look: [{ say: 'Nessuno ha mai capito davvero il tuo immenso valore.' }],
use: [{ say: 'O via, lascialo riposare. A pedalare oggi ci penso io.' }],
},
},
{
id: 'ghiacciomobile', name: 'la Ghiacciomobile', box: [96, 215, 160, 71], at: [240, 308], face: 'up', default: 'look',
// La Corsa nera degli amici (sprite di Codex, 26 ottobre). Parlandole, Andrea ricorda; lei non risponde.
@@ -2630,6 +2645,60 @@ export const story = {
{
id: 'al_ponticino', name: 'verso il ponticino della Carza', box: [440, 150, 90, 60], at: [480, 216], exit: { scene: 'ponticino', at: [444, 204], face: 'right' },
},
{
id: 'via_liguri_magelli', name: 'Via Liguri Magelli', box: [0, 100, 70, 260], at: [30, 260], exit: { scene: 'via_liguri_magelli', at: [320, 340], face: 'up' },
},
],
},
// Via Liguri Magelli (Street View mandato da Andrea, 28 ottobre): a sinistra dal campo del Giannini. A destra la
// casa salmone con la tenda del Trappola (il Barrettino), sul muro giallo la targa della Ghiacciomobile con la sua
// fotina, e in cima alla salita il Betino dell'Arcu (dipinto da Codex nel quadro), di traverso verso la discesa:
// per partire ne ha bisogno, e intanto ferma il traffico.
via_liguri_magelli: {
name: 'Via Liguri Magelli',
map: [76, 97],
background: 'assets/scenes/via-liguri-magelli.png',
walk: [[0, 360], [0, 320], [140, 262], [226, 198], [272, 198], [400, 250], [580, 318], [640, 330], [640, 360]],
depth: [[198, 0.3], [360, 1.1]],
entry: [320, 340],
speakers: { arcu: [374, 176] },
people: [
// L'Arcu sotto la tenda del Trappola: due minuti fa era a Campomigliaio (Andrea, 28 ottobre).
{ who: 'arcu', at: [374, 248], facing: -1, size: 1.3, idle: 'stand', talk: ['talk', 'explain'], blink: 'blink', every: 4.2 },
],
hotspots: [
{
id: 'arcu', name: 'l\'Arcu', box: [362, 180, 26, 68], at: [352, 256], face: 'right', default: 'talk',
actions: {
look: [{ say: 'L\'Arcu, sotto la tenda del Trappola. Due minuti fa era a Campomigliaio.' }],
talk: [{ dialogue: 'arcu_trappola' }],
},
},
{
// «Vai dal Trappola, la tenda è il Trappola» (Andrea). [DA ANDREA: com'è dentro, e chi c'è]
id: 'trappola', name: 'dal Trappola', box: [316, 150, 46, 72], at: [340, 238], face: 'right', default: 'walk',
actions: {
look: [{ say: 'La tenda è il Trappola: sotto c\'è il Barrettino.' }],
walk: [{ say: 'Dal Trappola ci si passa dopo. Prima il palio.' }],
},
},
{
id: 'targa', name: 'targa della Ghiacciomobile', box: [570, 130, 62, 78], at: [565, 336], face: 'right', default: 'look',
actions: {
look: [{ say: '«Qui riposa la Ghiacciomobile, che si è schiantata lì.»' }, { say: 'C\'è anche la fotina. Pareva sempre nuova.' }],
},
},
{
// La prima battuta è di Andrea (dal circolino, 26 ottobre).
id: 'betino', name: 'il Betino dell\'Arcu', box: [232, 172, 40, 24], at: [250, 206], face: 'up', default: 'look',
actions: {
look: [{ say: 'Nessuno ha mai capito davvero il tuo immenso valore.' }, { say: 'Lassù in cima, di traverso: per partire ha bisogno della discesa. E intanto ferma il traffico.' }],
use: [{ say: 'È il Betino dell\'Arcu. Senza una discesa davanti, un si muove.' }],
},
},
{
id: 'al_giannini', name: 'verso il campo del Giannini', box: [180, 330, 280, 30], at: [320, 345], exit: { scene: 'campo_giannini', at: [60, 250], face: 'right' },
},
],
},
// Cardetole, il rione dei verdi, dove abita Andrea: giù dalla Pieve.
@@ -3009,6 +3078,35 @@ export const story = {
},
},
},
// L'Arcu dal Trappola (Andrea, 28 ottobre): lo scherzo sulla velocità del Betino, poi la sfida: «il giro della Fortezza» (Andrea), cioè il GP di Fortezza;
// prima del via prende la rincorsa per accenderlo in discesa. [DA ANDREA: le battute sono provvisorie]
arcu_trappola: {
nodes: {
start: {
options: [
{ text: 'Ma ti ho visto du\' minuti fa a Campomigliaio!', then: [
{ say: 'E allora? Col Betino ci metto un attimo.', who: 'arcu', pose: 'explain' },
{ say: 'In discesa.', who: 'arcu', pose: 'laugh' },
{ say: 'E in salita?' },
{ say: 'In salita si spinge.', who: 'arcu', pose: 'shrug' },
] },
{ text: 'Si fa una gara coi motorini? Il giro della Fortezza!', next: 'gara', then: [
{ say: 'Col Betino? Io un perdo mai: un vo mai forte abbastanza da cadere.', who: 'arcu', pose: 'explain' },
{ say: 'Come la si fa?', who: 'arcu', pose: 'talk' },
] },
{ text: 'Ci si vede dopo, Arcu.', next: 'end' },
],
},
gara: {
options: [
{ text: 'Alla bona, un giro di paese.', next: 'end', then: [{ say: 'Alla bona. Chi arriva ultimo paga le paste.', who: 'arcu', pose: 'laugh' }, ...rincorsa('bona')] },
{ text: 'Seria.', next: 'end', then: [{ say: 'Seria. Tre giri, e la paglia in curva è vera.', who: 'arcu', pose: 'explain' }, ...rincorsa('seria')] },
{ text: 'Ginocchio in terra.', next: 'end', then: [{ say: 'Ginocchio in terra? Puntella un vede l\'ora.', who: 'arcu', pose: 'shrug' }, ...rincorsa('male')] },
{ text: 'No, lascia perdere.', next: 'start' },
],
},
},
},
// Da solo al campo del Circolo: Andrea decide quanto farsi male.
basket: {
nodes: {