diff --git a/assets/scenes/mini/piazzetta-cambray-digny.png b/assets/scenes/mini/piazzetta-cambray-digny.png new file mode 100644 index 0000000..a736825 Binary files /dev/null and b/assets/scenes/mini/piazzetta-cambray-digny.png differ diff --git a/assets/scenes/mini/provinciale-pignone.png b/assets/scenes/mini/provinciale-pignone.png new file mode 100644 index 0000000..b959c08 Binary files /dev/null and b/assets/scenes/mini/provinciale-pignone.png differ diff --git a/assets/scenes/mini/via-del-pignone.png b/assets/scenes/mini/via-del-pignone.png new file mode 100644 index 0000000..28d0613 Binary files /dev/null and b/assets/scenes/mini/via-del-pignone.png differ diff --git a/assets/scenes/piazzetta-cambray-digny.png b/assets/scenes/piazzetta-cambray-digny.png new file mode 100644 index 0000000..f27407e Binary files /dev/null and b/assets/scenes/piazzetta-cambray-digny.png differ diff --git a/assets/scenes/provinciale-pignone.png b/assets/scenes/provinciale-pignone.png new file mode 100644 index 0000000..fecb0f8 Binary files /dev/null and b/assets/scenes/provinciale-pignone.png differ diff --git a/assets/scenes/via-del-pignone.png b/assets/scenes/via-del-pignone.png new file mode 100644 index 0000000..7204822 Binary files /dev/null and b/assets/scenes/via-del-pignone.png differ diff --git a/assets/voices/andrea-0e558e54fe.mp3 b/assets/voices/andrea-0e558e54fe.mp3 new file mode 100644 index 0000000..8015fa3 Binary files /dev/null and b/assets/voices/andrea-0e558e54fe.mp3 differ diff --git a/assets/voices/andrea-1bd111f29d.mp3 b/assets/voices/andrea-1bd111f29d.mp3 new file mode 100644 index 0000000..ca67855 Binary files /dev/null and b/assets/voices/andrea-1bd111f29d.mp3 differ diff --git a/assets/voices/andrea-2b47355c2c.mp3 b/assets/voices/andrea-2b47355c2c.mp3 new file mode 100644 index 0000000..7f613b5 Binary files /dev/null and b/assets/voices/andrea-2b47355c2c.mp3 differ diff --git a/assets/voices/andrea-60f39f0dd7.mp3 b/assets/voices/andrea-60f39f0dd7.mp3 new file mode 100644 index 0000000..4479f86 Binary files /dev/null and b/assets/voices/andrea-60f39f0dd7.mp3 differ diff --git a/assets/voices/andrea-7b3b36edc6.mp3 b/assets/voices/andrea-7b3b36edc6.mp3 new file mode 100644 index 0000000..7efb5dc Binary files /dev/null and b/assets/voices/andrea-7b3b36edc6.mp3 differ diff --git a/assets/voices/andrea-7fd73fbb77.mp3 b/assets/voices/andrea-7fd73fbb77.mp3 new file mode 100644 index 0000000..eb2a8c3 Binary files /dev/null and b/assets/voices/andrea-7fd73fbb77.mp3 differ diff --git a/assets/voices/andrea-c3279de3ab.mp3 b/assets/voices/andrea-c3279de3ab.mp3 new file mode 100644 index 0000000..8ffe508 Binary files /dev/null and b/assets/voices/andrea-c3279de3ab.mp3 differ diff --git a/assets/voices/index.json b/assets/voices/index.json index a7f3d9b..73b69b9 100644 --- a/assets/voices/index.json +++ b/assets/voices/index.json @@ -627,6 +627,34 @@ "file": "andrea-e24cb31cbf.mp3", "sec": 2.62 }, + "andrea|Cartelli per la Pieve, per la stazione, per Firenze. Per il palio, nessuno.": { + "file": "andrea-60f39f0dd7.mp3", + "sec": 6.48 + }, + "andrea|Cistola. Il talento di via del Pignone.": { + "file": "andrea-2b47355c2c.mp3", + "sec": 3.81 + }, + "andrea|Col dieci, come i grandi. Se c'è un muro che se lo merita, è questo.": { + "file": "andrea-1bd111f29d.mp3", + "sec": 5.59 + }, + "andrea|Ciao Cistola! ...Almeno dipinto stai fermo ad ascoltarmi.": { + "file": "andrea-0e558e54fe.mp3", + "sec": 4.18 + }, + "andrea|Le mura della Fortezza medicea, mezze coperte dall'edera. Ne hanno viste più di me.": { + "file": "andrea-7b3b36edc6.mp3", + "sec": 5.93 + }, + "andrea|Una casetta piccina, appoggiata alle mura come un gatto al sole.": { + "file": "andrea-c3279de3ab.mp3", + "sec": 3.93 + }, + "andrea|Chiusa. E poi non è casa mia.": { + "file": "andrea-7fd73fbb77.mp3", + "sec": 2.66 + }, "andrea|L'area feste. D'estate ci montano la pista da ballo, le tavolate e lo stand della pasta.": { "file": "andrea-a942b2723e.mp3", "sec": 6.77 diff --git a/docs/IMMAGINI.md b/docs/IMMAGINI.md index 4ba389e..84381c3 100644 --- a/docs/IMMAGINI.md +++ b/docs/IMMAGINI.md @@ -27,6 +27,8 @@ ne è un'opera derivata. Le foto scattate da Andrea non hanno problemi; quelle p | `bosco-ai-frati.png` | Codex | `bosco-ai-frati.png` | [DA ANDREA] sembra una foto da Wikipedia/Wikimedia: verificare licenza | ? | | `campeggio.png` | Codex | `campeggio-ingresso.png` | [DA ANDREA] probabilmente dal sito del campeggio | ? | | `polisportiva-*.png`, `ponte-sieve.png`, `area-feste.png`, `via-provinciale.png`, `comune-asilo.png`, `giardini-poste.png`, `stazione.png` | Codex | foto omonime in `assets/raw/foto/` | Andrea (EXIF, 23 ottobre 2026) | sì | +| `via-del-pignone.png` | Codex | `via-del-pignone.png` (murale: `riferimenti/cistola.png`, `murale-maradona.png`) | Andrea | sì (Cistola consenziente) | +| `provinciale-pignone.png`, `piazzetta-cambray-digny.png` | Codex | screenshot di Google Street View | Google | **no**: da rifare con foto di Andrea | | `cardetole.png` | Codex | `cardetole.jpg` | Andrea (EXIF) | **da decidere**: è la casa vera di Andrea, pubblicarla dice dove abita | | `pieve-interno.png` | Codex | `pieve-interno.png` | Mariano Mirannalti (mandata ad Andrea su WhatsApp) | sì, se Mariano è d'accordo; citarlo nei crediti | | `panorama-intro.png` | Codex | `altre/panorama-intro.png` | da internet (screenshot con l'icona di Google Lens) | **no**, finché non si sostituisce | diff --git a/docs/STATO.md b/docs/STATO.md index 188bd8f..437c7d3 100644 --- a/docs/STATO.md +++ b/docs/STATO.md @@ -199,6 +199,11 @@ I prompt fissi (stile, scene, foglio sprite) sono in `prompts/STILE.md`, escluso sfondi da foto prese da internet (`docs/IMMAGINI.md`), Cardetole (dice dove abita Andrea). - Vecchietta e vecchietto sono in gioco sulla panchina della Piazza (`assets/characters/`, da `assets/raw/vecchiett?-sheet.png`): consenso delle persone ritratte confermato da Andrea il 2026-10-23; mancano i loro nomi. +- Via Provinciale (dalla rotonda verso la Pieve) → a destra Via del Pignone → in cima Piazzetta Cambray Digny, che porta + in Piazza (a sinistra, dove prima c'era l'uscita per il Comune) e in Via de' Medici. Battute provvisorie sul murale. + Via del Pignone (sfondo di Codex da `assets/raw/foto/via-del-pignone.png`): sul muro di destra il + murale di Cistola (Davide Poggi), «il talento di via del Pignone», alla maniera dei murali di Maradona a Napoli + (volto da `assets/raw/riferimenti/cistola.png`). Consenso di Davide confermato da Andrea il 2026-10-27. - Andrea rifatto dalla sua foto del 2007 (`assets/raw/andrea-sheet-prova-2.png`; il vecchio foglio resta in `andrea-sheet.png`). - Strada del campeggio (poi Bosco ai Frati) e strada della scuola: per ora battute, scene da fare con le foto di Andrea. diff --git a/src/story/story.js b/src/story/story.js index fa96df0..29c54cf 100644 --- a/src/story/story.js +++ b/src/story/story.js @@ -480,10 +480,7 @@ export const story = { id: 'verso_campeggio', name: 'strada verso il campeggio', box: [330, 190, 34, 48], at: [345, 234], exit: { scene: 'campeggio', at: [200, 345], face: 'right' }, }, { - id: 'verso_villa_adami', name: 'Via de\' Medici, verso Villa Adami', box: [0, 196, 90, 50], at: [92, 250], exit: { scene: 'via_de_medici', at: [300, 348], face: 'up' }, - }, - { - id: 'verso_comune', name: 'a sinistra, verso il Comune', box: [96, 196, 50, 54], at: [120, 252], exit: { scene: 'comune', at: [20, 300], face: 'right' }, + id: 'verso_piazzetta', name: 'Piazzetta Cambray Digny, verso Via de\' Medici', box: [0, 196, 146, 54], at: [92, 250], exit: { scene: 'piazzetta', at: [510, 274], face: 'down' }, }, { id: 'verso_calimara', name: 'Via Calimara, verso la farmacia', box: [180, 334, 380, 26], at: [360, 354], exit: { scene: 'via_calimara', at: [365, 212], face: 'down' }, @@ -658,7 +655,7 @@ export const story = { }, }, { - id: 'verso_provinciale', name: 'Via Provinciale, verso il River', box: [0, 270, 46, 70], at: [14, 312], face: 'left', exit: { scene: 'via_provinciale', at: [560, 240], face: 'left' }, + id: 'verso_provinciale', name: 'Via Provinciale, verso il River', box: [0, 270, 46, 70], at: [14, 312], face: 'left', exit: { scene: 'provinciale_pignone', at: [268, 216], face: 'down' }, }, { id: 'verso_forno', name: 'a destra, verso il forno', box: [570, 176, 70, 76], at: [588, 250], exit: { scene: 'forno', at: [628, 300], face: 'left' }, @@ -835,7 +832,7 @@ export const story = { }, ], }, - // Via de' Medici: dalla Piazza sale verso Villa Adami (la Piazza è alle spalle, in fondo si va su). + // Via de' Medici: dalla Piazzetta Cambray Digny sale verso Villa Adami (la Piazzetta è alle spalle, in fondo si va su). via_de_medici: { name: 'Via de\' Medici', map: [22, 32], @@ -855,7 +852,7 @@ export const story = { id: 'su_villa_adami', name: 'su verso Villa Adami', box: [272, 186, 60, 34], at: [300, 216], exit: { scene: 'villa_adami', at: [50, 252], face: 'right' }, }, { - id: 'giu_piazza', name: 'giù verso la Piazza', box: [0, 334, 560, 26], at: [300, 354], exit: { scene: 'piazza', at: [92, 250], face: 'right' }, + id: 'giu_piazzetta', name: 'giù verso Piazzetta Cambray Digny', box: [0, 334, 545, 26], at: [300, 354], exit: { scene: 'piazzetta', at: [20, 320], face: 'right' }, }, ], }, @@ -939,8 +936,8 @@ export const story = { }, ], }, - // Il Comune e l'asilo infantile Antonio Frilli: dalla Piazza (a sinistra, prima di Via de' Medici) o dalla - // strada di fronte alla farmacia. + // Il Comune e l'asilo infantile Antonio Frilli: dalla strada di fronte alla farmacia o da Via Calimara + // (a sinistra in Piazza, dove una volta si veniva qui, c'è la Piazzetta Cambray Digny: Andrea, 27 ottobre). comune: { name: 'Il Comune', map: [11, 45], @@ -969,9 +966,6 @@ export const story = { open: [{ say: 'All\'asilo? Ho già dato, grazie.' }], }, }, - { - id: 'alla_piazza', name: 'su, verso la Piazza', box: [0, 250, 40, 110], at: [14, 300], exit: { scene: 'piazza', at: [120, 252], face: 'right' }, - }, { id: 'al_giardino', name: 'verso il giardino di Via Calimara', box: [596, 290, 44, 70], at: [600, 340], exit: { scene: 'via_calimara', at: [160, 290], face: 'right' }, }, @@ -1069,7 +1063,7 @@ export const story = { id: 'al_ponte', name: 'a sinistra, verso il campo sportivo', box: [0, 216, 60, 100], at: [12, 318], exit: { scene: 'ponte_sieve', at: [300, 350], face: 'up' }, }, { - id: 'alla_pieve', name: 'dietro la farmacia, verso la Pieve', box: [470, 180, 120, 60], at: [560, 240], exit: { scene: 'pieve', at: [24, 312], face: 'right' }, + id: 'alla_pieve', name: 'dietro la farmacia, verso la Pieve', box: [470, 180, 120, 60], at: [560, 240], exit: { scene: 'provinciale_pignone', at: [300, 345], face: 'up' }, }, { id: 'area_feste', name: 'qui sotto, verso l\'area feste', box: [0, 318, 300, 42], at: [120, 352], exit: { scene: 'area_feste', at: [44, 350], face: 'up' }, @@ -1082,6 +1076,90 @@ export const story = { }, ], }, + // Via Provinciale fra la rotonda (alle spalle) e la Pieve (in fondo); a destra sale Via del Pignone. + provinciale_pignone: { + name: 'Via Provinciale', + map: [50, 64], + background: 'assets/scenes/provinciale-pignone.png', + walk: [[30, 360], [30, 330], [130, 270], [245, 212], [290, 212], [340, 228], [540, 232], [540, 258], [640, 300], [640, 360]], + depth: [[212, 0.32], [360, 1.2]], + entry: [300, 345], + hotspots: [ + { + id: 'cartelli', name: 'cartelli', box: [570, 162, 52, 28], at: [560, 290], face: 'right', + actions: { + look: [{ say: 'Cartelli per la Pieve, per la stazione, per Firenze. Per il palio, nessuno.' }], + }, + }, + { + id: 'alla_pieve', name: 'in fondo, verso la Pieve', box: [236, 150, 64, 64], at: [268, 216], exit: { scene: 'pieve', at: [24, 312], face: 'right' }, + }, + { + id: 'via_pignone', name: 'a destra, Via del Pignone', box: [440, 196, 100, 56], at: [530, 245], face: 'right', exit: { scene: 'via_pignone', at: [300, 345], face: 'up' }, + }, + { + id: 'alla_rotonda', name: 'indietro, verso la rotonda della farmacia', box: [0, 334, 640, 26], at: [300, 354], exit: { scene: 'via_provinciale', at: [560, 240], face: 'left' }, + }, + ], + }, + // Via del Pignone dal basso: sul muro a destra il murale di Cistola (Davide Poggi, consenso del 27 ottobre). + // In cima si arriva in Piazzetta Cambray Digny. + via_pignone: { + name: 'Via del Pignone', + map: [46, 54], + background: 'assets/scenes/via-del-pignone.png', + walk: [[0, 360], [0, 300], [150, 258], [290, 226], [335, 206], [352, 206], [350, 240], [345, 282], [640, 290], [640, 360]], + depth: [[206, 0.3], [360, 1.2]], + entry: [300, 345], + hotspots: [ + { + id: 'murale', name: 'murale di Cistola', box: [430, 36, 170, 240], at: [470, 300], face: 'right', + actions: { + look: [{ say: 'Cistola. Il talento di via del Pignone.' }, { say: 'Col dieci, come i grandi. Se c\'è un muro che se lo merita, è questo.' }], + talk: [{ say: 'Ciao Cistola! ...Almeno dipinto stai fermo ad ascoltarmi.' }], + }, + }, + { + id: 'su_piazzetta', name: 'su, verso Piazzetta Cambray Digny', box: [316, 176, 56, 40], at: [343, 210], exit: { scene: 'piazzetta', at: [610, 345], face: 'left' }, + }, + { + id: 'giu_provinciale', name: 'giù, in Via Provinciale', box: [0, 334, 640, 26], at: [300, 354], exit: { scene: 'provinciale_pignone', at: [530, 245], face: 'left' }, + }, + ], + }, + // Piazzetta Cambray Digny, in cima a Via del Pignone: a sinistra Via de' Medici, a diritto la Piazza. + piazzetta: { + name: 'Piazzetta Cambray Digny', + map: [40, 38], + background: 'assets/scenes/piazzetta-cambray-digny.png', + walk: [[0, 360], [0, 288], [300, 284], [470, 276], [495, 268], [540, 268], [600, 300], [640, 330], [640, 360]], + depth: [[268, 0.55], [360, 1.15]], + entry: [320, 330], + hotspots: [ + { + id: 'mura', name: 'mura della Fortezza', box: [60, 110, 230, 170], at: [180, 300], face: 'up', + actions: { + look: [{ say: 'Le mura della Fortezza medicea, mezze coperte dall\'edera. Ne hanno viste più di me.' }], + }, + }, + { + id: 'casetta_bianca', name: 'casetta bianca', box: [296, 196, 160, 90], at: [380, 292], face: 'up', + actions: { + look: [{ say: 'Una casetta piccina, appoggiata alle mura come un gatto al sole.' }], + open: [{ say: 'Chiusa. E poi non è casa mia.' }], + }, + }, + { + id: 'alla_piazza', name: 'a diritto, verso la Piazza', box: [470, 226, 70, 48], at: [510, 274], exit: { scene: 'piazza', at: [92, 250], face: 'right' }, + }, + { + id: 'via_de_medici', name: 'a sinistra, Via de\' Medici', box: [0, 280, 40, 80], at: [20, 320], face: 'left', exit: { scene: 'via_de_medici', at: [300, 348], face: 'up' }, + }, + { + id: 'giu_pignone', name: 'giù per Via del Pignone', box: [570, 300, 70, 60], at: [610, 345], exit: { scene: 'via_pignone', at: [343, 212], face: 'down' }, + }, + ], + }, // L'area feste (il parco Antonio Berti): dalla rotonda del River, a sinistra. area_feste: { name: 'Area feste', diff --git a/tests/browser.mjs b/tests/browser.mjs index 5958df9..84531e4 100644 --- a/tests/browser.mjs +++ b/tests/browser.mjs @@ -316,7 +316,7 @@ try { assert.ok(await page.isVisible('#map-none'), 'nessun posto: lo dice'); await page.fill('#map-search', ''); await page.click('#map-search'); - await page.keyboard.type('piaz'); + await page.keyboard.type('piazza col'); // «piaz» da solo trova anche la Piazzetta Cambray Digny assert.ok(await page.isVisible('#map'), 'scrivere «p» nella ricerca non chiude la mappa'); assert.ok(await page.isHidden('#map-none')); const shown = await page.locator('#map-board button:visible').evaluateAll(bs => bs.map(b => b.dataset.scene)); diff --git a/tests/command.test.mjs b/tests/command.test.mjs index afc9d5f..16f00b8 100644 --- a/tests/command.test.mjs +++ b/tests/command.test.mjs @@ -15,7 +15,7 @@ test('clic intelligente: parla con le persone, guarda le cose, attraversa le usc const { g, c, at } = setup(); assert.equal(c.sentence('vecchietti'), 'Parla con vecchietti'); assert.equal(c.sentence('manifesto'), 'Guarda manifesto del Palio'); - assert.equal(c.sentence('verso_villa_adami'), 'Vai a Via de\' Medici, verso Villa Adami'); + assert.equal(c.sentence('verso_piazzetta'), 'Vai a Piazzetta Cambray Digny, verso Via de\' Medici'); assert.equal(c.clickScene(at('vecchietti')), 'act'); settle(g); assert.equal(g.dialogue?.id, 'vecchietti');