La Smarronata del 1993: dal vecchio cartello sul lampione del Ponte sulla Sieve, coi ricordi di Andrea, la macchina del tempo porta alla festa delle castagne degli alpini sotto il ponte, col bruciatore delle bruciate, gli stand e il tendone giallo con le tavolate; dalle scene del viaggio la mappa non porta più via; tolte le battute sull'altezza del Taglia (Andrea)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GiECd9RWGMKV7n3K1mdy8T
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
// La Smarronata del 1993 nel browser vero: lo spiazzo sotto il Ponte sulla Sieve, la macchina del tempo, il cruscotto,
|
||||
// la festa sotto il ponte, il tendone e il ritorno al 2007. npm run browser:smarronata — schermate in /tmp/regolo-smarronata.
|
||||
import { chromium } from 'playwright';
|
||||
import { mkdirSync } from 'node:fs';
|
||||
import assert from 'node:assert/strict';
|
||||
import { staticServer } from './helpers.mjs';
|
||||
|
||||
const out = process.env.OUT ?? '/tmp/regolo-smarronata';
|
||||
mkdirSync(out, { recursive: true });
|
||||
const server = await staticServer();
|
||||
let browser;
|
||||
const errors = [];
|
||||
try {
|
||||
browser = await chromium.launch({ args: ['--autoplay-policy=no-user-gesture-required', '--use-gl=angle', '--use-angle=swiftshader', '--enable-unsafe-swiftshader'] });
|
||||
const page = await browser.newPage({ viewport: { width: 1280, height: 860 } });
|
||||
page.on('pageerror', e => { errors.push(e.message); console.log('ERR', e.message); });
|
||||
await page.goto(`http://127.0.0.1:${server.port}/`);
|
||||
await page.click('#splash'); await page.click('#new-game'); await page.click('#rione [data-rione="campomigliaio"]'); await page.click('#skip-intro');
|
||||
const settle = () => page.evaluate(async () => { const { settle } = await import('/tests/helpers.mjs'); settle(game); });
|
||||
// Si salta tutto quello che si può: viaggio, corse, battute (il tempo nel gioco va veloce).
|
||||
const run = () => page.evaluate(async () => {
|
||||
const { settle } = await import('/tests/helpers.mjs');
|
||||
for (let i = 0; i < 3000 && (game.closeup || game.speech || game.queue.length || game.walking); i++) { if (game.speech) game.skip(); else game.update(0.1); }
|
||||
settle(game);
|
||||
});
|
||||
await run();
|
||||
await page.evaluate(() => { game.go('ponte_sieve', [250, 320]); });
|
||||
await run();
|
||||
// Il cartello sul lampione si apre ingrandito; un tocco, e arriva la macchina.
|
||||
await page.evaluate(() => game.act('look', 'cartello_smarronata'));
|
||||
await page.waitForFunction(() => game.closeup?.id === 'manifesto_smarronata' && game.closeup.t > 0.6, null, { timeout: 15000 });
|
||||
await page.screenshot({ path: `${out}/0-cartello.png` });
|
||||
await page.evaluate(() => game.closeupTap());
|
||||
await run();
|
||||
assert.ok(await page.evaluate(() => game.state.flags.macchina_ponte), 'la macchina compare');
|
||||
await page.waitForTimeout(800);
|
||||
await page.screenshot({ path: `${out}/1-ponte-macchina.png` });
|
||||
await page.evaluate(() => game.act('use', 'macchina_ponte'));
|
||||
await page.waitForFunction(() => game.closeup?.id === 'viaggio_1993', null, { timeout: 15000 });
|
||||
await page.waitForTimeout(1500);
|
||||
await page.screenshot({ path: `${out}/2-cruscotto.png` });
|
||||
await run();
|
||||
assert.equal(await page.evaluate(() => game.state.scene), 'smarronata_1993');
|
||||
await page.waitForTimeout(1200);
|
||||
await page.screenshot({ path: `${out}/3-smarronata.png` });
|
||||
await page.evaluate(() => game.act('walk', 'tendone'));
|
||||
await run();
|
||||
assert.equal(await page.evaluate(() => game.state.scene), 'smarronata_tendone');
|
||||
await page.waitForTimeout(1200);
|
||||
await page.screenshot({ path: `${out}/4-tendone.png` });
|
||||
await page.evaluate(() => game.goBack());
|
||||
await run();
|
||||
assert.equal(await page.evaluate(() => game.state.scene), 'ponte_sieve');
|
||||
assert.ok(!await page.evaluate(() => game.state.flags.macchina_ponte), 'tornati, la macchina sparisce');
|
||||
assert.deepEqual(errors, []);
|
||||
console.log(`ok: schermate in ${out}`);
|
||||
} finally { await browser?.close(); server.kill(); }
|
||||
+29
-2
@@ -3,7 +3,7 @@ import assert from 'node:assert/strict';
|
||||
import { backgroundOrder } from '../src/engine/render.js';
|
||||
import { story } from '../src/story/story.js';
|
||||
import { solution } from '../src/story/solution.js';
|
||||
import { Game, VERBS, checkSave, introText, shuffledCredits, matchPlace, reelPictures } from '../src/engine/game.js';
|
||||
import { Game, VERBS, checkSave, introText, shuffledCredits, matchPlace, reelPictures, POSTER_READY } from '../src/engine/game.js';
|
||||
import { inside } from '../src/engine/geometry.js';
|
||||
import { existsSync, readFileSync } from 'node:fs';
|
||||
import { settle, exploreTorch } from './helpers.mjs';
|
||||
@@ -350,7 +350,8 @@ test('le strade vanno e tornano: niente sensi unici, e ogni posto si raggiunge d
|
||||
const text = JSON.stringify(story);
|
||||
assert.ok(text.includes(`"go":"${id}"`), `${id}: nessun viaggio ci porta`);
|
||||
const back = JSON.stringify(sc.hotspots).match(/"go":"([a-z_0-9]+)"/g)?.map(m => m.slice(6, -1)) ?? [];
|
||||
assert.ok(back.some(b => seen.has(b)), `${id}: non si torna indietro`);
|
||||
// Si torna in una scena vera, o in un'altra del viaggio (il tendone della Smarronata riporta alla festa).
|
||||
assert.ok(back.some(b => seen.has(b) || story.scenes[b]?.viaggio), `${id}: non si torna indietro`);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -691,3 +692,29 @@ test('i file che il Docker copia sono leggibili da tutti (nginx gira con un altr
|
||||
dirs.forEach(walk);
|
||||
assert.deepEqual(closed, [], 'file non leggibili da nginx (chmod 644)');
|
||||
});
|
||||
|
||||
test('la Smarronata del 1993: lo spiazzo sotto il ponte fa comparire la macchina, il viaggio, la festa, il tendone e il ritorno', () => {
|
||||
const g = new Game(story);
|
||||
settle(g); g.go('ponte_sieve', [250, 320]); settle(g);
|
||||
assert.ok(!g.hotspot('macchina_ponte'), 'prima del ricordo la macchina non c\'è');
|
||||
// Il vecchio cartello sul lampione: si apre ingrandito, e toccandolo arriva la macchina del tempo.
|
||||
g.act('look', 'cartello_smarronata'); settle(g);
|
||||
assert.equal(g.closeup?.id, 'manifesto_smarronata');
|
||||
g.update(POSTER_READY); assert.ok(g.closeupTap()); settle(g);
|
||||
assert.ok(g.state.flags.macchina_ponte && g.hotspot('macchina_ponte'));
|
||||
g.act('use', 'macchina_ponte'); settle(g);
|
||||
assert.equal(g.closeup?.id, 'viaggio_1993');
|
||||
// Il cruscotto, poi la partenza vista da fuori: due primi piani di fila.
|
||||
for (let i = 0; i < 4000 && (g.closeup || g.queue.length || g.speech); i++) { g.skip(); g.update(0.05); }
|
||||
settle(g);
|
||||
assert.equal(g.state.scene, 'smarronata_1993');
|
||||
assert.ok(!g.travel('piazza'), 'dal 1993 la mappa non porta via: si torna con la macchina');
|
||||
g.act('walk', 'tendone'); settle(g);
|
||||
assert.equal(g.state.scene, 'smarronata_tendone');
|
||||
g.act('walk', 'fuori_tendone'); settle(g);
|
||||
assert.equal(g.state.scene, 'smarronata_1993');
|
||||
assert.ok(g.goBack()); for (let i = 0; i < 4000 && (g.closeup || g.queue.length || g.speech); i++) { g.skip(); g.update(0.05); }
|
||||
settle(g);
|
||||
assert.equal(g.state.scene, 'ponte_sieve');
|
||||
assert.ok(!g.state.flags.macchina_ponte, 'tornati nel 2007 la macchina sparisce');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user