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.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 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
, scores <- game.currentScore :: game.scores
}
else
let newTime = game.time + input.delta
newPlayer = playerStep input.delta input.dir (newKeyCode game.keysDown input.inputKeysDown) game.player
(newCloud, addScore, newSeed) = cloudUpdate game.time 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 -> (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)
|