48 lines
1.6 KiB
Lua
48 lines
1.6 KiB
Lua
|
|
-- Central sound-effect registry. One preloaded Source per named effect; the game
|
||
|
|
-- calls Sound.play("name") to (re)trigger it. Ambient static + music live in
|
||
|
|
-- main.lua's _initSounds; this covers the one-shot gameplay/UI feedback.
|
||
|
|
--
|
||
|
|
-- Top level does NO audio calls on purpose: requiring this under the test love
|
||
|
|
-- stub (which never runs Sound.init) must be side-effect free. Until Sound.init
|
||
|
|
-- runs, Sound.sfx is empty and Sound.play is a harmless no-op.
|
||
|
|
Sound = {}
|
||
|
|
|
||
|
|
Sound.sfx = {} -- name -> Source
|
||
|
|
Sound.jabbers = {} -- pool of npc chatter Sources, picked at random
|
||
|
|
|
||
|
|
local function load(path)
|
||
|
|
return love.audio.newSource(path, "static")
|
||
|
|
end
|
||
|
|
|
||
|
|
function Sound.init()
|
||
|
|
Sound.sfx = {
|
||
|
|
playerMove = load("sounds/player_move.ogg"),
|
||
|
|
switchFail = load("sounds/switch_fail.wav"),
|
||
|
|
switchSuccess = load("sounds/switch_success.wav"),
|
||
|
|
doorUnlock = load("sounds/door_unlock.ogg"),
|
||
|
|
levelChange = load("sounds/level_change.ogg"),
|
||
|
|
uiButton = load("sounds/ui/button.wav"),
|
||
|
|
}
|
||
|
|
Sound.jabbers = {
|
||
|
|
load("sounds/jabber_1.ogg"),
|
||
|
|
load("sounds/jabber_2.ogg"),
|
||
|
|
}
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Restart-and-play a named effect. A static Source only plays one instance at a
|
||
|
|
-- time, so stopping first makes rapid retriggers (e.g. mashing move) audible.
|
||
|
|
function Sound.play(name)
|
||
|
|
local src = Sound.sfx[name]
|
||
|
|
if not src then return end
|
||
|
|
src:stop()
|
||
|
|
src:play()
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Pick a random npc jabber clip and play it. Used when a Dialogable starts talking.
|
||
|
|
function Sound.jabber()
|
||
|
|
if #Sound.jabbers == 0 then return end
|
||
|
|
local src = Sound.jabbers[love.math.random(#Sound.jabbers)]
|
||
|
|
src:stop()
|
||
|
|
src:play()
|
||
|
|
end
|