diff --git a/assets/icons/cedrata.svg b/assets/icons/cedrata.svg new file mode 100644 index 0000000..290aa4b --- /dev/null +++ b/assets/icons/cedrata.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/chiavetta.svg b/assets/icons/chiavetta.svg new file mode 100644 index 0000000..32da239 --- /dev/null +++ b/assets/icons/chiavetta.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/ghiacciolo.svg b/assets/icons/ghiacciolo.svg new file mode 100644 index 0000000..bcaeaf8 --- /dev/null +++ b/assets/icons/ghiacciolo.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/gomma.svg b/assets/icons/gomma.svg new file mode 100644 index 0000000..998644c --- /dev/null +++ b/assets/icons/gomma.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/stecco.svg b/assets/icons/stecco.svg new file mode 100644 index 0000000..e20d9a6 --- /dev/null +++ b/assets/icons/stecco.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/stecco_gomma.svg b/assets/icons/stecco_gomma.svg new file mode 100644 index 0000000..4922def --- /dev/null +++ b/assets/icons/stecco_gomma.svg @@ -0,0 +1 @@ + diff --git a/assets/icons/torcia.svg b/assets/icons/torcia.svg new file mode 100644 index 0000000..4564596 --- /dev/null +++ b/assets/icons/torcia.svg @@ -0,0 +1 @@ + diff --git a/assets/voices/andrea-050ef60153.mp3 b/assets/voices/andrea-050ef60153.mp3 new file mode 100644 index 0000000..bda41db Binary files /dev/null and b/assets/voices/andrea-050ef60153.mp3 differ diff --git a/assets/voices/andrea-0a30866235.mp3 b/assets/voices/andrea-0a30866235.mp3 new file mode 100644 index 0000000..4492594 Binary files /dev/null and b/assets/voices/andrea-0a30866235.mp3 differ diff --git a/assets/voices/andrea-0c6e40cc5e.mp3 b/assets/voices/andrea-0c6e40cc5e.mp3 new file mode 100644 index 0000000..de39ce5 Binary files /dev/null and b/assets/voices/andrea-0c6e40cc5e.mp3 differ diff --git a/assets/voices/andrea-0d9794e650.mp3 b/assets/voices/andrea-0d9794e650.mp3 new file mode 100644 index 0000000..e8ac258 Binary files /dev/null and b/assets/voices/andrea-0d9794e650.mp3 differ diff --git a/assets/voices/andrea-185d607a84.mp3 b/assets/voices/andrea-185d607a84.mp3 new file mode 100644 index 0000000..cf16d9b Binary files /dev/null and b/assets/voices/andrea-185d607a84.mp3 differ diff --git a/assets/voices/andrea-276c2298aa.mp3 b/assets/voices/andrea-276c2298aa.mp3 new file mode 100644 index 0000000..4493755 Binary files /dev/null and b/assets/voices/andrea-276c2298aa.mp3 differ diff --git a/assets/voices/andrea-29863877af.mp3 b/assets/voices/andrea-29863877af.mp3 new file mode 100644 index 0000000..811f041 Binary files /dev/null and b/assets/voices/andrea-29863877af.mp3 differ diff --git a/assets/voices/andrea-31dfba3283.mp3 b/assets/voices/andrea-31dfba3283.mp3 new file mode 100644 index 0000000..e18e547 Binary files /dev/null and b/assets/voices/andrea-31dfba3283.mp3 differ diff --git a/assets/voices/andrea-35b92c1da8.mp3 b/assets/voices/andrea-35b92c1da8.mp3 new file mode 100644 index 0000000..0994db3 Binary files /dev/null and b/assets/voices/andrea-35b92c1da8.mp3 differ diff --git a/assets/voices/andrea-4a2ae1d92d.mp3 b/assets/voices/andrea-4a2ae1d92d.mp3 new file mode 100644 index 0000000..408815d Binary files /dev/null and b/assets/voices/andrea-4a2ae1d92d.mp3 differ diff --git a/assets/voices/andrea-52128d0321.mp3 b/assets/voices/andrea-52128d0321.mp3 deleted file mode 100644 index c9fb885..0000000 Binary files a/assets/voices/andrea-52128d0321.mp3 and /dev/null differ diff --git a/assets/voices/andrea-5526428f0b.mp3 b/assets/voices/andrea-5526428f0b.mp3 new file mode 100644 index 0000000..c48590e Binary files /dev/null and b/assets/voices/andrea-5526428f0b.mp3 differ diff --git a/assets/voices/andrea-57c48fa00f.mp3 b/assets/voices/andrea-57c48fa00f.mp3 new file mode 100644 index 0000000..273d79e Binary files /dev/null and b/assets/voices/andrea-57c48fa00f.mp3 differ diff --git a/assets/voices/andrea-59775ccaab.mp3 b/assets/voices/andrea-59775ccaab.mp3 deleted file mode 100644 index 0fb5b69..0000000 Binary files a/assets/voices/andrea-59775ccaab.mp3 and /dev/null differ diff --git a/assets/voices/andrea-629bfcac17.mp3 b/assets/voices/andrea-629bfcac17.mp3 new file mode 100644 index 0000000..eb9245c Binary files /dev/null and b/assets/voices/andrea-629bfcac17.mp3 differ diff --git a/assets/voices/andrea-69907b4352.mp3 b/assets/voices/andrea-69907b4352.mp3 new file mode 100644 index 0000000..46e2951 Binary files /dev/null and b/assets/voices/andrea-69907b4352.mp3 differ diff --git a/assets/voices/andrea-7009fd9d71.mp3 b/assets/voices/andrea-7009fd9d71.mp3 new file mode 100644 index 0000000..dda6b73 Binary files /dev/null and b/assets/voices/andrea-7009fd9d71.mp3 differ diff --git a/assets/voices/andrea-723609c210.mp3 b/assets/voices/andrea-723609c210.mp3 new file mode 100644 index 0000000..32b7496 Binary files /dev/null and b/assets/voices/andrea-723609c210.mp3 differ diff --git a/assets/voices/andrea-79917d60dd.mp3 b/assets/voices/andrea-79917d60dd.mp3 new file mode 100644 index 0000000..03d8c49 Binary files /dev/null and b/assets/voices/andrea-79917d60dd.mp3 differ diff --git a/assets/voices/andrea-7fadbeebca.mp3 b/assets/voices/andrea-7fadbeebca.mp3 new file mode 100644 index 0000000..89d6205 Binary files /dev/null and b/assets/voices/andrea-7fadbeebca.mp3 differ diff --git a/assets/voices/andrea-81ed927023.mp3 b/assets/voices/andrea-81ed927023.mp3 new file mode 100644 index 0000000..cd08311 Binary files /dev/null and b/assets/voices/andrea-81ed927023.mp3 differ diff --git a/assets/voices/andrea-872d650e46.mp3 b/assets/voices/andrea-872d650e46.mp3 new file mode 100644 index 0000000..c3475bf Binary files /dev/null and b/assets/voices/andrea-872d650e46.mp3 differ diff --git a/assets/voices/andrea-8abb6148b1.mp3 b/assets/voices/andrea-8abb6148b1.mp3 new file mode 100644 index 0000000..fa84f71 Binary files /dev/null and b/assets/voices/andrea-8abb6148b1.mp3 differ diff --git a/assets/voices/andrea-8be920ef35.mp3 b/assets/voices/andrea-8be920ef35.mp3 new file mode 100644 index 0000000..fabfabf Binary files /dev/null and b/assets/voices/andrea-8be920ef35.mp3 differ diff --git a/assets/voices/andrea-8c9713081a.mp3 b/assets/voices/andrea-8c9713081a.mp3 new file mode 100644 index 0000000..ef76b31 Binary files /dev/null and b/assets/voices/andrea-8c9713081a.mp3 differ diff --git a/assets/voices/andrea-942c0fe126.mp3 b/assets/voices/andrea-942c0fe126.mp3 new file mode 100644 index 0000000..8a179af Binary files /dev/null and b/assets/voices/andrea-942c0fe126.mp3 differ diff --git a/assets/voices/andrea-949c556ec2.mp3 b/assets/voices/andrea-949c556ec2.mp3 new file mode 100644 index 0000000..eba4555 Binary files /dev/null and b/assets/voices/andrea-949c556ec2.mp3 differ diff --git a/assets/voices/andrea-958e8cfd07.mp3 b/assets/voices/andrea-958e8cfd07.mp3 new file mode 100644 index 0000000..33bec33 Binary files /dev/null and b/assets/voices/andrea-958e8cfd07.mp3 differ diff --git a/assets/voices/andrea-a8dfddbe65.mp3 b/assets/voices/andrea-a8dfddbe65.mp3 new file mode 100644 index 0000000..a2c2485 Binary files /dev/null and b/assets/voices/andrea-a8dfddbe65.mp3 differ diff --git a/assets/voices/andrea-a93d3ba5ad.mp3 b/assets/voices/andrea-a93d3ba5ad.mp3 new file mode 100644 index 0000000..dad0c0d Binary files /dev/null and b/assets/voices/andrea-a93d3ba5ad.mp3 differ diff --git a/assets/voices/andrea-acc1a379b7.mp3 b/assets/voices/andrea-acc1a379b7.mp3 new file mode 100644 index 0000000..48d5e5c Binary files /dev/null and b/assets/voices/andrea-acc1a379b7.mp3 differ diff --git a/assets/voices/andrea-acc9f8180b.mp3 b/assets/voices/andrea-acc9f8180b.mp3 new file mode 100644 index 0000000..8925174 Binary files /dev/null and b/assets/voices/andrea-acc9f8180b.mp3 differ diff --git a/assets/voices/andrea-ae47136080.mp3 b/assets/voices/andrea-ae47136080.mp3 new file mode 100644 index 0000000..2403f04 Binary files /dev/null and b/assets/voices/andrea-ae47136080.mp3 differ diff --git a/assets/voices/andrea-af37e73b26.mp3 b/assets/voices/andrea-af37e73b26.mp3 new file mode 100644 index 0000000..103fb95 Binary files /dev/null and b/assets/voices/andrea-af37e73b26.mp3 differ diff --git a/assets/voices/andrea-afa7f1eea2.mp3 b/assets/voices/andrea-afa7f1eea2.mp3 new file mode 100644 index 0000000..da7dc37 Binary files /dev/null and b/assets/voices/andrea-afa7f1eea2.mp3 differ diff --git a/assets/voices/andrea-bd31b556ae.mp3 b/assets/voices/andrea-bd31b556ae.mp3 deleted file mode 100644 index 806ee30..0000000 Binary files a/assets/voices/andrea-bd31b556ae.mp3 and /dev/null differ diff --git a/assets/voices/andrea-bd342ed1a9.mp3 b/assets/voices/andrea-bd342ed1a9.mp3 deleted file mode 100644 index efdc9a4..0000000 Binary files a/assets/voices/andrea-bd342ed1a9.mp3 and /dev/null differ diff --git a/assets/voices/andrea-bda78d511c.mp3 b/assets/voices/andrea-bda78d511c.mp3 new file mode 100644 index 0000000..6b594c9 Binary files /dev/null and b/assets/voices/andrea-bda78d511c.mp3 differ diff --git a/assets/voices/andrea-c6acc0d948.mp3 b/assets/voices/andrea-c6acc0d948.mp3 new file mode 100644 index 0000000..3a86dd9 Binary files /dev/null and b/assets/voices/andrea-c6acc0d948.mp3 differ diff --git a/assets/voices/andrea-d13933a255.mp3 b/assets/voices/andrea-d13933a255.mp3 new file mode 100644 index 0000000..17673b7 Binary files /dev/null and b/assets/voices/andrea-d13933a255.mp3 differ diff --git a/assets/voices/andrea-dc8fdb81a3.mp3 b/assets/voices/andrea-dc8fdb81a3.mp3 deleted file mode 100644 index c012ec6..0000000 Binary files a/assets/voices/andrea-dc8fdb81a3.mp3 and /dev/null differ diff --git a/assets/voices/andrea-e549a3c205.mp3 b/assets/voices/andrea-e549a3c205.mp3 new file mode 100644 index 0000000..05d47da Binary files /dev/null and b/assets/voices/andrea-e549a3c205.mp3 differ diff --git a/assets/voices/andrea-e9913ba3dd.mp3 b/assets/voices/andrea-e9913ba3dd.mp3 deleted file mode 100644 index c89082c..0000000 Binary files a/assets/voices/andrea-e9913ba3dd.mp3 and /dev/null differ diff --git a/assets/voices/andrea-f2ea95922d.mp3 b/assets/voices/andrea-f2ea95922d.mp3 new file mode 100644 index 0000000..812d802 Binary files /dev/null and b/assets/voices/andrea-f2ea95922d.mp3 differ diff --git a/assets/voices/index.json b/assets/voices/index.json index de29f46..855e902 100644 --- a/assets/voices/index.json +++ b/assets/voices/index.json @@ -271,6 +271,14 @@ "file": "andrea-f798fa755d.mp3", "sec": 4.9 }, + "andrea|Una gomma da masticare ancora incartata, persa davanti al palco. Qualcuno ha perso l'appetito.": { + "file": "andrea-f2ea95922d.mp3", + "sec": 7.49 + }, + "andrea|Una gomma alla fragola. Me la tengo.": { + "file": "andrea-7009fd9d71.mp3", + "sec": 2.91 + }, "andrea|Un libro dimenticato sulle tavolate. Sulla copertina c'è scritto «La storia infinita».": { "file": "andrea-42e270af3d.mp3", "sec": 6.21 @@ -403,13 +411,29 @@ "file": "andrea-33e0dd705a.mp3", "sec": 4.75 }, - "andrea|Una casetta chiusa. Ci tengono le prolunghe della festa e, dicono, un mistero.": { - "file": "andrea-e9913ba3dd.mp3", - "sec": 5.85 + "andrea|La casetta, aperta. Dentro solo prolunghe. Il mistero era la torcia.": { + "file": "andrea-0c6e40cc5e.mp3", + "sec": 7.63 }, - "andrea|Chiusa. Il mistero resta.": { - "file": "andrea-59775ccaab.mp3", - "sec": 2.56 + "andrea|Una casetta chiusa con un lucchetto piccolo. Ci tengono le prolunghe della festa e, dicono, un mistero.": { + "file": "andrea-050ef60153.mp3", + "sec": 8.32 + }, + "andrea|È già aperta.": { + "file": "andrea-958e8cfd07.mp3", + "sec": 0.95 + }, + "andrea|La chiavetta entra nel lucchetto... clic!": { + "file": "andrea-35b92c1da8.mp3", + "sec": 3.91 + }, + "andrea|Prolunghe, prolunghe, prolunghe... e una torcia.": { + "file": "andrea-8abb6148b1.mp3", + "sec": 5.98 + }, + "andrea|Chiusa col lucchetto. Il mistero resta.": { + "file": "andrea-a8dfddbe65.mp3", + "sec": 3.45 }, "andrea|Il tabernacolo prima del ponte. Chi passa per andare via dal paese, un saluto glielo fa sempre.": { "file": "andrea-78a5ef65f0.mp3", @@ -519,21 +543,13 @@ "file": "andrea-684bb66307.mp3", "sec": 2.4 }, - "andrea|Un ghiacciolo al limone, per favore. Da inzuppare nella cedrata.": { - "file": "andrea-bd342ed1a9.mp3", - "sec": 4.18 + "tosca|Eccomi, Andrea! Cosa ti do? Fanta, Coca, cedrata, spuma bionda... o un ghiacciolo?": { + "file": "tosca-75db2f3b4e.mp3", + "sec": 8.26 }, - "andrea|Lo so, è una cosa esagerata. Ma è la merenda dei campioni.": { - "file": "andrea-dc8fdb81a3.mp3", - "sec": 4.62 - }, - "andrea|Niente, è chiuso. Torno quando ho ritrovato il palio, e ne prendo due.": { - "file": "andrea-52128d0321.mp3", - "sec": 6.08 - }, - "andrea|Chiuso. Il ghiacciolo dovrà aspettare.": { - "file": "andrea-bd31b556ae.mp3", - "sec": 3.07 + "andrea|Il chiosco si apre da dentro. Basta chiamare la Tosca.": { + "file": "andrea-acc1a379b7.mp3", + "sec": 3.89 }, "andrea|L'omino di ferro con la racchetta, una scultura di Simone Rocchi. Almeno lui a tennis ci gioca.": { "file": "andrea-958e834bc0.mp3", @@ -643,6 +659,42 @@ "file": "andrea-5594f1f70c.mp3", "sec": 5.02 }, + "andrea|La griglia. Ormai dentro ci sono solo foglie.": { + "file": "andrea-0a30866235.mp3", + "sec": 3.6 + }, + "andrea|Dentro la griglia luccica qualcosa: una chiavetta! È caduta fra le sbarre.": { + "file": "andrea-c6acc0d948.mp3", + "sec": 5.83 + }, + "andrea|Non c'è più niente da prendere.": { + "file": "andrea-57c48fa00f.mp3", + "sec": 1.57 + }, + "andrea|Le dita non passano fra le sbarre. Ci vorrebbe qualcosa di lungo e sottile... e appiccicoso.": { + "file": "andrea-723609c210.mp3", + "sec": 7.23 + }, + "andrea|La chiavetta l'ho già ripescata.": { + "file": "andrea-acc9f8180b.mp3", + "sec": 1.6 + }, + "andrea|Giù lo stecco, piano piano... la gomma tocca la chiavetta...": { + "file": "andrea-29863877af.mp3", + "sec": 4.54 + }, + "andrea|Presa!": { + "file": "andrea-872d650e46.mp3", + "sec": 0.69 + }, + "andrea|Lo stecco ci arriva, ma la chiavetta non si attacca. Serve qualcosa di appiccicoso in cima.": { + "file": "andrea-af37e73b26.mp3", + "sec": 5.94 + }, + "andrea|La gomma da sola non ci arriva. Serve qualcosa per spingerla giù.": { + "file": "andrea-e549a3c205.mp3", + "sec": 4.69 + }, "andrea|La piccola edicola in fondo al ponticino. C'è sempre un fiore fresco, ma nessuno l'ha mai visto metterlo.": { "file": "andrea-59afc50d80.mp3", "sec": 7.04 @@ -787,10 +839,114 @@ "file": "andrea-3a6af3897f.mp3", "sec": 6.52 }, + "andrea|Un ghiacciolo al limone. Si scioglie a guardarlo.": { + "file": "andrea-8c9713081a.mp3", + "sec": 3.44 + }, + "andrea|Da solo? No: il ghiacciolo al limone va inzuppato nella cedrata. È la regola.": { + "file": "andrea-7fadbeebca.mp3", + "sec": 8.34 + }, + "andrea|Ghiacciolo dentro la cedrata... si scioglie, frizza, è verde e giallo insieme.": { + "file": "andrea-629bfcac17.mp3", + "sec": 6.24 + }, + "andrea|Esagerato. Buonissimo. La merenda dei campioni.": { + "file": "andrea-4a2ae1d92d.mp3", + "sec": 4.57 + }, + "andrea|Mi resta lo stecco. Non si sa mai.": { + "file": "andrea-8be920ef35.mp3", + "sec": 2.96 + }, + "andrea|Una bottiglietta di cedrata, gelata.": { + "file": "andrea-31dfba3283.mp3", + "sec": 2.72 + }, + "andrea|Bevuta liscia è sprecata. Ci vuole qualcosa da inzupparci dentro.": { + "file": "andrea-69907b4352.mp3", + "sec": 5.27 + }, + "andrea|Lo stecco del ghiacciolo. Appiccica ancora un po' di limone.": { + "file": "andrea-942c0fe126.mp3", + "sec": 4.23 + }, + "andrea|Da solo non arriva a niente. Ci vorrebbe qualcosa che attacca.": { + "file": "andrea-5526428f0b.mp3", + "sec": 4.68 + }, + "andrea|Mastico la gomma e la attacco in cima allo stecco.": { + "file": "andrea-949c556ec2.mp3", + "sec": 2.5 + }, + "andrea|Ecco una canna da pesca per chiavi. Brevetto San Piero.": { + "file": "andrea-afa7f1eea2.mp3", + "sec": 4.12 + }, + "andrea|Una gomma da masticare alla fragola, ancora incartata.": { + "file": "andrea-185d607a84.mp3", + "sec": 3.44 + }, + "andrea|Masticarla così, per niente? Meglio tenerla per quando serve qualcosa che appiccica.": { + "file": "andrea-bda78d511c.mp3", + "sec": 6.5 + }, + "andrea|Lo stecco con la gomma in cima. Attacca qualunque cosa. Anche le dita.": { + "file": "andrea-79917d60dd.mp3", + "sec": 6 + }, + "andrea|Una chiavetta piccola, ripescata dalla griglia. Di un lucchetto, o di una casetta.": { + "file": "andrea-276c2298aa.mp3", + "sec": 5.47 + }, + "andrea|Una torcia rossa, funziona. Per il buio della Fortezza, prima o poi, servirà.": { + "file": "andrea-81ed927023.mp3", + "sec": 6.47 + }, + "andrea|Clic. Accesa. Clic. Spenta. Le pile le tengo per quando serve davvero.": { + "file": "andrea-a93d3ba5ad.mp3", + "sec": 8.8 + }, "andrea|Una chiave grossa e antica. Quella dell'oratorio, parola di San Pietro.": { "file": "andrea-60cdae2e35.mp3", "sec": 5.1 }, + "tosca|Eccola, ghiacciata.": { + "file": "tosca-133c83efc3.mp3", + "sec": 1.79 + }, + "andrea|Glu glu... arancione fino alle orecchie. Grazie, Tosca!": { + "file": "andrea-ae47136080.mp3", + "sec": 6.05 + }, + "tosca|Tieni.": { + "file": "tosca-db5640a086.mp3", + "sec": 0.46 + }, + "andrea|Fa le bollicine nel naso. Come sempre. Grazie!": { + "file": "andrea-d13933a255.mp3", + "sec": 4.57 + }, + "tosca|La spuma bionda! Ormai la chiedono solo i nonni.": { + "file": "tosca-b4008e55ce.mp3", + "sec": 3.8 + }, + "andrea|E io. Buona come ai tempi della festa.": { + "file": "andrea-0d9794e650.mp3", + "sec": 3.05 + }, + "tosca|Cedrata. Bella fresca.": { + "file": "tosca-d6b114d197.mp3", + "sec": 2.24 + }, + "tosca|Al limone, l'ultimo della cassetta.": { + "file": "tosca-376fbb9f17.mp3", + "sec": 2.41 + }, + "tosca|Quando ti viene sete, sai dove trovarmi.": { + "file": "tosca-db2da31cef.mp3", + "sec": 2.31 + }, "san_pietro|Cinque? Ne hai contati la metà. Vai a guardarli bene, lassù.": { "file": "san_pietro-4f6f201875.mp3", "sec": 6.53 diff --git a/assets/voices/tosca-133c83efc3.mp3 b/assets/voices/tosca-133c83efc3.mp3 new file mode 100644 index 0000000..c7ccf5a Binary files /dev/null and b/assets/voices/tosca-133c83efc3.mp3 differ diff --git a/assets/voices/tosca-376fbb9f17.mp3 b/assets/voices/tosca-376fbb9f17.mp3 new file mode 100644 index 0000000..8273819 Binary files /dev/null and b/assets/voices/tosca-376fbb9f17.mp3 differ diff --git a/assets/voices/tosca-75db2f3b4e.mp3 b/assets/voices/tosca-75db2f3b4e.mp3 new file mode 100644 index 0000000..2fda4d2 Binary files /dev/null and b/assets/voices/tosca-75db2f3b4e.mp3 differ diff --git a/assets/voices/tosca-b4008e55ce.mp3 b/assets/voices/tosca-b4008e55ce.mp3 new file mode 100644 index 0000000..835778b Binary files /dev/null and b/assets/voices/tosca-b4008e55ce.mp3 differ diff --git a/assets/voices/tosca-d6b114d197.mp3 b/assets/voices/tosca-d6b114d197.mp3 new file mode 100644 index 0000000..368d8cb Binary files /dev/null and b/assets/voices/tosca-d6b114d197.mp3 differ diff --git a/assets/voices/tosca-db2da31cef.mp3 b/assets/voices/tosca-db2da31cef.mp3 new file mode 100644 index 0000000..879a6bc Binary files /dev/null and b/assets/voices/tosca-db2da31cef.mp3 differ diff --git a/assets/voices/tosca-db5640a086.mp3 b/assets/voices/tosca-db5640a086.mp3 new file mode 100644 index 0000000..3d8bb79 Binary files /dev/null and b/assets/voices/tosca-db5640a086.mp3 differ diff --git a/src/engine/render.js b/src/engine/render.js index 524725d..7d1f2f0 100644 --- a/src/engine/render.js +++ b/src/engine/render.js @@ -1,5 +1,6 @@ // Disegno della scena su un canvas 640×360, ingrandito dal CSS senza sfocatura. // Le forme provvisorie (`art`) verranno sostituite da sfondi e sprite in pixel art. +import { check } from './game.js'; export const WIDTH = 640, HEIGHT = 360; function drawShape(ctx, s) { @@ -108,7 +109,8 @@ export function render(ctx, game, { hover, spots } = {}) { ctx.clearRect(0, 0, WIDTH, HEIGHT); if (bg) ctx.drawImage(bg, 0, 0, WIDTH, HEIGHT); for (const shape of scene.art ?? []) drawShape(ctx, shape); - for (const h of game.hotspots()) for (const shape of h.art ?? []) drawShape(ctx, shape); + // Una forma può avere la sua condizione (`when`): la chiavetta nella griglia sparisce quando la si prende. + for (const h of game.hotspots()) for (const shape of h.art ?? []) if (check(shape.when, game.state)) drawShape(ctx, shape); // Andrea e i personaggi della scena, dal più lontano al più vicino. const andrea = sprites.get('andrea'); const drawAndreaNow = () => andrea ? drawSprite(ctx, andrea, game.pose(), s.x, s.y, game.scaleAt(s.y), s.facing) diff --git a/src/story/story.js b/src/story/story.js index 4b263bc..97ff510 100644 --- a/src/story/story.js +++ b/src/story/story.js @@ -38,6 +38,7 @@ export const story = { castello: { name: 'Il Castello', color: '#c8f0a0' }, leone: { name: 'Il leone', color: '#f0a070' }, san_pietro: { name: 'San Pietro', color: '#e8e0c8' }, + tosca: { name: 'La Tosca', color: '#ffb0d0' }, }, items: { squama: { @@ -64,6 +65,74 @@ export const story = { use: [{ say: 'Leggere adesso? Prima il palio. E poi, a quanto pare, si fa presto.' }], }, }, + // La catena del ghiacciolo (idea di Andrea, 2026-10-24): la Tosca dà ghiacciolo e cedrata; il ghiacciolo inzuppato + // nella cedrata lascia lo stecco; stecco più gomma (dall'oratorio) ripesca la chiavetta dalla griglia del + // ponticino; la chiavetta apre la casetta dell'area feste, dove c'è la torcia. + ghiacciolo: { + name: 'ghiacciolo', + icon: { src: 'assets/icons/ghiacciolo.svg' }, + actions: { + look: [{ say: 'Un ghiacciolo al limone. Si scioglie a guardarlo.' }], + use: [{ say: 'Da solo? No: il ghiacciolo al limone va inzuppato nella cedrata. È la regola.' }], + }, + with: { + cedrata: [ + { drop: 'ghiacciolo' }, { drop: 'cedrata' }, + { say: 'Ghiacciolo dentro la cedrata... si scioglie, frizza, è verde e giallo insieme.' }, + { say: 'Esagerato. Buonissimo. La merenda dei campioni.' }, + { give: 'stecco' }, { set: 'stecco_fatto' }, { say: 'Mi resta lo stecco. Non si sa mai.' }, + ], + }, + }, + cedrata: { + name: 'cedrata', + icon: { src: 'assets/icons/cedrata.svg' }, + actions: { + look: [{ say: 'Una bottiglietta di cedrata, gelata.' }], + use: [{ say: 'Bevuta liscia è sprecata. Ci vuole qualcosa da inzupparci dentro.' }], + }, + }, + stecco: { + name: 'stecco', + icon: { src: 'assets/icons/stecco.svg' }, + actions: { + look: [{ say: 'Lo stecco del ghiacciolo. Appiccica ancora un po\' di limone.' }], + use: [{ say: 'Da solo non arriva a niente. Ci vorrebbe qualcosa che attacca.' }], + }, + with: { + gomma: [{ drop: 'stecco' }, { drop: 'gomma' }, { say: 'Mastico la gomma e la attacco in cima allo stecco.' }, { say: 'Ecco una canna da pesca per chiavi. Brevetto San Piero.' }, { give: 'stecco_gomma' }], + }, + }, + gomma: { + name: 'gomma', + icon: { src: 'assets/icons/gomma.svg' }, + actions: { + look: [{ say: 'Una gomma da masticare alla fragola, ancora incartata.' }], + use: [{ say: 'Masticarla così, per niente? Meglio tenerla per quando serve qualcosa che appiccica.' }], + }, + }, + stecco_gomma: { + name: 'stecco e gomma', + icon: { src: 'assets/icons/stecco_gomma.svg' }, + actions: { + look: [{ say: 'Lo stecco con la gomma in cima. Attacca qualunque cosa. Anche le dita.' }], + }, + }, + chiavetta: { + name: 'chiavetta', + icon: { src: 'assets/icons/chiavetta.svg' }, + actions: { + look: [{ say: 'Una chiavetta piccola, ripescata dalla griglia. Di un lucchetto, o di una casetta.' }], + }, + }, + torcia: { + name: 'torcia', + icon: { src: 'assets/icons/torcia.svg' }, + actions: { + look: [{ say: 'Una torcia rossa, funziona. Per il buio della Fortezza, prima o poi, servirà.' }], + use: [{ say: 'Clic. Accesa. Clic. Spenta. Le pile le tengo per quando serve davvero.' }], + }, + }, // La chiave dell'oratorio: la dà San Pietro a chi risolve il suo indovinello. Indispensabile: non si butta. chiave_oratorio: { name: 'chiave dell\'oratorio', @@ -360,6 +429,14 @@ export const story = { use: [{ say: 'Mi siedo e aspetto che arrivi la pastasciutta? Ci vorrebbe una settimana.' }], }, }, + { + id: 'gomma_terra', name: 'gomma da masticare', box: [134, 230, 16, 10], at: [140, 244], face: 'up', when: ['!has:gomma', '!gomma_presa'], + art: [{ rect: [137, 233, 10, 4], fill: '#f27ab0' }, { rect: [138, 233, 3, 1], fill: '#ffd0e8' }], + actions: { + look: [{ say: 'Una gomma da masticare ancora incartata, persa davanti al palco. Qualcuno ha perso l\'appetito.' }], + take: [{ give: 'gomma' }, { set: 'gomma_presa' }, { say: 'Una gomma alla fragola. Me la tengo.' }], + }, + }, { // 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'], @@ -632,8 +709,11 @@ export const story = { { id: 'casetta', name: 'casetta', box: [170, 146, 26, 22], at: [250, 200], face: 'up', actions: { - look: [{ say: 'Una casetta chiusa. Ci tengono le prolunghe della festa e, dicono, un mistero.' }], - open: [{ say: 'Chiusa. Il mistero resta.' }], + look: [{ if: 'casetta_aperta', then: [{ say: 'La casetta, aperta. Dentro solo prolunghe. Il mistero era la torcia.' }], else: [{ say: 'Una casetta chiusa con un lucchetto piccolo. Ci tengono le prolunghe della festa e, dicono, un mistero.' }] }], + open: [{ if: 'casetta_aperta', then: [{ say: 'È già aperta.' }], else: [{ if: 'has:chiavetta', then: [{ drop: 'chiavetta' }, { set: 'casetta_aperta' }, { say: 'La chiavetta entra nel lucchetto... clic!' }, { say: 'Prolunghe, prolunghe, prolunghe... e una torcia.' }, { give: 'torcia' }], else: [{ say: 'Chiusa col lucchetto. Il mistero resta.' }] }] }], + }, + with: { + chiavetta: [{ if: 'casetta_aperta', then: [{ say: 'È già aperta.' }], else: [{ drop: 'chiavetta' }, { set: 'casetta_aperta' }, { say: 'La chiavetta entra nel lucchetto... clic!' }, { say: 'Prolunghe, prolunghe, prolunghe... e una torcia.' }, { give: 'torcia' }] }], }, }, { @@ -839,6 +919,7 @@ export const story = { name: 'Il tennis della chiesa', map: [66, 51], background: 'assets/scenes/tennis-chiesa.png', + speakers: { tosca: [292, 196] }, walk: [[0, 360], [0, 300], [200, 290], [420, 268], [640, 258], [640, 360]], depth: [[258, 0.7], [360, 1.15]], entry: [320, 350], @@ -860,8 +941,8 @@ export const story = { id: 'chiosco', name: 'chiosco', box: [240, 196, 106, 72], at: [300, 296], face: 'up', default: 'talk', actions: { look: [{ say: 'Il chiosco del tennis. D\'estate qui c\'è la Tosca coi ghiaccioli.' }], - talk: [{ say: 'Tosca! C\'è la Tosca?' }, { say: 'Un ghiacciolo al limone, per favore. Da inzuppare nella cedrata.' }, { say: 'Lo so, è una cosa esagerata. Ma è la merenda dei campioni.' }, { say: '...' }, { say: 'Niente, è chiuso. Torno quando ho ritrovato il palio, e ne prendo due.' }], - open: [{ say: 'Chiuso. Il ghiacciolo dovrà aspettare.' }], + talk: [{ say: 'Tosca! C\'è la Tosca?' }, { say: 'Eccomi, Andrea! Cosa ti do? Fanta, Coca, cedrata, spuma bionda... o un ghiacciolo?', who: 'tosca' }, { dialogue: 'tosca' }], + open: [{ say: 'Il chiosco si apre da dentro. Basta chiamare la Tosca.' }], }, }, { @@ -1055,6 +1136,19 @@ export const story = { use: [{ say: 'Fare i ponti di sassi? Prima il palio. Poi le dighe.' }], }, }, + { + id: 'griglia', name: 'griglia', box: [346, 246, 40, 24], at: [366, 270], face: 'up', + art: [{ rect: [364, 257, 5, 2], fill: '#f2f6ff', when: '!chiavetta_presa' }, { rect: [365, 256, 2, 1], fill: '#ffffff', when: '!chiavetta_presa' }], + actions: { + look: [{ if: 'chiavetta_presa', then: [{ say: 'La griglia. Ormai dentro ci sono solo foglie.' }], else: [{ say: 'Dentro la griglia luccica qualcosa: una chiavetta! È caduta fra le sbarre.' }] }], + take: [{ if: 'chiavetta_presa', then: [{ say: 'Non c\'è più niente da prendere.' }], else: [{ say: 'Le dita non passano fra le sbarre. Ci vorrebbe qualcosa di lungo e sottile... e appiccicoso.' }] }], + }, + with: { + stecco_gomma: [{ if: 'chiavetta_presa', then: [{ say: 'La chiavetta l\'ho già ripescata.' }], else: [{ say: 'Giù lo stecco, piano piano... la gomma tocca la chiavetta...' }, { say: 'Presa!' }, { give: 'chiavetta' }, { set: 'chiavetta_presa' }] }], + stecco: [{ say: 'Lo stecco ci arriva, ma la chiavetta non si attacca. Serve qualcosa di appiccicoso in cima.' }], + gomma: [{ say: 'La gomma da sola non ci arriva. Serve qualcosa per spingerla giù.' }], + }, + }, { id: 'edicola', name: 'edicola della Madonna', box: [442, 148, 36, 44], at: [458, 204], face: 'up', actions: { @@ -1270,6 +1364,21 @@ export const story = { }, }, dialogues: { + // Il chiosco della Tosca: le bibite si bevono subito; ghiacciolo e cedrata si portano via (una volta per tipo). + tosca: { + nodes: { + start: { + options: [ + { text: 'Una Fanta.', then: [{ say: 'Eccola, ghiacciata.', who: 'tosca' }, { say: 'Glu glu... arancione fino alle orecchie. Grazie, Tosca!' }] }, + { text: 'Una Coca.', then: [{ say: 'Tieni.', who: 'tosca' }, { say: 'Fa le bollicine nel naso. Come sempre. Grazie!' }] }, + { text: 'Una spuma bionda.', then: [{ say: 'La spuma bionda! Ormai la chiedono solo i nonni.', who: 'tosca' }, { say: 'E io. Buona come ai tempi della festa.' }] }, + { text: 'Una cedrata, da portare via.', when: ['!has:cedrata', '!stecco_fatto'], then: [{ say: 'Cedrata. Bella fresca.', who: 'tosca' }, { give: 'cedrata' }] }, + { text: 'Un ghiacciolo al limone.', when: ['!has:ghiacciolo', '!stecco_fatto'], then: [{ say: 'Al limone, l\'ultimo della cassetta.', who: 'tosca' }, { give: 'ghiacciolo' }] }, + { text: 'Niente, grazie Tosca.', next: 'end', then: [{ say: 'Quando ti viene sete, sai dove trovarmi.', who: 'tosca' }] }, + ], + }, + }, + }, // L'indovinello di San Pietro. La risposta si trova nel gioco: il bastione della Fortezza la dice. indovinello: { nodes: { diff --git a/tests/story.test.mjs b/tests/story.test.mjs index 131a976..713d396 100644 --- a/tests/story.test.mjs +++ b/tests/story.test.mjs @@ -231,3 +231,33 @@ test('le strade vanno e tornano: niente sensi unici, e ogni posto si raggiunge d while (queue.length) for (const b of exits[queue.shift()] ?? []) if (!seen.has(b)) { seen.add(b); queue.push(b); } for (const id of Object.keys(story.scenes)) assert.ok(seen.has(id), `${id} non si raggiunge`); }); + +test('la catena del ghiacciolo: Tosca, cedrata, stecco, gomma, griglia, chiavetta, casetta, torcia', () => { + const g = new Game(story); + const say = () => settle(g); + const answer = text => { const i = g.options().findIndex(o => o.text === text); assert.ok(i >= 0, `manca «${text}»`); g.choose(i); say(); }; + g.go('tennis_chiesa'); say(); + g.act('talk', 'chiosco'); say(); + answer('Un ghiacciolo al limone.'); + answer('Una cedrata, da portare via.'); + answer('Niente, grazie Tosca.'); + assert.deepEqual(g.state.inventory, ['ghiacciolo', 'cedrata']); + g.act('use', 'cedrata', 'ghiacciolo'); say(); + assert.deepEqual(g.state.inventory, ['stecco'], 'inzuppato e mangiato: resta lo stecco'); + g.act('talk', 'chiosco'); say(); + assert.ok(!g.options().some(o => o.text.startsWith('Un ghiacciolo')), 'il ghiacciolo era l\'ultimo'); + answer('Niente, grazie Tosca.'); + g.go('ponticino'); say(); + g.act('use', 'griglia', 'stecco'); say(); + assert.ok(!g.state.inventory.includes('chiavetta'), 'senza gomma non si attacca'); + g.go('oratorio'); say(); + g.act('take', 'gomma_terra'); say(); + g.act('use', 'gomma', 'stecco'); say(); + assert.deepEqual(g.state.inventory, ['stecco_gomma']); + g.go('ponticino'); say(); + g.act('use', 'griglia', 'stecco_gomma'); say(); + assert.ok(g.state.inventory.includes('chiavetta')); + g.go('area_feste'); say(); + g.act('open', 'casetta'); say(); + assert.ok(g.state.flags.casetta_aperta && g.state.inventory.includes('torcia') && !g.state.inventory.includes('chiavetta')); +}); diff --git a/tools/voci.json b/tools/voci.json index 8b10ee0..bff5b5b 100644 --- a/tools/voci.json +++ b/tools/voci.json @@ -5,5 +5,6 @@ "vecchietto": { "speaker": "Viktor Eka" }, "castello": { "speaker": "Damien Black", "filtro": "asetrate=24000*0.9,aresample=24000,atempo=0.95,aecho=0.8:0.7:90|180:0.25|0.15" }, "leone": { "speaker": "Baldur Sanjin", "filtro": "asetrate=24000*0.84,aresample=24000,atempo=1.08" }, - "san_pietro": { "speaker": "Wulf Carlevaro", "filtro": "asetrate=24000*0.92,aresample=24000,atempo=0.95,aecho=0.8:0.6:60:0.2" } + "san_pietro": { "speaker": "Wulf Carlevaro", "filtro": "asetrate=24000*0.92,aresample=24000,atempo=0.95,aecho=0.8:0.6:60:0.2" }, + "tosca": { "speaker": "Gitta Nikolina" } }