content: module Inits where
  
  import Types
  import qualified Physics.Hipmunk as H
  import Utils
  
  title = "click-clack"
  
  
  ----------------------------
  -- inits
  
  -- frames per second
  fps :: Int
  fps = 60
  
  -- frame time in milliseconds
  frameTime :: Time
  frameTime = 1000 * ((1::Double) / fromIntegral fps)
  
  dt :: H.Time
  dt = 0.2
  
  minVel :: H.CpFloat
  minVel = 9
  
  creationPeriod :: Int
  creationPeriod = 170
  
  windowWidth, windowHeight, frameWidth, frameHeight, 
      frameOffset, wallOffset, w2, h2, o2 :: Double
  
  frameOffset     = 50
  frameWidth      = 700   
  frameHeight     = 500
  wallOffset      = 40
  
  windowWidth     = frameWidth  + 2*frameOffset
  windowHeight    = frameHeight + 2*frameOffset
  
  w2 = frameWidth/2;  h2 = frameHeight/2;  o2 = wallOffset/2
  
  ballRadius :: Double
  ballRadius = 11
  
  bonusRadius :: Double
  bonusRadius = frameHeight / 2.7
  
  bonusSleep :: Int
  bonusSleep = 7
  
  
  holePoints :: [H.Position]
  holePoints = [
          vec (-w2+dt) (-h2+dt),
          vec 0     (-h2+dt),
          vec (w2-dt)    (-h2+dt),
          vec (-w2+dt) (h2-dt),
          vec 0     (h2-dt),
          vec (w2-dt)  (h2-dt)
      ]
      where dt  = 5
  
  wallPoints :: [(H.Position, H.Position)]
  wallPoints = [
      (vec (-w2+o2) (-h2), vec (-o2) (-h2)),
      (vec o2 (-h2), vec (w2-o2) (-h2)),
      
      (vec (-w2+o2) h2, vec (-o2) h2),
      (vec o2 h2, vec (w2-o2) h2),
      
      (vec (-w2) (h2-o2), vec (-w2) (-h2+o2)),
      (vec   w2  (h2-o2), vec   w2  (-h2+o2))]
  
  
  goodBallCount, bonusBallCount, badBallCount :: Int
  
  goodBallCount   = 2
  bonusBallCount  = 4
  badBallCount    = 13
  
  livesNum :: Int
  livesNum = 15
  
  bonusNum :: Int
  bonusNum = 40
  
  minBallVel, maxBallVel :: H.CpFloat
  
  minBallVel = 7
  maxBallVel = 11
  
  
  wallThickness :: Double
  wallThickness = 1
  
  
  scoresY1, scoresWidth, scoresX1, scoresX2, scoresHeight :: Double
  
  scoresY1 = h2+30
  scoresY2 = scoresY1 - scoresHeight
  
  scoresX1 = -w2+o2
  scoresX2 = w2 - scoresWidth-o2
  
  scoresHeight = 20
  scoresWidth = 100
  
  
  livesRect :: Double -> (Point, Point)
  livesRect k =  
      ((Point scoresX1 scoresY1), 
       (Point (scoresX1+k*scoresWidth) scoresY2))
  
  bonusRect :: Double -> (Point, Point)
  bonusRect k =  
      ((Point scoresX2 scoresY1), 
       (Point (scoresX2+k*scoresWidth) scoresY2))
  
  
  
  resultPoint = Point (scoresX2-25) (scoresY2 )
  
  
  -- level up' we make it harder
  -- by rising number of balls
  
  incrBad, incrBonus, incrGood :: Int -> Int -> Int
  
  incrBad    = const (+3)
  incrBonus level
      | even level = (+1)
      | otherwise  = (+2)
  incrGood level  
      | even level    = succ 
      | otherwise     = id 
  
  
  