Files
leggenda-del-regolo/tests/command.test.mjs
T
manzoloandClaude Opus 5.5 fb1568259b Via dell'Antica Posta fra Piazza e Piazzetta, la Piazzetta del Comune e la scalinata; uscite ritoccate (Andrea)
Sfondi di Codex dalle foto di Andrea: Via dell'Antica Posta dalla Piazza, la Piazzetta del Comune (il retro del
municipio con la torre e le sculture), la cima della via sotto il muro di Villa Schifanoia col ponticello, le
panchine e due gatti, e la scalinata col cortile dei garage. Dalla Piazza, a sinistra, si sale in Via dell'Antica
Posta e poi in Piazzetta, che non porta più direttamente in Piazza; dalla Piazzetta (a destra del palazzo) e dalla
curva in cima alla via si scende per la scalinata ai giardini del Comune (lato sinistro). In Piazzetta tutto il lato
sinistro porta in Via de' Medici. Alla rotonda della farmacia l'uscita per la Pieve dove la strada gira dietro il
palazzo e quella per il Comune su tutto l'albero. Il campo del Giannini si collega al ponticino della Carza invece
che all'area camper. Battute provvisorie e voci.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GiECdCPptNRwbVzjzHbohi
2026-10-28 12:03:05 +01:00

83 lines
3.4 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import { story } from '../src/story/story.js';
import { Game } from '../src/engine/game.js';
import { Command } from '../src/engine/command.js';
import { settle } from './helpers.mjs';
const center = h => [h.box[0] + h.box[2] / 2, h.box[1] + h.box[3] / 2];
const setup = () => {
const g = new Game(story);
return { g, c: new Command(g), at: id => center(g.hotspot(id)) };
};
test('clic intelligente: parla con le persone, guarda le cose, attraversa le uscite', () => {
const { g, c, at } = setup();
assert.equal(c.sentence('vecchietti'), 'Parla con vecchietti');
assert.equal(c.sentence('manifesto'), 'Guarda manifesto del Palio');
assert.equal(c.sentence('verso_piazzetta'), 'Vai a Via dell\'Antica Posta, verso Piazzetta Cambray Digny');
assert.equal(c.clickScene(at('vecchietti')), 'act');
settle(g);
assert.equal(g.dialogue?.id, 'vecchietti');
});
test('verbo scelto, poi bersaglio; il verbo si azzera dopo il comando', () => {
const { g, c, at } = setup();
c.pickVerb('take');
assert.equal(c.sentence(), 'Prendi…');
assert.equal(c.sentence('colonna'), 'Prendi colonna');
c.clickScene(at('colonna'));
assert.equal(c.verb, null);
assert.match(settle(g)[0].text, /come la chiamano/);
});
test('pressione lunga o clic destro guarda', () => {
const { g, c, at } = setup();
c.clickScene(at('vecchietti'), { look: true });
assert.match(settle(g)[0].text, /panchina/);
assert.equal(g.dialogue, null);
});
test('un clic sul vuoto cammina; un clic mentre si parla salta la battuta', () => {
const { g, c } = setup();
assert.equal(c.clickScene([300, 330]), 'walk');
settle(g);
assert.deepEqual([g.state.x, g.state.y], [300, 330]);
g.queue.push({ say: 'Una battuta lunga.' });
g.update(0.01);
assert.equal(c.clickScene([10, 330]), 'skip');
assert.equal(g.speech, null);
});
test('oggetto dell\'inventario: usa con, dai a, guarda', () => {
const { g, c, at } = setup();
g.state.inventory.push('squama');
assert.equal(c.clickItem('squama'), 'select');
assert.equal(c.sentence('vecchietti'), 'Usa squama con vecchietti');
c.reset();
c.pickVerb('give');
c.clickItem('squama');
assert.equal(c.sentence('vecchietti'), 'Dai squama a vecchietti');
c.clickScene(at('vecchietti'));
assert.deepEqual(settle(g).map(s => s.who), ['andrea', 'vecchietta', 'vecchietto', 'andrea']);
assert.deepEqual(g.state.inventory, ['squama'], 'nessun vicolo cieco: la squama resta');
c.clickItem('squama', { look: true });
assert.match(settle(g)[0].text, /cantina/);
});
test('un oggetto si usa da solo: cliccandolo due volte, o subito se è una bibita', () => {
const g = new Game(story);
g.go('tennis_chiesa');
settle(g);
g.state.inventory.push('coca', 'ghiacciolo');
const c = new Command(g);
assert.equal(c.clickItem('coca'), 'act', 'la Coca si beve al primo clic');
settle(g);
assert.ok(!g.state.inventory.includes('coca'));
assert.equal(c.clickItem('ghiacciolo'), 'select');
assert.equal(c.sentence('ghiacciolo'), 'Usa ghiacciolo', 'di nuovo sullo stesso oggetto: usalo da solo');
assert.equal(c.clickItem('ghiacciolo'), 'act');
const said = settle(g).map(s => s.text);
assert.ok(said.some(t => t.includes('cedrata')), 'il ghiacciolo da solo dice che vuole la cedrata');
});