Si sceglie il rione all'inizio: Piazza, Pieve, Cardetole o Campomigliaio

Dopo «Nuova partita» la domanda «Per chi corri quest'anno?» con i quattro rioni nei loro colori; la scelta resta
nella partita (rione:<id>) e cambia la riga dell'introduzione e le battute sul rione di Andrea. Voci nuove.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ApqNBvNbNCwXqR2RLo8QJh
This commit is contained in:
2026-10-24 15:04:15 +02:00
co-authored by Claude Opus 5.5
parent ee6c03a04d
commit 94a5479645
20 changed files with 149 additions and 18 deletions
+18 -1
View File
@@ -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 } from '../src/engine/game.js';
import { Game, VERBS, checkSave, introText } from '../src/engine/game.js';
import { inside } from '../src/engine/geometry.js';
import { existsSync, readFileSync } from 'node:fs';
import { settle } from './helpers.mjs';
@@ -391,3 +391,20 @@ test('ogni posto della mappa ha la sua miniatura (make miniature)', () => {
assert.ok(existsSync(new URL('../' + p.mini, import.meta.url)), `manca ${p.mini}: make miniature`);
}
});
test('i quattro rioni: ognuno ha la sua riga nell\'introduzione, e le battute sul rione di Andrea lo seguono', () => {
assert.deepEqual(Object.keys(story.rioni), ['piazza', 'pieve', 'cardetole', 'campomigliaio']);
const line = story.intro.find(l => typeof l !== 'string');
assert.deepEqual(Object.keys(line.rione).sort(), Object.keys(story.rioni).sort(), 'una riga per rione');
for (const [id, r] of Object.entries(story.rioni)) assert.ok(introText(line, id).includes(r.colors.replace('i ', '')), `${id}: ${introText(line, id)}`);
const look = (rione, scene, target) => {
const flags = rione ? { ['rione:' + rione]: true } : {};
const g = new Game(story, { state: { scene, x: 0, y: 0, facing: 1, inventory: [], flags, used: {}, ended: false } });
g.act('look', target); return settle(g).map(s => s.text).join(' ');
};
assert.match(look('pieve', 'pieve', 'chiesa'), /Il mio rione/);
assert.match(look('cardetole', 'pieve', 'chiesa'), /quelli in bianco/);
assert.match(look('piazza', 'piazza', 'colonna'), /noi rossi/);
assert.doesNotMatch(look('pieve', 'piazza', 'colonna'), /noi rossi/);
assert.match(look(null, 'pieve', 'chiesa'), /quelli in bianco/, 'un salvataggio di prima dei rioni funziona');
});