L'Ingorgo Sonoro: dal manifesto in piazza, ingrandito e toccato, «Quanto darei per essere all'Ingorgo stasera?!?» e l'effetto speciale; il centro di notte pieno zeppo di gente (sfondi di Codex), le console di Andrea (Suno) che si mescolano camminando, Andrea più grande alla festa, uscendo si torna a maggio. Baldoria al campo sportivo col bandierone della Sampdoria (Codex) (Andrea)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECd9Quo9nEdXyjXYF8ma
This commit is contained in:
2026-10-30 22:17:21 +01:00
co-authored by Claude Opus 5.5
parent 9cd8027256
commit c132e94ed8
47 changed files with 962 additions and 39 deletions
+34
View File
@@ -0,0 +1,34 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import { existsSync, readFileSync } from 'node:fs';
import { Game } from '../src/engine/game.js';
import { story } from '../src/story/story.js';
import { settle } from './helpers.mjs';
test('Baldoria al campo principale: ogni tanto sventola il bandierone, sennò sta fermo', () => {
const g = new Game(story); g.go('polisportiva_principale'); settle(g);
const p = g.people().find(p => p.who === 'baldoria');
assert.ok(p, 'Baldoria è in scena');
const poses = new Set();
for (let t = 0; t < 9; t += 0.05) { g.time = t; poses.add(g.personPose(p)); }
assert.ok(poses.has('wave') && poses.has('wave2') && poses.has('stand') && poses.has('blink'));
g.time = 3; assert.equal(g.personPose(p), 'stand', 'fuori dallo sventolio, fermo');
const sheet = JSON.parse(readFileSync(new URL('../assets/characters/baldoria.json', import.meta.url)));
for (const f of ['stand', 'blink', 'talk', 'explain', 'wave', 'wave2', 'cheer', 'laugh']) assert.ok(sheet.frames[f], f);
assert.ok(existsSync(new URL('../assets/characters/baldoria.png', import.meta.url)));
});
test('si parla con Baldoria: le risposte e il saluto', () => {
const g = new Game(story); g.go('polisportiva_principale'); settle(g);
g.act('talk', 'baldoria'); settle(g);
assert.equal(g.dialogue?.id, 'baldoria');
const said = [];
for (const text of ['Baldoria! Ma che ci fai col bandierone al campo?', 'Guarda che qui la Sampdoria non ci gioca.', 'Hai visto passare il palio, per caso?']) {
g.choose(g.options().findIndex(o => o.text === text));
said.push(...settle(g).filter(s => s.who === 'baldoria').map(s => s.text));
}
assert.ok(said.includes('Forza Doria!'));
assert.equal(said.length, 4);
g.choose(g.options().findIndex(o => o.text === 'Ciao, Baldoria.')); settle(g);
assert.equal(g.dialogue, null);
});