Add special-target activation without bypassing attack cadence, cooperative card preferences and emotes, skill sound banks, per-operator voice choices, text sizing, install prompts, closed-tab recovery and unanimous setup rerolls. Retain late deployment elapsed time and resolve echo/counter pulses without recursive hook overflow. Independent final review remains pending. Golden: roster-016, roster-035, roster-036, roster-045; boss-boss_1-pair, boss-boss_3-pair, boss-boss_5-pair, boss-boss_7-pair, hidden-boss_9-pair; solo-HARD-9-boosted: Lemuen attack cadence. diy-132: Necras extra activation targets. coop2-NORMAL-14-standins: cooperative purchase preference and simulation fixes. hidden-boss_10-solo: echo pulse FIFO resolution. See DESIGN 28.13-28.24 for assumptions, sources and contributor credit.
27 lines
1.3 KiB
JavaScript
27 lines
1.3 KiB
JavaScript
// Real reflected hits against a scaled hit-count enemy must finish without recursive hook overflow.
|
|
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { makeBattle, checkInvariants } from '../helpers/battleHarness.js';
|
|
const ECHO = 'enemy_9023_acdums';
|
|
for (const chessId of ['chess_char_1_06_b', 'chess_char_2_08_a']) {
|
|
test(`${chessId}: a 67-hit echo resolves all counter pulses including its lethal hit`, () => {
|
|
const h = makeBattle({ units: [{ chessId, row: 10, col: 4 }], autoFinish: false, captureNoisy: true, hooks: ['damaged'] });
|
|
h.step();
|
|
const u = h.unit(chessId);
|
|
h.b.addBuff(u, { key: 'test:survive', persist: true, mods: { hpFlat: 1e8 } });
|
|
u.hp = u.s.maxHp;
|
|
u.skill.sp = u.skill.spCost; u.skill.charges = 1;
|
|
assert.ok(u.skill.activate('manual'));
|
|
const echo = h.spawn(ECHO, { pos: [10, 5], mods: { hpMul: 6.7, speedMul: 0 } });
|
|
assert.equal(echo.s.maxHp, 67);
|
|
const t = h.eventsOf('fx').length;
|
|
h.b.dealDamage(u, echo, { amount: 1, type: 'arts', isAttack: true });
|
|
assert.equal(echo.alive, false);
|
|
assert.equal(h.b.errors.length, 0);
|
|
assert.equal(h.eventsOf('fx').slice(t).filter((f) => f[1] === 'explode' && f[4]?.kind === 'echoPulse').length, 67);
|
|
assert.equal(echo.mem.ab.pulsing, false);
|
|
assert.deepEqual(echo.mem.ab.pulses, []);
|
|
checkInvariants(h.b);
|
|
});
|
|
}
|