-
Notifications
You must be signed in to change notification settings - Fork 1
/
Pirate.elm
93 lines (70 loc) · 2.13 KB
/
Pirate.elm
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
module Pirate exposing (Pirate, toEntity, move, takeAHit, isDead)
import Element exposing (Element)
import Entity exposing (Entity)
import Map exposing (Map)
import AStar
import Euclid.Vector as Vector
import Coordinate
import Time exposing (Time)
type alias Pirate =
{ position : Coordinate.Global
, path : Maybe AStar.Path
, health : Int
}
toEntity : Pirate -> Entity
toEntity { position } =
{ position = position
, width = width
, height = height
, imagePath = imagePath
}
move : Time -> Pirate -> Pirate
move diff pirate =
case pirate.path of
Just (nextPoint :: rest) ->
let
distanceToNextPoint =
AStar.pythagoreanCost (Coordinate.toTuple pirate.position)
nextPoint
distanceInThisInterval =
(Time.inSeconds diff) * speedPerSecond
in
if distanceToNextPoint > distanceInThisInterval then
let
( nextX, nextY ) =
nextPoint
thisTickG =
Coordinate.fromGlobalXY nextX nextY
|> Coordinate.toLocal pirate.position
|> Coordinate.setMagnitude distanceInThisInterval
|> Coordinate.toGlobal pirate.position
in
{ pirate | position = thisTickG }
else
let
( newX, newY ) =
nextPoint
newPosition =
Coordinate.fromGlobalXY newX newY
in
{ pirate | position = newPosition, path = Just rest }
_ ->
pirate
takeAHit : Pirate -> Pirate
takeAHit pirate =
{ pirate | health = pirate.health - 1 }
isDead : Pirate -> Bool
isDead { health } =
health <= 0
imagePath : String
imagePath =
"images/pirate-new.png"
width : Int
width =
33
height : Int
height =
56
speedPerSecond : number
speedPerSecond =
60