module Model.Level exposing ( levelScoreDuration , currentLevel , currentLevelScore , currentLevelNumber , progressiveColor ) import Time exposing (Time) import Color as Color exposing (Color) import List.Nonempty as NE exposing (Nonempty(..), (:::)) import Model.Vec2 as Vec2 exposing (Vec2) import Utils.Physics as Physics import Utils.Color as Color levelScoreDuration : Int levelScoreDuration = 20 type alias Move = Vec2 -> Vec2 -> Time -> Vec2 type alias Level = { moves : Nonempty Move } currentLevelScore : Int -> Int currentLevelScore currentScore = currentScore - (currentLevelNumber currentScore - 1) * levelScoreDuration currentLevelNumber : Int -> Int currentLevelNumber currentScore = currentScore // levelScoreDuration + 1 currentLevel : Int -> Level currentLevel currentScore = NE.get (currentScore // levelScoreDuration) levels nextLevel : Int -> Level nextLevel currentScore = currentLevel (currentScore + levelScoreDuration) progressiveColor : Int -> Color progressiveColor currentScore = let reminder = currentScore `rem` levelScoreDuration ratio = progressiveRatio reminder levelScoreDuration currentColor = color currentScore nextColor = color (currentScore + levelScoreDuration) in Color.merge ratio nextColor currentColor progressiveRatio : Int -> Int -> Float progressiveRatio a b = (toFloat a ^ 7) / (toFloat b ^ 7) initialColor : Color initialColor = Color.rgb 156 168 233 color : Int -> Color color score = Color.spin (toFloat <| 20 * (score // levelScoreDuration)) initialColor levels : Nonempty Level levels = let ma1 = \initPos initDest delta -> Physics.getMove (delta / 20) (initDest `Vec2.sub` initPos) ma2 = \initPos initDest delta -> Physics.getWaveMove (delta / 20) (initDest `Vec2.sub` initPos) 10 10 ma3 = \initPos initDest delta -> Physics.getSawToothMove (delta / 25) (initDest `Vec2.sub` initPos) 30 10 mb1 = \initPos initDest delta -> Physics.getMove (delta / 18) (initDest `Vec2.sub` initPos) mb2 = \initPos initDest delta -> Physics.getWaveMove (delta / 18) (initDest `Vec2.sub` initPos) 20 20 mb3 = \initPos initDest delta -> Physics.getSawToothMove (delta / 20) (initDest `Vec2.sub` initPos) 30 15 mc1 = \initPos initDest delta -> Physics.getMove (delta / 13) (initDest `Vec2.sub` initPos) mc2 = \initPos initDest delta -> Physics.getWaveMove (delta / 16) (initDest `Vec2.sub` initPos) 10 50 mc3 = \initPos initDest delta -> Physics.getSawToothMove (delta / 25) (initDest `Vec2.sub` initPos) 100 15 in Nonempty { moves = NE.fromElement ma1 } [ { moves = NE.fromElement ma2 } , { moves = NE.fromElement ma3 } , { moves = Nonempty ma1 [ ma2, ma3 ] } , { moves = NE.fromElement mb1 } , { moves = NE.fromElement mb2 } , { moves = NE.fromElement mb3 } , { moves = Nonempty mb1 [ mb2, mb3 ] } , { moves = NE.fromElement mc1 } , { moves = NE.fromElement mc2 } , { moves = NE.fromElement mc3 } , { moves = Nonempty mc1 [ mc2, mc3 ] } ]