Cleanup, haddocks

This commit is contained in:
2021-04-05 11:36:54 +02:00
parent dfee9b2f37
commit 772103f92c
9 changed files with 56 additions and 56 deletions
-1
View File
@@ -7,7 +7,6 @@ import Dodge.Data
import Dodge.Initialisation import Dodge.Initialisation
import Dodge.Rooms import Dodge.Rooms
import Dodge.Layout import Dodge.Layout
import Dodge.LoadSound
import Dodge.Update import Dodge.Update
import Dodge.Event import Dodge.Event
import Dodge.Render import Dodge.Render
+4 -2
View File
@@ -5,13 +5,15 @@ import Dodge.RandomHelp
import Geometry import Geometry
import System.Random import System.Random
import Control.Monad (replicateM)
import Data.Functor ((<&>))
import Control.Monad.State import Control.Monad.State
import Data.List (zip4) import Data.List (zip4)
main :: IO () main :: IO ()
main = do main = do
[ps1, ps2, ps3, ps4] <- mapM randomPoints [500,500,500,500] [ps1, ps2, ps3, ps4] <- mapM randomPoints [500,500,500,500]
fs <- sequence $ replicate 500 (randomRIO (1,20)) fs <- replicateM 500 (randomRIO (1,20))
defaultMain defaultMain
[ bgroup "circLine tests" [ bgroup "circLine tests"
[ bench "circLine" $ nf (map $ uncurry4 circOnLine) (zip4 ps1 ps2 ps3 fs) [ bench "circLine" $ nf (map $ uncurry4 circOnLine) (zip4 ps1 ps2 ps3 fs)
@@ -22,4 +24,4 @@ main = do
uncurry4 f (a,b,c,d) = f a b c d uncurry4 f (a,b,c,d) = f a b c d
randomPoints :: Int -> IO [Point2] randomPoints :: Int -> IO [Point2]
randomPoints i = getStdGen >>= return . evalState (sequence $ replicate i $ randInCirc 500) randomPoints i = getStdGen <&> evalState (replicateM i $ randInCirc 500)
+2 -6
View File
@@ -14,6 +14,7 @@ import Dodge.Item.Consumable
import Dodge.WorldEvent.Cloud import Dodge.WorldEvent.Cloud
import Dodge.Creature.YourControl import Dodge.Creature.YourControl
import Dodge.Creature.Inanimate import Dodge.Creature.Inanimate
import Dodge.Item
import Picture import Picture
import Geometry import Geometry
@@ -255,13 +256,9 @@ startCr = defaultCreature
[pistol [pistol
,blinkGun ,blinkGun
,spawnGun lamp ,spawnGun lamp
,flameGrenade ,poisonSprayer
,teslaGrenade
,autoGun ,autoGun
,launcher ,launcher
,flameLauncher
,poisonLauncher
,teslaLauncher
,lasGun ,lasGun
,grenade ,grenade
,ltAutoGun,flamer,multGun,spreadGun,remoteLauncher ,ltAutoGun,flamer,multGun,spreadGun,remoteLauncher
@@ -272,7 +269,6 @@ startCr = defaultCreature
,miniGun ,miniGun
,medkit 50 ,medkit 50
,bezierGun ,bezierGun
,poisonSprayer
] ]
++ repeat NoItem)) ++ repeat NoItem))
, _crCorpse = onLayer CorpseLayer $ color (greyN 0.5) $ pictures [color (greyN 0.8) $ circleSolid 10, circLine 10] , _crCorpse = onLayer CorpseLayer $ color (greyN 0.5) $ pictures [color (greyN 0.8) $ circleSolid 10, circLine 10]
-22
View File
@@ -1578,28 +1578,6 @@ jetPack = defaultEquipment
, _itID = Nothing , _itID = Nothing
} }
latchkey :: Int -> Item
latchkey n = defaultEquipment
{ _itIdentity = Generic
, _itName = "KEY "++show n
, _itMaxStack = 1
, _itAmount = 1
, _itFloorPict = onLayer FlItLayer $ latchkeyPic
, _itEquipPict = \cr _ -> onLayer PtLayer $ translate (-5) (-5) $ rotate (pi/2.5) latchkeyPic
, _itEffect = NoItEffect
, _itHammer = HammerUp
, _itID = Nothing
, _itAimingSpeed = 1
, _itAimingRange = 0
, _itZoom = defaultItZoom
, _itInvColor = yellow
, _itInvDisplay = _itName
}
latchkeyPic = color yellow $
pictures [translate (-4) 0 $ thickCircle 4 2
,lineOfThickness 2 [(0,0),(8,0),(8,-4)]
,lineOfThickness 2 [(4,0),(4,-4)]
]
-- }}} -- }}}
+9 -9
View File
@@ -90,13 +90,13 @@ errorPointInPolygon !i !p xs
-- | Debug version of 'normalizeV'. -- | Debug version of 'normalizeV'.
errorNormalizeV :: Int -> Point2 -> Point2 errorNormalizeV :: Int -> Point2 -> Point2
errorNormalizeV !i !(0,0) = error $ "problem with function: errorNormalizeV "++show i errorNormalizeV !i (0,0) = error $ "problem with function: errorNormalizeV "++show i
errorNormalizeV !i !p = normalizeV p errorNormalizeV !i !p = normalizeV p
-- | Debug version of 'angleVV'. -- | Debug version of 'angleVV'.
errorAngleVV :: Int -> Point2 -> Point2 -> Float errorAngleVV :: Int -> Point2 -> Point2 -> Float
errorAngleVV !i !(0,0) _ = error $ "problem with function: errorAngleVV "++show i errorAngleVV !i (0,0) _ = error $ "problem with function: errorAngleVV "++show i
errorAngleVV !i _ !(0,0) = error $ "problem with function: errorAngleVV "++show i errorAngleVV !i _ (0,0) = error $ "problem with function: errorAngleVV "++show i
errorAngleVV !i !p !p' = angleVV p p' errorAngleVV !i !p !p' = angleVV p p'
-- | Debug version of 'isLHS'. -- | Debug version of 'isLHS'.
@@ -126,9 +126,9 @@ isLHS
-> Bool -> Bool
{-# INLINE isLHS #-} {-# INLINE isLHS #-}
isLHS isLHS
!(x,y) (x,y)
!(x',y') (x',y')
!(x'',y'') (x'',y'')
| (x,y) == (x',y') = False | (x,y) == (x',y') = False
| otherwise = a1 * b2 - a2 * b1 > 0 | otherwise = a1 * b2 - a2 * b1 > 0
where where
@@ -146,9 +146,9 @@ isRHS
-> Bool -> Bool
{-# INLINE isRHS #-} {-# INLINE isRHS #-}
isRHS isRHS
!(x,y) (x,y)
!(x',y') (x',y')
!(x'',y'') (x'',y'')
| (x,y) == (x',y') = False | (x,y) == (x',y') = False
| otherwise = a1 * b2 - a2 * b1 < 0 | otherwise = a1 * b2 - a2 * b1 < 0
where where
-1
View File
@@ -8,7 +8,6 @@ import Foreign.C.Types
import GHC.Generics import GHC.Generics
import qualified GHC.Int import qualified GHC.Int
import qualified SDL import qualified SDL
import SDL.Internal.Numbered as SDL.Internal.Numbered
import System.Directory import System.Directory
+1 -1
View File
@@ -1,6 +1,6 @@
{-| {-|
Module : Loop Module : Loop
Description : A minimal game loop Description : Minimal game loop
This module sets up an SDL window which may be updated using a simple game loop. This module sets up an SDL window which may be updated using a simple game loop.
-} -}
+39 -13
View File
@@ -1,45 +1,64 @@
{-|
Module : Sound
Description : Channel selection and storage
This module checks for empty channels and plays sounds on them, using data chunks loaded into an IntMap,
and sound specifications of type 'Sound' loaded into a Map.
Uses SDL.Mixer.
-}
module Sound module Sound
where where
import Sound.Preload import Sound.Preload
import Control.Monad
import qualified SDL.Mixer as Mix import qualified SDL.Mixer as Mix
import Data.Maybe import Data.Maybe
import qualified Data.IntMap as IM import qualified Data.IntMap as IM
import qualified Data.Map as M import qualified Data.Map as M
import Control.Monad
import Control.Lens import Control.Lens
{- | Play sounds from a list of indices.
Each sound is played once if there is a free channel.
-}
playSoundQueue :: SoundData a -> [Int] -> IO () 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
-- this can be cleaned up {- | Given a chunk, attempt to play this on a free channel a given number of
times. Returns 'Just' the channel if succeeds.
-}
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
mayChan <- Mix.getAvailable Mix.DefaultGroup mayChan <- Mix.getAvailable Mix.DefaultGroup
case mayChan of case mayChan of
Nothing -> return Nothing Nothing -> return Nothing
Just i -> Just <$> Mix.playOn i times c Just i -> Just <$> Mix.playOn i times c
{- | Given a chunk and sound specification, play the chunk according to the specification
if there is a free channel.
On success return 'Just' an updated sound specification.
-}
playSoundIfFree :: Mix.Chunk -> Sound -> IO (Maybe Sound) playSoundIfFree :: Mix.Chunk -> Sound -> IO (Maybe Sound)
playSoundIfFree c s = case _soundTime s of playSoundIfFree c s = case _soundTime s of
Just _ -> (playIfFree c Mix.Forever) >>= return . f Just _ -> playIfFree c Mix.Forever >>= return . f
Nothing -> playIfFree c Mix.Once >>= return . f Nothing -> playIfFree c Mix.Once >>= return . f
where where
f :: Maybe Mix.Channel -> Maybe Sound f :: Maybe Mix.Channel -> Maybe Sound
f = fmap (\chan -> (s & soundChannel .~ Just chan)) f = fmap ( \chan -> s & soundChannel ?~ chan)
{- Stop a channel if it was playing.
Always returns 'IO' 'Nothing'.
-}
haltMaybe :: Maybe Mix.Channel -> IO (Maybe Sound) haltMaybe :: Maybe Mix.Channel -> IO (Maybe Sound)
haltMaybe (Just x) = Mix.halt x >> return Nothing haltMaybe (Just x) = Mix.halt x >> return Nothing
haltMaybe Nothing = return Nothing haltMaybe Nothing = return Nothing
-- logic: check if sound is playing: {- Play a sound according to it's specification.
-- if so, decrement timers, and/or stop playing and remove Logic: check if sound is playing:
-- if not, check if there is free channel:
-- if so, start playing - If so, decrement timers, and/or stop playing and remove
-- if not, remove sound - If not, check if there is free channel:
- If so, start playing
- If not, remove sound.
-}
playSound :: SoundData a -> Sound -> IO (Maybe Sound) playSound :: SoundData a -> Sound -> IO (Maybe Sound)
playSound sd s = case _soundChannel s of playSound sd s = case _soundChannel s of
Just i -> case _soundTime s of Just i -> case _soundTime s of
@@ -51,15 +70,22 @@ playSound sd s = case _soundChannel s of
) )
Nothing -> playSoundIfFree (_loadedChunks sd IM.! _soundType s) s Nothing -> playSoundIfFree (_loadedChunks sd IM.! _soundType s) s
{- Play all sounds and create new sound data.
-}
playSounds :: SoundData a -> IO (SoundData a) playSounds :: SoundData a -> IO (SoundData a)
playSounds sd = do playSounds sd = do
newSounds <- mapM (playSound sd) (_playingSounds sd) newSounds <- mapM (playSound sd) (_playingSounds sd)
return $ sd & playingSounds .~ M.mapMaybe id newSounds return $ sd & playingSounds .~ M.mapMaybe id newSounds
{- Update sound specifications by overwriting an old Map with a new Map.
Copies any information about channels from the old Map to the new Map.
-}
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 where
f newSound oldSound = newSound {_soundChannel = _soundChannel oldSound} f newSound oldSound = newSound {_soundChannel = _soundChannel oldSound}
{- Start playing new sounds and update sound specifications.
-}
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 = playSounds $ over playingSounds (updatePlaying new) sd playAndUpdate new sd = playSounds $ over playingSounds (updatePlaying new) sd