From 3a1cbfe23a3d06c3c30828c623a089868cff0670 Mon Sep 17 00:00:00 2001 From: Joris Date: Sun, 2 Oct 2016 15:34:27 +0200 Subject: Add saw-tooth move and multiple moves per level --- src/Model/Level.elm | 105 ++++++++++++++++++++++------------------------------ 1 file changed, 45 insertions(+), 60 deletions(-) (limited to 'src/Model/Level.elm') diff --git a/src/Model/Level.elm b/src/Model/Level.elm index 9a60b9a..9daa60a 100644 --- a/src/Model/Level.elm +++ b/src/Model/Level.elm @@ -1,26 +1,27 @@ module Model.Level exposing - ( currentLevel + ( levelScoreDuration + , currentLevel , currentLevelScore , currentLevelNumber , progressiveColor - , levelScoreDuration ) import Time exposing (Time) -import Debug +import Color as Color exposing (Color) +import List.Nonempty as NE exposing (Nonempty(..), (:::)) -import Model.Color exposing (..) -import Model.Vec2 exposing (..) -import Model.Point exposing (pointSpeed) +import Model.Vec2 as Vec2 exposing (Vec2) -import Utils.Physics exposing (getMove, getWaveMove) +import Utils.Physics as Physics +import Utils.Color as Color levelScoreDuration : Int levelScoreDuration = 20 +type alias Move = Vec2 -> Vec2 -> Time -> Vec2 + type alias Level = - { color : Color - , move : Vec2 -> Vec2 -> Time -> Vec2 + { moves : Nonempty Move } currentLevelScore : Int -> Int @@ -28,17 +29,10 @@ currentLevelScore currentScore = currentScore - (currentLevelNumber currentScore - 1) * levelScoreDuration currentLevelNumber : Int -> Int -currentLevelNumber currentScore = - min - (List.length levels + 1) - (currentScore // levelScoreDuration + 1) +currentLevelNumber currentScore = currentScore // levelScoreDuration + 1 currentLevel : Int -> Level -currentLevel currentScore = - levels - |> List.drop (currentScore // levelScoreDuration) - |> List.head - |> Maybe.withDefault lastLevel +currentLevel currentScore = NE.get (currentScore // levelScoreDuration) levels nextLevel : Int -> Level nextLevel currentScore = currentLevel (currentScore + levelScoreDuration) @@ -47,50 +41,41 @@ progressiveColor : Int -> Color progressiveColor currentScore = let reminder = currentScore `rem` levelScoreDuration ratio = progressiveRatio reminder levelScoreDuration - currentColor = (currentLevel currentScore).color - nextColor = (nextLevel currentScore).color - in mergeColors ratio nextColor currentColor + 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) --- Hue + 35 with gimp each time from the first color -levels : List Level -levels = - [ { color = { red = 156, green = 168, blue = 233 } - , move = \initPos initDest delta -> getMove (delta / 20) (initDest `sub` initPos) - } - , { color = { red = 190, green = 156, blue = 233 } - , move = \initPos initDest delta -> getWaveMove (delta / 20) (initDest `sub` initPos) 10 10 - } - , { color = { red = 233, green = 156, blue = 232 } - , move = \initPos initDest delta -> getMove (delta / 18) (initDest `sub` initPos) - } - , { color = { red = 233, green = 156, blue = 187 } - , move = \initPos initDest delta -> getWaveMove (delta / 18) (initDest `sub` initPos) 20 20 - } - , { color = { red = 233, green = 171, blue = 156 } - , move = \initPos initDest delta -> getMove (delta / 13) (initDest `sub` initPos) - } - , { color = { red = 233, green = 215, blue = 156 } - , move = \initPos initDest delta -> getWaveMove (delta / 16) (initDest `sub` initPos) 10 50 - } - , { color = { red = 206, green = 233, blue = 156 } - , move = \initPos initDest delta -> getMove (delta / 11) (initDest `sub` initPos) - } - , { color = { red = 162, green = 233, blue = 156 } - , move = \initPos initDest delta -> getWaveMove (delta / 14) (initDest `sub` initPos) 30 15 - } - , { color = { red = 156, green = 233, blue = 196 } - , move = \initPos initDest delta -> getMove (delta / 8) (initDest `sub` initPos) - } - , { color = { red = 156, green = 225, blue = 233 } - , move = \initPos initDest delta -> getWaveMove (delta / 12) (initDest `sub` initPos) 30 30 - } - ] +initialColor : Color +initialColor = Color.rgb 156 168 233 -lastLevel : Level -lastLevel = - { color = { red = 156, green = 225, blue = 233 } - , move = \initPos initDest delta -> getWaveMove (delta / 5) (initDest `sub` initPos) 30 30 - } +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 ] } + ] -- cgit v1.2.3