-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathTower.elm
145 lines (107 loc) · 3.13 KB
/
Tower.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
module Tower
exposing
( Placement
, Tower
, isReadyToShoot
, shoot
, timeElapsed
, placement
, renderPlacement
, noPlacement
, renderTowers
, placeTower
, maxRange
)
import Element exposing (Element)
import Map exposing (Map, Pixels(..))
import Mouse
import Tile
import TileSheet exposing (TileSheet)
import Time exposing (Time)
import Color
import Coordinate
type alias Tower =
{ tileNumber : Map.TileNumber
, position : Coordinate.Global
, timeSinceLastShot : Time
}
isReadyToShoot : Tower -> Bool
isReadyToShoot { timeSinceLastShot } =
timeSinceLastShot > reloadTime
shoot : Time -> Tower -> Tower
shoot diff tower =
{ tower | timeSinceLastShot = tower.timeSinceLastShot + diff - reloadTime }
timeElapsed : Time -> Tower -> Tower
timeElapsed diff tower =
{ tower | timeSinceLastShot = tower.timeSinceLastShot + diff }
reloadTime : Time
reloadTime =
Time.second / 1
fromTileNumber : Map -> Map.TileNumber -> Tower
fromTileNumber map tileNumber =
{ tileNumber = tileNumber
, position = Map.centerOfTile map tileNumber
, timeSinceLastShot = 0
}
maxRange : number
maxRange =
100
type Placement
= NoPlacement
| InvalidPlacement Map.TileNumber
| ValidPlacement Map.TileNumber
noPlacement : Placement
noPlacement =
NoPlacement
placement : Mouse.Position -> Map -> Placement
placement { x, y } map =
let
(Pixels mapWidth) =
Map.pixelWidth map
(Pixels mapHeight) =
Map.pixelHeight map
tileNumber =
Map.tileNumberFromCoords x y map
in
if x < mapWidth && y < mapHeight then
if Map.isBuildableTile map tileNumber then
ValidPlacement tileNumber
else
InvalidPlacement tileNumber
else
NoPlacement
placeTower : Map -> List Tower -> Placement -> List Tower
placeTower map towers placement =
case placement of
ValidPlacement tileNumber ->
(fromTileNumber map tileNumber) :: towers
_ ->
towers
renderPlacement : Map -> Placement -> Element
renderPlacement map towerPlacement =
case towerPlacement of
ValidPlacement tileNumber ->
validPlacementOverlay
|> Map.renderAtTile map tileNumber
InvalidPlacement tileNumber ->
invalidPlacementOverlay map.sheet
|> Map.renderAtTile map tileNumber
NoPlacement ->
Element.empty
renderTowerSprite : Element
renderTowerSprite =
Tile.render TileSheet.kennyPirates Tile.kennyPirateTower
validPlacementOverlay : Element
validPlacementOverlay =
renderTowerSprite
|> Element.opacity 0.66
invalidPlacementOverlay : TileSheet -> Element
invalidPlacementOverlay { tileSide } =
Element.spacer tileSide tileSide
|> Element.color Color.red
|> Element.opacity 0.3
renderTowers : Map -> List Tower -> Element
renderTowers map towers =
towers
|> List.map (\{ tileNumber } -> Map.renderAtTile map tileNumber renderTowerSprite)
|> Element.layers