packages feed

4Blocks-0.2: Core/Level.hs

module Core.Level ( Level,
                    getGravityFromLevel,
                    getGoalFromLevel,
                    getLevelNumFromLevel,
                    initLevel,
                    incLevel,
                    decLevel )

where

data Level = Level {
               gravity :: Int,
               goal :: Integer
             } deriving Show
             
getGravityFromLevel :: Level -> Int
getGravityFromLevel (Level gravity _) = gravity             

getGoalFromLevel :: Level -> Integer
getGoalFromLevel (Level _ goal) = goal

getLevelNumFromLevel :: Level -> Int
getLevelNumFromLevel (Level gravity _)
  = if gravity >= 1 
      then gravity - 1
      else gravity

initLevel :: Int -> Level
initLevel level = Level newGravity newGoal
  where newGravity = if level >= 0 
                       then level+1
                       else level
        newGoal = if (newGravity < 0) 
                    then 0
                    else getGoalFromGravity newGravity
        
incLevel :: Level -> Level
incLevel (Level gravity goal) = Level newGravity newGoal
  where newGravity = incGravity gravity
        newGoal = if (newGravity < 0) 
                    then 0
                    else getGoalFromGravity newGravity
                    
decLevel :: Level -> Level
decLevel (Level gravity goal) = Level newGravity newGoal
  where newGravity = decGravity gravity
        newGoal = if (newGravity < 0) 
                    then 0
                    else getGoalFromGravity newGravity

getGoalFromGravity :: Int -> Integer
getGoalFromGravity n =  toInteger $ foldr1 (+) (map (*5) [1..n])

-- Increment Gravity
incGravity :: Int -> Int
incGravity gravity
  | gravity < -1   = gravity+1
  | gravity == -1  = 1
  | (gravity >= 1) = gravity+1

-- Decrement Gravity
decGravity :: Int -> Int
decGravity gravity
  | gravity > 1     = gravity-1
  | gravity == 1    = -1
  | (gravity <= -1) = gravity-1