0.2.3: prepare follow-up fixes and client features (#407, #408, #410, #413, #431, #435, #436, #440, #444)
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.
This commit is contained in:
1 parent
314564c139
commit
f3658a0dd4
104 files changed
+3674
-741
No files matched your search
@@ -0,0 +1,28 @@
|
||||
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');
|
||||
});
|
||||
Reference in new issue
Block a user