aboutsummaryrefslogtreecommitdiff
path: root/src/Update/Update.elm
blob: 0187dcfd7f1f49b88360d9fee000a5b6dc2f9063 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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)