Il libro della storia infinita all'oratorio; le idee di Andrea in docs/IDEE.md

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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UdeKd62opy9PKgpQXtVctF
This commit is contained in:
2026-10-23 13:29:45 +02:00
co-authored by Claude Opus 5.5
parent e3354be352
commit b467bcc1d9
3 changed files with 53 additions and 0 deletions
+16
View File
@@ -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à.
+23
View File
@@ -29,6 +29,20 @@ export const story = {
use: [{ say: 'Potrei usarla come plettro. Ma prima scopro di chi è.' }], 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: { scenes: {
piazza: { piazza: {
@@ -229,6 +243,15 @@ export const story = {
use: [{ say: 'Mi siedo e aspetto che arrivi la pastasciutta? Ci vorrebbe una settimana.' }], 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', id: 'cancello', name: 'cancello', box: [477, 166, 23, 52], at: [488, 236], face: 'up',
actions: { actions: {
+14
View File
@@ -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}`); 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');
});