{-# LANGUAGE GeneralizedNewtypeDeriving #-} module Game ( Bullet(..) , GameState(..) , Game , runGame ) where import Level import Tank import Texture import Control.Monad import Control.Monad.State import Data.Fixed import qualified Data.Map as M data Bullet = Bullet { bulletX :: !Micro , bulletY :: !Micro , bulletDir :: !Micro , bulletSpeed :: !Micro , bulletBouncesLeft :: !Int , bulletTank :: !Int } deriving Show data GameState = GameState { level :: !Level , tanks :: ![Tank] , bullets :: ![Bullet] , textures :: !(M.Map Texture TextureObject) } deriving (Show) newtype Game a = Game (StateT GameState IO a) deriving (Monad, MonadIO, MonadState GameState) runGame :: GameState -> Game a -> IO (a, GameState) runGame st (Game a) = runStateT a st