import test from 'node:test'; import assert from 'node:assert/strict'; import { newFlipper, futureLayout } from '../src/engine/flipper.js'; import { flipperScene } from '../src/engine/flipper-art.js'; test('il backglass segue i luoghi attraversati, senza modificare la partita', () => { const c = newFlipper(91); assert.equal(flipperScene(c), 'regolo'); for (const [x, y, scene] of [[403, 70, 'regolo'], [297, 90, 'rioni'], [220, 168, 'pieve'], [416, 180, 'trebbio'], [290, 135, 'fortezza'], [320, 202, 'regolo'], [320, 290, 'sieve']]) { Object.assign(c.ball, { waiting: false, x, y }); const before = structuredClone(c); assert.equal(flipperScene(c), scene, `zona ${x}, ${y}`); assert.deepEqual(c, before); } for (const [id, scene] of [['sinistra', 'fortezza'], ['destra', 'trebbio'], ['super', 'cosmo'], ['orbita', 'cosmo'], ['ponte', 'fortezza'], ['spira', 'spira']]) { c.ball.ramp = { id }; assert.equal(flipperScene(c), scene); } c.regolo.hit = 0.2; assert.equal(flipperScene(c), 'regolo', 'il colpo al Regolo ha precedenza sulle rampe'); }); test('palline in attesa o trattenute non attivano immagini, il multiball ha una priorità stabile', () => { const c = newFlipper(92); c.extraBalls = [{ ...structuredClone(c.ball), x: 210, y: 170, waiting: false, releaseAt: c.sim + 2 }]; assert.equal(flipperScene(c), 'regolo'); Object.assign(c.ball, { waiting: false, ramp: { id: 'destra' } }); Object.assign(c.extraBalls[0], { releaseAt: 0, ramp: { id: 'sinistra' } }); const first = flipperScene(c); [c.ball, c.extraBalls[0]] = [c.extraBalls[0], c.ball]; assert.equal(flipperScene(c), first); c.ball = null; c.extraBalls = []; c.step = 'result'; assert.equal(flipperScene(c), 'regolo'); Object.assign(c, futureLayout(), { table: 'future' }); assert.equal(flipperScene(c), 'cosmo'); });