您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A comprehensive audio player that attempts to recreate the cart experience
// ==UserScript== // @name AWBW Music Player // @namespace https://awbw.amarriner.com/ // @version 2.0.8 // @description A comprehensive audio player that attempts to recreate the cart experience // @author twiggy_ // @match https://awbw.amarriner.com/*?games_id=* // @match https://awbw.amarriner.com/*?replays_id=* // @match https://awbw.amarriner.com/*editmap* // @icon https://awbw.amarriner.com/favicon.ico // @license MIT // ==/UserScript== const MY_VERSION = "2.0.8"; var NEWEST_VERSION = "FETCHING..."; let musicPlayerSettings = {} let isMapEditor = window.location.href.indexOf("editmap.php?") > -1; let neutralImgLink = 'https://macroland.one/img/music-player-icon.png'; let playingImgLink = 'https://macroland.one/img/music-player-playing.gif'; let myName = document.querySelector('#profile-menu').getElementsByClassName("dropdown-menu-link")[0].href.split("username=")[1]; let myID = -1; let clicked = false; let isPlaying = false; let menuOpen = false; let menuItemClick = false; let randomThemeTimeout = null; let volume = 0.5; let sfxVolume = 0.35; let uiVolume = 0.425; let val; let ahMove = null; let ahWait = null; let ahLoad = null; let ahUnload = null; let ahCapt = null; let ahExplode = null; let ahSupply = null; let ahRepair = null; let ahJoin = null; let ahFog = null; let ahCursorMove = null; let ahOpenMenu = null; let ahCloseMenu = null; let ahUnitClick = null; let scopBHDelay = 2500; let scopDelay = 1550; let movementSFX = null; let movingUnit = null; let activeUnitSFX = {}; let currentTheme = new Audio(); currentTheme.volume = volume; let themeSource = ""; let loopingTheme; let currentSFX = new Audio(); currentSFX.volume = sfxVolume; let currentUI = new Audio(); currentUI.volume = volume; const CURSOR_THRESHOLD = 30; let sfxSource = ""; let menuOptions = null; let playerCOObj = {}; let playerNames = []; let blackHoleCOs = ["Adder", "Flak", "Hawke", "Jugger", "Kindle", "Koal", "Lash", "Sturm", "Von Bolt"]; let SCOPTheme = "https://macroland.one/themes/kingrex/misc/super-power.ogg"; let COPTheme = "https://macroland.one/themes/kingrex/misc/power.ogg"; let SCOPThemeBH = "https://macroland.one/themes/kingrex/misc/bh-super-power.ogg"; let COPThemeBH = "https://macroland.one/themes/kingrex/misc/bh-power.ogg"; let victoryTheme = "https://macroland.one/themes/kingrex/misc/victory-1.ogg"; let defeatTheme = "https://macroland.one/themes/kingrex/misc/defeat-1.ogg"; let mapTheme = "https://sndup.net/zwwj/d"; let andyTheme = "https://macroland.one/themes/kingrex/orange-star/andy.ogg"; let hachiTheme = "https://macroland.one/themes/kingrex/orange-star/hachi.ogg"; let jakeTheme = "https://macroland.one/themes/kingrex/orange-star/jake.ogg"; let maxTheme = "https://macroland.one/themes/kingrex/orange-star/max.ogg"; let nellTheme = "https://macroland.one/themes/kingrex/orange-star/nell.ogg"; let rachelTheme = "https://macroland.one/themes/kingrex/orange-star/rachel.ogg"; let samiTheme = "https://macroland.one/themes/kingrex/orange-star/sami.ogg"; let colinTheme = "https://macroland.one/themes/kingrex/blue-moon/colin.ogg"; let gritTheme = "https://macroland.one/themes/kingrex/blue-moon/grit.ogg"; let olafTheme = "https://macroland.one/themes/kingrex/blue-moon/olaf.ogg"; let sashaTheme = "https://macroland.one/themes/kingrex/blue-moon/sasha.ogg"; let drakeTheme = "https://macroland.one/themes/kingrex/green-earth/drake.ogg"; let eagleTheme = "https://macroland.one/themes/kingrex/green-earth/eagle.ogg"; let javierTheme = "https://macroland.one/themes/kingrex/green-earth/javier.ogg"; let jessTheme = "https://macroland.one/themes/kingrex/green-earth/jess.ogg"; let grimmTheme = "https://macroland.one/themes/kingrex/yellow-comet/grimm.ogg"; let kanbeiTheme = "https://macroland.one/themes/kingrex/yellow-comet/kanbei.ogg"; let senseiTheme = "https://macroland.one/themes/kingrex/yellow-comet/sensei.ogg"; let sonjaTheme = "https://macroland.one/themes/kingrex/yellow-comet/sonja.ogg"; let adderTheme = "https://macroland.one/themes/kingrex/black-hole/adder.ogg"; let flakTheme = "https://macroland.one/themes/kingrex/black-hole/flak.ogg"; let hawkeTheme = "https://macroland.one/themes/kingrex/black-hole/hawke.ogg"; let juggerTheme = "https://macroland.one/themes/kingrex/black-hole/jugger.ogg"; let kindleTheme = "https://macroland.one/themes/kingrex/black-hole/kindle.ogg"; let koalTheme = "https://macroland.one/themes/kingrex/black-hole/koal.ogg"; let lashTheme = "https://macroland.one/themes/kingrex/black-hole/lash.ogg"; let sturmTheme = "https://macroland.one/themes/kingrex/black-hole/sturm.ogg"; let vonboltTheme = "https://macroland.one/themes/kingrex/black-hole/vonbolt.ogg"; // Reboot Camp let SCOPThemeRBC = "https://macroland.one/themes/rbc/loop/t-co-super-power-2.wav"; let COPThemeRBC = "https://macroland.one/themes/rbc/loop/t-co-power-2.wav"; let SCOPThemeBHRBC = "https://macroland.one/themes/rbc/loop/t-bh-super-power-2.wav"; let COPThemeBHRBC = "https://macroland.one/themes/rbc/loop/t-bh-power-2.wav"; let victoryThemeRBC = "https://macroland.one/themes/rbc/loop/t-no-loop-victory.wav"; let defeatThemeRBC = "https://macroland.one/themes/rbc/loop/t-no-loop-defeat.wav"; let andyThemeRBC = "https://macroland.one/themes/rbc/loop/t-andy.wav"; let hachiThemeRBC = "https://macroland.one/themes/rbc/loop/t-hachi.wav"; let maxThemeRBC = "https://macroland.one/themes/rbc/loop/t-max.wav"; let nellThemeRBC = "https://macroland.one/themes/rbc/loop/t-nell.wav"; let samiThemeRBC = "https://macroland.one/themes/rbc/loop/t-sami.wav"; let colinThemeRBC = "https://macroland.one/themes/rbc/loop/t-colin.wav"; let gritThemeRBC = "https://macroland.one/themes/rbc/loop/t-grit.wav"; let olafThemeRBC = "https://macroland.one/themes/rbc/loop/t-olaf.wav"; let drakeThemeRBC = "https://macroland.one/themes/rbc/loop/t-drake.wav"; let eagleThemeRBC = "https://macroland.one/themes/rbc/loop/t-eagle.wav"; let jessThemeRBC = "https://macroland.one/themes/rbc/loop/t-jess.wav"; let kanbeiThemeRBC = "https://macroland.one/themes/rbc/loop/t-kanbei.wav"; let senseiThemeRBC = "https://macroland.one/themes/rbc/loop/t-sensei.wav"; let sonjaThemeRBC = "https://macroland.one/themes/rbc/loop/t-sonja.wav"; let adderThemeRBC = "https://macroland.one/themes/rbc/loop/t-adder.wav"; let flakThemeRBC = "https://macroland.one/themes/rbc/loop/t-flak.wav"; let hawkeThemeRBC = "https://macroland.one/themes/rbc/loop/t-hawke.wav"; let lashThemeRBC = "https://macroland.one/themes/rbc/loop/t-lash.wav"; let sturmThemeRBC = "https://macroland.one/themes/rbc/loop/t-sturm.wav"; let allCOThemes = [andyTheme, hachiTheme, jakeTheme, maxTheme, nellTheme, rachelTheme, samiTheme, colinTheme, gritTheme, olafTheme, sashaTheme, drakeTheme, eagleTheme, javierTheme, jessTheme, grimmTheme, kanbeiTheme, senseiTheme, sonjaTheme, adderTheme, flakTheme, hawkeTheme, juggerTheme, kindleTheme, koalTheme, lashTheme, sturmTheme, vonboltTheme, andyThemeRBC, hachiThemeRBC, maxThemeRBC, nellThemeRBC, samiThemeRBC, colinThemeRBC, gritThemeRBC, olafThemeRBC, drakeThemeRBC, eagleThemeRBC, jessThemeRBC, kanbeiThemeRBC, senseiThemeRBC, sonjaThemeRBC, adderThemeRBC, flakThemeRBC, hawkeThemeRBC, lashThemeRBC, sturmThemeRBC]; let moveInf_1 = "https://macroland.one/movement/inf_move_chopped_1.mp3"; let moveInf_2 = "https://macroland.one/movement/inf_move_chopped_2.mp3"; let moveInf_3 = "https://macroland.one/movement/inf_move_chopped_3.mp3"; let moveBCopterLoop = "https://macroland.one/movement/move_bcopter.wav"; let moveBCopterOneShot = "https://macroland.one/movement/move_bcopter_rolloff.wav"; let moveInfLoop = "https://macroland.one/movement/move_inf.wav"; let moveMechLoop = "https://macroland.one/movement/move_mech.wav"; let moveNavalLoop = "https://macroland.one/movement/move_naval.wav"; let movePiperunnerLoop = "https://macroland.one/movement/move_piperunner.wav"; let movePlaneLoop = "https://macroland.one/movement/move_plane.wav"; let movePlaneOneShot = "https://macroland.one/movement/move_plane_rolloff.wav"; let moveSubLoop = "https://macroland.one/movement/move_sub.wav"; let moveTCopterLoop = "https://macroland.one/movement/move_tcopter.wav"; let moveTCopterOneShot = "https://macroland.one/movement/move_tcopter_rolloff.wav"; let moveTiresHeavyLoop = "https://macroland.one/movement/move_tires_heavy.wav"; let moveTiresHeavyOneShot = "https://macroland.one/movement/move_tires_heavy_rolloff.wav"; let moveTiresLightLoop = "https://macroland.one/movement/move_tires_light.wav"; let moveTiresLightOneShot = "https://macroland.one/movement/move_tires_light_rolloff.wav"; let moveTreadHeavyLoop = "https://macroland.one/movement/move_tread_heavy.wav"; let moveTreadHeavyOneShot = "https://macroland.one/movement/move_tread_heavy_rolloff.wav"; let moveTreadLightLoop = "https://macroland.one/movement/move_tread_light.wav"; let moveTreadLightOneShot = "https://macroland.one/movement/move_tread_light_rolloff.wav"; let actionLoadSFX = "https://macroland.one/game/action_load.wav"; let actionUnloadSFX = "https://macroland.one/game/action_unload.wav"; let actionCaptAllySFX = "https://macroland.one/game/capture_ally.wav"; let actionCaptEnemySFX = "https://macroland.one/game/capture_enemy.wav"; let actionUnitExplode = "https://macroland.one/game/unit_explode.wav"; let actionSupplyRepair = "https://macroland.one/game/action_resupply_repair.wav"; let uiCursorMove = "https://macroland.one/game/ui_cursormove.wav"; let uiMenuOpen = "https://macroland.one/game/ui_openmenu.wav"; let uiMenuClose = "https://macroland.one/game/ui_closemenu.wav"; let uiMenuMove = "https://macroland.one/game/ui_menumove.wav"; let uiUnitClick = "https://macroland.one/game/ui_unitclick.wav"; let powerSCOPIntro = "https://macroland.one/game/power_co_scop.wav"; let powerBHSCOPIntro = "https://macroland.one/game/power_bh_scop.wav"; let thisGamesCOs = []; let preLoadedAudio = []; let eventHeader = document.querySelector('.event-username'); let menu = isMapEditor ? document.querySelector('#replay-misc-controls') : document.querySelector('#game-map-menu').parentNode; // build and append button to game menu let musicPlayerDiv = document.createElement('div'); musicPlayerDiv.id = 'music-player-parent'; musicPlayerDiv.classList.add('game-tools-btn'); musicPlayerDiv.classList.add('cls-context-menu-root'); musicPlayerDiv.style.width = '34px'; musicPlayerDiv.style.height = '30px'; musicPlayerDiv.style.border = isMapEditor ? 'none' : '1px solid #888888'; musicPlayerDiv.style.borderLeft = isMapEditor ? '1px solid #888888' : '0px'; let musicPlayerDivHoverSpan = document.createElement('span'); musicPlayerDivHoverSpan.id = 'adji-hover-span'; musicPlayerDivHoverSpan.classList.add('game-tools-btn-text'); musicPlayerDivHoverSpan.classList.add('small_text'); musicPlayerDivHoverSpan.classList.add('cls-context-menu-root'); musicPlayerDivHoverSpan.innerText = "Play Tunes"; let musicPlayerDivBackground = document.createElement('div'); musicPlayerDivBackground.id = 'music-player-background'; musicPlayerDivBackground.classList.add('game-tools-bg'); musicPlayerDivBackground.classList.add('cls-context-menu-root'); musicPlayerDivBackground.style.backgroundImage = "linear-gradient(to right, #ffffff 0% , #888888 0%)"; // #0066CC let musicPlayerDivBackgroundSpan = document.createElement('span'); musicPlayerDivBackgroundSpan.id = 'music-player-background-span'; musicPlayerDivBackgroundSpan.classList.add('norm2'); musicPlayerDivBackgroundSpan.classList.add('cls-context-menu-root'); let musicPlayerDivBackgroundLink = document.createElement('a'); musicPlayerDivBackgroundLink.id = 'music-player-background-link'; musicPlayerDivBackgroundLink.classList.add('norm2'); musicPlayerDivBackgroundLink.classList.add('cls-context-menu-root'); let musicPlayerDivBackgroundImg = document.createElement('img'); musicPlayerDivBackgroundImg.id = 'music-player-background-link'; musicPlayerDivBackgroundImg.classList.add('cls-context-menu-root'); musicPlayerDivBackgroundImg.src = neutralImgLink; musicPlayerDivBackgroundImg.style.verticalAlign = "middle"; musicPlayerDivBackgroundImg.style.width = '17px'; musicPlayerDivBackgroundImg.style.height = '17px'; musicPlayerDiv.appendChild(musicPlayerDivBackground); musicPlayerDiv.appendChild(musicPlayerDivHoverSpan); musicPlayerDivBackground.appendChild(musicPlayerDivBackgroundSpan); musicPlayerDivBackgroundSpan.appendChild(musicPlayerDivBackgroundLink); musicPlayerDivBackgroundLink.appendChild(musicPlayerDivBackgroundImg); menu.appendChild(musicPlayerDiv); musicPlayerDivBackgroundLink.onclick = musicFunc; // Button click function function musicFunc() { if (clicked == false) { isPlaying = true; isMapEditor ? playMapTunes() : playTunes(); musicPlayerDivHoverSpan.innerText = "Stop Tunes"; musicPlayerDivBackground.style.backgroundColor = "#e1e1e1"; clicked = true; } else { isPlaying = false; stopTunes(); musicPlayerDivBackgroundImg.src = neutralImgLink; musicPlayerDivHoverSpan.innerText = "Play Tunes"; musicPlayerDivBackground.style.backgroundColor = "#ffffff"; clicked = false; } musicPlayerSettings["is-playing"] = isPlaying; updateObjectInLocalStorage(); } function determineRandomCO() { if (rbcThemesOn) { let newTheme = ""; while (!newTheme.includes("t-")) { let randomTheme = allCOThemes[Math.floor(Math.random() * allCOThemes.length)]; themeSource = randomTheme; newTheme = themeSource; } } else { let randomTheme = allCOThemes[Math.floor(Math.random() * allCOThemes.length)]; themeSource = randomTheme; } } // Determine who the current CO is and generate their theme data function determineCurrentCO() { let COName = ""; Object.keys(playersInfo).forEach(playerID => { if (playerID == currentTurn) { COName = playersInfo[playerID]["co_name"]; } playerCOObj[playerID] = playersInfo[playerID]["co_name"]; playerNames.push(playersInfo[playerID]["users_username"]); }); switch(COName) { case "Andy": if (rbcThemesOn) { themeSource = andyThemeRBC; } else { themeSource = andyTheme; } break; case "Hachi": if (rbcThemesOn) { themeSource = hachiThemeRBC; } else { themeSource = hachiTheme; } break; case "Jake": themeSource = jakeTheme; break; case "Max": if (rbcThemesOn) { themeSource = maxThemeRBC; } else { themeSource = maxTheme; } break; case "Nell": if (rbcThemesOn) { themeSource = nellThemeRBC; } else { themeSource = nellTheme; } break; case "Rachel": themeSource = rachelTheme; break; case "Sami": if (rbcThemesOn) { themeSource = samiThemeRBC; } else { themeSource = samiTheme; } break; case "Colin": if (rbcThemesOn) { themeSource = colinThemeRBC; } else { themeSource = colinTheme; } break; case "Grit": if (rbcThemesOn) { themeSource = gritThemeRBC; } else { themeSource = gritTheme; } break; case "Olaf": if (rbcThemesOn) { themeSource = olafThemeRBC; } else { themeSource = olafTheme; } break; case "Sasha": themeSource = sashaTheme; break; case "Drake": if (rbcThemesOn) { themeSource = drakeThemeRBC; } else { themeSource = drakeTheme; } break; case "Eagle": if (rbcThemesOn) { themeSource = eagleThemeRBC; } else { themeSource = eagleTheme; } break; case "Javier": themeSource = javierTheme; break; case "Jess": if (rbcThemesOn) { themeSource = jessThemeRBC; } else { themeSource = jessTheme; } break; case "Grimm": themeSource = grimmTheme; break; case "Kanbei": if (rbcThemesOn) { themeSource = kanbeiThemeRBC; } else { themeSource = kanbeiTheme; } break; case "Sensei": if (rbcThemesOn) { themeSource = senseiThemeRBC; } else { themeSource = senseiTheme; } break; case "Sonja": if (rbcThemesOn) { themeSource = sonjaThemeRBC; } else { themeSource = sonjaTheme; } break; case "Adder": if (rbcThemesOn) { themeSource = adderThemeRBC; } else { themeSource = adderTheme; } break; case "Flak": if (rbcThemesOn) { themeSource = flakThemeRBC; } else { themeSource = flakTheme; } break; case "Hawke": if (rbcThemesOn) { themeSource = hawkeThemeRBC; } else { themeSource = hawkeTheme; } break; case "Jugger": themeSource = juggerTheme; break; case "Kindle": themeSource = kindleTheme; break; case "Koal": themeSource = koalTheme; break; case "Lash": if (rbcThemesOn) { themeSource = lashThemeRBC; } else { themeSource = lashTheme; } break; case "Sturm": if (rbcThemesOn) { themeSource = sturmThemeRBC; } else { themeSource = sturmTheme; } break; case "Von Bolt": themeSource = vonboltTheme; break; } } // Event listener for when the audio data is actually loaded currentTheme.onloadedmetadata = function() { if (isRandomCOTheme) { currentTheme.loop = false; var duration = currentTheme.duration * 1000; randomThemeTimeout = setTimeout(function() { stopTunes(); playTunes(); }, duration); }; if (isClassicTheme || currentTheme.src == SCOPTheme || currentTheme.src == COPTheme || currentTheme.src == SCOPThemeBH || currentTheme.src == COPThemeBH || currentTheme.src == victoryTheme || currentTheme.src == defeatTheme) { currentTheme.loop = true; if (currentTheme.src == victoryThemeRBC || currentTheme.src == defeatThemeRBC) { currentTheme.loop = false; setTimeout(function() { musicFunc(); }, currentTheme.duration * 1000); } clearTimeout(randomThemeTimeout); }; currentTheme.play(); musicPlayerDivBackgroundImg.src = playingImgLink; }; currentSFX.onloadedmetadata = function() { currentSFX.loop = false; currentSFX.play(); }; var on = (function() { if (window.addEventListener) { return function(target, type, listener){ target.addEventListener(type, listener, false); }; } else { return function(object, sEvent, fpNotify){ object.attachEvent("on" + sEvent, fpNotify); }; } } ()); let replayForwardBtn = document.getElementsByClassName('replay-forward')[0]; let replayBackwardBtn = document.getElementsByClassName('replay-backward')[0]; if (replayForwardBtn != null) { on(replayForwardBtn, "click", function(){ if (isPlaying == false) return; stopTunes(); setTimeout(()=>{ playTunes(); }, 1000); }); } if (replayBackwardBtn != null) { on(replayBackwardBtn, "click", function(){ if (isPlaying == false) return; stopTunes(); setTimeout(()=>{ playTunes(); }, 1000); }); } // Wrap the event screen to update the current theme if (isMapEditor == false) { let native = showEventScreen; showEventScreen = function() { native.apply(showEventScreen, arguments); if (isPlaying == false) return; if (eventHeader.innerText.includes("Super") && eventHeader.innerText.includes("Power") && blackHoleCOs.includes(playerCOObj[currentTurn]) == false) { stopTunes(); if (isClassicTheme == false) { if (isEnemyTheme) playSCOPBHTheme(); else playSCOPTheme(); } else { playSCOPTheme(); } } else if (eventHeader.innerText.includes("Super") && eventHeader.innerText.includes("Power") && blackHoleCOs.includes(playerCOObj[currentTurn]) == true) { stopTunes(); if (isClassicTheme == false) { if (isEnemyTheme) playSCOPBHTheme(); else playSCOPTheme(); } else { playSCOPBHTheme(); } } else if (eventHeader.innerText.includes("Super") == false && eventHeader.innerText.includes("Power") && blackHoleCOs.includes(playerCOObj[currentTurn]) == false) { stopTunes(); if (isClassicTheme == false) { if (isEnemyTheme) playCOPBHTheme(); else playCOPTheme(); } else { playCOPTheme(); } } else if (eventHeader.innerText.includes("Super") == false && eventHeader.innerText.includes("Power") && blackHoleCOs.includes(playerCOObj[currentTurn]) == true) { stopTunes(); if (isClassicTheme == false) { if (isEnemyTheme) playCOPBHTheme(); else playCOPTheme(); } else { playCOPBHTheme(); } } else if (eventHeader.innerText.includes("Day") ) { stopTunes(); playTunes(); } else if (eventHeader.innerText.includes(myName)) { stopTunes(); playDefeatTheme(); } else if (eventHeader.innerText.includes(myName) == false) { stopTunes(); playVictoryTheme(); } }; } // Play/Stop functions function playMapTunes() { currentTheme.src = mapTheme; } function playTunes() { if (isClassicCOTheme) { determineCurrentCO(); }; if (isRandomCOTheme) { determineRandomCO(); }; currentTheme.src = themeSource; } function playVictoryTheme() { if (rbcThemesOn) { currentTheme.loop = false; currentTheme.src = victoryThemeRBC; } else { currentTheme.src = victoryTheme; } } function playDefeatTheme() { if (rbcThemesOn) { currentTheme.loop = false; currentTheme.src = defeatThemeRBC; } else { currentTheme.src = defeatTheme; } } function playSCOPTheme() { playOneShot(powerSCOPIntro, volume); setTimeout(() => { if (rbcThemesOn) { currentTheme.src = SCOPThemeRBC; } else { currentTheme.src = SCOPTheme; } }, scopDelay); } function playCOPTheme() { if (rbcThemesOn) { currentTheme.src = COPThemeRBC; } else { currentTheme.src = COPTheme; } } function playSCOPBHTheme() { playOneShot(powerBHSCOPIntro, volume); setTimeout(() => { if (rbcThemesOn) { currentTheme.src = SCOPThemeBHRBC; } else { currentTheme.src = SCOPThemeBH; } }, scopBHDelay); } function playCOPBHTheme() { if (rbcThemesOn) { currentTheme.src = COPThemeBHRBC; } else { currentTheme.src = COPThemeBH; } } function stopTunes() { // clearInterval(loopingTheme); clearTimeout(randomThemeTimeout); currentTheme.src = ''; } function determineThemesToPreload() { Object.values(playersInfo).forEach(entry => { thisGamesCOs.push(entry.co_name); }); } function getCOThemesToPreload() { if (isRandomCOTheme) { allCOThemes.forEach(function(theme) { preLoadedAudio.push(theme); }); } else { thisGamesCOs.forEach(function(co) { switch(co) { case "Andy": preLoadedAudio.push(andyTheme); if (rbcThemesOn) { preLoadedAudio.push(andyThemeRBC); } break; case "Hachi": preLoadedAudio.push(hachiTheme); if (rbcThemesOn) { preLoadedAudio.push(hachiThemeRBC); } break; case "Jake": preLoadedAudio.push(jakeTheme); break; case "Max": preLoadedAudio.push(maxTheme); if (rbcThemesOn) { preLoadedAudio.push(maxThemeRBC); } break; case "Nell": preLoadedAudio.push(nellTheme); if (rbcThemesOn) { preLoadedAudio.push(nellThemeRBC); } break; case "Rachel": preLoadedAudio.push(rachelTheme); break; case "Sami": preLoadedAudio.push(samiTheme); if (rbcThemesOn) { preLoadedAudio.push(samiThemeRBC); } break; case "Colin": preLoadedAudio.push(colinTheme); if (rbcThemesOn) { preLoadedAudio.push(colinThemeRBC); } break; case "Grit": preLoadedAudio.push(gritTheme); if (rbcThemesOn) { preLoadedAudio.push(gritThemeRBC); } break; case "Olaf": preLoadedAudio.push(olafTheme); if (rbcThemesOn) { preLoadedAudio.push(olafThemeRBC); } break; case "Sasha": preLoadedAudio.push(sashaTheme); break; case "Drake": preLoadedAudio.push(drakeTheme); if (rbcThemesOn) { preLoadedAudio.push(drakeThemeRBC); } break; case "Eagle": preLoadedAudio.push(eagleTheme); if (rbcThemesOn) { preLoadedAudio.push(eagleThemeRBC); } break; case "Javier": preLoadedAudio.push(javierTheme); break; case "Jess": preLoadedAudio.push(jessTheme); if (rbcThemesOn) { preLoadedAudio.push(jessThemeRBC); } break; case "Grimm": preLoadedAudio.push(grimmTheme); if (rbcThemesOn) { preLoadedAudio.push(grimmThemeRBC); } break; case "Kanbei": preLoadedAudio.push(kanbeiTheme); if (rbcThemesOn) { preLoadedAudio.push(kanbeiThemeRBC); } break; case "Sensei": preLoadedAudio.push(senseiTheme); if (rbcThemesOn) { preLoadedAudio.push(senseiThemeRBC); } break; case "Sonja": preLoadedAudio.push(sonjaTheme); if (rbcThemesOn) { preLoadedAudio.push(sonjaThemeRBC); } break; case "Adder": preLoadedAudio.push(adderTheme); if (rbcThemesOn) { preLoadedAudio.push(adderThemeRBC); } break; case "Flak": preLoadedAudio.push(flakTheme); if (rbcThemesOn) { preLoadedAudio.push(flakThemeRBC); } break; case "Hawke": preLoadedAudio.push(hawkeTheme); if (rbcThemesOn) { preLoadedAudio.push(hawkeThemeRBC); } break; case "Jugger": preLoadedAudio.push(juggerTheme); break; case "Kindle": preLoadedAudio.push(kindleTheme); break; case "Koal": preLoadedAudio.push(koalTheme); break; case "Lash": preLoadedAudio.push(lashTheme); if (rbcThemesOn) { preLoadedAudio.push(lashThemeRBC); } break; case "Sturm": preLoadedAudio.push(sturmTheme); if (rbcThemesOn) { preLoadedAudio.push(sturmThemeRBC); } break; case "Von Bolt": preLoadedAudio.push(vonboltTheme); break; } }); } } function getGenericThemesToPreload() { preLoadedAudio.push(SCOPTheme); preLoadedAudio.push(COPTheme); preLoadedAudio.push(SCOPThemeBH); preLoadedAudio.push(COPThemeBH); preLoadedAudio.push(victoryTheme); preLoadedAudio.push(defeatTheme); if (rbcThemesOn) { preLoadedAudio.push(SCOPThemeRBC); preLoadedAudio.push(COPThemeRBC); preLoadedAudio.push(SCOPThemeBHRBC); preLoadedAudio.push(COPThemeBHRBC); preLoadedAudio.push(victoryThemeRBC); preLoadedAudio.push(defeatThemeRBC); } } function getMovementSFXToPreload() { preLoadedAudio.push(moveBCopterLoop); preLoadedAudio.push(moveBCopterOneShot); preLoadedAudio.push(moveInfLoop); preLoadedAudio.push(moveNavalLoop); preLoadedAudio.push(movePiperunnerLoop); preLoadedAudio.push(movePlaneLoop); preLoadedAudio.push(movePlaneOneShot); preLoadedAudio.push(moveSubLoop); preLoadedAudio.push(moveTCopterLoop); preLoadedAudio.push(moveTCopterOneShot); preLoadedAudio.push(moveTiresHeavyLoop); preLoadedAudio.push(moveTiresHeavyOneShot); preLoadedAudio.push(moveTiresLightLoop); preLoadedAudio.push(moveTiresLightOneShot); preLoadedAudio.push(moveTreadHeavyLoop); preLoadedAudio.push(moveTreadHeavyOneShot); preLoadedAudio.push(moveTreadLightLoop); preLoadedAudio.push(moveTreadLightOneShot); } function getGameSFXToPreload() { preLoadedAudio.push(actionLoadSFX); preLoadedAudio.push(actionUnloadSFX); preLoadedAudio.push(actionCaptAllySFX); preLoadedAudio.push(actionCaptEnemySFX); } function preloadAudio() { console.log(preLoadedAudio.length) preLoadedAudio.forEach(function(url) { let audio = new Audio(); audio.addEventListener('canplaythrough', loadedAudio, false); audio.src = url; }) } let loaded = 0; let loadPercentage = 0; function loadedAudio() { loaded++; loadPercentage = (loaded / preLoadedAudio.length) * 100; musicPlayerDivBackground.style.backgroundImage = "linear-gradient(to right, #ffffff " + String(loadPercentage) + "% , #888888 0%)"; if (loaded == preLoadedAudio.length) { console.log("All audio has been pre-loaded!"); } } function preloadThemes() { if (!isMapEditor) { determineThemesToPreload(); getCOThemesToPreload(); getGenericThemesToPreload(); getMovementSFXToPreload(); getGameSFXToPreload(); } else { preLoadedAudio.push(mapTheme); } preloadAudio(); } const playMovementSound = (audioURL, playCount = 1, volume) => { const audioContext = new AudioContext(); audioContext.resume(); let playCountArray = []; for (let i = 0; i < playCount; i++) { let soundInstance = new Audio(audioURL); playCountArray.push(soundInstance); if (playCountArray.length < playCount) { playCountArray[i].addEventListener('ended', () => { playCountArray.shift(); playCountArray[0].currentTime = 0; playCountArray[0].volume = volume; movementSFX = playCountArray[0]; playCountArray[0].play(); }); } } movementSFX = playCountArray[0]; playCountArray[0].currentTime = 0; playCountArray[0].volume = volume; playCountArray[0].play(); }; var playOneShot = (audioURL, volume) => { // const audioContext = new AudioContext(); // audioContext.resume(); let soundInstance = new Audio(audioURL); soundInstance.currentTime = 0; soundInstance.volume = volume; soundInstance.play(); }; function stopMovementSound(unitId, rolloff) { if (movementSFX != null) { movementSFX.currentTime = 0; movementSFX.pause(); } if (movingUnit == unitId && rolloff) { switch(activeUnitSFX["unitType"]) { case "APC": playOneShot(moveTreadLightOneShot, sfxVolume); break; case "Anti-Air": playOneShot(moveTreadLightOneShot, sfxVolume); break; case "Artillery": playOneShot(moveTreadLightOneShot, sfxVolume); break; case "B-Copter": playOneShot(moveBCopterOneShot, sfxVolume); break; case "Black Bomb": playOneShot(movePlaneOneShot, sfxVolume); break; case "Bomber": playOneShot(movePlaneOneShot, sfxVolume); break; case "Fighter": playOneShot(movePlaneOneShot, sfxVolume); break; case "Md.Tank": playOneShot(moveTreadHeavyOneShot, sfxVolume); break; case "Mega Tank": playOneShot(moveTreadHeavyOneShot, sfxVolume); break; case "Missile": playOneShot(moveTiresHeavyOneShot, sfxVolume); break; case "Neotank": playOneShot(moveTreadHeavyOneShot, sfxVolume); break; case "Recon": playOneShot(moveTiresLightOneShot, sfxVolume); break; case "Rocket": playOneShot(moveTiresHeavyOneShot, sfxVolume); break; case "Stealth": playOneShot(movePlaneOneShot, sfxVolume); break; case "T-Copter": playOneShot(moveTCopterOneShot, sfxVolume); break; case "Tank": playOneShot(moveTreadLightOneShot, sfxVolume); break; } movingUnit = null; } } function playSoundBasedOnUnitType(unitType) { switch(unitType) { case "APC": playMovementSound(moveTreadLightLoop, 1, sfxVolume); break; case "Anti-Air": playMovementSound(moveTreadLightLoop, 1, sfxVolume); break; case "Artillery": playMovementSound(moveTreadLightLoop, 1, sfxVolume); break; case "B-Copter": playMovementSound(moveBCopterLoop, 1, sfxVolume); break; case "Battleship": playMovementSound(moveNavalLoop, 1, sfxVolume); break; case "Black Boat": playMovementSound(moveNavalLoop, 1, sfxVolume); break; case "Black Bomb": playMovementSound(movePlaneLoop, 1, sfxVolume); break; case "Bomber": playMovementSound(movePlaneLoop, 1, sfxVolume); break; case "Carrier": playMovementSound(moveNavalLoop, 1, sfxVolume); break; case "Cruiser": playMovementSound(moveNavalLoop, 1, sfxVolume); break; case "Fighter": playMovementSound(movePlaneLoop, 1, sfxVolume); break; case "Infantry": playMovementSound(moveInfLoop, 1, sfxVolume); break; case "Lander": playMovementSound(moveNavalLoop, 1, sfxVolume); break; case "Md.Tank": playMovementSound(moveTreadHeavyLoop, 1, sfxVolume); break; case "Mech": playMovementSound(moveMechLoop, 1, sfxVolume); break; case "Mega Tank": playMovementSound(moveTreadHeavyLoop, 1, sfxVolume); break; case "Missile": playMovementSound(moveTiresHeavyLoop, 1, sfxVolume); break; case "Neotank": playMovementSound(moveTreadHeavyLoop, 1, sfxVolume); break; case "Piperunner": playMovementSound(movePiperunnerLoop, 1, sfxVolume); break; case "Recon": playMovementSound(moveTiresLightLoop, 1, sfxVolume); break; case "Rocket": playMovementSound(moveTiresHeavyLoop, 1, sfxVolume); break; case "Stealth": playMovementSound(movePlaneLoop, 1, sfxVolume); break; case "Sub": playMovementSound(moveSubLoop, 1, sfxVolume); break; case "T-Copter": playMovementSound(moveTCopterLoop, 1, sfxVolume); break; case "Tank": playMovementSound(moveTreadLightLoop, 1, sfxVolume); break; } } function getPlayerInfo() { Object.values(playersInfo).forEach(entry => { if (entry.users_username == myName) { myID = entry.players_id; }; }); } // Action Handlers ahMove = actionHandlers.Move; actionHandlers.Move = function() { ahMove.apply(actionHandlers.Move, arguments); if (isPlaying == false) return; stopMovementSound(movingUnit, false); movingUnit = arguments[0].unit.units_id; var movementDist = arguments[0].path.length; if (movementDist > 1) { var unitType = unitsInfo[arguments[0].unit.units_id].units_name; activeUnitSFX["unitID"] = movingUnit; activeUnitSFX["unitType"] = unitType; playSoundBasedOnUnitType(unitType); } } ahWait = waitUnit; waitUnit = function() { ahWait.apply(waitUnit, arguments); if (isPlaying == false) return; if (movementSFX != null) { if (arguments[0] !== undefined && unitsInfo[arguments[0]] !== undefined && unitsInfo[arguments[0]].units_moved) { stopMovementSound(arguments[0], true); }; } } ahCursorMove = updateCursor; let lastCursorCall = Date.now(); updateCursor = function() { ahCursorMove.apply(updateCursor, arguments); if (isPlaying == false) return; if (Date.now() - lastCursorCall > CURSOR_THRESHOLD) { playOneShot(uiCursorMove, uiVolume) }; lastCursorCall = Date.now(); } ahOpenMenu = openMenu; openMenu = function() { ahOpenMenu.apply(openMenu, arguments); if (isPlaying == false) return; menuOptions = document.getElementsByClassName("menu-option"); for (var i = 0; i < menuOptions.length; i++) { menuOptions[i].addEventListener('mouseover', function(e) { if (e.target !== this) { return; }; playOneShot(uiMenuMove, uiVolume); }); on(menuOptions[i], "click", function(){ menuItemClick = true; }); } menuOpen = true; playOneShot(uiMenuOpen, uiVolume); } ahCloseMenu = closeMenu; closeMenu = function() { ahCloseMenu.apply(closeMenu, arguments); if (isPlaying == false) return; if (menuItemClick && menuOpen) { playOneShot(uiMenuOpen, uiVolume); }; if (!menuItemClick && menuOpen) { playOneShot(uiMenuClose, uiVolume); }; menuOpen = false; menuItemClick = false; } ahUnitClick = unitClickHandler; unitClickHandler = function() { ahUnitClick.apply(unitClickHandler, arguments); if (isPlaying == false) return; playOneShot(uiUnitClick, uiVolume); } ahJoin = joinUnits; joinUnits = function() { ahJoin.apply(joinUnits, arguments); if (isPlaying == false) return; stopMovementSound(movingUnit, false); } ahFog = updateAirUnitFogOnMove; updateAirUnitFogOnMove = function() { ahFog.apply(updateAirUnitFogOnMove, arguments); if (isPlaying == false) return; if (arguments[5] === "Add") { setTimeout(() => { if (movementSFX != null) { stopMovementSound(movingUnit, true); } }, arguments[6]); }; } ahHide = hideUnit; hideUnit = function() { ahHide.apply(hideUnit, arguments); if (isPlaying == false) return; if (movementSFX != null) { stopMovementSound(arguments[0], false); }; } ahLoad = actionHandlers.Load; actionHandlers.Load = function() { ahLoad.apply(actionHandlers.Load, arguments); if (isPlaying == false) return; playOneShot(actionLoadSFX, sfxVolume); } ahUnload = actionHandlers.Unload; actionHandlers.Unload = function() { ahUnload.apply(actionHandlers.Unload, arguments); if (isPlaying == false) return; playOneShot(actionUnloadSFX, sfxVolume); } ahCapt = actionHandlers.Capt; actionHandlers.Capt = function() { ahCapt.apply(actionHandlers.Capt, arguments); if (isPlaying == false) return; if ((arguments[0].newIncome != undefined || arguments[0].newIncome != null) && playerKeys.includes(myID)) { if (arguments[0].buildingInfo.buildings_team != null && arguments[0].buildingInfo.buildings_team != myID) { playOneShot(actionCaptEnemySFX, sfxVolume); } else if (arguments[0].buildingInfo.buildings_team != null && arguments[0].buildingInfo.buildings_team == myID) { playOneShot(actionCaptAllySFX, sfxVolume); } } else if ((arguments[0].newIncome != undefined || arguments[0].newIncome != null) && !playerKeys.includes(myID)) { if (arguments[0].buildingInfo.buildings_team != null) { playOneShot(actionCaptAllySFX, sfxVolume); }; } } ahExplode = animExplosion; animExplosion = function() { ahExplode.apply(animExplosion, arguments); if (isPlaying == false) return; playOneShot(actionUnitExplode, sfxVolume); } ahSupply = actionHandlers.Supply; actionHandlers.Supply = function() { ahSupply.apply(actionHandlers.Supply, arguments); if (isPlaying == false) return; playOneShot(actionSupplyRepair, sfxVolume); } ahRepair = actionHandlers.Repair; actionHandlers.Repair = function() { ahRepair.apply(actionHandlers.Repair, arguments); if (isPlaying == false) return; playOneShot(actionSupplyRepair, sfxVolume); } ahBuild = actionHandlers.Build; actionHandlers.Build = function() { ahBuild.apply(actionHandlers.Build, arguments); if (isPlaying == false) return; if (!playerKeys.includes(myID)) { playOneShot(actionSupplyRepair, sfxVolume); } } // Custom context menu let contextMenu = document.createElement('div'); contextMenu.id = 'div-context-menu'; contextMenu.classList.add('cls-context-menu'); contextMenu.style.position = 'absolute'; contextMenu.style.height = '76px'; contextMenu.style.paddingTop = '0px'; contextMenu.style.paddingBottom = isMapEditor ? '0px' : '4px'; musicPlayerDiv.appendChild(contextMenu); // Volume slider const volumeSlider = document.createElement('input'); volumeSlider.id = "vol-slider"; volumeSlider.type = "range"; volumeSlider.max = "1"; volumeSlider.min = "0"; volumeSlider.step = "0.01"; volumeSlider.value = volume; let volumeSliderFlexContainer = document.createElement('div'); volumeSliderFlexContainer.id = "vol-slider-flex-container"; volumeSliderFlexContainer.style.display = 'flex'; volumeSliderFlexContainer.style.flexDirection = 'row'; volumeSliderFlexContainer.style.marginBottom = '3.5px'; volumeSliderFlexContainer.style.alignItems = 'center'; volumeSliderFlexContainer.style.backgroundColor = '#F0F0F0'; let volumeSliderSpanDiv = document.createElement('div'); volumeSliderSpanDiv.id = "vol-slider-div"; volumeSliderSpanDiv.style.display = 'inline-block'; volumeSliderSpanDiv.style.width = '100%'; volumeSliderSpanDiv.style.textAlign = 'center'; let volumeSliderSpan = document.createElement('span'); volumeSliderSpan.id = "vol-slider-desc"; volumeSliderSpan.textContent = "Music Volume"; volumeSliderSpan.style.fontSize = "13px"; contextMenu.appendChild(volumeSliderFlexContainer); volumeSliderFlexContainer.appendChild(volumeSliderSpanDiv); volumeSliderSpanDiv.appendChild(volumeSliderSpan); contextMenu.appendChild(volumeSlider); // SFX Volume slider const sfxVolumeSlider = document.createElement('input'); sfxVolumeSlider.id = "vol-sfx-slider"; sfxVolumeSlider.type = "range"; sfxVolumeSlider.max = "1"; sfxVolumeSlider.min = "0"; sfxVolumeSlider.step = "0.01"; sfxVolumeSlider.value = sfxVolume; let sfxVolumeSliderFlexContainer = document.createElement('div'); sfxVolumeSliderFlexContainer.id = "vol-sfx-slider-flex-container"; sfxVolumeSliderFlexContainer.style.display = 'flex'; sfxVolumeSliderFlexContainer.style.flexDirection = 'row'; sfxVolumeSliderFlexContainer.style.marginBottom = '3.5px'; sfxVolumeSliderFlexContainer.style.marginTop = '3.5px'; sfxVolumeSliderFlexContainer.style.alignItems = 'center'; let sfxVolumeSliderSpanDiv = document.createElement('div'); sfxVolumeSliderSpanDiv.id = "vol-sfx-slider-div"; sfxVolumeSliderSpanDiv.style.display = 'inline-block'; sfxVolumeSliderSpanDiv.style.width = '100%'; sfxVolumeSliderSpanDiv.style.textAlign = 'center'; let sfxVolumeSliderSpan = document.createElement('span'); sfxVolumeSliderSpan.id = "vol-sfx-slider-desc"; sfxVolumeSliderSpan.textContent = "SFX Volume"; sfxVolumeSliderSpan.style.fontSize = "13px"; contextMenu.appendChild(sfxVolumeSliderFlexContainer); sfxVolumeSliderFlexContainer.appendChild(sfxVolumeSliderSpanDiv); sfxVolumeSliderSpanDiv.appendChild(sfxVolumeSliderSpan); contextMenu.appendChild(sfxVolumeSlider); // UI Volume slider const uiVolumeSlider = document.createElement('input'); uiVolumeSlider.id = "vol-ui-slider"; uiVolumeSlider.type = "range"; uiVolumeSlider.max = "1"; uiVolumeSlider.min = "0"; uiVolumeSlider.step = "0.01"; uiVolumeSlider.value = uiVolume; let uiVolumeSliderFlexContainer = document.createElement('div'); uiVolumeSliderFlexContainer.id = "vol-ui-slider-flex-container"; uiVolumeSliderFlexContainer.style.display = 'flex'; uiVolumeSliderFlexContainer.style.flexDirection = 'row'; uiVolumeSliderFlexContainer.style.marginBottom = '3.5px'; uiVolumeSliderFlexContainer.style.marginTop = '3.5px'; uiVolumeSliderFlexContainer.style.alignItems = 'center'; let uiVolumeSliderSpanDiv = document.createElement('div'); uiVolumeSliderSpanDiv.id = "vol-ui-slider-div"; uiVolumeSliderSpanDiv.style.display = 'inline-block'; uiVolumeSliderSpanDiv.style.width = '100%'; uiVolumeSliderSpanDiv.style.textAlign = 'center'; let uiVolumeSliderSpan = document.createElement('span'); uiVolumeSliderSpan.id = "vol-ui-slider-desc"; uiVolumeSliderSpan.textContent = "Interface Volume"; uiVolumeSliderSpan.style.fontSize = "13px"; contextMenu.appendChild(uiVolumeSliderFlexContainer); uiVolumeSliderFlexContainer.appendChild(uiVolumeSliderSpanDiv); uiVolumeSliderSpanDiv.appendChild(uiVolumeSliderSpan); contextMenu.appendChild(uiVolumeSlider); // Theme flex container let themeFlexContainer = document.createElement('div'); themeFlexContainer.id = "theme-slider-flex-container"; themeFlexContainer.style.display = 'flex'; themeFlexContainer.style.flexDirection = 'row'; themeFlexContainer.style.marginTop = '5.5px'; themeFlexContainer.style.alignItems = 'center'; themeFlexContainer.style.backgroundColor = '#F0F0F0'; let themeSpanDiv = document.createElement('div'); themeSpanDiv.id = "theme-slider-div"; themeSpanDiv.style.display = 'inline-block'; themeSpanDiv.style.width = '100%'; themeSpanDiv.style.textAlign = 'center'; let themeSpan = document.createElement('span'); themeSpan.id = "theme-slider-desc"; themeSpan.textContent = "COP/SCOP Themes"; themeSpan.style.fontSize = "13px"; // Classic COP/SCOP slider let themeSliderFlexContainer = document.createElement('div'); themeSliderFlexContainer.id = "classic-slider-flex-container"; themeSliderFlexContainer.style.display = 'flex'; themeSliderFlexContainer.style.flexDirection = 'row'; themeSliderFlexContainer.style.marginTop = '5.5px'; themeSliderFlexContainer.style.alignItems = 'center'; themeSliderFlexContainer.style.justifyContent = 'space-around'; let classicSliderSpanDiv = document.createElement('div'); classicSliderSpanDiv.id = "classic-slider-div"; classicSliderSpanDiv.style.display = 'flex'; classicSliderSpanDiv.style.width = 'auto'; classicSliderSpanDiv.style.textAlign = 'center'; classicSliderSpanDiv.style.flexDirection = 'column'; classicSliderSpanDiv.style.alignItems = 'center'; let classicSliderSpan = document.createElement('span'); classicSliderSpan.id = "classic-slider-desc"; classicSliderSpan.textContent = "Classic"; classicSliderSpan.style.fontSize = "11px"; // Ally COP/SCOP slider // let allySliderFlexContainer = document.createElement('div'); // allySliderFlexContainer.id = "ally-slider-flex-container"; // allySliderFlexContainer.style.display = 'flex'; // allySliderFlexContainer.style.flexDirection = 'row'; // allySliderFlexContainer.style.marginTop = '3.5px'; // allySliderFlexContainer.style.alignItems = 'center'; let allySliderSpanDiv = document.createElement('div'); allySliderSpanDiv.id = "ally-slider-div"; allySliderSpanDiv.style.display = 'flex'; allySliderSpanDiv.style.width = 'auto'; allySliderSpanDiv.style.textAlign = 'center'; allySliderSpanDiv.style.flexDirection = 'column'; allySliderSpanDiv.style.alignItems = 'center'; let allySliderSpan = document.createElement('span'); allySliderSpan.id = "ally-slider-desc"; allySliderSpan.textContent = "Allies"; allySliderSpan.style.fontSize = "11px"; // Black Hole COP/SCOP slider // let bhSliderFlexContainer = document.createElement('div'); // bhSliderFlexContainer.id = "bh-slider-flex-container"; // bhSliderFlexContainer.style.display = 'flex'; // bhSliderFlexContainer.style.flexDirection = 'row'; // bhSliderFlexContainer.style.marginTop = '3.5px'; // bhSliderFlexContainer.style.alignItems = 'center'; let bhSliderSpanDiv = document.createElement('div'); bhSliderSpanDiv.id = "bh-slider-div"; bhSliderSpanDiv.style.display = 'flex'; bhSliderSpanDiv.style.width = 'auto'; bhSliderSpanDiv.style.textAlign = 'center'; bhSliderSpanDiv.style.flexDirection = 'column'; bhSliderSpanDiv.style.alignItems = 'center'; let bhSliderSpan = document.createElement('span'); bhSliderSpan.id = "bh-slider-desc"; bhSliderSpan.textContent = "Enemies"; bhSliderSpan.style.fontSize = "11px"; // Radio buttons var classicRadioBtn = document.createElement('input'); classicRadioBtn.id = "classic-radio-btn"; classicRadioBtn.classList.add('theme-radio-btn'); classicRadioBtn.type = "radio"; var allyRadioBtn = document.createElement('input'); allyRadioBtn.id = "ally-radio-btn"; allyRadioBtn.classList.add('theme-radio-btn'); allyRadioBtn.type = "radio"; var enemyRadioBtn = document.createElement('input'); enemyRadioBtn.id = "enemy-radio-btn"; enemyRadioBtn.classList.add('theme-radio-btn'); enemyRadioBtn.type = "radio"; contextMenu.appendChild(themeFlexContainer); themeFlexContainer.appendChild(themeSpanDiv); themeSpanDiv.appendChild(themeSpan); contextMenu.appendChild(themeSliderFlexContainer); themeSliderFlexContainer.appendChild(classicSliderSpanDiv); classicSliderSpanDiv.appendChild(classicRadioBtn); classicSliderSpanDiv.appendChild(classicSliderSpan); themeSliderFlexContainer.appendChild(allySliderSpanDiv); allySliderSpanDiv.appendChild(allyRadioBtn); allySliderSpanDiv.appendChild(allySliderSpan); themeSliderFlexContainer.appendChild(bhSliderSpanDiv); bhSliderSpanDiv.appendChild(enemyRadioBtn); bhSliderSpanDiv.appendChild(bhSliderSpan); // CO Theme Options flex container let coThemeOptionsFlexContainer = document.createElement('div'); coThemeOptionsFlexContainer.id = "co-theme-slider-flex-container"; coThemeOptionsFlexContainer.style.display = 'flex'; coThemeOptionsFlexContainer.style.flexDirection = 'row'; coThemeOptionsFlexContainer.style.marginTop = '5.5px'; coThemeOptionsFlexContainer.style.alignItems = 'center'; coThemeOptionsFlexContainer.style.backgroundColor = '#F0F0F0'; let coThemeOptionsSpanDiv = document.createElement('div'); coThemeOptionsSpanDiv.id = "co-theme-slider-div"; coThemeOptionsSpanDiv.style.display = 'inline-block'; coThemeOptionsSpanDiv.style.width = '100%'; coThemeOptionsSpanDiv.style.textAlign = 'center'; let coThemeOptionsSpan = document.createElement('span'); coThemeOptionsSpan.id = "theme-slider-desc"; coThemeOptionsSpan.textContent = "CO Themes"; coThemeOptionsSpan.style.fontSize = "13px"; contextMenu.appendChild(coThemeOptionsFlexContainer); coThemeOptionsFlexContainer.appendChild(coThemeOptionsSpanDiv); coThemeOptionsSpanDiv.appendChild(coThemeOptionsSpan); // CO Theme Container let coThemeFlexContainer = document.createElement('div'); coThemeFlexContainer.id = "co-theme-flex-container"; coThemeFlexContainer.style.display = 'flex'; coThemeFlexContainer.style.flexDirection = 'row'; coThemeFlexContainer.style.marginTop = '3.5px'; coThemeFlexContainer.style.alignItems = 'center'; coThemeFlexContainer.style.justifyContent = 'space-evenly'; let coThemeSpanDiv = document.createElement('div'); coThemeSpanDiv.id = "co-theme-div"; coThemeSpanDiv.style.display = 'flex'; coThemeSpanDiv.style.width = 'auto'; coThemeSpanDiv.style.textAlign = 'center'; coThemeSpanDiv.style.flexDirection = 'column'; coThemeSpanDiv.style.alignItems = 'center'; let coThemeSpan = document.createElement('span'); coThemeSpan.id = "co-theme-desc"; coThemeSpan.textContent = "Classic"; coThemeSpan.style.fontSize = "11px"; // CO Random Container let coRandomSpanDiv = document.createElement('div'); coRandomSpanDiv.id = "co-random-div"; coRandomSpanDiv.style.display = 'flex'; coRandomSpanDiv.style.width = 'auto'; coRandomSpanDiv.style.textAlign = 'center'; coRandomSpanDiv.style.flexDirection = 'column'; coRandomSpanDiv.style.alignItems = 'center'; let coRandomSpan = document.createElement('span'); coRandomSpan.id = "co-random-desc"; coRandomSpan.textContent = "Random"; coRandomSpan.style.fontSize = "11px"; // Radio buttons var coThemeRadioBtn = document.createElement('input'); coThemeRadioBtn.id = "co-theme-radio-btn"; coThemeRadioBtn.classList.add('theme-radio-btn'); coThemeRadioBtn.type = "radio"; var randomThemeRadioBtn = document.createElement('input'); randomThemeRadioBtn.id = "random-theme-radio-btn"; randomThemeRadioBtn.classList.add('theme-radio-btn'); randomThemeRadioBtn.type = "radio"; var shuffleButton = document.createElement("button"); shuffleButton.id = 'shuffle-button'; randomThemeRadioBtn.classList.add('shuffle-button-enabled'); shuffleButton.innerHTML = 'Shuffle'; shuffleButton.addEventListener ("click", function() { if (isPlaying && isRandomCOTheme) { stopTunes(); playTunes(); } }); contextMenu.appendChild(coThemeFlexContainer); coThemeFlexContainer.appendChild(coThemeSpanDiv); coThemeSpanDiv.appendChild(coThemeRadioBtn); coThemeSpanDiv.appendChild(coThemeSpan); coThemeFlexContainer.appendChild(coRandomSpanDiv); coRandomSpanDiv.appendChild(randomThemeRadioBtn); coRandomSpanDiv.appendChild(coRandomSpan); coThemeFlexContainer.appendChild(shuffleButton); // RBC flex container let rbcFlexContainer = document.createElement('div'); rbcFlexContainer.id = "rbc-flex-container"; rbcFlexContainer.style.display = 'flex'; rbcFlexContainer.style.flexDirection = 'row'; rbcFlexContainer.style.marginTop = '5.5px'; rbcFlexContainer.style.alignItems = 'center'; rbcFlexContainer.style.backgroundColor = '#F0F0F0'; let rbcSpanDiv = document.createElement('div'); rbcSpanDiv.id = "rbc-slider-div"; rbcSpanDiv.style.display = 'inline-block'; rbcSpanDiv.style.width = '100%'; rbcSpanDiv.style.textAlign = 'center'; let rbcSpan = document.createElement('span'); rbcSpan.id = "rbc-slider-desc"; rbcSpan.textContent = "Reboot Camp Themes"; rbcSpan.style.fontSize = "13px"; // RBC flex div let rbcSliderFlexContainer = document.createElement('div'); rbcSliderFlexContainer.id = "rbc-on-slider-flex-container"; rbcSliderFlexContainer.style.display = 'flex'; rbcSliderFlexContainer.style.flexDirection = 'row'; rbcSliderFlexContainer.style.marginTop = '5.5px'; rbcSliderFlexContainer.style.alignItems = 'center'; rbcSliderFlexContainer.style.justifyContent = 'space-around'; // RBC on slider let rbcOnSliderSpanDiv = document.createElement('div'); rbcOnSliderSpanDiv.id = "rbc-on-slider-div"; rbcOnSliderSpanDiv.style.display = 'flex'; rbcOnSliderSpanDiv.style.width = 'auto'; rbcOnSliderSpanDiv.style.textAlign = 'center'; rbcOnSliderSpanDiv.style.flexDirection = 'column'; rbcOnSliderSpanDiv.style.alignItems = 'center'; let rbcOnSliderSpan = document.createElement('span'); rbcOnSliderSpan.id = "rbc-on-slider-desc"; rbcOnSliderSpan.textContent = "On"; rbcOnSliderSpan.style.fontSize = "11px"; // RBC off slider let rbcOffSliderSpanDiv = document.createElement('div'); rbcOffSliderSpanDiv.id = "rbc-off-slider-div"; rbcOffSliderSpanDiv.style.display = 'flex'; rbcOffSliderSpanDiv.style.width = 'auto'; rbcOffSliderSpanDiv.style.textAlign = 'center'; rbcOffSliderSpanDiv.style.flexDirection = 'column'; rbcOffSliderSpanDiv.style.alignItems = 'center'; let rbcOffSliderSpan = document.createElement('span'); rbcOffSliderSpan.id = "rbc-off-slider-desc"; rbcOffSliderSpan.textContent = "Off"; rbcOffSliderSpan.style.fontSize = "11px"; // Radio buttons var rbcOnRadioBtn = document.createElement('input'); rbcOnRadioBtn.id = "rbc-on-radio-btn"; rbcOnRadioBtn.classList.add('theme-radio-btn'); rbcOnRadioBtn.type = "radio"; var rbcOffRadioBtn = document.createElement('input'); rbcOffRadioBtn.id = "rbc-off-radio-btn"; rbcOffRadioBtn.classList.add('theme-radio-btn'); rbcOffRadioBtn.type = "radio"; contextMenu.appendChild(rbcFlexContainer); rbcFlexContainer.appendChild(rbcSpanDiv); rbcSpanDiv.appendChild(rbcSpan); contextMenu.appendChild(rbcSliderFlexContainer); rbcSliderFlexContainer.appendChild(rbcOnSliderSpanDiv); rbcOnSliderSpanDiv.appendChild(rbcOnRadioBtn); rbcOnSliderSpanDiv.appendChild(rbcOnSliderSpan); rbcSliderFlexContainer.appendChild(rbcOffSliderSpanDiv); rbcOffSliderSpanDiv.appendChild(rbcOffRadioBtn); rbcOffSliderSpanDiv.appendChild(rbcOffSliderSpan); let versionDiv = document.createElement('div'); versionDiv.id = "version-number-div"; versionDiv.style.width = '100%'; versionDiv.style.marginTop = "5px"; versionDiv.style.backgroundColor = '#F0F0F0'; let versionSpan = document.createElement('span'); versionSpan.id = "version-number"; versionSpan.textContent = "VERSION: " + MY_VERSION + " / " + NEWEST_VERSION; versionSpan.style.fontSize = "9px"; versionSpan.style.color = "#888888"; contextMenu.appendChild(versionDiv); versionDiv.appendChild(versionSpan); function getVersionNumber() { fetch('https://greasyfork.org/en/scripts/459630-awbw-music-player').then(function (response) { return response.text(); }).then(function (html) { var parser = new DOMParser(); var doc = parser.parseFromString(html, 'text/html'); var newestVersionNumber = doc.getElementsByClassName("script-show-version"); NEWEST_VERSION = String(newestVersionNumber[1].firstChild.innerHTML); versionSpan.textContent = "VERSION: " + MY_VERSION + " / "; var myNum; var newNum; var outOfDate = false; if (Number(MY_VERSION.split(".")[0]) < Number(NEWEST_VERSION.split(".")[0])) { outOfDate = true; } else if (Number(MY_VERSION.split(".")[1]) < Number(NEWEST_VERSION.split(".")[1])) { outOfDate = true; } else if (Number(MY_VERSION.split(".")[2]) < Number(NEWEST_VERSION.split(".")[2])) { outOfDate = true; } // console.log(MY_VERSION); // console.log(NEWEST_VERSION); if (outOfDate) { console.log("Music Player version is out of date!"); versionSpan.textContent = ""; let versionText = "UPDATE TO " + NEWEST_VERSION; let link = document.createElement("a") let txt = document.createTextNode(versionText) link.appendChild(txt) link.title = versionText; link.id = "version-link"; link.target = '_blank'; link.href = "https://greasyfork.org/en/scripts/459630-awbw-music-player"; let el = document.getElementById("version-number"); el.appendChild(link) } else { versionSpan.textContent = "VERSION " + MY_VERSION; } }).catch(function (err) { // There was an error console.warn('Something went wrong.', err); }); } function disableShuffle(bool) { shuffleButton.disabled = bool; if (bool) { shuffleButton.classList.add('shuffle-button-disabled'); shuffleButton.classList.remove('shuffle-button-enabled'); } else { shuffleButton.classList.remove('shuffle-button-disabled'); shuffleButton.classList.add('shuffle-button-enabled'); } } // Volume control let modifyVolume = function(val) { volume = val.target.value; currentTheme.volume = volume; musicPlayerSettings["volume"] = volume; updateObjectInLocalStorage(); // console.log("changing volume to: " + String(volume)); } document.getElementById("vol-slider").addEventListener ("input", modifyVolume, false); // SFX volume control let modifySFXVolume = function(val) { sfxVolume = val.target.value; currentSFX.volume = sfxVolume; musicPlayerSettings["sfx-volume"] = sfxVolume; updateObjectInLocalStorage(); // console.log("changing volume to: " + String(volume)); } document.getElementById("vol-sfx-slider").addEventListener ("input", modifySFXVolume, false); // SFX volume control let modifyUIVolume = function(val) { uiVolume = val.target.value; currentUI.volume = uiVolume; musicPlayerSettings["ui-volume"] = uiVolume; updateObjectInLocalStorage(); console.log("changing volume to: " + String(volume)); } document.getElementById("vol-ui-slider").addEventListener ("input", modifyUIVolume, false); // Toggle Classic COP/SCOP let isClassicTheme = false; let toggleClassicTheme = function(val) { musicPlayerSettings["themeType"] = 1; updateObjectInLocalStorage(); isClassicTheme = true; isAllyTheme = false; isEnemyTheme = false; allyRadioBtn.checked = false; enemyRadioBtn.checked = false; } document.getElementById("classic-radio-btn").addEventListener ("change", toggleClassicTheme, false); // Toggle Ally COP/SCOP let isAllyTheme = false; let toggleAllyTheme = function(val) { musicPlayerSettings["themeType"] = 2; updateObjectInLocalStorage(); isAllyTheme = true; isClassicTheme = false; isEnemyTheme = false; classicRadioBtn.checked = false; enemyRadioBtn.checked = false; } document.getElementById("ally-radio-btn").addEventListener ("change", toggleAllyTheme, false); // Toggle Enemy COP/SCOP let isEnemyTheme = false; let toggleEnemyTheme = function(val) { musicPlayerSettings["themeType"] = 3; updateObjectInLocalStorage(); isEnemyTheme = true; isClassicTheme = false; isAllyTheme = false; classicRadioBtn.checked = false; allyRadioBtn.checked = false; } document.getElementById("enemy-radio-btn").addEventListener ("change", toggleEnemyTheme, false); // Toggle Classic CO Themes let isClassicCOTheme = false; let toggleClassicCOTheme = function(val) { musicPlayerSettings["coThemeType"] = 1; updateObjectInLocalStorage(); isClassicCOTheme = true; isRandomCOTheme = false; coThemeRadioBtn.checked = true; randomThemeRadioBtn.checked = false; currentTheme.loop = true; disableShuffle(true); if (isPlaying) { stopTunes(); playTunes(); } } document.getElementById("co-theme-radio-btn").addEventListener ("change", toggleClassicCOTheme, false); // Toggle Random CO Themes let isRandomCOTheme = false; let toggleRandomCOTheme = function(val) { musicPlayerSettings["coThemeType"] = 2; updateObjectInLocalStorage(); isClassicCOTheme = false; isRandomCOTheme = true; coThemeRadioBtn.checked = false; randomThemeRadioBtn.checked = true; currentTheme.loop = false; disableShuffle(false); if (isPlaying) { stopTunes(); playTunes(); } } document.getElementById("random-theme-radio-btn").addEventListener ("change", toggleRandomCOTheme, false); let rbcThemesOn = false; // Toggle RBC On let toggleRBCThemesOn = function(val) { musicPlayerSettings["rbcThemesToggle"] = 1; updateObjectInLocalStorage(); rbcThemesOn = true; rbcOffRadioBtn.checked = false; if (isPlaying) { stopTunes(); playTunes(); } } document.getElementById("rbc-on-radio-btn").addEventListener ("change", toggleRBCThemesOn, false); // Toggle RBC off let toggleRBCThemesOff = function(val) { musicPlayerSettings["rbcThemesToggle"] = 2; updateObjectInLocalStorage(); rbcThemesOn = false; rbcOnRadioBtn.checked = false; if (isPlaying) { stopTunes(); playTunes(); } } document.getElementById("rbc-off-radio-btn").addEventListener ("change", toggleRBCThemesOff, false); // Tool-tip functions let lastTooltipState = ""; let hoverClassicTheme = function() { lastTooltipState = musicPlayerDivHoverSpan.innerText; musicPlayerDivHoverSpan.innerText = "Play CO-Specific COP/SCOP Themes"; } document.getElementById("classic-radio-btn").addEventListener ("mouseover", hoverClassicTheme, false); let hoverAllyTheme = function() { lastTooltipState = musicPlayerDivHoverSpan.innerText; musicPlayerDivHoverSpan.innerText = "Only Play Macro Land COP/SCOP Themes"; } document.getElementById("ally-radio-btn").addEventListener ("mouseover", hoverAllyTheme, false); let hoverEnemyTheme = function() { lastTooltipState = musicPlayerDivHoverSpan.innerText; musicPlayerDivHoverSpan.innerText = "Only Play Black Hole COP/SCOP Themes"; } document.getElementById("enemy-radio-btn").addEventListener ("mouseover", hoverEnemyTheme, false); let hoverCassicCOTheme = function() { lastTooltipState = musicPlayerDivHoverSpan.innerText; musicPlayerDivHoverSpan.innerText = "Play Theme of Active CO"; } document.getElementById("co-theme-radio-btn").addEventListener ("mouseover", hoverCassicCOTheme, false); let hoverRandomOTheme = function() { lastTooltipState = musicPlayerDivHoverSpan.innerText; musicPlayerDivHoverSpan.innerText = "Play Random CO Themes"; } document.getElementById("random-theme-radio-btn").addEventListener ("mouseover", hoverRandomOTheme, false); let hoverRBCThemesOn = function() { lastTooltipState = musicPlayerDivHoverSpan.innerText; musicPlayerDivHoverSpan.innerText = "Enable RBC Themes for COs"; } document.getElementById("rbc-on-radio-btn").addEventListener ("mouseover", hoverRBCThemesOn, false); let hoverRBCThemesOff = function() { lastTooltipState = musicPlayerDivHoverSpan.innerText; musicPlayerDivHoverSpan.innerText = "Disable RBC Themes for COs"; } document.getElementById("rbc-off-radio-btn").addEventListener ("mouseover", hoverRBCThemesOff, false); let hoverOut = function() { musicPlayerDivHoverSpan.innerText = lastTooltipState; } document.getElementById("classic-radio-btn").addEventListener ("mouseout", hoverOut, false); document.getElementById("ally-radio-btn").addEventListener ("mouseout", hoverOut, false); document.getElementById("enemy-radio-btn").addEventListener ("mouseout", hoverOut, false); document.getElementById("co-theme-radio-btn").addEventListener ("mouseout", hoverOut, false); document.getElementById("random-theme-radio-btn").addEventListener ("mouseout", hoverOut, false); document.getElementById("rbc-on-radio-btn").addEventListener ("mouseout", hoverOut, false); document.getElementById("rbc-off-radio-btn").addEventListener ("mouseout", hoverOut, false); function setVolume() { let s = String(volume); volumeSlider.value = s; currentTheme.volume = volume; let ssfx = String(sfxVolume); sfxVolumeSlider.value = ssfx; currentSFX.volume = sfxVolume; let sui = String(uiVolume); uiVolumeSlider.value = sui; currentUI.volume = uiVolume; } function setDefaultThemeMode() { if (musicPlayerSettings["themeType"] == null) { musicPlayerSettings["themeType"] = 1; isClassicTheme = true; isAllyTheme = false; isEnemyTheme = false; classicRadioBtn.checked = true; allyRadioBtn.checked = false; enemyRadioBtn.checked = false; isClassicCOTheme = true; isRandomCOTheme = false; coThemeRadioBtn.checked = true; randomThemeRadioBtn.checked = false; rbcThemesOn = false rbcOnRadioBtn.checked = false; rbcOffRadioBtn.checked = true; disableShuffle(true); } } function setThemeMode() { if (musicPlayerSettings["themeType"] != undefined && musicPlayerSettings["themeType"] == 1) { isClassicTheme = true; isAllyTheme = false; isEnemyTheme = false; classicRadioBtn.checked = true; allyRadioBtn.checked = false; enemyRadioBtn.checked = false; } else if (musicPlayerSettings["themeType"] != undefined && musicPlayerSettings["themeType"] == 2) { isClassicTheme = false; isAllyTheme = true; isEnemyTheme = false; classicRadioBtn.checked = false; allyRadioBtn.checked = true; enemyRadioBtn.checked = false; } else if (musicPlayerSettings["themeType"] != undefined && musicPlayerSettings["themeType"] == 3) { isClassicTheme = false; isAllyTheme = false; isEnemyTheme = true; classicRadioBtn.checked = false; allyRadioBtn.checked = false; enemyRadioBtn.checked = true; } else { isClassicTheme = true; isAllyTheme = false; isEnemyTheme = false; classicRadioBtn.checked = true; allyRadioBtn.checked = false; enemyRadioBtn.checked = false; } } function setCOThemeMode() { if (musicPlayerSettings["coThemeType"] != undefined && musicPlayerSettings["coThemeType"] == 1) { isClassicCOTheme = true; isRandomCOTheme = false; coThemeRadioBtn.checked = true; randomThemeRadioBtn.checked = false; disableShuffle(true); } else if (musicPlayerSettings["coThemeType"] != undefined && musicPlayerSettings["coThemeType"] == 2) { isClassicCOTheme = false; isRandomCOTheme = true; coThemeRadioBtn.checked = false; randomThemeRadioBtn.checked = true; disableShuffle(false); } else { isClassicCOTheme = true; isRandomCOTheme = false; coThemeRadioBtn.checked = true; randomThemeRadioBtn.checked = false; disableShuffle(true); } } function setRBCThemeMode() { if (musicPlayerSettings["rbcThemesToggle"] != undefined && musicPlayerSettings["rbcThemesToggle"] == 1) { rbcThemesOn = true; rbcOnRadioBtn.checked = true; rbcOffRadioBtn.checked = false; } else if (musicPlayerSettings["rbcThemesToggle"] != undefined && musicPlayerSettings["rbcThemesToggle"] == 2) { rbcThemesOn = false; rbcOnRadioBtn.checked = false; rbcOffRadioBtn.checked = true; } } on(document, "click", function(e) { if (e.target.id == "div-context-menu" || e.target.id == "vol-slider" || e.target.id == "vol-sfx-slider" || e.target.id == "vol-ui-slider" || e.target.id == "bh-slider-div" || e.target.id == "ally-slider-div" || e.target.id == "classic-slider-div" || e.target.id == "classic-radio-btn" || e.target.id == "ally-radio-btn" || e.target.id == "enemy-radio-btn" || e.target.id == "co-theme-radio-btn" || e.target.id == "random-theme-radio-btn" || e.target.id == "co-theme-div" || e.target.id == "co-random-div" || e.target.id == "shuffle-button" || e.target.id == "rbc-on-radio-btn" || e.target.id == "rbc-off-radio-btn" || e.target.id == "rbc-on-slider-flex-container") return; contextMenu.style.display = 'none'; }); let contextMenuOpen = false; document.getElementById('music-player-parent').oncontextmenu = function(e){ let elmnt = e.target if (elmnt.id.startsWith ("music-player")) { e.preventDefault(); let eid = elmnt.id.replace(/link-/,""); contextMenu.style.height = '347px'; contextMenu.style.width = '175px'; contextMenu.style.top = '37px'; contextMenu.style.display = 'block'; let toRepl = "to=" + eid.toString(); setVolume(); contextMenuOpen = true; } } // Store settings in local storage function loadSettings() { if (window.localStorage.getItem('musicPlayerSettings') != null) { musicPlayerSettings = JSON.parse(window.localStorage.getItem('musicPlayerSettings')); if (musicPlayerSettings["volume"] != undefined) { volume = musicPlayerSettings["volume"]; } if (musicPlayerSettings["sfx-volume"] != undefined) { sfxVolume = musicPlayerSettings["sfx-volume"]; }; if (musicPlayerSettings["ui-volume"] != undefined) { uiVolume = musicPlayerSettings["ui-volume"]; }; setVolume(); setThemeMode(); setCOThemeMode(); setRBCThemeMode(); musicPlayerSettings["is-playing"] = false; updateObjectInLocalStorage(); } else { initializeMusicPlayerSettings(); } } function initializeMusicPlayerSettings() { addObjectToLocalStorage(); } function addObjectToLocalStorage() { localStorage.setItem('musicPlayerSettings', JSON.stringify(musicPlayerSettings)); } function updateObjectInLocalStorage() { localStorage.removeItem(musicPlayerSettings); localStorage.setItem('musicPlayerSettings', JSON.stringify(musicPlayerSettings)); } function resetSettings() { localStorage.removeItem(musicPlayerSettings); } // Custom styling for context menu let styles = ` // Context Menu .cls-context-menu-link { display:block; padding:20px; background:#ECECEC; } .cls-context-menu { position:absolute; display:none; width: 175px; height: 347px; padding-top: 4px; } .cls-context-menu ul, #context-menu li { list-style:none; margin:0; padding:0; background:white; } .cls-context-menu { border: 1px solid #888888 !important;} .cls-context-menu li { border: 1px solid #888888; } .cls-context-menu li:last-child { border:none; } .cls-context-menu li a { display:block; padding:5px 10px; text-decoration:none; color:blue; } .cls-context-menu li a:hover { background:blue; color:#FFF; } // Input Range :root { --shadow-len: -60px; } input[type="range"] { margin: auto; -webkit-appearance: none; position: relative; overflow: hidden; height: 25px; cursor: pointer; border-radius: 0; /* iOS */ } ::-webkit-slider-runnable-track { background: #ddd; } /* * 1. Set to 0 width and remove border for a slider without a thumb * 2. Shadow is negative the full width of the input and has a spread * of the width of the input. */ ::-webkit-slider-thumb { -webkit-appearance: none; width: 20px; /* 1 */ height: 25px; background: #fff; box-shadow: -200px 0 0 200px #0066CC; /* 2 */ border: 2px solid #888888; /* 1 */ clip-path: inset(0px 0px 0px let(--shadow-len)); } ::-moz-range-track { height: 25px; background: #888888; } ::-moz-range-thumb { background: #fff; height: 25px; width: 20px; border: 3px solid #888888; border-radius: 0 !important; box-shadow: -200px 0 0 200px #0066CC; box-sizing: border-box; clip-path: inset(0px 0px 0px let(--shadow-len)); } ::-ms-fill-lower { background: #0066CC; } ::-ms-thumb { background: #fff; border: 3px solid #999; height: 25px; width: 20px; box-sizing: border-box; } ::-ms-ticks-after { display: none; } ::-ms-ticks-before { display: none; } ::-ms-track { background: #888888; color: transparent; height: 25px; border: none; } ::-ms-tooltip { display: none; } .theme-radio-btn { height: 14px; width: 14px; } .theme-radio-btn:hover { cursor: pointer; } #shuffle-button { font-family: "Nova Square", cursive; line-height: 25px; } .shuffle-button-enabled { color: white; background: #0066CC; border: 2px solid #0066CC; } .shuffle-button-enabled:hover { cursor: pointer; } .shuffle-button-enabled:active { color: black; background: white; border: 2px solid #888888; } .shuffle-button-disabled { color: white; background: #888888; border: 2px solid #888888; } .blob { animation: shine 1.5s ease-in-out infinite; animation-fill-mode: forwards; animation-direction: alternate; } #version-link { color: #0066CC; font-weight: bold; text-decoration: underline; } } ` let styleSheet = document.createElement("style") styleSheet.innerText = styles document.head.appendChild(styleSheet); getPlayerInfo(); preloadThemes(); setDefaultThemeMode(); loadSettings(); getVersionNumber();