Refactored world runner.
[hollow-plutonium.git] / Main.hs
blob5a74c5c9e81aa85685f24fca2a360afa5a7fbc19
1 module Main where
3 import Data.Function (fix)
4 import Data.IORef (newIORef, readIORef, writeIORef)
5 import Control.Monad
6 import Control.Monad.State
9 import Clock
10 import Video
11 import Audio
12 import World
13 import Input
14 import Output
17 main :: IO ()
18 main = do
19 video <- startVideo 320 240 UseSDL
20 audio <- startAudio
21 world <- (loadWorld video) >>= newIORef
22 quitRef <- newIORef False
23 clock <- mkClock 10 -- use 10ms time quantum (max 100fps)
24 fix $ \loop -> do
25 n <- readNewClockTicks clock -- blocks until n > 0
26 replicateM_ n $ do
27 inputs <- readRawInput quitRef
28 w <- readIORef world
29 let (w',outs) = runWorld inputs w -- 1 game step
30 writeIORef world w'
31 forM_ outs (execOutput video audio)
32 readIORef world >>= renderWorld video -- one graphics frame
33 done <- readIORef quitRef
34 when (not done) loop
35 endAudio
36 endVideo