diff --git a/src/story/story.js b/src/story/story.js index f79ed0e..36f2fb0 100644 --- a/src/story/story.js +++ b/src/story/story.js @@ -639,9 +639,6 @@ export const story = { { id: 'al_piazzale', name: 'laggiù, il piazzale delle feste', box: [40, 100, 120, 70], at: [130, 224], exit: { scene: 'area_feste_festa', at: [320, 350], face: 'up' }, }, - { - id: 'alla_polisportiva', name: 'in fondo, verso il campo sportivo', box: [360, 168, 110, 34], at: [400, 198], exit: { scene: 'polisportiva_principale', at: [40, 330], face: 'right' }, - }, { id: 'alla_rotonda', name: 'indietro, verso la rotonda', box: [0, 330, 640, 30], at: [300, 354], exit: { scene: 'via_provinciale', at: [120, 345], face: 'up' }, }, @@ -874,6 +871,9 @@ export const story = { talk: [{ say: 'Partita?' }, { say: '...' }, { say: 'Mi sa che vince lui ai punti. Non si muove mai.' }], }, }, + { + id: 'al_cancello', name: 'dal cancello verde, verso il posticino della Carza', box: [380, 300, 120, 60], at: [440, 330], exit: { scene: 'carza', at: [440, 290], face: 'left' }, + }, { id: 'alla_carza', name: 'verso il ponticino della Carza', box: [470, 140, 120, 130], at: [515, 280], exit: { scene: 'ponticino', at: [400, 350], face: 'up' }, }, @@ -1027,7 +1027,7 @@ export const story = { }, }, { - id: 'cancello', name: 'cancello verde, verso il tennis della chiesa', box: [460, 150, 46, 132], at: [440, 290], face: 'right', exit: { scene: 'tennis_chiesa', at: [320, 350], face: 'up' }, + id: 'cancello', name: 'cancello verde, verso il tennis della chiesa', box: [460, 150, 46, 132], at: [440, 290], face: 'right', exit: { scene: 'tennis_chiesa', at: [440, 330], face: 'up' }, actions: { look: [{ say: 'Il cancello verde, sempre aperto. Di là c\'è il tennis della chiesa.' }], }, @@ -1067,6 +1067,9 @@ export const story = { { id: 'alla_stazione', name: 'a destra, verso la stazione', box: [486, 160, 90, 40], at: [474, 202], exit: { scene: 'stazione', at: [20, 300], face: 'right' }, }, + { + id: 'al_tennis', name: 'giù, verso il tennis della chiesa', box: [0, 160, 230, 70], at: [300, 330], exit: { scene: 'tennis_chiesa', at: [515, 280], face: 'left' }, + }, { id: 'alla_carza', name: 'indietro, verso la Pieve', box: [0, 330, 640, 30], at: [400, 354], exit: { scene: 'carza', at: [325, 222], face: 'down' }, }, diff --git a/tests/story.test.mjs b/tests/story.test.mjs index 03e752e..131a976 100644 --- a/tests/story.test.mjs +++ b/tests/story.test.mjs @@ -220,3 +220,14 @@ test('ogni oggetto ha la sua icona a pixel', () => { assert.match(svg, /viewBox="0 0 16 16"/, `${id}: l'icona deve essere 16x16`); } }); + +test('le strade vanno e tornano: niente sensi unici, e ogni posto si raggiunge dalla partenza', () => { + const exits = {}; + for (const [id, sc] of Object.entries(story.scenes)) + for (const h of sc.hotspots ?? []) if (h.exit) (exits[id] ??= new Set()).add(h.exit.scene); + for (const [a, to] of Object.entries(exits)) + for (const b of to) assert.ok(exits[b]?.has(a), `da ${a} si va a ${b}, ma da ${b} non si torna a ${a}`); + const seen = new Set([story.start.scene]), queue = [story.start.scene]; + 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`); +});