aboutsummaryrefslogtreecommitdiff
path: root/src/Update/Update.elm
blob: 2183d9798e55a3d2ddc3b65f384db5df4ccb4b20 (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
55
56
57
58
59
60
61
module Update.Update
  ( update
  ) where

import List
import Keyboard (KeyCode)
import Char (fromCode, toCode)
import Maybe

import Model.Player (..)
import Model.Vec2 (..)
import Model.Config (otherConfig)
import Model.Cloud (..)
import Model.Game (..)
import Model.Round (Round)

import Utils.Geometry (..)
import Utils.Physics (getNewPosAndSpeed)

import Update.CloudUpdate (cloudUpdate)

import Input (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 <- game.rounds `List.append` [Round game.time game.currentScore]
          }
        else
          let newTime = game.time + input.delta
              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 <- newTime
              , 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 : 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)