Remove loop dependency on loading dodge sounds

This commit is contained in:
jgk
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
import Loop
import Shader
import LoadConfig
import Dodge.Default
import Dodge.Data
import Dodge.Initialisation
@@ -16,14 +14,13 @@ import Dodge.Rendering
import Dodge.Menu
import Dodge.Floor
import Dodge.LoadConfig
import Dodge.LoadSound
import Picture
import Picture.Render
import Picture.Preload
import Sound
import Preload
import Sound.Preload
import Control.Concurrent
import Control.Lens
@@ -32,17 +29,25 @@ import Control.Monad (when)
import System.Random
import qualified Data.Map as M
import qualified SDL
import qualified SDL.Mixer as Mix
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 = do
(sizex,sizey) <- loadConfig
keyConfig <- loadKeyConfig
setupLoop
(sizex,sizey)
(SDL.cursorVisible $= False >> doPreload >>= resizeSpareFBO sizex sizey)
(SDL.cursorVisible $= False >> doPreload' >>= resizeSpareFBO sizex sizey)
(\x -> (SDL.cursorVisible $= True) >> cleanUpPreload x)
(fmap (setWindowSize sizex sizey keyConfig) firstWorld)
( \preData w -> do
+3 -1
View File
@@ -6,6 +6,8 @@ import Dodge.Default
import Dodge.CreatureState
import Dodge.LightSources
import Dodge.WorldEvent.Sound
import Dodge.Creature.Update hiding (CRUpdate)
import Picture
@@ -30,7 +32,7 @@ updateLamp :: Int -> CRUpdate
updateLamp i = unrandUpdate handleLS internalUpdate
where
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
internalUpdate cr
| _crHP cr < 0 = Nothing
-2
View File
@@ -3,7 +3,6 @@ module Dodge.Item.Weapon
( module Dodge.Item.Weapon
)
where
-- imports {{{
import Dodge.Data
import Dodge.Base
import Dodge.SoundLogic
@@ -50,7 +49,6 @@ pistol,lasGun,tractorGun,launcher,autoGun
,multGun
-- ,shatterGun
,longGun,flamer,blinkGun,forceFieldGun :: Item
pistol = Weapon
{ _itName = "PISTOL"
, _itIdentity = Pistol
+6 -2
View File
@@ -4,6 +4,8 @@ import Dodge.Data
import Dodge.Base
import Dodge.SoundLogic
import Dodge.WorldEvent.Sound
import Dodge.LevelGen.Pathing
import Geometry
@@ -40,9 +42,11 @@ killBlock bl w = f bl .
where
f bl@(Block {_blDegrades = (x:xs)}) = degradeBlock 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
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
sos = [BlockDegradeSound 0,BlockDegradeSound 1]
(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 = do
-- pFireSound <- Mix.load "./data/sound/tap3.wav"
pFireSound <- Mix.load "./data/sound/tap3.wav"
click <- Mix.load "./data/sound/click1.wav"
reloadSound' <- Mix.load "./data/sound/reload1.wav"
tone440 <- Mix.load "./data/sound/tone440.wav"
pickupSound' <- Mix.load "./data/sound/pickUp.wav"
Mix.openAudio Mix.defaultAudio 256
pFireSound <- Mix.load "./data/sound/tap3.wav"
click <- Mix.load "./data/sound/click1.wav"
reloadSound' <- Mix.load "./data/sound/reload1.wav"
tone440 <- Mix.load "./data/sound/tone440.wav"
pickupSound' <- Mix.load "./data/sound/pickUp.wav"
putdownSound' <- Mix.load "./data/sound/whiteNoiseFadeOut.wav"
fireSound' <- Mix.load "./data/sound/fire1.wav"
grenadeBang' <- Mix.load "./data/sound/grenade.wav"
+20 -24
View File
@@ -1,12 +1,7 @@
module Dodge.SoundLogic where
-- imports {{{
import Dodge.Data
import Control.Lens
import qualified Data.Map as M
-- }}}
--
-- PLACEHOLDERS:
haltSound :: World -> World
haltSound w = w
@@ -21,26 +16,28 @@ soundOnce :: Int -> World -> World
soundOnce i = over soundQueue ((:) i)
continueSoundFrom :: SoundOrigin -> Int -> Int -> Int -> World -> World
continueSoundFrom so sType time fadeTime w
= over sounds (M.insertWith f so sound) w
where sound = Sound { _soundType = sType
, _soundTime = time
, _soundFadeTime = fadeTime
, _soundChannel = Nothing
, _soundPos = Nothing
}
f _ s = s {_soundTime = time, _soundFadeTime = fadeTime}
continueSoundFrom so sType time fadeTime w = over sounds (M.insertWith f so sound) w
where
sound = Sound
{ _soundType = sType
, _soundTime = time
, _soundFadeTime = fadeTime
, _soundChannel = Nothing
, _soundPos = Nothing
}
f _ s = s {_soundTime = time, _soundFadeTime = fadeTime}
soundFrom :: SoundOrigin -> Int -> Int -> Int -> World -> World
soundFrom so sType time fadeTime w
= over sounds (M.insertWith f so sound) w
where sound = Sound { _soundType = sType
, _soundTime = time
, _soundFadeTime = fadeTime
, _soundChannel = Nothing
, _soundPos = Nothing
}
f _ s = s {_soundTime = time, _soundFadeTime = fadeTime}
soundFrom so sType time fadeTime w = over sounds (M.insertWith f so sound) w
where
sound = Sound
{ _soundType = sType
, _soundTime = time
, _soundFadeTime = fadeTime
, _soundChannel = Nothing
, _soundPos = Nothing
}
f _ s = s {_soundTime = time, _soundFadeTime = fadeTime}
soundMultiFrom :: [SoundOrigin] -> Int -> Int -> Int -> World -> World
soundMultiFrom [] _ _ _ w = w
@@ -57,7 +54,6 @@ soundMultiFrom (so:sos) sType time fadeTime w
stopSoundFrom :: SoundOrigin -> World -> World
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
-- 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)
doPreload :: IO (PreloadData a)
doPreload = do
sData <- preloadSound
rData <- preloadRender
return $ PreloadData rData sData 0
--doPreload :: IO (PreloadData a)
--doPreload = do
-- sData <- preloadSound
-- rData <- preloadRender
-- return $ PreloadData rData sData 0
cleanUpPreload :: PreloadData a -> IO ()
cleanUpPreload pd = do
+4 -5
View File
@@ -13,8 +13,7 @@ import qualified Data.Map as M
import Control.Lens
playSoundQueue :: SoundData a -> [Int] -> IO ()
playSoundQueue sd ns =
forM_ ns $ \n -> playIfFree (_loadedChunks sd IM.! n) Mix.Once
playSoundQueue sd ns = forM_ ns $ \n -> playIfFree (_loadedChunks sd IM.! n) Mix.Once
playIfFree :: Mix.Chunk -> Mix.Times -> IO (Maybe Mix.Channel)
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 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 new sd = do
playSounds $ over playingSounds (updatePlaying new) sd
playAndUpdate 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
,_playingSounds :: M.Map a Sound
}
data Sound = Sound { _soundTime :: Int
, _soundFadeTime :: Int
--, _soundChannel :: Maybe Int
, _soundChannel :: Maybe Mix.Channel
, _soundPos :: Maybe Point2
, _soundType :: Int
}
deriving (Eq,Ord,Show)
data Sound = Sound
{ _soundTime :: Int
, _soundFadeTime :: Int
, _soundChannel :: Maybe Mix.Channel
, _soundPos :: Maybe Point2
, _soundType :: Int
}
deriving (Eq,Ord,Show)
makeLenses ''SoundData
makeLenses ''Sound
cleanUpSoundPreload :: SoundData a -> IO ()
cleanUpSoundPreload sd = Mix.closeAudio
preloadSound :: IO (SoundData a)
preloadSound = do
Mix.openAudio Mix.defaultAudio 256
-- pFireSound <- Mix.loadWAV "./data/sound/tap3.wav"
pFireSound <- Mix.load "./data/sound/tap3.wav"
click <- Mix.load "./data/sound/click1.wav"
reloadSound' <- Mix.load "./data/sound/reload1.wav"
tone440 <- Mix.load "./data/sound/tone440.wav"
pickupSound' <- Mix.load "./data/sound/pickUp.wav"
putdownSound' <- Mix.load "./data/sound/whiteNoiseFadeOut.wav"
fireSound' <- Mix.load "./data/sound/fire1.wav"
grenadeBang' <- Mix.load "./data/sound/grenade.wav"
tapQuiet' <- Mix.load "./data/sound/tapQuiet.wav"
twoStep' <- Mix.load "./data/sound/twoStep.wav"
healSound' <- Mix.load "./data/sound/heal.wav"
doorSound' <- Mix.load "./data/sound/slideDoor.wav"
twoStepSlow' <- Mix.load "./data/sound/twoStepSlow.wav"
knifeSound' <- Mix.load "./data/sound/knife.wav"
buzzSound' <- Mix.load "./data/sound/buzz.wav"
hitSound' <- Mix.load "./data/sound/hit1.wav"
autoGunSound' <- Mix.load "./data/sound/autoGun.wav"
shotgunSound' <- Mix.load "./data/sound/shotgun.wav"
teleSound' <- Mix.load "./data/sound/tele.wav"
longGunSound' <- Mix.load "./data/sound/longTap.wav"
launcherSound' <- Mix.load "./data/sound/tap4.wav"
smokeTrailSound' <- Mix.load "./data/sound/missileLaunch.wav"
foot1Sound' <- Mix.load "./data/sound/foot1.wav"
foot2Sound' <- Mix.load "./data/sound/foot2.wav"
lasSound' <- Mix.load "./data/sound/tone440sawtooth.wav"
teslaSound' <- Mix.load "./data/sound/Electrical-Welding.wav"
crankSlow' <- Mix.load "./data/sound/crankSlow.wav"
autoB' <- Mix.load "./data/sound/autoB.wav"
mini' <- Mix.load "./data/sound/mini1.wav"
impactA' <- Mix.load "./data/sound/Impact-A.wav"
impactB' <- Mix.load "./data/sound/Impact-B.wav"
impactC' <- Mix.load "./data/sound/Impact-C.wav"
impactD' <- Mix.load "./data/sound/Impact-D.wav"
glassShat1' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A1.wav"
glassShat2' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A2.wav"
glassShat3' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A3.wav"
glassShat4' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A4.wav"
glass1' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A1.wav"
glass2' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A2.wav"
glass3' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A3.wav"
glass4' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A4.wav"
foamSpray' <- Mix.load "./data/sound/foamSprayLoop.wav"
let loadedS = IM.fromList $ zip [0..]
$ [ pFireSound
, click
, reloadSound'
, tone440
, pickupSound'
, putdownSound'
, fireSound'
, grenadeBang'
, tapQuiet'
, twoStep'
, healSound'
, doorSound'
, twoStepSlow'
, knifeSound'
, buzzSound'
, hitSound' --15
, autoGunSound'
, shotgunSound'
, teleSound'
, longGunSound'
, launcherSound'
, smokeTrailSound'
, foot1Sound'
, foot2Sound'
, lasSound'
, teslaSound' --25
, crankSlow'
, autoB'
, mini'
, impactA'
, impactB' --30
, impactC'
, impactD'
, glassShat1' --33
, glassShat2'
, glassShat3'
, glassShat4'
, glass1' --37
, glass2'
, glass3'
, glass4' --40
, foamSpray'
]
return $ SoundData {_loadedChunks = loadedS, _playingSounds = M.empty}
--preloadSound :: IO (SoundData a)
--preloadSound = do
-- Mix.openAudio Mix.defaultAudio 256
-- pFireSound <- Mix.load "./data/sound/tap3.wav"
-- click <- Mix.load "./data/sound/click1.wav"
-- reloadSound' <- Mix.load "./data/sound/reload1.wav"
-- tone440 <- Mix.load "./data/sound/tone440.wav"
-- pickupSound' <- Mix.load "./data/sound/pickUp.wav"
-- putdownSound' <- Mix.load "./data/sound/whiteNoiseFadeOut.wav"
-- fireSound' <- Mix.load "./data/sound/fire1.wav"
-- grenadeBang' <- Mix.load "./data/sound/grenade.wav"
-- tapQuiet' <- Mix.load "./data/sound/tapQuiet.wav"
-- twoStep' <- Mix.load "./data/sound/twoStep.wav"
-- healSound' <- Mix.load "./data/sound/heal.wav"
-- doorSound' <- Mix.load "./data/sound/slideDoor.wav"
-- twoStepSlow' <- Mix.load "./data/sound/twoStepSlow.wav"
-- knifeSound' <- Mix.load "./data/sound/knife.wav"
-- buzzSound' <- Mix.load "./data/sound/buzz.wav"
-- hitSound' <- Mix.load "./data/sound/hit1.wav"
-- autoGunSound' <- Mix.load "./data/sound/autoGun.wav"
-- shotgunSound' <- Mix.load "./data/sound/shotgun.wav"
-- teleSound' <- Mix.load "./data/sound/tele.wav"
-- longGunSound' <- Mix.load "./data/sound/longTap.wav"
-- launcherSound' <- Mix.load "./data/sound/tap4.wav"
-- smokeTrailSound' <- Mix.load "./data/sound/missileLaunch.wav"
-- foot1Sound' <- Mix.load "./data/sound/foot1.wav"
-- foot2Sound' <- Mix.load "./data/sound/foot2.wav"
-- lasSound' <- Mix.load "./data/sound/tone440sawtooth.wav"
-- teslaSound' <- Mix.load "./data/sound/Electrical-Welding.wav"
-- crankSlow' <- Mix.load "./data/sound/crankSlow.wav"
-- autoB' <- Mix.load "./data/sound/autoB.wav"
-- mini' <- Mix.load "./data/sound/mini1.wav"
-- impactA' <- Mix.load "./data/sound/Impact-A.wav"
-- impactB' <- Mix.load "./data/sound/Impact-B.wav"
-- impactC' <- Mix.load "./data/sound/Impact-C.wav"
-- impactD' <- Mix.load "./data/sound/Impact-D.wav"
-- glassShat1' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A1.wav"
-- glassShat2' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A2.wav"
-- glassShat3' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A3.wav"
-- glassShat4' <- Mix.load "./data/sound/Glass-Bottle-Shattering-A4.wav"
-- glass1' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A1.wav"
-- glass2' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A2.wav"
-- glass3' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A3.wav"
-- glass4' <- Mix.load "./data/sound/Small-Piece-Of-Glass-Shattering-A4.wav"
-- foamSpray' <- Mix.load "./data/sound/foamSprayLoop.wav"
-- let loadedS = IM.fromList $ zip [0..] $
-- [ pFireSound
-- , click
-- , reloadSound'
-- , tone440
-- , pickupSound'
-- , putdownSound'
-- , fireSound'
-- , grenadeBang'
-- , tapQuiet'
-- , twoStep'
-- , healSound'
-- , doorSound'
-- , twoStepSlow'
-- , knifeSound'
-- , buzzSound'
-- , hitSound' --15
-- , autoGunSound'
-- , shotgunSound'
-- , teleSound'
-- , longGunSound'
-- , launcherSound'
-- , smokeTrailSound'
-- , foot1Sound'
-- , foot2Sound'
-- , lasSound'
-- , teslaSound' --25
-- , crankSlow'
-- , autoB'
-- , mini'
-- , impactA'
-- , impactB' --30
-- , impactC'
-- , impactD'
-- , glassShat1' --33
-- , glassShat2'
-- , glassShat3'
-- , glassShat4'
-- , glass1' --37
-- , glass2'
-- , glass3'
-- , glass4' --40
-- , foamSpray'
-- ]
-- return $ SoundData {_loadedChunks = loadedS, _playingSounds = M.empty}