{-# LANGUAGE TemplateHaskell #-} module Play.Engine.Load where import SDL.Vect (V4(..)) import qualified SDL import qualified Play.Engine.MySDL.MySDL as MySDL import Play.Engine import Control.Monad.Except import Control.Lens data State = State { _timer :: Int , _filepaths :: [(String, MySDL.ResourceType FilePath)] , _nextScene :: MySDL.Resources -> Result Scene } makeLenses ''State mkState :: Int -> [(String, MySDL.ResourceType FilePath)] -> (MySDL.Resources -> Result Scene) -> Scene mkState time files next = Scene $ SceneF (initState time files next) update render initState :: Int -> [(String, MySDL.ResourceType FilePath)] -> (MySDL.Resources -> Result Scene) -> State initState = State update :: Input -> State -> Result ([MySDL.Request], (StackCommand, State)) update _ s@(State t _ _) | t > 0 = pure ([], (None, s & over timer (\n -> n - 1))) update input s@(State _ files next) = case (files, responses input) of ([], []) -> pure ([], (None, s)) ([], [MySDL.Exception e]) -> throwError [e] ([], [MySDL.ResourcesLoaded resources]) -> do next' <- next resources pure ([], (Replace next', s)) ([], rs) -> throwError ["Unexpected number of responses: " ++ show (length rs)] (files', _) -> pure ([MySDL.Load files'], (None, set filepaths [] s)) render :: SDL.Renderer -> State -> IO () render renderer state = let c = fromIntegral $ state ^. timer in void $ MySDL.setBGColor ( V4 (20 `mod` 255) ((10 + (c `div` 3)) `mod` 255) ((20 + (c `div` 2)) `mod` 255) 255 ) renderer