Source: module/sounds.js

/** @module sounds */

import { appUrl } from './util.js'

/**
 * A thin wrapper for sound effects.
 */
class Sound {
    /**
     * Construct the sound.
     * @param {string} src - URL of the file
     */
    constructor(src) {
        /**
         * The sound element.
         * @type {HTMLAudioElement}
         */
        this.sound = document.createElement('audio')
        this.sound.src = src
        this.sound.setAttribute('preload', 'auto')
        this.sound.setAttribute('controls', 'none')
        this.sound.style.display = 'none'

        document.body.appendChild(this.sound)
    }

    /**
     * Start playing the sound.
     */
    async play() {
        const duration = this.sound.duration

        await this.sound.play()
        await new Promise(res => {
            setTimeout(res, duration * 1000)
        })
    }

    /**
     * Pause the sound.
     */
    stop() {
        this.sound.pause()
    }
}

/**
 * Enum of the various sound effects available in the game.
 * @type {object}
 */
const GameSounds = {
    Victory: new Sound(appUrl('/lib/sounds/cartoon_success_fanfair.mp3')),
    Fire: new Sound(appUrl('/lib/sounds/zapsplat_warfare_mortar_projectile_launch_002_25232.mp3')),
    Hit: new Sound(appUrl('/lib/sounds/zapsplat_warfare_bomb_whizz_in_hit_close_by_explosion_med_003_48060.mp3')),
    Miss: new Sound(appUrl('/lib/sounds/zapsplat_nature_water_pour_medium_amount_deep_sudden_fast_002_52765.mp3')),
}

export { GameSounds }