GameInit
This commit is contained in:
160
public/music.js
Normal file
160
public/music.js
Normal file
@ -0,0 +1,160 @@
|
||||
// Music playlist manager
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
const MUSIC_FOLDER = 'music/';
|
||||
const PLAYLIST = [
|
||||
'Knights Of The Old Republic II - The Sith Lords — The Temple of Freedon Nadd (www.lightaudio.ru).mp3',
|
||||
'Soundtrack — StarWars (www.lightaudio.ru) (1).mp3',
|
||||
'Soundtrack — Starwars (www.lightaudio.ru).mp3',
|
||||
'StarWars — Across The Stars Love Theme (www.lightaudio.ru).mp3'
|
||||
];
|
||||
|
||||
let currentAudio = null;
|
||||
let currentTrackIndex = -1;
|
||||
let playedTracks = [];
|
||||
let volume = 0.5;
|
||||
let isPlaying = false;
|
||||
let isEnabled = true;
|
||||
|
||||
function getRandomTrack() {
|
||||
if (playedTracks.length >= PLAYLIST.length) {
|
||||
playedTracks = [];
|
||||
}
|
||||
let available = PLAYLIST.filter((_, i) => !playedTracks.includes(i));
|
||||
if (available.length === 0) {
|
||||
playedTracks = [];
|
||||
available = PLAYLIST;
|
||||
}
|
||||
const randomIndex = Math.floor(Math.random() * available.length);
|
||||
const trackName = available[randomIndex];
|
||||
const trackIndex = PLAYLIST.indexOf(trackName);
|
||||
playedTracks.push(trackIndex);
|
||||
return { trackName, trackIndex };
|
||||
}
|
||||
|
||||
function loadTrack(trackName) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const audio = new Audio(MUSIC_FOLDER + trackName);
|
||||
audio.volume = volume;
|
||||
audio.addEventListener('loadeddata', () => resolve(audio));
|
||||
audio.addEventListener('error', (e) => reject(e));
|
||||
audio.load();
|
||||
});
|
||||
}
|
||||
|
||||
function playNext() {
|
||||
if (!isEnabled) return;
|
||||
|
||||
if (currentAudio) {
|
||||
currentAudio.pause();
|
||||
currentAudio = null;
|
||||
}
|
||||
|
||||
const { trackName, trackIndex } = getRandomTrack();
|
||||
currentTrackIndex = trackIndex;
|
||||
|
||||
loadTrack(trackName)
|
||||
.then((audio) => {
|
||||
currentAudio = audio;
|
||||
currentAudio.volume = volume;
|
||||
currentAudio.addEventListener('ended', () => {
|
||||
playNext();
|
||||
});
|
||||
currentAudio.addEventListener('error', () => {
|
||||
console.warn('Failed to load track:', trackName);
|
||||
playNext();
|
||||
});
|
||||
currentAudio.play().catch((e) => {
|
||||
console.warn('Failed to play track:', e);
|
||||
});
|
||||
isPlaying = true;
|
||||
updateUI();
|
||||
})
|
||||
.catch((e) => {
|
||||
console.warn('Failed to load track:', trackName, e);
|
||||
playNext();
|
||||
});
|
||||
}
|
||||
|
||||
function stop() {
|
||||
if (currentAudio) {
|
||||
currentAudio.pause();
|
||||
currentAudio = null;
|
||||
}
|
||||
isPlaying = false;
|
||||
updateUI();
|
||||
}
|
||||
|
||||
function setVolume(newVolume) {
|
||||
volume = Math.max(0, Math.min(1, newVolume));
|
||||
if (currentAudio) {
|
||||
currentAudio.volume = volume;
|
||||
}
|
||||
localStorage.setItem('musicVolume', volume.toString());
|
||||
updateUI();
|
||||
}
|
||||
|
||||
function toggle() {
|
||||
isEnabled = !isEnabled;
|
||||
localStorage.setItem('musicEnabled', isEnabled.toString());
|
||||
if (isEnabled && !isPlaying) {
|
||||
playNext();
|
||||
} else if (!isEnabled) {
|
||||
stop();
|
||||
}
|
||||
updateUI();
|
||||
}
|
||||
|
||||
function updateUI() {
|
||||
const volumeSlider = document.getElementById('music-volume-slider');
|
||||
const volumeValue = document.getElementById('music-volume-value');
|
||||
const musicToggle = document.getElementById('music-toggle');
|
||||
|
||||
if (volumeSlider) {
|
||||
volumeSlider.value = volume;
|
||||
}
|
||||
if (volumeValue) {
|
||||
volumeValue.textContent = Math.round(volume * 100) + '%';
|
||||
}
|
||||
if (musicToggle) {
|
||||
musicToggle.textContent = isEnabled ? 'Выключить' : 'Включить';
|
||||
musicToggle.classList.toggle('active', isEnabled);
|
||||
}
|
||||
}
|
||||
|
||||
function init() {
|
||||
const savedVolume = localStorage.getItem('musicVolume');
|
||||
if (savedVolume !== null) {
|
||||
volume = parseFloat(savedVolume);
|
||||
} else {
|
||||
volume = 0.5;
|
||||
}
|
||||
|
||||
const savedEnabled = localStorage.getItem('musicEnabled');
|
||||
if (savedEnabled !== null) {
|
||||
isEnabled = savedEnabled === 'true';
|
||||
} else {
|
||||
isEnabled = true;
|
||||
}
|
||||
|
||||
updateUI();
|
||||
|
||||
if (isEnabled) {
|
||||
setTimeout(() => {
|
||||
playNext();
|
||||
}, 500);
|
||||
}
|
||||
}
|
||||
|
||||
window.Music = {
|
||||
play: playNext,
|
||||
stop: stop,
|
||||
setVolume: setVolume,
|
||||
toggle: toggle,
|
||||
getVolume: () => volume,
|
||||
isEnabled: () => isEnabled,
|
||||
isPlaying: () => isPlaying,
|
||||
init: init
|
||||
};
|
||||
})();
|
||||
Reference in New Issue
Block a user