// La soluzione completa, passo per passo: la percorre tests/story.test.mjs a ogni modifica della storia, // e tests/browser.mjs con clic veri. Passi: [verbo, bersaglio, oggetto?] oppure ['choose', testo dell'opzione]. // I tragitti fra le scene (`route`) seguono le uscite più brevi: cambiano da soli se cambia la mappa. import { story } from './story.js'; // Le uscite che si prendono sempre col Vai a: senza condizioni e senza una battuta che le sostituisce. const exits = id => (story.scenes[id].hotspots ?? []).filter(h => h.exit && !h.when && !h.actions?.walk); export function route(from, to) { const back = new Map([[from, null]]), queue = [from]; for (let i = 0; i < queue.length && !back.has(to); i++) for (const h of exits(queue[i])) if (!back.has(h.exit.scene)) { back.set(h.exit.scene, [queue[i], h.id]); queue.push(h.exit.scene); } if (!back.has(to)) throw new Error(`nessuna strada da ${from} a ${to}`); const steps = []; for (let at = to; back.get(at); at = back.get(at)[0]) steps.unshift(['walk', back.get(at)[1]]); return steps; } export const solution = [ // La squama: i vecchietti raccontano del luccichio sotto la panchina. ['look', 'colonna'], ['talk', 'vecchietti'], ['choose', 'Avete notato niente di strano stanotte?'], ['choose', 'Ci vediamo dopo.'], ['take', 'cosa_luccicante'], // Le impronte sotto la Fortezza: il Regolo è passato di qui, e le impronte vanno verso il bastione. ...route('piazza', 'fortezza'), ['use', 'impronte', 'squama'], ['look', 'fessura'], // La chiave dell'oratorio: l'indovinello di San Pietro (la risposta è sul cartellino del fonte, dentro la Pieve). ...route('fortezza', 'pieve_interno'), ['look', 'fonte'], ...route('pieve_interno', 'pieve'), ['talk', 'statua'], ['choose', 'Giovanni della Robbia.'], ['open', 'porta_oratorio'], ['take', 'gomma_terra'], // La Tosca: cedrata e ghiacciolo, e resta lo stecco; con la gomma diventa uno stecco che appiccica. ...route('oratorio', 'tennis_chiesa'), ['talk', 'chiosco'], ['choose', 'Una cedrata, da portare via.'], ['choose', 'Un ghiacciolo al limone.'], ['choose', 'Niente, grazie Tosca.'], ['use', 'cedrata', 'ghiacciolo'], ['use', 'gomma', 'stecco'], // La chiavetta sotto la griglia del ponticino, la casetta dell'area feste, la torcia. ...route('tennis_chiesa', 'ponticino'), ['use', 'griglia', 'stecco_gomma'], ...route('ponticino', 'area_feste'), ['open', 'casetta'], // La torcia nella fessura: il palio, e due occhi gialli. Fine del primo capitolo. ...route('area_feste', 'fortezza'), ['use', 'fessura', 'torcia'], ];