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:
2026-10-31 12:13:55 +01:00
co-authored by Claude Opus 5.5
parent f57a91ca74
commit b07a1e4941
56 changed files with 457 additions and 24 deletions
+57
View File
@@ -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(); }