{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE LambdaCase #-}
module Imj.Game.Hamazed.Loop.Deadlines
( getNextDeadline
) where
import Imj.Prelude
import Data.List( minimumBy, find )
import Data.Maybe( catMaybes )
import Imj.Game.Hamazed.Level
import Imj.Game.Hamazed.Loop.Event.Types
import Imj.Game.Hamazed.Types
import Imj.Graphics.UI.Animation
import Imj.Graphics.Animation.Design.Update
import Imj.Timing
getNextDeadline :: GameState
-> SystemTime
-> Maybe Deadline
getNextDeadline s t =
let l = getDeadlinesByDecreasingPriority s t
in overdueDeadline t l <|> earliestDeadline' l
earliestDeadline' :: [Deadline] -> Maybe Deadline
earliestDeadline' [] = Nothing
earliestDeadline' l = Just $ minimumBy (\(Deadline t1 _) (Deadline t2 _) -> compare t1 t2 ) l
overdueDeadline :: SystemTime -> [Deadline] -> Maybe Deadline
overdueDeadline t = find (\(Deadline (KeyTime t') _) -> t' < t)
getDeadlinesByDecreasingPriority :: GameState -> SystemTime -> [Deadline]
getDeadlinesByDecreasingPriority s@(GameState _ _ _ _ level _) t =
catMaybes [ uiAnimationDeadline s
, messageDeadline level t
, getMoveFlyingItemsDeadline s
, animationDeadline s
]
getMoveFlyingItemsDeadline :: GameState -> Maybe Deadline
getMoveFlyingItemsDeadline (GameState nextGameStep _ _ _ (Level _ _ levelFinished) _) =
maybe
(maybe
Nothing
(\s -> Just $ Deadline s MoveFlyingItems)
nextGameStep)
(const Nothing)
levelFinished
animationDeadline :: GameState -> Maybe Deadline
animationDeadline (GameState _ world _ _ _ _) =
maybe Nothing (\ti -> Just $ Deadline ti Animate) $ earliestAnimationDeadline world
uiAnimationDeadline :: GameState -> Maybe Deadline
uiAnimationDeadline (GameState _ _ _ _ _ uianim) =
maybe
Nothing
(\deadline -> Just $ Deadline deadline AnimateUI)
$ getUIAnimationDeadline uianim
earliestAnimationDeadline :: World -> Maybe KeyTime
earliestAnimationDeadline (World _ _ _ animations _) =
earliestKeyTime $ map getDeadline animations
earliestKeyTime :: [KeyTime] -> Maybe KeyTime
earliestKeyTime deadlines =
if null deadlines
then
Nothing
else
Just $ minimum deadlines