local sfx = {} sfx.sources = {} sfx.volumes = {} sfx.liquidActive = false local LIQUID_FILTER = { type = "lowpass", volume = 0.8, highgain = 0.15 } local MUSIC_SOURCES = { game_ambient_loop = true, UI_loop_song = true, } local DEFAULT_VOLUMES = { game_ambient_loop = 0.3, UI_loop_song = 0.5, running = 0.35, die = 0.7, dive = 0.6, jump = 0.5, land = 0.5, HUD = 0.5, pickup = 0.5, UI = 0.5, } function sfx.load() local dir = "assets/sfx" local ok, items = pcall(love.filesystem.getDirectoryItems, dir) if not ok or not items then return end for _, filename in ipairs(items) do local ext = filename:match("%.(%w+)$") if ext == "ogg" or ext == "mp3" or ext == "wav" then local name = filename:gsub("%.[^.]+$", "") local sourceType = MUSIC_SOURCES[name] and "stream" or "static" local success, src = pcall(love.audio.newSource, dir .. "/" .. filename, sourceType) if success and src then local vol = DEFAULT_VOLUMES[name] or 0.5 src:setVolume(vol) sfx.sources[name] = src sfx.volumes[name] = vol end end end end function sfx.play(name) local src = sfx.sources[name] if not src then return end src:stop() src:setLooping(false) if sfx.liquidActive and not MUSIC_SOURCES[name] then pcall(src.setFilter, src, LIQUID_FILTER) end src:play() end function sfx.loop(name) local src = sfx.sources[name] if not src then return end if src:isPlaying() then return end src:setLooping(true) src:play() end function sfx.stop(name) local src = sfx.sources[name] if not src then return end src:stop() end function sfx.isPlaying(name) local src = sfx.sources[name] return src and src:isPlaying() end function sfx.setVolume(name, vol) local src = sfx.sources[name] if not src then return end sfx.volumes[name] = vol src:setVolume(vol) end function sfx.setLiquidEffect(active) if sfx.liquidActive == active then return end sfx.liquidActive = active for name, src in pairs(sfx.sources) do if not MUSIC_SOURCES[name] then if active then pcall(src.setFilter, src, LIQUID_FILTER) else pcall(src.setFilter, src) end end end end function sfx.stopAll() for _, src in pairs(sfx.sources) do src:stop() end end return sfx