diff options
Diffstat (limited to 'sfx.lua')
| -rw-r--r-- | sfx.lua | 105 |
1 files changed, 105 insertions, 0 deletions
@@ -0,0 +1,105 @@ +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 |
