Refactor sounds
This commit is contained in:
+37
-82
@@ -6,13 +6,10 @@ This module allows us to talk to the "Sound" module.
|
||||
-}
|
||||
module Dodge.SoundLogic (
|
||||
-- * Manipulation of individual sounds
|
||||
soundOnce
|
||||
, soundOncePos
|
||||
, soundOnceOrigin
|
||||
, soundFromPos
|
||||
soundOnceOrigin
|
||||
, soundFrom
|
||||
, soundFromGeneral
|
||||
, soundMultiFrom
|
||||
, soundMultiFromPos
|
||||
, stopSoundFrom
|
||||
|
||||
-- * Manipulation of all sounds
|
||||
@@ -41,20 +38,6 @@ pauseSound w = w
|
||||
resumeSound :: World -> World
|
||||
resumeSound w = w
|
||||
|
||||
{-| Add a sound to the queue for playback.
|
||||
Consider replacing instances with 'soundOncePos'.
|
||||
-}
|
||||
soundOnce :: Int -> World -> World
|
||||
soundOnce i = soundQueue %~ ((i,0) : )
|
||||
|
||||
{-| Play a sound with a given position in the world.
|
||||
Uses the angle between the given position and '_cameraViewFrom', taking into account '_cameraRot'.
|
||||
-}
|
||||
soundOncePos :: Int -> Point2 -> World -> World
|
||||
soundOncePos i pos w = w & soundQueue %~ ((i,a) :)
|
||||
where
|
||||
a = soundAngle pos w
|
||||
|
||||
{-| Play a sound once, with a given origin.
|
||||
For each origin only one sound will play at a time.
|
||||
-}
|
||||
@@ -69,7 +52,6 @@ soundOnceOrigin sType so p w = w & sounds %~ M.insertWith (\ _ x -> x) so theSou
|
||||
theSound = Sound
|
||||
{ _soundChunkID = sType
|
||||
, _soundTime = Nothing
|
||||
, _soundFadeTime = 0
|
||||
, _soundStatus = ToStart
|
||||
, _soundChannel = Nothing
|
||||
, _soundAngDist = Just (a,0)
|
||||
@@ -78,28 +60,48 @@ soundOnceOrigin sType so p w = w & sounds %~ M.insertWith (\ _ x -> x) so theSou
|
||||
}
|
||||
a = soundAngle p w
|
||||
|
||||
soundFromPos
|
||||
soundFrom
|
||||
:: SoundOrigin -- ^ \"Creator\" of sound
|
||||
-> Point2 -- ^ Position of sound
|
||||
-> Int -- ^ ID of sound to be played
|
||||
-> Int -- ^ Frames to play sound for
|
||||
-> Int -- ^ Time sound fades out after playing for the given number of frames (ms)
|
||||
-> World -> World
|
||||
soundFromPos so pos sType time fadeTime w = over sounds (M.insertWith f so sound) w
|
||||
-> Maybe Int -- ^ Frames to play sound for, Nothing for until finished
|
||||
-> World
|
||||
-> World
|
||||
soundFrom so pos sType mtime w = over sounds (M.insertWith f so sound) w
|
||||
where
|
||||
sound = Sound
|
||||
{ _soundChunkID = sType
|
||||
, _soundTime = Just time
|
||||
, _soundTime = mtime
|
||||
, _soundStatus = ToStart
|
||||
, _soundFadeTime = fadeTime
|
||||
, _soundChannel = Nothing
|
||||
, _soundAngDist = Just (a,0)
|
||||
, _soundPos = pos
|
||||
, _soundVolume = soundVolID sType
|
||||
}
|
||||
f _ s = s {_soundTime = Just time, _soundFadeTime = fadeTime}
|
||||
f _ s = s {_soundTime = mtime }
|
||||
a = soundAngle pos w
|
||||
|
||||
soundFromGeneral
|
||||
:: SoundOrigin -- ^ \"Creator\" of sound
|
||||
-> (World -> Point2) -- ^ Position of sound
|
||||
-> Int -- ^ ID of sound to be played
|
||||
-> Maybe Int -- ^ Frames to play sound for, Nothing for until finished
|
||||
-> World
|
||||
-> World
|
||||
soundFromGeneral so fpos sType mtime w = over sounds (M.insertWith f so sound) w
|
||||
where
|
||||
sound = Sound
|
||||
{ _soundChunkID = sType
|
||||
, _soundTime = mtime
|
||||
, _soundStatus = ToStart
|
||||
, _soundChannel = Nothing
|
||||
, _soundAngDist = Just (a,0)
|
||||
, _soundPos = fpos w
|
||||
, _soundVolume = soundVolID sType
|
||||
}
|
||||
f _ s = s {_soundTime = mtime }
|
||||
a = soundAngle (fpos w) w
|
||||
|
||||
{-| Calculates the angle of a sound with reference to '_cameraViewFrom'.
|
||||
Within 10 units considers the sound to be directly in front.
|
||||
-}
|
||||
@@ -115,71 +117,24 @@ soundAngle p w
|
||||
where
|
||||
earPos = _cameraViewFrom w
|
||||
|
||||
soundFrom
|
||||
:: SoundOrigin
|
||||
-> Int -- ^ Sound ID
|
||||
-> Int -- ^ Frames to play
|
||||
-> Int -- ^ Fade out time (ms)
|
||||
-> World
|
||||
-> World
|
||||
soundFrom so sType time fadeTime w = w & sounds %~ M.insertWith f so sound
|
||||
where
|
||||
sound = Sound
|
||||
{ _soundChunkID = sType
|
||||
, _soundTime = Just time
|
||||
, _soundStatus = ToStart
|
||||
, _soundFadeTime = fadeTime
|
||||
, _soundChannel = Nothing
|
||||
, _soundAngDist = Nothing
|
||||
, _soundPos = _cameraCenter w
|
||||
, _soundVolume = soundVolID sType
|
||||
}
|
||||
f _ s = s {_soundTime = Just time, _soundFadeTime = fadeTime}
|
||||
{-| Uses the first free origin from a list.
|
||||
Does nothing if all origins are already creating sounds.
|
||||
TODO: add positional information.
|
||||
-}
|
||||
soundMultiFrom
|
||||
:: [SoundOrigin]
|
||||
-> Int -- ^ Sound ID
|
||||
-> Int -- ^ Frames to play for
|
||||
-> Int -- ^ Fade out time (ms)
|
||||
-> World -> World
|
||||
soundMultiFrom [] _ _ _ w = w
|
||||
soundMultiFrom (so:sos) sType time fadeTime w
|
||||
| so `M.member` _sounds w = soundMultiFrom sos sType time fadeTime w
|
||||
| otherwise = over sounds (M.insert so sound) w
|
||||
where
|
||||
sound = Sound
|
||||
{ _soundChunkID = sType
|
||||
, _soundTime = Nothing
|
||||
, _soundStatus = ToStart
|
||||
, _soundFadeTime = fadeTime
|
||||
, _soundChannel = Nothing
|
||||
, _soundAngDist = Nothing
|
||||
, _soundPos = _cameraCenter w
|
||||
, _soundVolume = soundVolID sType
|
||||
}
|
||||
{-| Uses the first free origin from a list.
|
||||
Does nothing if all origins are already creating sounds. -}
|
||||
soundMultiFromPos
|
||||
soundMultiFrom
|
||||
:: [SoundOrigin]
|
||||
-> Int -- ^ Sound ID
|
||||
-> Int -- ^ Frames to play for
|
||||
-> Int -- ^ Fade out time (ms)
|
||||
-> Point2 -- ^ Position
|
||||
-> Int -- ^ Sound ID
|
||||
-> Maybe Int -- ^ Frames to play for, Nothing for full length
|
||||
-> World
|
||||
-> World
|
||||
soundMultiFromPos [] _ _ _ _ w = w
|
||||
soundMultiFromPos (so:sos) sType time fadeTime pos w
|
||||
| so `M.member` _sounds w = soundMultiFromPos sos sType time fadeTime pos w
|
||||
soundMultiFrom [] _ _ _ w = w
|
||||
soundMultiFrom (so:sos) pos sType mtime w
|
||||
| so `M.member` _sounds w = soundMultiFrom sos pos sType mtime w
|
||||
| otherwise = over sounds (M.insert so sound) w
|
||||
where
|
||||
sound = Sound
|
||||
{ _soundChunkID = sType
|
||||
, _soundTime = Nothing
|
||||
, _soundTime = mtime
|
||||
, _soundStatus = ToStart
|
||||
, _soundFadeTime = fadeTime
|
||||
, _soundChannel = Nothing
|
||||
, _soundAngDist = Just (a,0)
|
||||
, _soundPos = pos
|
||||
|
||||
Reference in New Issue
Block a user