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.
29 lines
1.9 KiB
JavaScript
29 lines
1.9 KiB
JavaScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { sanitizeSettings } from '../../public/js/ui/gameLogic/settings.js';
|
|
import { sanitizeVoiceOverrides, voiceLangFor } from '../../public/js/voicePrefs.js';
|
|
import { AudioManager, voiceLine } from '../../public/js/audio.js';
|
|
const a = 'char_263_skadi', b = 'char_103_angel';
|
|
test('old settings migrate to inherit, malformed or prototype entries are discarded', () => {
|
|
assert.deepEqual(sanitizeSettings({ voiceLang: 'jp' }).voiceOverrides, {});
|
|
assert.deepEqual(sanitizeVoiceOverrides(Object.assign(Object.create({ [b]: 'jp' }), { [a]: 'jp', bad: 'cn', char_1_no: 'en' })), { [a]: 'jp' });
|
|
for (const raw of [null, [], 1, 'jp']) assert.deepEqual(sanitizeVoiceOverrides(raw), {});
|
|
});
|
|
test('per-character override survives persistence; deletion restores the current global setting', () => {
|
|
const settings = sanitizeSettings(JSON.parse(JSON.stringify({ voiceLang: 'cn', voiceOverrides: { [a]: 'jp', [b]: 'cn' } })));
|
|
const manager = new AudioManager();
|
|
manager.setVoiceLang(settings.voiceLang, settings.voiceOverrides);
|
|
assert.equal(voiceLangFor(a, manager.voiceLang, manager.voiceOverrides), 'jp');
|
|
manager.setVoiceLang('jp');
|
|
assert.equal(voiceLangFor(b, manager.voiceLang, manager.voiceOverrides), 'cn');
|
|
delete settings.voiceOverrides[b];
|
|
manager.setVoiceLang('jp', settings.voiceOverrides);
|
|
assert.equal(voiceLangFor(b, manager.voiceLang, manager.voiceOverrides), 'jp');
|
|
assert.equal(voiceLangFor('unknown', 'cn', manager.voiceOverrides), 'cn');
|
|
});
|
|
test('the per-operator JP preference retains the existing per-slot Chinese fallback', () => {
|
|
const tree = { voice: { [a]: { select: '/cn.mp3' } }, voiceJp: { [a]: { skill1: '/jp.mp3' } } };
|
|
assert.equal(voiceLine(tree, a, 'select', voiceLangFor(a, 'cn', { [a]: 'jp' })).url, '/cn.mp3');
|
|
assert.equal(voiceLine(tree, a, 'skill1', voiceLangFor(a, 'cn', { [a]: 'jp' })).url, '/jp.mp3');
|
|
});
|