module Update.Update ( update ) where import List import Char exposing (fromCode, toCode, KeyCode) 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.elapsedTime game.player (getPlayerSize game.currentScore) hostilePoints) then { game | elapsedTime = 0 , currentScore = 0 , cloud = initCloud , rounds = (Round game.elapsedTime game.currentScore) :: game.rounds } else let newPlayer = playerStep input.delta game.boardSize input.dir (newKeyCode game.keysDown input.inputKeysDown) game.player (getPlayerSize game.currentScore) (newCloud, addScore, newSeed) = cloudUpdate game.elapsedTime game.boardSize game.seed newPlayer (getPlayerSize game.currentScore) game.cloud game.currentScore in { game | elapsedTime = game.elapsedTime + input.delta , keysDown = input.inputKeysDown , currentScore = game.currentScore + addScore , player = newPlayer , cloud = newCloud , seed = newSeed } playerStep : Float -> Vec2 -> Vec2 -> (KeyCode -> Bool) -> Player -> Float -> Player playerStep dt boardSize dir newKey player playerSize = 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)