Release Healer Man 0.1.45

This commit is contained in:
phenom committed 2026-09-15 14:43:15 -04:00
1 parent 756ee4f64a
commit f82daf1c13
242 files changed
+1440 -101

No files matched your search

+46 -19
View File
@@ -117,32 +117,58 @@ describe("combat audio output policy", () => {
expect(AudioContextConstructor).not.toHaveBeenCalled();
});
it("stays silent without an original sound, even with combat audio enabled", () => {
combatMedia.ready = true;
const AudioContextConstructor = vi.fn();
vi.stubGlobal("window", { AudioContext: AudioContextConstructor });
configureCombatAudio(DEFAULT_COMBAT_PRESENTATION_SETTINGS, 0.6);
playCombatAudio(fixtureEvent);
expect(AudioContextConstructor).not.toHaveBeenCalled();
expect(combatMedia.fetch).not.toHaveBeenCalled();
});
it.each(["original", "missing-file", "bad-audio"])("uses original audio or silence for %s", async (scenario) => {
vi.resetModules();
const audio = await import("./combatAudio");
const source = { connect: vi.fn(), disconnect: vi.fn(), start: vi.fn(), stop: vi.fn(), buffer: null, onended: null };
it("plays a generated spatial cue when an original sound is unavailable", () => {
const oscillator = {
connect: vi.fn(), disconnect: vi.fn(), start: vi.fn(), stop: vi.fn(),
frequency: { setValueAtTime: vi.fn() }, type: "sine", onended: null,
};
const audioContext = {
currentTime: 0,
state: "running",
destination: {},
createGain: () => ({
connect: vi.fn(), disconnect: vi.fn(), gain: { setTargetAtTime: vi.fn(), value: 1 },
connect: vi.fn(), disconnect: vi.fn(),
gain: {
setTargetAtTime: vi.fn(), setValueAtTime: vi.fn(),
exponentialRampToValueAtTime: vi.fn(), value: 1,
},
}),
createStereoPanner: () => ({ connect: vi.fn(), disconnect: vi.fn() }),
createOscillator: vi.fn(() => oscillator),
resume: vi.fn(async () => undefined),
};
vi.stubGlobal("window", { AudioContext: function () { return audioContext; } });
configureCombatAudio(DEFAULT_COMBAT_PRESENTATION_SETTINGS, 0.6);
playCombatAudio(fixtureEvent);
expect(audioContext.createOscillator).toHaveBeenCalledTimes(1);
expect(oscillator.start).toHaveBeenCalledTimes(1);
expect(oscillator.stop).toHaveBeenCalledTimes(1);
expect(combatMedia.fetch).not.toHaveBeenCalled();
});
it.each(["original", "missing-file", "bad-audio"])("uses original audio or a generated fallback for %s", async (scenario) => {
vi.resetModules();
const audio = await import("./combatAudio");
const source = { connect: vi.fn(), disconnect: vi.fn(), start: vi.fn(), stop: vi.fn(), buffer: null, onended: null };
const oscillator = {
connect: vi.fn(), disconnect: vi.fn(), start: vi.fn(), stop: vi.fn(),
frequency: { setValueAtTime: vi.fn() }, type: "sine", onended: null,
};
const audioContext = {
currentTime: 0,
state: "running",
destination: {},
createGain: () => ({
connect: vi.fn(), disconnect: vi.fn(), gain: {
setTargetAtTime: vi.fn(), setValueAtTime: vi.fn(),
exponentialRampToValueAtTime: vi.fn(), value: 1,
},
}),
createStereoPanner: () => ({ connect: vi.fn(), disconnect: vi.fn() }),
createBufferSource: vi.fn(() => source),
createOscillator: vi.fn(),
createOscillator: vi.fn(() => oscillator),
decodeAudioData: vi.fn(async () => {
if (scenario === "bad-audio") throw new Error("Invalid audio");
return { duration: 1 };
@@ -165,7 +191,8 @@ describe("combat audio output policy", () => {
expect(combatMedia.fetch).toHaveBeenCalledWith("/assets/game/combat-effects/audio/flash-heal.wav");
expect(source.start).toHaveBeenCalledTimes(scenario === "original" ? 1 : 0);
expect(audioContext.createBufferSource).toHaveBeenCalledTimes(scenario === "original" ? 1 : 0);
expect(audioContext.createOscillator).not.toHaveBeenCalled();
expect(audioContext.createOscillator).toHaveBeenCalledTimes(scenario === "original" ? 0 : 1);
expect(oscillator.start).toHaveBeenCalledTimes(scenario === "original" ? 0 : 1);
audio.resetCombatAudio();
});
});