summaryrefslogtreecommitdiff
path: root/sfx.lua
diff options
context:
space:
mode:
authorcursed22bc <admin@pixeldawn.org>2026-03-11 12:50:56 +0200
committercursed22bc <admin@pixeldawn.org>2026-03-11 12:50:56 +0200
commit8c5a91acb224312ea511c7ff502c44bb9fe7452b (patch)
tree194a2aee7f92fabbab79cc0ab64f0d2989b7d55e /sfx.lua
parentcd432860828a84aca93852a09cf05fc0e6294bab (diff)
sfx and other polish
Diffstat (limited to 'sfx.lua')
-rw-r--r--sfx.lua105
1 files changed, 105 insertions, 0 deletions
diff --git a/sfx.lua b/sfx.lua
new file mode 100644
index 0000000..c7e7377
--- /dev/null
+++ b/sfx.lua
@@ -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