diff --git a/assets/voices/andrea-195cf2b022.mp3 b/assets/voices/andrea-195cf2b022.mp3 new file mode 100644 index 0000000..d45783d Binary files /dev/null and b/assets/voices/andrea-195cf2b022.mp3 differ diff --git a/assets/voices/andrea-5550b0890f.mp3 b/assets/voices/andrea-5550b0890f.mp3 new file mode 100644 index 0000000..7ee18e9 Binary files /dev/null and b/assets/voices/andrea-5550b0890f.mp3 differ diff --git a/assets/voices/andrea-6c9e7f684e.mp3 b/assets/voices/andrea-6c9e7f684e.mp3 new file mode 100644 index 0000000..c7de753 Binary files /dev/null and b/assets/voices/andrea-6c9e7f684e.mp3 differ diff --git a/assets/voices/andrea-acc7949f4c.mp3 b/assets/voices/andrea-acc7949f4c.mp3 deleted file mode 100644 index b77676a..0000000 Binary files a/assets/voices/andrea-acc7949f4c.mp3 and /dev/null differ diff --git a/assets/voices/andrea-f6c10fd559.mp3 b/assets/voices/andrea-f6c10fd559.mp3 new file mode 100644 index 0000000..f73aa3c Binary files /dev/null and b/assets/voices/andrea-f6c10fd559.mp3 differ diff --git a/assets/voices/index.json b/assets/voices/index.json index 63f2bd8..49b6696 100644 --- a/assets/voices/index.json +++ b/assets/voices/index.json @@ -1583,6 +1583,10 @@ "file": "andrea-ee455fdc33.mp3", "sec": 3.67 }, + "andrea|Qui dietro ci stanno i camper. Ma per noi questo resta il campo del Giannini.": { + "file": "andrea-195cf2b022.mp3", + "sec": 4.86 + }, "andrea|Gli scivoli dei bambini. Una volta il pallone finiva lì una volta su tre.": { "file": "andrea-a3e36c12a1.mp3", "sec": 5.4 @@ -1619,9 +1623,9 @@ "file": "andrea-3d15dd47bb.mp3", "sec": 4.82 }, - "andrea|Casa mia. Terzo piano, quello con la tapparella a metà: è la mia camera.": { - "file": "andrea-acc7949f4c.mp3", - "sec": 5.91 + "andrea|Casa mia. Secondo piano: quella con la tapparella a metà è la camera di mia sorella, e a destra quella dei miei.": { + "file": "andrea-6c9e7f684e.mp3", + "sec": 8.72 }, "andrea|Se salgo, mi mettono ad apparecchiare. Prima il palio.": { "file": "andrea-8945f1786d.mp3", @@ -1639,6 +1643,14 @@ "file": "andrea-018183c4dd.mp3", "sec": 5.82 }, + "andrea|Su questo campo ci abbiamo passato trentacinque anni, giorno, pomeriggio e sera, a giocare a calcio.": { + "file": "andrea-5550b0890f.mp3", + "sec": 7.74 + }, + "andrea|Le maglie a fare da pali, e i palloni tagliati che entravano nelle terrazze, ovunque.": { + "file": "andrea-f6c10fd559.mp3", + "sec": 6.28 + }, "andrea|Un pino a ombrello enorme. Alla ricreazione, tutti all'ombra lì sotto. Sembra ieri.": { "file": "andrea-0a073729fd.mp3", "sec": 7.3 diff --git a/docs/STATO.md b/docs/STATO.md index 887ed43..f4387d1 100644 --- a/docs/STATO.md +++ b/docs/STATO.md @@ -261,6 +261,11 @@ I prompt fissi (stile, scene, foglio sprite) sono in `prompts/STILE.md`, escluso scuro, di serie), l'Arcu (Betino). **Puntella (Marco Villani) non corre finché manca il suo consenso** (`consenso: null` in piloti.js: quando arriva, la data). Mancano: quanto erano truccati gli altri, le battute di Andrea, il rumore del motore (c'è solo quello dell'arrivo in griglia); i confini della paglia non si vedono sul quadro (revisione di Codex, punto 9). +- Strade attorno a casa (Andrea, 28 ottobre): la scena `area_camper` ora si chiama «Le villette del Giannini» (ci abita + lui; i camper stanno dietro il suo campo). Cardetole: in basso a destra «dal Giannini» (le villette), a destra il + ponticino della Carza, a sinistra il Trappola. Il campo del Giannini: a destra le villette, a sinistra il Trappola; + dal ponticino non ci si va. Via Liguri Magelli: lassù vicino al Betino si torna a casa, laggiù a destra il campo. + Da sapere: dove si gira, in fondo al ponticino, per Cardetole [DA ANDREA]. - Via Liguri Magelli (Street View di Andrea, 28 ottobre), a sinistra dal campo del Giannini: a destra la casa salmone con la tenda del Trappola (il Barrettino, «Vai dal Trappola»: niente interno, [DA ANDREA]), l'Arcu sotto la tenda (scherzo: «ti ho visto du' minuti fa a Campomigliaio» col Betino, poi la sfida del GP), davanti la targa «Qui riposa la diff --git a/src/engine/command.js b/src/engine/command.js index ea307d3..42d62d7 100644 --- a/src/engine/command.js +++ b/src/engine/command.js @@ -2,8 +2,9 @@ // Senza verbo scelto vale il clic intelligente: l'azione più sensata per quel punto. import { VERB_LABELS } from './game.js'; -// «Vai a» davanti a un nome che comincia con «dal», «dalla»…: «Vai dal Trappola», non «Vai a dal Trappola». -const verbLabel = (verb, name) => verb === 'walk' && /^da(l|lla|i|gli|ll')?\b/i.test(name ?? '') ? 'Vai' : VERB_LABELS[verb]; +// «Vai a» davanti a un nome che dice già dove («dal Trappola», «a destra, …», «verso …», «indietro, …»): solo «Vai». +const WHERE = /^(da(l|lla|i|gli|ll')?|a|verso|indietro|su|giù|in|laggiù|lassù|dietro|oltre)(?=[\s,]|$)/i; +const verbLabel = (verb, name) => verb === 'walk' && WHERE.test(name ?? '') ? 'Vai' : VERB_LABELS[verb]; export class Command { constructor(game) { diff --git a/src/story/story.js b/src/story/story.js index 2246478..a474b21 100644 --- a/src/story/story.js +++ b/src/story/story.js @@ -2578,10 +2578,11 @@ export const story = { }, }, { - id: 'all_area_camper', name: 'a sinistra, verso l\'area camper', box: [320, 160, 110, 42], at: [442, 202], exit: { scene: 'area_camper', at: [600, 330], face: 'left' }, + id: 'all_area_camper', name: 'a sinistra, verso le villette del Giannini', box: [320, 160, 110, 42], at: [442, 202], exit: { scene: 'area_camper', at: [600, 330], face: 'left' }, }, { - id: 'al_giannini', name: 'in fondo a sinistra, verso il campo del Giannini', box: [380, 165, 58, 30], at: [440, 200], exit: { scene: 'campo_giannini', at: [480, 218], face: 'left' }, + // [DA ANDREA: dove si gira per Cardetole, in fondo al ponticino] + id: 'a_cardetole', name: 'in fondo a destra, verso Cardetole', box: [578, 80, 62, 90], at: [476, 204], exit: { scene: 'cardetole', at: [628, 290], face: 'left' }, }, { id: 'alla_stazione', name: 'a destra, verso la stazione', box: [486, 160, 90, 40], at: [474, 202], exit: { scene: 'stazione', at: [20, 300], face: 'right' }, @@ -2592,7 +2593,8 @@ export const story = { ], }, area_camper: { - name: 'Area camper', + // Le villette dove abita il Giannini: da qui si va al suo campo (Andrea, 28 ottobre). L'id resta area_camper. + name: 'Le villette del Giannini', map: [70, 84], background: 'assets/scenes/area-camper.png', walk: [[0, 360], [0, 260], [200, 232], [380, 240], [450, 248], [640, 300], [640, 360]], @@ -2606,13 +2608,18 @@ export const story = { }, }, { - id: 'villette', name: 'villette', box: [500, 80, 140, 120], at: [560, 280], face: 'right', + id: 'villette', name: 'villette', box: [500, 80, 140, 106], at: [560, 280], face: 'right', actions: { look: [{ say: 'Le villette rosa coi balconi bianchi. Da qui a casa mia è un attimo.' }], }, }, { - id: 'a_cardetole', name: 'verso casa, a Cardetole', box: [0, 230, 80, 130], at: [20, 300], exit: { scene: 'cardetole', at: [300, 350], face: 'up' }, + // Casa è a destra, per la strada (Andrea, 28 ottobre). + id: 'a_cardetole', name: 'verso casa, a Cardetole', box: [572, 188, 68, 96], at: [618, 300], exit: { scene: 'cardetole', at: [560, 348], face: 'up' }, + }, + { + // Laggiù, in fondo al vialetto vicino alla siepe, il campo del Giannini (Andrea, 28 ottobre). + id: 'al_giannini', name: 'laggiù, il campo del Giannini', box: [330, 150, 96, 74], at: [380, 246], exit: { scene: 'campo_giannini', at: [480, 216], face: 'left' }, }, { id: 'al_ponticino', name: 'indietro, il ponticino', box: [560, 300, 80, 60], at: [620, 330], exit: { scene: 'ponticino', at: [442, 202], face: 'down' }, @@ -2620,7 +2627,8 @@ export const story = { ], }, // Il prato del parco dei camper visto dall'altra parte: per i ragazzi, «il campo del Giannini». Ci si arriva dal - // ponticino della Carza; niente uscita verso l'area camper, perché è già questa (Andrea, 28 ottobre). + // lato delle villette dove abita il Giannini (fra gli alberi a destra) e dal Trappola; dal ponticino non si viene + // qui. L'area camper è il campo stesso: i camper stanno qui dietro (Andrea, 28 ottobre). campo_giannini: { name: 'Il campo del Giannini', map: [82, 96], @@ -2636,6 +2644,12 @@ export const story = { use: [{ say: 'Senza pallone, e senza la squadra, non vale.' }], }, }, + { + id: 'camper', name: 'qui dietro, i camper', box: [520, 320, 120, 40], at: [560, 340], face: 'down', default: 'look', + actions: { + look: [{ say: 'Qui dietro ci stanno i camper. Ma per noi questo resta il campo del Giannini.' }], + }, + }, { id: 'giochi', name: 'giochi dei bambini', box: [220, 170, 80, 40], at: [260, 216], face: 'up', actions: { @@ -2643,10 +2657,11 @@ 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' }, + // Fra gli alberi a destra si arriva alle villette del Giannini, in fondo al vialetto (Andrea, 28 ottobre). + id: 'all_area_camper', name: 'verso le villette del Giannini', box: [440, 150, 90, 60], at: [480, 216], exit: { scene: 'area_camper', at: [380, 246], face: 'down' }, }, { - 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' }, + id: 'via_liguri_magelli', name: 'dal Trappola, in Via Liguri Magelli', box: [0, 100, 70, 260], at: [30, 260], exit: { scene: 'via_liguri_magelli', at: [520, 306], face: 'left' }, }, ], }, @@ -2697,7 +2712,12 @@ export const story = { }, }, { - 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' }, + // Casa di Andrea è lassù, in cima alla salita, a destra del Betino (Andrea, 28 ottobre). + id: 'a_cardetole', name: 'lassù, verso casa a Cardetole', box: [274, 148, 40, 50], at: [264, 202], exit: { scene: 'cardetole', at: [20, 352], face: 'right' }, + }, + { + // Il campo del Giannini è laggiù a destra, oltre la siepe (Andrea, 28 ottobre). + id: 'al_giannini', name: 'verso il campo del Giannini', box: [430, 150, 132, 100], at: [520, 306], exit: { scene: 'campo_giannini', at: [60, 250], face: 'right' }, }, ], }, @@ -2713,21 +2733,38 @@ export const story = { { id: 'casa', name: 'casa di Andrea', box: [330, 20, 220, 212], at: [470, 290], face: 'up', actions: { - look: [{ say: 'Casa mia. Terzo piano, quello con la tapparella a metà: è la mia camera.' }], + look: [{ say: 'Casa mia. Secondo piano: quella con la tapparella a metà è la camera di mia sorella, e a destra quella dei miei.' }], open: [{ say: 'Se salgo, mi mettono ad apparecchiare. Prima il palio.' }], walk: [{ say: 'Se salgo, mi mettono ad apparecchiare. Prima il palio.' }], }, }, { - id: 'platano', name: 'platano', box: [90, 0, 170, 216], at: [200, 306], face: 'up', + id: 'platano', name: 'platano', box: [90, 0, 170, 206], at: [200, 306], face: 'up', actions: { look: [{ say: 'Il prato sotto casa. Qui le porte le facevamo con le maglie per terra: due maglie, un palo ciascuna.' }, { say: 'E ogni gol era «Era fuori!», «No, era dentro!».' }], use: [{ say: 'Arrampicarmi? Alla mia età, e davanti a tutto il condominio?' }], }, }, - // Si compare a destra dell'area camper: inquadrature invertite rispetto alle foto (Andrea, 28 ottobre, va bene così). { - id: 'alla_pieve', name: 'su verso la Pieve', box: [0, 330, 640, 30], at: [300, 354], exit: { scene: 'area_camper', at: [600, 330], face: 'left' }, + // Il prato in salita sotto casa: le parole sono di Andrea (28 ottobre). + id: 'prato', name: 'prato', box: [52, 208, 278, 76], at: [262, 300], face: 'up', default: 'look', + actions: { + look: [ + { say: 'Su questo campo ci abbiamo passato trentacinque anni, giorno, pomeriggio e sera, a giocare a calcio.' }, + { say: 'Le maglie a fare da pali, e i palloni tagliati che entravano nelle terrazze, ovunque.' }, + ], + }, + }, + // Le uscite di casa (Andrea, 28 ottobre): in basso a destra il Giannini (le sue villette, dalla strada delle + // villette), a destra il ponticino della Carza, a sinistra il Trappola. + { + id: 'al_giannini', name: 'dal Giannini', box: [440, 322, 200, 38], at: [560, 348], exit: { scene: 'area_camper', at: [618, 300], face: 'left' }, + }, + { + id: 'al_ponticino', name: 'a destra, il ponticino della Carza', box: [596, 150, 44, 110], at: [628, 290], exit: { scene: 'ponticino', at: [476, 204], face: 'down' }, + }, + { + id: 'al_trappola', name: 'a sinistra, dal Trappola', box: [0, 236, 50, 104], at: [20, 352], exit: { scene: 'via_liguri_magelli', at: [264, 202], face: 'down' }, }, ], }, diff --git a/tests/command.test.mjs b/tests/command.test.mjs index a33ab5b..81d99aa 100644 --- a/tests/command.test.mjs +++ b/tests/command.test.mjs @@ -16,6 +16,13 @@ test('clic intelligente: parla con le persone, guarda le cose, attraversa le usc assert.equal(c.sentence('vecchietti'), 'Parla con vecchietti'); assert.equal(c.sentence('manifesto'), 'Guarda manifesto del Palio'); assert.equal(c.sentence('verso_piazzetta'), 'Vai a Via dell\'Antica Posta, verso Piazzetta Cambray Digny'); + // Quando il nome dice già dove, niente «a» in più: «Vai dal Trappola», «Vai a destra, …». + const casa = new Game(story), cc = new Command(casa); casa.go('cardetole'); + assert.equal(cc.sentence('al_giannini'), 'Vai dal Giannini'); + assert.equal(cc.sentence('al_ponticino'), 'Vai a destra, il ponticino della Carza'); + casa.go('via_liguri_magelli'); + assert.equal(cc.sentence('a_cardetole'), 'Vai lassù, verso casa a Cardetole'); + assert.equal(cc.sentence('trappola'), 'Vai dal Trappola'); assert.equal(c.clickScene(at('vecchietti')), 'act'); settle(g); assert.equal(g.dialogue?.id, 'vecchietti');