Remove loop dependency on loading dodge sounds

This commit is contained in:
2021-03-27 13:42:14 +01:00
parent 2897c65e9e
commit 2011728de5
10 changed files with 171 additions and 153 deletions
+11 -6
View File
@@ -1,9 +1,7 @@
module Main where module Main where
import Loop import Loop
import Shader import Shader
import LoadConfig import LoadConfig
import Dodge.Default import Dodge.Default
import Dodge.Data import Dodge.Data
import Dodge.Initialisation import Dodge.Initialisation
@@ -16,14 +14,13 @@ import Dodge.Rendering
import Dodge.Menu import Dodge.Menu
import Dodge.Floor import Dodge.Floor
import Dodge.LoadConfig import Dodge.LoadConfig
import Dodge.LoadSound
import Picture import Picture
import Picture.Render import Picture.Render
import Picture.Preload import Picture.Preload
import Sound import Sound
import Preload import Preload
import Sound.Preload
import Control.Concurrent import Control.Concurrent
import Control.Lens import Control.Lens
@@ -32,17 +29,25 @@ import Control.Monad (when)
import System.Random import System.Random
import qualified Data.Map as M
import qualified SDL import qualified SDL
import qualified SDL.Mixer as Mix import qualified SDL.Mixer as Mix
import Graphics.Rendering.OpenGL hiding (color,scale,translate,rotate) import Graphics.Rendering.OpenGL hiding (color,scale,translate,rotate)
doPreload' :: IO (PreloadData a)
doPreload' = do
lChunks <- loadSounds
let sData = SoundData {_loadedChunks = lChunks, _playingSounds = M.empty}
rData <- preloadRender
return $ PreloadData rData sData 0
main :: IO () main :: IO ()
main = do main = do
(sizex,sizey) <- loadConfig (sizex,sizey) <- loadConfig
keyConfig <- loadKeyConfig keyConfig <- loadKeyConfig
setupLoop setupLoop
(sizex,sizey) (sizex,sizey)
(SDL.cursorVisible $= False >> doPreload >>= resizeSpareFBO sizex sizey) (SDL.cursorVisible $= False >> doPreload' >>= resizeSpareFBO sizex sizey)
(\x -> (SDL.cursorVisible $= True) >> cleanUpPreload x) (\x -> (SDL.cursorVisible $= True) >> cleanUpPreload x)
(fmap (setWindowSize sizex sizey keyConfig) firstWorld) (fmap (setWindowSize sizex sizey keyConfig) firstWorld)
( \preData w -> do ( \preData w -> do
+3 -1
View File
@@ -6,6 +6,8 @@ import Dodge.Default
import Dodge.CreatureState import Dodge.CreatureState
import Dodge.LightSources import Dodge.LightSources
import Dodge.WorldEvent.Sound
import Dodge.Creature.Update hiding (CRUpdate) import Dodge.Creature.Update hiding (CRUpdate)
import Picture import Picture
@@ -30,7 +32,7 @@ updateLamp :: Int -> CRUpdate
updateLamp i = unrandUpdate handleLS internalUpdate updateLamp i = unrandUpdate handleLS internalUpdate
where where
handleLS cr w handleLS cr w
| _crHP cr < 0 = w & lightSources %~ IM.delete i | _crHP cr < 0 = mkSoundBreakGlass w & lightSources %~ IM.delete i
| otherwise = w & lightSources . ix i . lsPos .~ _crPos cr | otherwise = w & lightSources . ix i . lsPos .~ _crPos cr
internalUpdate cr internalUpdate cr
| _crHP cr < 0 = Nothing | _crHP cr < 0 = Nothing
-2
View File
@@ -3,7 +3,6 @@ module Dodge.Item.Weapon
( module Dodge.Item.Weapon ( module Dodge.Item.Weapon
) )
where where
-- imports {{{
import Dodge.Data import Dodge.Data
import Dodge.Base import Dodge.Base
import Dodge.SoundLogic import Dodge.SoundLogic
@@ -50,7 +49,6 @@ pistol,lasGun,tractorGun,launcher,autoGun
,multGun ,multGun
-- ,shatterGun -- ,shatterGun
,longGun,flamer,blinkGun,forceFieldGun :: Item ,longGun,flamer,blinkGun,forceFieldGun :: Item
pistol = Weapon pistol = Weapon
{ _itName = "PISTOL" { _itName = "PISTOL"
, _itIdentity = Pistol , _itIdentity = Pistol
+6 -2
View File
@@ -4,6 +4,8 @@ import Dodge.Data
import Dodge.Base import Dodge.Base
import Dodge.SoundLogic import Dodge.SoundLogic
import Dodge.WorldEvent.Sound
import Dodge.LevelGen.Pathing import Dodge.LevelGen.Pathing
import Geometry import Geometry
@@ -40,9 +42,11 @@ killBlock bl w = f bl .
where where
f bl@(Block {_blDegrades = (x:xs)}) = degradeBlock bl . hitSound bl f bl@(Block {_blDegrades = (x:xs)}) = degradeBlock bl . hitSound bl
f bl = hitSound' bl f bl = hitSound' bl
hitSound bl | _wlIsSeeThrough bl = soundMultiFrom sos (soundid+8) 25 0 hitSound bl | _wlIsSeeThrough bl = mkSoundBreakGlass
-- hitSound bl | _wlIsSeeThrough bl = soundMultiFrom sos (soundid+8) 25 0
| otherwise = soundMultiFrom sos soundid 25 0 | otherwise = soundMultiFrom sos soundid 25 0
hitSound' bl | _wlIsSeeThrough bl = soundMultiFrom sos (soundid+4) 25 0 hitSound' bl | _wlIsSeeThrough bl = mkSoundSplinterGlass
-- hitSound' bl | _wlIsSeeThrough bl = soundMultiFrom sos (soundid+4) 25 0
| otherwise = soundMultiFrom sos soundid 25 0 | otherwise = soundMultiFrom sos soundid 25 0
sos = [BlockDegradeSound 0,BlockDegradeSound 1] sos = [BlockDegradeSound 0,BlockDegradeSound 1]
(soundid,_) = randomR (29,32) $ _randGen w (soundid,_) = randomR (29,32) $ _randGen w
+6 -6
View File
@@ -14,12 +14,12 @@ import qualified SDL.Mixer as Mix
-- }}} -- }}}
loadSounds :: IO (IM.IntMap Mix.Chunk) loadSounds :: IO (IM.IntMap Mix.Chunk)
loadSounds = do loadSounds = do
-- pFireSound <- Mix.load "./data/sound/tap3.wav" Mix.openAudio Mix.defaultAudio 256
pFireSound <- Mix.load "./data/sound/tap3.wav" pFireSound <- Mix.load "./data/sound/tap3.wav"
click <- Mix.load "./data/sound/click1.wav" click <- Mix.load "./data/sound/click1.wav"
reloadSound' <- Mix.load "./data/sound/reload1.wav" reloadSound' <- Mix.load "./data/sound/reload1.wav"
tone440 <- Mix.load "./data/sound/tone440.wav" tone440 <- Mix.load "./data/sound/tone440.wav"
pickupSound' <- Mix.load "./data/sound/pickUp.wav" pickupSound' <- Mix.load "./data/sound/pickUp.wav"
putdownSound' <- Mix.load "./data/sound/whiteNoiseFadeOut.wav" putdownSound' <- Mix.load "./data/sound/whiteNoiseFadeOut.wav"
fireSound' <- Mix.load "./data/sound/fire1.wav" fireSound' <- Mix.load "./data/sound/fire1.wav"
grenadeBang' <- Mix.load "./data/sound/grenade.wav" grenadeBang' <- Mix.load "./data/sound/grenade.wav"
+20 -24
View File
@@ -1,12 +1,7 @@
module Dodge.SoundLogic where module Dodge.SoundLogic where
-- imports {{{
import Dodge.Data import Dodge.Data
import Control.Lens import Control.Lens
import qualified Data.Map as M import qualified Data.Map as M
-- }}}
--
-- PLACEHOLDERS:
haltSound :: World -> World haltSound :: World -> World
haltSound w = w haltSound w = w
@@ -21,26 +16,28 @@ soundOnce :: Int -> World -> World
soundOnce i = over soundQueue ((:) i) soundOnce i = over soundQueue ((:) i)
continueSoundFrom :: SoundOrigin -> Int -> Int -> Int -> World -> World continueSoundFrom :: SoundOrigin -> Int -> Int -> Int -> World -> World
continueSoundFrom so sType time fadeTime w continueSoundFrom so sType time fadeTime w = over sounds (M.insertWith f so sound) w
= over sounds (M.insertWith f so sound) w where
where sound = Sound { _soundType = sType sound = Sound
, _soundTime = time { _soundType = sType
, _soundFadeTime = fadeTime , _soundTime = time
, _soundChannel = Nothing , _soundFadeTime = fadeTime
, _soundPos = Nothing , _soundChannel = Nothing
} , _soundPos = Nothing
f _ s = s {_soundTime = time, _soundFadeTime = fadeTime} }
f _ s = s {_soundTime = time, _soundFadeTime = fadeTime}
soundFrom :: SoundOrigin -> Int -> Int -> Int -> World -> World soundFrom :: SoundOrigin -> Int -> Int -> Int -> World -> World
soundFrom so sType time fadeTime w soundFrom so sType time fadeTime w = over sounds (M.insertWith f so sound) w
= over sounds (M.insertWith f so sound) w where
where sound = Sound { _soundType = sType sound = Sound
, _soundTime = time { _soundType = sType
, _soundFadeTime = fadeTime , _soundTime = time
, _soundChannel = Nothing , _soundFadeTime = fadeTime
, _soundPos = Nothing , _soundChannel = Nothing
} , _soundPos = Nothing
f _ s = s {_soundTime = time, _soundFadeTime = fadeTime} }
f _ s = s {_soundTime = time, _soundFadeTime = fadeTime}
soundMultiFrom :: [SoundOrigin] -> Int -> Int -> Int -> World -> World soundMultiFrom :: [SoundOrigin] -> Int -> Int -> Int -> World -> World
soundMultiFrom [] _ _ _ w = w soundMultiFrom [] _ _ _ w = w
@@ -57,7 +54,6 @@ soundMultiFrom (so:sos) sType time fadeTime w
stopSoundFrom :: SoundOrigin -> World -> World stopSoundFrom :: SoundOrigin -> World -> World
stopSoundFrom so = over (sounds . ix so . soundTime) (min 0) stopSoundFrom so = over (sounds . ix so . soundTime) (min 0)
-- idea: pass the id of the sound to the world and send it to some queue for -- idea: pass the id of the sound to the world and send it to some queue for
-- playback -- playback
+18
View File
@@ -0,0 +1,18 @@
module Dodge.WorldEvent.Sound
where
import Dodge.Data
import Dodge.SoundLogic
import System.Random
import Control.Lens
mkSoundBreakGlass :: World -> World
mkSoundBreakGlass w = soundOnce soundid $ set randGen g w
where
(soundid,g) = _randGen w & randomR (37,40)
mkSoundSplinterGlass :: World -> World
mkSoundSplinterGlass w = soundOnce soundid $ set randGen g w
where
(soundid,g) = _randGen w & randomR (33,36)
+5 -5
View File
@@ -13,11 +13,11 @@ import Control.Lens
import GHC.Word (Word32) import GHC.Word (Word32)
doPreload :: IO (PreloadData a) --doPreload :: IO (PreloadData a)
doPreload = do --doPreload = do
sData <- preloadSound -- sData <- preloadSound
rData <- preloadRender -- rData <- preloadRender
return $ PreloadData rData sData 0 -- return $ PreloadData rData sData 0
cleanUpPreload :: PreloadData a -> IO () cleanUpPreload :: PreloadData a -> IO ()
cleanUpPreload pd = do cleanUpPreload pd = do
+4 -5
View File
@@ -13,8 +13,7 @@ import qualified Data.Map as M
import Control.Lens import Control.Lens
playSoundQueue :: SoundData a -> [Int] -> IO () playSoundQueue :: SoundData a -> [Int] -> IO ()
playSoundQueue sd ns = playSoundQueue sd ns = forM_ ns $ \n -> playIfFree (_loadedChunks sd IM.! n) Mix.Once
forM_ ns $ \n -> playIfFree (_loadedChunks sd IM.! n) Mix.Once
playIfFree :: Mix.Chunk -> Mix.Times -> IO (Maybe Mix.Channel) playIfFree :: Mix.Chunk -> Mix.Times -> IO (Maybe Mix.Channel)
playIfFree c times = do playIfFree c times = do
@@ -43,8 +42,8 @@ playSounds sd = do
updatePlaying :: Ord a => M.Map a Sound -> M.Map a Sound -> M.Map a Sound updatePlaying :: Ord a => M.Map a Sound -> M.Map a Sound -> M.Map a Sound
updatePlaying new old = M.unionWith f new old updatePlaying new old = M.unionWith f new old
where f newSound oldSound = newSound {_soundChannel = _soundChannel oldSound} where
f newSound oldSound = newSound {_soundChannel = _soundChannel oldSound}
playAndUpdate :: Ord a => M.Map a Sound -> SoundData a -> IO (SoundData a) playAndUpdate :: Ord a => M.Map a Sound -> SoundData a -> IO (SoundData a)
playAndUpdate new sd = do playAndUpdate new sd = playSounds $ over playingSounds (updatePlaying new) sd
playSounds $ over playingSounds (updatePlaying new) sd
+98 -102
View File
@@ -15,112 +15,108 @@ data SoundData a = SoundData
{_loadedChunks :: IM.IntMap Mix.Chunk {_loadedChunks :: IM.IntMap Mix.Chunk
,_playingSounds :: M.Map a Sound ,_playingSounds :: M.Map a Sound
} }
data Sound = Sound { _soundTime :: Int data Sound = Sound
, _soundFadeTime :: Int { _soundTime :: Int
--, _soundChannel :: Maybe Int , _soundFadeTime :: Int
, _soundChannel :: Maybe Mix.Channel , _soundChannel :: Maybe Mix.Channel
, _soundPos :: Maybe Point2 , _soundPos :: Maybe Point2
, _soundType :: Int , _soundType :: Int
} }
deriving (Eq,Ord,Show) deriving (Eq,Ord,Show)
makeLenses ''SoundData makeLenses ''SoundData
makeLenses ''Sound makeLenses ''Sound
cleanUpSoundPreload :: SoundData a -> IO () cleanUpSoundPreload :: SoundData a -> IO ()
cleanUpSoundPreload sd = Mix.closeAudio cleanUpSoundPreload sd = Mix.closeAudio
--preloadSound :: IO (SoundData a)
preloadSound :: IO (SoundData a) --preloadSound = do
preloadSound = do -- Mix.openAudio Mix.defaultAudio 256
Mix.openAudio Mix.defaultAudio 256 -- pFireSound <- Mix.load "./data/sound/tap3.wav"
-- pFireSound <- Mix.loadWAV "./data/sound/tap3.wav" -- click <- Mix.load "./data/sound/click1.wav"
pFireSound <- Mix.load "./data/sound/tap3.wav" -- reloadSound' <- Mix.load "./data/sound/reload1.wav"
click <- Mix.load "./data/sound/click1.wav" -- tone440 <- Mix.load "./data/sound/tone440.wav"
reloadSound' <- Mix.load "./data/sound/reload1.wav" -- pickupSound' <- Mix.load "./data/sound/pickUp.wav"
tone440 <- Mix.load "./data/sound/tone440.wav" -- putdownSound' <- Mix.load "./data/sound/whiteNoiseFadeOut.wav"
pickupSound' <- Mix.load "./data/sound/pickUp.wav" -- fireSound' <- Mix.load "./data/sound/fire1.wav"
putdownSound' <- Mix.load "./data/sound/whiteNoiseFadeOut.wav" -- grenadeBang' <- Mix.load "./data/sound/grenade.wav"
fireSound' <- Mix.load "./data/sound/fire1.wav" -- tapQuiet' <- Mix.load "./data/sound/tapQuiet.wav"
grenadeBang' <- Mix.load "./data/sound/grenade.wav" -- twoStep' <- Mix.load "./data/sound/twoStep.wav"
tapQuiet' <- Mix.load "./data/sound/tapQuiet.wav" -- healSound' <- Mix.load "./data/sound/heal.wav"
twoStep' <- Mix.load "./data/sound/twoStep.wav" -- doorSound' <- Mix.load "./data/sound/slideDoor.wav"
healSound' <- Mix.load "./data/sound/heal.wav" -- twoStepSlow' <- Mix.load "./data/sound/twoStepSlow.wav"
doorSound' <- Mix.load "./data/sound/slideDoor.wav" -- knifeSound' <- Mix.load "./data/sound/knife.wav"
twoStepSlow' <- Mix.load "./data/sound/twoStepSlow.wav" -- buzzSound' <- Mix.load "./data/sound/buzz.wav"
knifeSound' <- Mix.load "./data/sound/knife.wav" -- hitSound' <- Mix.load "./data/sound/hit1.wav"
buzzSound' <- Mix.load "./data/sound/buzz.wav" -- autoGunSound' <- Mix.load "./data/sound/autoGun.wav"
hitSound' <- Mix.load "./data/sound/hit1.wav" -- shotgunSound' <- Mix.load "./data/sound/shotgun.wav"
autoGunSound' <- Mix.load "./data/sound/autoGun.wav" -- teleSound' <- Mix.load "./data/sound/tele.wav"
shotgunSound' <- Mix.load "./data/sound/shotgun.wav" -- longGunSound' <- Mix.load "./data/sound/longTap.wav"
teleSound' <- Mix.load "./data/sound/tele.wav" -- launcherSound' <- Mix.load "./data/sound/tap4.wav"
longGunSound' <- Mix.load "./data/sound/longTap.wav" -- smokeTrailSound' <- Mix.load "./data/sound/missileLaunch.wav"
launcherSound' <- Mix.load "./data/sound/tap4.wav" -- foot1Sound' <- Mix.load "./data/sound/foot1.wav"
smokeTrailSound' <- Mix.load "./data/sound/missileLaunch.wav" -- foot2Sound' <- Mix.load "./data/sound/foot2.wav"
foot1Sound' <- Mix.load "./data/sound/foot1.wav" -- lasSound' <- Mix.load "./data/sound/tone440sawtooth.wav"
foot2Sound' <- Mix.load "./data/sound/foot2.wav" -- teslaSound' <- Mix.load "./data/sound/Electrical-Welding.wav"
lasSound' <- Mix.load "./data/sound/tone440sawtooth.wav" -- crankSlow' <- Mix.load "./data/sound/crankSlow.wav"
teslaSound' <- Mix.load "./data/sound/Electrical-Welding.wav" -- autoB' <- Mix.load "./data/sound/autoB.wav"
crankSlow' <- Mix.load "./data/sound/crankSlow.wav" -- mini' <- Mix.load "./data/sound/mini1.wav"
autoB' <- Mix.load "./data/sound/autoB.wav" -- impactA' <- Mix.load "./data/sound/Impact-A.wav"
mini' <- Mix.load "./data/sound/mini1.wav" -- impactB' <- Mix.load "./data/sound/Impact-B.wav"
impactA' <- Mix.load "./data/sound/Impact-A.wav" -- impactC' <- Mix.load "./data/sound/Impact-C.wav"
impactB' <- Mix.load "./data/sound/Impact-B.wav" -- impactD' <- Mix.load "./data/sound/Impact-D.wav"
impactC' <- Mix.load "./data/sound/Impact-C.wav" -- glassShat1' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A1.wav"
impactD' <- Mix.load "./data/sound/Impact-D.wav" -- glassShat2' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A2.wav"
glassShat1' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A1.wav" -- glassShat3' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A3.wav"
glassShat2' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A2.wav" -- glassShat4' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A4.wav"
glassShat3' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A3.wav" -- glass1' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A1.wav"
glassShat4' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A4.wav" -- glass2' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A2.wav"
glass1' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A1.wav" -- glass3' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A3.wav"
glass2' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A2.wav" -- glass4' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A4.wav"
glass3' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A3.wav" -- foamSpray' <- Mix.load "./data/sound/foamSprayLoop.wav"
glass4' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A4.wav" -- let loadedS = IM.fromList $ zip [0..] $
foamSpray' <- Mix.load "./data/sound/foamSprayLoop.wav" -- [ pFireSound
let loadedS = IM.fromList $ zip [0..] -- , click
$ [ pFireSound -- , reloadSound'
, click -- , tone440
, reloadSound' -- , pickupSound'
, tone440 -- , putdownSound'
, pickupSound' -- , fireSound'
, putdownSound' -- , grenadeBang'
, fireSound' -- , tapQuiet'
, grenadeBang' -- , twoStep'
, tapQuiet' -- , healSound'
, twoStep' -- , doorSound'
, healSound' -- , twoStepSlow'
, doorSound' -- , knifeSound'
, twoStepSlow' -- , buzzSound'
, knifeSound' -- , hitSound' --15
, buzzSound' -- , autoGunSound'
, hitSound' --15 -- , shotgunSound'
, autoGunSound' -- , teleSound'
, shotgunSound' -- , longGunSound'
, teleSound' -- , launcherSound'
, longGunSound' -- , smokeTrailSound'
, launcherSound' -- , foot1Sound'
, smokeTrailSound' -- , foot2Sound'
, foot1Sound' -- , lasSound'
, foot2Sound' -- , teslaSound' --25
, lasSound' -- , crankSlow'
, teslaSound' --25 -- , autoB'
, crankSlow' -- , mini'
, autoB' -- , impactA'
, mini' -- , impactB' --30
, impactA' -- , impactC'
, impactB' --30 -- , impactD'
, impactC' -- , glassShat1' --33
, impactD' -- , glassShat2'
, glassShat1' --33 -- , glassShat3'
, glassShat2' -- , glassShat4'
, glassShat3' -- , glass1' --37
, glassShat4' -- , glass2'
, glass1' --37 -- , glass3'
, glass2' -- , glass4' --40
, glass3' -- , foamSpray'
, glass4' --40 -- ]
, foamSpray' -- return $ SoundData {_loadedChunks = loadedS, _playingSounds = M.empty}
]
return $ SoundData {_loadedChunks = loadedS, _playingSounds = M.empty}