Risposte su misura ai tentativi sbagliati (squama, torcia, ghiacciolo, libro a vecchietti, leone, San Pietro, Tosca, torre, amici); il pettegolezzo che cambia con le scoperte (vecchietti, Arcu, Tosca); l'Arcu senza memoria; le altre idee di Codex in IDEE.md

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018ks2K99uqCZjAxvy7Rdj1R
This commit is contained in:
2026-10-25 14:56:02 +01:00
co-authored by Claude Opus 5.5
parent 4bda52d9ac
commit 32a3d8a7c5
63 changed files with 422 additions and 1 deletions
+65
View File
@@ -519,3 +519,68 @@ test('gli amici in giro: l\'Arcu al circolino, il Tozzino al cancello del tennis
assert.ok(baron.includes('barondeduke: Avevo due donne e due jack. Entra la terza donna, e penso: «Male male si divide».'));
assert.equal(baron.at(-1), 'barondeduke: L\'altro aveva colore.');
});
test('i tentativi sbagliati hanno una risposta loro, non quella generica', () => {
const g = new Game(story);
settle(g);
g.state.inventory.push('squama', 'ghiacciolo', 'libro', 'torcia', 'stecco_gomma');
const generic = ['Non funziona.', 'Non credo che lo voglia.'];
for (const [scene, verb, target, item, who] of [
['piazza', 'give', 'vecchietti', 'ghiacciolo', 'vecchietta'], ['piazza', 'give', 'vecchietti', 'libro', 'vecchietto'],
['salita_villa_adami', 'use', 'leone', 'torcia', 'leone'], ['salita_villa_adami', 'give', 'leone', 'squama', 'leone'],
['pieve', 'give', 'statua', 'squama', 'san_pietro'], ['tennis_chiesa', 'give', 'chiosco', 'squama', 'tosca'],
['trebbio', 'use', 'torre', 'torcia', 'castello'], ['campomigliaio_circolo', 'give', 'arcu', 'libro', 'arcu'],
['carza', 'give', 'tozzino', 'ghiacciolo', 'tozzino'], ['polisportiva', 'give', 'barondeduke', 'squama', 'barondeduke'],
['area_feste', 'use', 'casetta', 'stecco_gomma', 'andrea'], ['fortezza', 'use', 'impronte', 'torcia', 'andrea'],
]) {
g.go(scene); settle(g);
assert.ok(g.act(verb, target, item), `${scene}: ${verb} ${target} con ${item}`);
const lines = settle(g);
assert.ok(lines.length && !lines.some(l => generic.includes(l.text)), `${scene}: ${target} con ${item} risponde con la frase generica`);
assert.ok(lines.some(l => (l.who ?? 'andrea') === who), `${scene}: ${target} con ${item}: manca la risposta di ${who}`);
}
});
test('il pettegolezzo cambia con le scoperte: vecchietti, Arcu e Tosca', () => {
const g = new Game(story);
settle(g);
const texts = () => g.options().map(o => o.text);
const talk = (scene, who) => { g.go(scene); settle(g); g.act('talk', who); return settle(g).map(s => `${s.who ?? 'andrea'}: ${s.text}`); };
const leave = () => { g.choose(g.options().findIndex(o => o.next === 'end')); settle(g); };
// All'inizio niente notizie.
talk('piazza', 'vecchietti');
assert.ok(!texts().some(t => t.startsWith('Ho trovato una squama')), 'senza squama non c\'è la notizia');
leave();
// Trovata la squama: una notizia nuova, una volta sola.
g.state.flags.squama_presa = true;
talk('piazza', 'vecchietti');
assert.ok(texts().includes('Ho trovato una squama, sotto la panchina.'));
g.choose(texts().indexOf('Ho trovato una squama, sotto la panchina.'));
assert.ok(settle(g).some(s => s.who === 'vecchietto' && s.text.includes('muta')));
assert.ok(!texts().includes('Ho trovato una squama, sotto la panchina.'), 'detta una volta, basta');
leave();
// Le impronte: prima di parlare, i vecchietti sparlano di Andrea (una volta sola); poi la notizia delle impronte.
g.state.flags.indizio_regolo = true;
let said = talk('piazza', 'vecchietti');
assert.ok(said.includes('vecchietto: Dice che Andrea ha trovato un serpente lungo dodici metri.'));
assert.ok(said.includes('andrea: Sono qui, eh. Vi sento.'));
assert.ok(texts().some(t => t.startsWith('Sotto la Fortezza ci sono impronte')));
leave();
said = talk('piazza', 'vecchietti');
assert.ok(!said.some(t => t.includes('dodici metri')), 'le chiacchiere si origliano una volta');
leave();
// L'Arcu e la Tosca seguono le stesse tappe.
talk('campomigliaio_circolo', 'arcu');
assert.ok(texts().includes('Sotto la Fortezza ci sono le sue impronte.') && texts().includes('Ho trovato una squama del Regolo.'));
assert.ok(!texts().includes('Ho la torcia. Stasera entro nella fessura.'), 'senza torcia non si annuncia la fessura');
g.choose(texts().indexOf('Cosa stavamo dicendo???'));
assert.deepEqual(settle(g).map(s => s.text).slice(-2), ['Ma ti si è bruciata la memoria, fratello???!?', '...I pompieri per cosa?']);
leave();
talk('tennis_chiesa', 'chiosco');
assert.ok(texts().includes('Tosca, cosa si dice in giro?'));
leave();
g.state.flags.casetta_aperta = true;
talk('campomigliaio_circolo', 'arcu');
assert.ok(texts().includes('Ho la torcia. Stasera entro nella fessura.'));
leave();
});