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" }
}