{-# LANGUAGE GeneralizedNewtypeDeriving #-} module Game ( Tank(..) , Shoot(..) , GameState(..) , Game , runGame ) where import Level import Texture import Control.Monad import Control.Monad.State import Data.Fixed import qualified Data.Map as M data Tank = Tank { tankX :: !Micro , tankY :: !Micro , tankDir :: !Micro , tankAim :: !Micro , tankSpeed :: !Micro , tankTurnspeed :: !Micro , tankMoving :: !Bool , tankShootSpeed :: !Micro , tankShootBounces :: !Int , tankShootsLeft :: !Int } deriving Show data Shoot = Shoot { shootX :: !Micro , shootY :: !Micro , shootDir :: !Micro , shootSpeed :: !Micro , shootBouncesLeft :: !Int , shootTank :: !Int } deriving Show data GameState = GameState { level :: !Level , tanks :: ![Tank] , shoots :: ![Shoot] , 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