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:
@@ -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();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user