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
|
-module(btl_map).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-type id() :: binary().
-record
(
map,
{
id :: id(),
width :: integer(),
height :: integer(),
tile_class_ids :: array:array(btl_tile:class_id())
}
).
-opaque type() :: #map{}.
-export_type([type/0, id/0]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Accessors
-export
(
[
get_id/1,
get_width/1,
get_height/1,
get_tile_class_ids/1,
get_tile_class_id/2
]
).
-export
(
[
from_list/4
]
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec location_to_array_index
(
non_neg_integer(),
btl_location:type()
)
-> ('error' | non_neg_integer()).
location_to_array_index (ArrayWidth, {X, Y}) ->
if
(X < 0) -> error;
(Y < 0) -> error;
(X >= ArrayWidth) -> error;
true -> ((Y * ArrayWidth) + X)
end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% Accessors
-spec get_id (type()) -> id().
get_id (Battlemap) -> Battlemap#map.id.
-spec get_width (type()) -> integer().
get_width (Battlemap) -> Battlemap#map.width.
-spec get_height (type()) -> integer().
get_height (Battlemap) -> Battlemap#map.height.
-spec get_tile_class_ids (type()) -> array:array(btl_tile:class_id()).
get_tile_class_ids (Battlemap) -> Battlemap#map.tile_class_ids.
-spec get_tile_class_id (btl_location:type(), type()) -> btl_tile:class_id().
get_tile_class_id (Location, Battlemap) ->
TileIX = location_to_array_index(Battlemap#map.width, Location),
array:get(TileIX, Battlemap#map.tile_class_ids).
-spec from_list
(
non_neg_integer(),
non_neg_integer(),
non_neg_integer(),
list(non_neg_integer())
)
-> type().
from_list (ID, Width, Height, List) ->
TileClassIDs = lists:map(fun btl_tile:class_id_from_int/1, List),
#map
{
id = list_to_binary(integer_to_list(ID)),
width = Width,
height = Height,
tile_class_ids = array:from_list(TileClassIDs)
}.
|