packages feed

spanout-0.1: src/Spanout/Common.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}

module Spanout.Common
  ( M
  , type (->>)

  , GameState(..)
  , gsBall
  , gsBatX
  , gsBricks
  , Ball(..)
  , ballPos
  , ballVel
  , Brick(..)
  , brPos
  , brGeom
  , BrickGeom(..)

  , Env(..)
  , envMouse
  , envKeys

  , screenWidth
  , screenHeight
  , screenBoundX
  , screenBoundY
  , ballRadius
  , ballInit
  , batWidth
  , batHeight
  , batPositionY
  , batSpread
  , brickWidth
  , brickHeight
  , countdownTime
  , levelEndTime
  , bgColor
  , ballColor
  , batColor
  , brickColor
  , textScale
  , textColor
  ) where

import Spanout.Wire

import Control.Lens
import Control.Monad.Random
import Control.Monad.Reader

import Data.Set (Set)

import qualified Graphics.Gloss.Interface.IO.Game as Gloss

import Linear



-- The monad stack under reactive values
type M = ReaderT Env (Rand StdGen)

-- A reactive value of type `b`, which depends on a value of type `a`
type a ->> b = Wire (Timed Float ()) () M a b

data GameState = GameState
  { _gsBall          :: Ball
  , _gsBatX          :: Float
  , _gsBricks        :: [Brick]
  }

data Ball = Ball
  { _ballPos :: V2 Float
  , _ballVel :: V2 Float
  }

data Brick = Brick
  { _brPos  :: V2 Float
  , _brGeom :: BrickGeom
  }

data BrickGeom
  = Circle Float
  | Rectangle Float Float

data Env = Env
  { _envMouse :: V2 Float
  , _envKeys  :: Set Gloss.Key
  }

makeLenses ''GameState
makeLenses ''Ball
makeLenses ''Brick
makeLenses ''Env

screenWidth :: Float
screenWidth = 2 * (16 / 9)

screenHeight :: Float
screenHeight = 2

screenBoundX :: Float
screenBoundX = screenWidth / 2

screenBoundY :: Float
screenBoundY = screenHeight / 2

ballRadius :: Float
ballRadius = 0.05

ballInit :: Ball
ballInit = Ball
  { _ballPos = V2 0 (-screenBoundY + 4 * batHeight)
  , _ballVel = V2 0 (-1.75)
  }

batWidth :: Float
batWidth = 0.5

batHeight :: Float
batHeight = 0.07

batPositionY :: Float
batPositionY = -screenBoundY + batHeight / 2

batSpread :: Float
batSpread = pi / 12

brickWidth :: Float
brickWidth = 0.4

brickHeight :: Float
brickHeight = 0.12

countdownTime :: Float
countdownTime = 3

levelEndTime :: Float
levelEndTime = 1.5

bgColor :: Gloss.Color
bgColor = Gloss.makeColor8 0x31 0x2b 0x25 0xff

ballColor :: Gloss.Color
ballColor = Gloss.makeColor8 0x9f 0x87 0x6b 0xff

batColor :: Gloss.Color
batColor = Gloss.makeColor8 0x6d 0xa3 0x3a 0xff

brickColor :: Gloss.Color
brickColor = Gloss.makeColor8 0xb1 0x5b 0x3e 0xff

textScale :: Float
textScale = 0.004

textColor :: Gloss.Color
textColor = Gloss.chartreuse