Projet_Web_IceBreaker/assets/js/audio-manager.js
2025-12-21 13:10:23 +01:00

207 lines
5.2 KiB
JavaScript

/*
* Audio - sons et musique du jeu
*/
const AudioManager = (function () {
'use strict';
let isInitialized = false;
let audioContext = null;
// sons
const sounds = {
bgm: null,
drop: null,
alert: null,
break: null
};
// par défaut
let settings = {
masterVolume: 0.8,
sfxVolume: 1.0,
musicVolume: 0.6,
sfxEnabled: true,
musicEnabled: true
};
// init
function init(audioElements = {}) {
// Charger les paramètres depuis le storage
if (typeof IceBreakerStorage !== 'undefined') {
settings = { ...settings, ...IceBreakerStorage.getSettings() };
}
// Assigner les éléments audio
sounds.bgm = audioElements.bgm || document.getElementById('background-audio');
sounds.drop = audioElements.drop || document.getElementById('sfx-drop');
sounds.alert = audioElements.alert || document.getElementById('sfx-alert');
sounds.break = audioElements.break || document.getElementById('sfx-break');
// Appliquer les volumes initiaux
applyVolumes();
// Créer le contexte audio pour le préchargement
try {
audioContext = new (window.AudioContext || window.webkitAudioContext)();
} catch (e) {
console.warn('AudioContext non supporté');
}
isInitialized = true;
}
// précharger les sons
function preload() {
if (!isInitialized) return;
Object.entries(sounds).forEach(([name, audio]) => {
if (audio && name !== 'bgm') {
audio.volume = 0;
audio.play().then(() => {
audio.pause();
audio.currentTime = 0;
applyVolumes();
}).catch(() => { });
}
});
}
// mettre à jour les volumes
function applyVolumes() {
const master = settings.masterVolume;
if (sounds.bgm) {
sounds.bgm.volume = settings.musicEnabled ? master * settings.musicVolume : 0;
}
['drop', 'alert', 'break'].forEach(name => {
if (sounds[name]) {
sounds[name].volume = settings.sfxEnabled ? master * settings.sfxVolume : 0;
}
});
}
// jouer un son
function playSfx(name, volumeMultiplier = 1.0) {
if (!settings.sfxEnabled || !sounds[name]) return;
const audio = sounds[name];
audio.currentTime = 0;
audio.volume = settings.masterVolume * settings.sfxVolume * volumeMultiplier;
audio.play().catch(() => { });
}
// musique de fond
function playMusic() {
if (!settings.musicEnabled || !sounds.bgm) return Promise.resolve();
sounds.bgm.volume = settings.masterVolume * settings.musicVolume;
return sounds.bgm.play().catch(e => {
console.warn('Impossible de jouer la musique:', e);
});
}
// stop musique
function stopMusic() {
if (sounds.bgm) {
sounds.bgm.pause();
sounds.bgm.currentTime = 0;
}
}
// pause
function pauseMusic() {
if (sounds.bgm) {
sounds.bgm.pause();
}
}
// changer un param
function setSetting(key, value) {
if (key in settings) {
settings[key] = value;
applyVolumes();
// Sauvegarder
if (typeof IceBreakerStorage !== 'undefined') {
IceBreakerStorage.saveSettings(settings);
}
}
}
// plusieurs params d'un coup
function setSettings(newSettings) {
settings = { ...settings, ...newSettings };
applyVolumes();
if (typeof IceBreakerStorage !== 'undefined') {
IceBreakerStorage.saveSettings(settings);
}
}
// lire params
function getSettings() {
return { ...settings };
}
// volume principal
function getMasterVolume() {
return settings.masterVolume;
}
// modifier volume
function setMasterVolume(value) {
setSetting('masterVolume', Math.max(0, Math.min(1, value)));
}
// on/off musique
function toggleMusic() {
settings.musicEnabled = !settings.musicEnabled;
applyVolumes();
if (settings.musicEnabled && sounds.bgm) {
sounds.bgm.play().catch(() => { });
} else if (sounds.bgm) {
sounds.bgm.pause();
}
if (typeof IceBreakerStorage !== 'undefined') {
IceBreakerStorage.saveSettings(settings);
}
return settings.musicEnabled;
}
// on/off sfx
function toggleSfx() {
settings.sfxEnabled = !settings.sfxEnabled;
applyVolumes();
if (typeof IceBreakerStorage !== 'undefined') {
IceBreakerStorage.saveSettings(settings);
}
return settings.sfxEnabled;
}
return {
init,
preload,
playSfx,
playMusic,
stopMusic,
pauseMusic,
setSetting,
setSettings,
getSettings,
getMasterVolume,
setMasterVolume,
toggleMusic,
toggleSfx
};
})();
if (typeof module !== 'undefined' && module.exports) {
module.exports = AudioManager;
}