aboutsummaryrefslogtreecommitdiff
path: root/src/Update/Update.elm
diff options
context:
space:
mode:
Diffstat (limited to 'src/Update/Update.elm')
-rw-r--r--src/Update/Update.elm54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/Update/Update.elm b/src/Update/Update.elm
new file mode 100644
index 0000000..0187dcf
--- /dev/null
+++ b/src/Update/Update.elm
@@ -0,0 +1,54 @@
+module Update.Update
+ ( update
+ ) where
+
+import List
+import Keyboard (KeyCode)
+import Char (fromCode, toCode)
+
+import Model.Player (..)
+import Model.Point (pointSpeed, pointMove, pointAwayDist)
+import Model.Vec2 (..)
+import Model.Config (otherConfig)
+import Model.Cloud (..)
+import Model.Game (..)
+
+import Utils.Geometry (..)
+import Utils.Physics (getNewPosAndSpeed)
+
+import Update.CloudUpdate (cloudUpdate)
+
+import Input (Input)
+
+update : Input -> Game -> Game
+update {dir, inputKeysDown, delta} {time, keysDown, score, player, cloud, bestScore, seed} =
+ let hostilePoints = cloud.points (otherConfig player.config)
+ in if(playerPointsCollision time player hostilePoints) then
+ let newBestScore = if(score > bestScore) then score else bestScore
+ in initialGame seed player.pos player.config newBestScore
+ else
+ let newTime = time + delta
+ newPlayer = playerStep delta dir (newKeyCode keysDown inputKeysDown) player
+ (newCloud, addScore, newSeed) = cloudUpdate time seed newPlayer cloud
+ in { time = newTime
+ , keysDown = inputKeysDown
+ , score = score + addScore
+ , player = newPlayer
+ , cloud = newCloud
+ , bestScore = bestScore
+ , seed = newSeed
+ }
+
+playerStep : Float -> Vec2 -> (KeyCode -> Bool) -> Player -> Player
+playerStep dt dir newKey player =
+ let (pos, speed) = getNewPosAndSpeed dt dir playerSpeed (player.pos, player.speed)
+ newConfig = if (newKey 69) then otherConfig player.config else player.config
+ in { pos = inBoard playerSize pos
+ , speed = speed
+ , config = newConfig
+ }
+
+newKeyCode : List KeyCode -> List KeyCode -> KeyCode -> Bool
+newKeyCode lastKeyCodes newKeyCodes keyCode =
+ let contains = not << List.isEmpty << List.filter (\kc -> kc == keyCode)
+ in not (contains lastKeyCodes) && (contains newKeyCodes)