La catena del ghiacciolo: la Tosca e le bibite, ghiacciolo nella cedrata, stecco e gomma, la chiavetta nella griglia del ponticino, la torcia nella casetta

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017egeN2amL84ErjfgQFtEDn
This commit is contained in:
2026-10-24 00:49:37 +02:00
co-authored by Claude Opus 5.5
parent 64a57d6524
commit 066f9ff9ed
63 changed files with 331 additions and 26 deletions
+3 -1
View File
@@ -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)
+113 -4
View File
@@ -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: {