59 lines
1.4 KiB
JavaScript
59 lines
1.4 KiB
JavaScript
const soundFiles = {
|
|
chestClose: "/sfx/sfx_chest_close.wav",
|
|
chestOpen: "/sfx/sfx_chest_open.wav",
|
|
click: "/sfx/sfx_click.wav",
|
|
clock: "/sfx/sfx_clock.wav",
|
|
key: "/sfx/sfx_key.wav",
|
|
lose: "/sfx/sfx_lose.wav",
|
|
step: "/sfx/sfx_step.wav",
|
|
win: "/sfx/sfx_win.wav",
|
|
};
|
|
|
|
const sounds = {};
|
|
for (const [name, filePath] of Object.entries(soundFiles)) {
|
|
const audio = new Audio(filePath);
|
|
audio.preload = "auto";
|
|
sounds[name] = audio;
|
|
}
|
|
|
|
let audioPrimed = false;
|
|
|
|
function playAudio(audio, volume = 1) {
|
|
const instance = audio.cloneNode();
|
|
instance.volume = volume;
|
|
instance.currentTime = 0;
|
|
const promise = instance.play();
|
|
if (promise && typeof promise.catch === "function") {
|
|
promise.catch(() => {});
|
|
}
|
|
}
|
|
|
|
export function primeSfx() {
|
|
if (audioPrimed) {
|
|
return;
|
|
}
|
|
|
|
audioPrimed = true;
|
|
for (const audio of Object.values(sounds)) {
|
|
const probe = audio.cloneNode();
|
|
probe.volume = 0;
|
|
const promise = probe.play();
|
|
if (promise && typeof promise.then === "function") {
|
|
promise
|
|
.then(() => {
|
|
probe.pause();
|
|
probe.currentTime = 0;
|
|
})
|
|
.catch(() => {});
|
|
}
|
|
}
|
|
}
|
|
|
|
export function playSfx(name, volume = 1) {
|
|
const audio = sounds[name];
|
|
if (!audio) {
|
|
return;
|
|
}
|
|
|
|
playAudio(audio, volume);
|
|
} |