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)