module Update.Update ( update ) where import List import Keyboard exposing (KeyCode) import Char exposing (fromCode, toCode) import Maybe import Set import Set exposing (Set) import Model.Player exposing (..) import Model.Vec2 exposing (..) import Model.Config exposing (otherConfig) import Model.Cloud exposing (..) import Model.Game exposing (..) import Model.Round exposing (Round) import Utils.Geometry exposing (..) import Utils.Physics exposing (getNewPosAndSpeed) import Update.CloudUpdate exposing (cloudUpdate) import Input exposing (Input) update : Input -> Game -> Game update input game = let hostilePoints = game.cloud.points (otherConfig game.player.config) in if(playerPointsCollision game.time game.player hostilePoints) then { game | time <- 0 , currentScore <- 0 , cloud <- initCloud , rounds <- (Round game.time game.currentScore) :: game.rounds } else let newPlayer = playerStep input.delta game.boardSize input.dir (newKeyCode game.keysDown input.inputKeysDown) game.player (newCloud, addScore, newSeed) = cloudUpdate game.time game.boardSize game.seed newPlayer game.cloud in { game | time <- game.time + input.delta , keysDown <- input.inputKeysDown , currentScore <- game.currentScore + addScore , player <- newPlayer , cloud <- newCloud , seed <- newSeed } playerStep : Float -> Vec2 -> Vec2 -> (KeyCode -> Bool) -> Player -> Player playerStep dt boardSize 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 boardSize playerSize pos , speed = speed , config = newConfig } newKeyCode : Set KeyCode -> Set KeyCode -> KeyCode -> Bool newKeyCode lastKeyCodes newKeyCodes keyCode = let contains = not << List.isEmpty << List.filter (\kc -> kc == keyCode) << Set.toList in not (contains lastKeyCodes) && (contains newKeyCodes)