Files
leggenda-del-regolo/src/story/solution.js
T

56 lines
2.7 KiB
JavaScript

// 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'],
];