{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Imj.Game.Hamazed.Loop.Create
( mkInitialState
) where
import Imj.Prelude
import Control.Monad.IO.Class(MonadIO)
import Imj.Game.Hamazed.Color
import Imj.Game.Hamazed.Infos
import Imj.Game.Hamazed.Parameters
import Imj.Game.Hamazed.Types
import Imj.Game.Hamazed.World.Create
import Imj.Game.Hamazed.World.Size
import Imj.Game.Hamazed.World.InTerminal
import Imj.Graphics.UI.Animation
import Imj.Graphics.UI.Colored
import Imj.Timing
mkInitialState :: (MonadIO m)
=> GameParameters
-> Int
-> Maybe GameState
-> m (Either String GameState)
mkInitialState (GameParameters shape wallType) levelNumber mayState = do
let numbers = [1..(3+levelNumber)]
target = sum numbers `quot` 2
newLevel = Level levelNumber target Nothing
newSize = worldSizeFromLevel levelNumber shape
newAmmo = 10
newShotNums = []
make ew = do
newWorld <- mkWorld ew newSize wallType numbers newAmmo
t <- liftIO getSystemTime
let (curWorld, level, ammo, shotNums) =
maybe
(newWorld, newLevel, 0, [])
(\(GameState _ w@(World _ (BattleShip _ curAmmo _ _) _ _ _)
_ curShotNums curLevel _) ->
(w, curLevel, curAmmo, curShotNums))
mayState
curInfos = mkInfos Normal ammo shotNums level
newInfos = mkInfos ColorAnimated newAmmo newShotNums newLevel
uiAnimation =
mkUIAnimation
(Colored worldFrameColors $ mkWorldContainer curWorld, curInfos)
(Colored worldFrameColors $ mkWorldContainer newWorld, newInfos)
t
gameDeadline =
if isFinished uiAnimation
then
Just $ KeyTime t
else
Nothing
return $ Right $ GameState gameDeadline curWorld newWorld newShotNums newLevel uiAnimation
mkInTerminal newSize >>= either (return . Left) make