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
|
|
{ posx :: !Micro
|
|
, posy :: !Micro
|
|
, dir :: !Micro
|
|
, aim :: !Micro
|
|
, speed :: !Micro
|
|
, turnspeed :: !Micro
|
|
, moving :: !Bool
|
|
, tankShootSpeed :: !Micro
|
|
, tankShootBounces :: !Int
|
|
, shootsLeft :: !Int
|
|
} deriving Show
|
|
|
|
data Shoot = Shoot
|
|
{ shootX :: !Micro
|
|
, shootY :: !Micro
|
|
, shootDir :: !Micro
|
|
, shootSpeed :: !Micro
|
|
, bouncesLeft :: !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
|