Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GiECdCPptNRwbVzjzHbohi
90 lines
3.9 KiB
JavaScript
90 lines
3.9 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');
|
|
// Quando il nome dice già dove, niente «a» in più: «Vai dal Trappola», «Vai a destra, …».
|
|
const casa = new Game(story), cc = new Command(casa); casa.go('cardetole');
|
|
assert.equal(cc.sentence('al_giannini'), 'Vai dal Giannini');
|
|
assert.equal(cc.sentence('al_ponticino'), 'Vai a destra, il ponticino della Carza');
|
|
casa.go('via_liguri_magelli');
|
|
assert.equal(cc.sentence('a_cardetole'), 'Vai lassù, verso casa a Cardetole');
|
|
assert.equal(cc.sentence('trappola'), 'Vai dal Trappola');
|
|
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');
|
|
});
|