From b467bcc1d9d3857afd5c5cfe65d5d92bb72ea130 Mon Sep 17 00:00:00 2001 From: Andrea Manzi Date: Fri, 23 Oct 2026 13:29:45 +0200 Subject: [PATCH] Il libro della storia infinita all'oratorio; le idee di Andrea in docs/IDEE.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sulle tavolate c'è un libro dimenticato: si prende, si apre, ha una pagina sola con scritto «FINE». Test: si prende con un clic sul tavolo, sparisce dalla scena, aperto dice FINE (provato anche con il testo cambiato: il test fallisce). In IDEE.md anche la pastasciutta di Mariano, in attesa del suo consenso. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01UdeKd62opy9PKgpQXtVctF --- docs/IDEE.md | 16 ++++++++++++++++ src/story/story.js | 23 +++++++++++++++++++++++ tests/story.test.mjs | 14 ++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 docs/IDEE.md diff --git a/docs/IDEE.md b/docs/IDEE.md new file mode 100644 index 0000000..94571f8 --- /dev/null +++ b/docs/IDEE.md @@ -0,0 +1,16 @@ +# Idee da mettere nel gioco + +Battute, oggetti e scherzi proposti da Andrea, in attesa di un posto nella storia. Quando un'idea entra nel gioco +si segna qui con la data e il punto di `src/story/story.js` dove sta; le persone vere entrano solo col loro consenso. + +## In attesa + +- **Oratorio, la pastasciutta di Mariano** (2026-10-23). Alle tavolate dell'oratorio Andrea dice che se aspetta che + Mariano gli porti un piatto di pasta, addio: Mariano è sempre a Novoli. Andrebbe in «Usa tavolate» al posto + della battuta provvisoria sulla pastasciutta. Prima: il consenso di Mariano a comparire col suo nome. + +## Già nel gioco + +- **«La storia infinita»** (2026-10-23): un libro dimenticato sulle tavolate dell'oratorio; si prende, si apre + e ha una pagina sola con scritto «FINE». In `story.js`: oggetto `libro`, punto caldo `libro_dimenticato`. + Da valutare: una tavola illustrata a tutto schermo con la pagina aperta, quando il motore le avrà. diff --git a/src/story/story.js b/src/story/story.js index bd56589..59adbb4 100644 --- a/src/story/story.js +++ b/src/story/story.js @@ -29,6 +29,20 @@ export const story = { use: [{ say: 'Potrei usarla come plettro. Ma prima scopro di chi è.' }], }, }, + // Lo scherzo del libro (idea di Andrea, 2026-10-23): «La storia infinita» ha una pagina sola. + libro: { + name: 'libro', + icon: { fill: '#c46a3a', shape: 'book' }, + actions: { + look: [{ say: '«La storia infinita». Bello spesso: questo mi tiene compagnia fino a settembre.' }], + open: [ + { say: 'Vediamo da dove comincia...' }, + { say: 'C\'è una pagina sola. Con scritto: «FINE».' }, + { say: 'Infinita, dicevano.' }, + ], + use: [{ say: 'Leggere adesso? Prima il palio. E poi, a quanto pare, si fa presto.' }], + }, + }, }, scenes: { piazza: { @@ -229,6 +243,15 @@ export const story = { use: [{ say: 'Mi siedo e aspetto che arrivi la pastasciutta? Ci vorrebbe una settimana.' }], }, }, + { + // Dopo le tavolate: dove si sovrappongono, vince l'ultimo della lista. + id: 'libro_dimenticato', name: 'libro dimenticato', box: [562, 198, 18, 12], at: [560, 268], face: 'up', when: ['!has:libro', '!libro_preso'], + art: [{ rect: [565, 203, 11, 5], fill: '#c46a3a' }, { rect: [565, 207, 11, 1], fill: '#f4efe4' }, { rect: [569, 204, 3, 3], fill: '#e8c25a' }], + actions: { + look: [{ say: 'Un libro dimenticato sulle tavolate. Sulla copertina c\'è scritto «La storia infinita».' }], + take: [{ give: 'libro' }, { set: 'libro_preso' }, { say: 'Me lo prendo. Se è suo, il proprietario lo ritrova... prima o poi.' }], + }, + }, { id: 'cancello', name: 'cancello', box: [477, 166, 23, 52], at: [488, 236], face: 'up', actions: { diff --git a/tests/story.test.mjs b/tests/story.test.mjs index 59527c7..e093a4e 100644 --- a/tests/story.test.mjs +++ b/tests/story.test.mjs @@ -121,3 +121,17 @@ test('il foglio di Andrea ha tutti i fotogrammi e l\'immagine', () => { for (const f of ['walk_1', 'walk_2', 'walk_3', 'walk_4', 'stand', 'talk', 'take', 'back']) assert.ok(atlas.frames[f], `${id}: manca ${f}`); } }); + +test('il libro dell\'oratorio: «La storia infinita» ha una pagina sola', () => { + const g = new Game(story); + g.go('oratorio', [320, 345]); + settle(g); + assert.ok(g.hotspotAt([570, 205])?.id === 'libro_dimenticato', 'sulle tavolate il clic prende il libro, non le tavolate'); + assert.ok(g.act('take', 'libro_dimenticato')); + settle(g); + assert.ok(g.state.inventory.includes('libro')); + assert.equal(g.hotspot('libro_dimenticato'), undefined, 'preso, il libro non resta sul tavolo'); + assert.ok(g.act('open', 'libro')); + const said = settle(g).map(s => s.text); + assert.ok(said.some(t => t.includes('FINE')), 'aperto, dice FINE'); +});