52 lines
1.3 KiB
Haskell
52 lines
1.3 KiB
Haskell
{-# 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
|