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
|
module Battlemap.Navigator exposing
(
Type,
Summary,
new,
get_current_location,
get_remaining_points,
get_range_markers,
get_summary,
try_adding_step,
try_getting_path_to
)
import Dict
import Battlemap.Location
import Battlemap.Direction
import Battlemap.Marker
import Battlemap.Navigator.Path
import Battlemap.Navigator.RangeIndicator
--------------------------------------------------------------------------------
-- TYPES -----------------------------------------------------------------------
--------------------------------------------------------------------------------
type alias Type =
{
starting_location: Battlemap.Location.Type,
movement_dist: Int,
attack_dist: Int,
path: Battlemap.Navigator.Path.Type,
range_indicators:
(Dict.Dict
Battlemap.Location.Ref
Battlemap.Navigator.RangeIndicator.Type
)
}
type alias Summary =
{
starting_location: Battlemap.Location.Type,
path: (List Battlemap.Direction.Type),
markers: (List (Battlemap.Location.Ref, Battlemap.Marker.Type))
}
--------------------------------------------------------------------------------
-- LOCAL -----------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- EXPORTED --------------------------------------------------------------------
--------------------------------------------------------------------------------
new : (
Battlemap.Location.Type ->
Int ->
Int ->
(Battlemap.Location.Type -> Bool) -> Type
)
new start_loc mov_dist atk_dist can_cross_fun =
{
starting_location = start_loc,
movement_dist = mov_dist,
attack_dist = atk_dist,
path = (Battlemap.Navigator.Path.new start_loc mov_dist),
range_indicators =
(Battlemap.Navigator.RangeIndicator.generate
start_loc
mov_dist
atk_dist
(can_cross_fun)
)
}
get_current_location : Type -> Battlemap.Location.Type
get_current_location navigator =
(Battlemap.Navigator.Path.get_current_location navigator.path)
get_remaining_points : Type -> Int
get_remaining_points navigator =
(Battlemap.Navigator.Path.get_remaining_points navigator.path)
get_range_markers : (
Type ->
(List
(Battlemap.Location.Ref, Battlemap.Navigator.RangeIndicator.Type)
)
)
get_range_markers navigator = (Dict.toList navigator.range_indicators)
get_summary : Type -> Summary
get_summary navigator =
{
starting_location = navigator.starting_location,
path = (Battlemap.Navigator.Path.get_summary navigator.path),
markers =
(List.map
(\(loc, range_indicator) ->
(
loc,
(Battlemap.Navigator.RangeIndicator.get_marker
range_indicator
)
)
)
(Dict.toList
navigator.range_indicators
)
)
}
try_adding_step : (
Type ->
Battlemap.Direction.Type ->
(Battlemap.Location.Type -> Bool) ->
(Battlemap.Location.Type -> Int) ->
(Maybe Type)
)
try_adding_step navigator dir can_cross cost_fun =
case
(Battlemap.Navigator.Path.try_following_direction
can_cross
cost_fun
(Just navigator.path)
dir
)
of
(Just path) -> (Just {navigator | path = path})
Nothing -> Nothing
try_getting_path_to : (
Type ->
Battlemap.Location.Ref ->
(Maybe (List Battlemap.Direction.Type))
)
try_getting_path_to navigator loc_ref =
case (Dict.get loc_ref navigator.range_indicators) of
(Just target) ->
(Just (Battlemap.Navigator.RangeIndicator.get_path target))
Nothing -> Nothing
|