module World where
import qualified Physics.Hipmunk as H
import qualified Graphics.UI.GLFW as G
import Data.StateVar
import Control.Monad
import Data.Maybe
import Types
import Utils
import qualified IxMap as M
import Pure
import Dirty
import Inits
import Graphics
updateWorld :: World -> IO (World, Time)
updateWorld world = do
t0 <- get G.time
(sense, events) <- percept dirty
let (pure', queries) = updatePure sense events pure
dirty' <- react queries dirty
t1 <- get G.time
return (World pure' dirty', t1 - t0)
where dirty = worldDirty world
pure = worldPure world
percept :: Dirty -> IO (Sense, [Event])
percept a = do
hero <- obj2hero $ dirtyHero a
balls <- mapM (uncurry obj2ball) $ M.toList $ dirtyObjs a
evts1 <- fmap maybeToList $ getTouch (dirtyTouchVar a) $ dirtyObjs a
evts2 <- fmap maybeToList $ getClick $ dirtyMouse a
return $ (Sense hero balls, evts1 ++ evts2)
updatePure :: Sense -> [Event] -> Pure -> (Pure, [Query])
updatePure s evts = updateEvents evts . updateSenses s
react :: [Query] -> Dirty -> IO Dirty
react = foldr (<=<) return
. fmap (foldQuery removeBall heroVelocity
makeBall gameOver (stepDirty dt))
drawWorld :: World -> IO ()
drawWorld = draw . picture . worldPure
initWorld :: IO World
initWorld = do
dirty <- initDirty
(sense, events) <- percept dirty
return $ World (initPure sense events) dirty