diff --git a/app/Main.hs b/app/Main.hs index 9ebbef507..7385911da 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -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 diff --git a/src/Dodge/Creature/Inanimate.hs b/src/Dodge/Creature/Inanimate.hs index 0b7cb1a5f..d291025bf 100644 --- a/src/Dodge/Creature/Inanimate.hs +++ b/src/Dodge/Creature/Inanimate.hs @@ -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 diff --git a/src/Dodge/Item/Weapon.hs b/src/Dodge/Item/Weapon.hs index 2660c1d5d..519b8b6f0 100644 --- a/src/Dodge/Item/Weapon.hs +++ b/src/Dodge/Item/Weapon.hs @@ -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 diff --git a/src/Dodge/LevelGen/Block.hs b/src/Dodge/LevelGen/Block.hs index ea5d21054..ee69fb2c7 100644 --- a/src/Dodge/LevelGen/Block.hs +++ b/src/Dodge/LevelGen/Block.hs @@ -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 diff --git a/src/Dodge/LoadSound.hs b/src/Dodge/LoadSound.hs index 2791f0846..a825b8c98 100644 --- a/src/Dodge/LoadSound.hs +++ b/src/Dodge/LoadSound.hs @@ -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" diff --git a/src/Dodge/SoundLogic.hs b/src/Dodge/SoundLogic.hs index 44c51b031..81b8382bc 100644 --- a/src/Dodge/SoundLogic.hs +++ b/src/Dodge/SoundLogic.hs @@ -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 diff --git a/src/Dodge/WorldEvent/Sound.hs b/src/Dodge/WorldEvent/Sound.hs new file mode 100644 index 000000000..66267a1a0 --- /dev/null +++ b/src/Dodge/WorldEvent/Sound.hs @@ -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) diff --git a/src/Preload.hs b/src/Preload.hs index 2900f2307..3b893855e 100644 --- a/src/Preload.hs +++ b/src/Preload.hs @@ -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 diff --git a/src/Sound.hs b/src/Sound.hs index 2d049d6aa..17c373b9c 100644 --- a/src/Sound.hs +++ b/src/Sound.hs @@ -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 diff --git a/src/Sound/Preload.hs b/src/Sound/Preload.hs index ac0ecbdf6..599dadd1b 100644 --- a/src/Sound/Preload.hs +++ b/src/Sound/Preload.hs @@ -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}