summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/shared/struct/map/shr_map.erl')
-rw-r--r-- | src/shared/struct/map/shr_map.erl | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/src/shared/struct/map/shr_map.erl b/src/shared/struct/map/shr_map.erl new file mode 100644 index 0000000..b72c566 --- /dev/null +++ b/src/shared/struct/map/shr_map.erl @@ -0,0 +1,176 @@ +-module(shr_map). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-type id() :: ataxia_id:type(). + +-record +( + map, + { + owner :: shr_player:id(), + width :: non_neg_integer(), + height :: non_neg_integer(), + tile_instances :: shr_tile:instances_tuple(), + markers :: shr_map_marker:collection() + } +). + +-opaque type() :: #map{}. + +-export_type([type/0, id/0]). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-export +( + [ + get_owner/1, + get_width/1, + get_height/1, + get_tile_instances/1, + get_tile_instance/2, + get_markers/1, + get_marker/2, + + get_used_tile_ids/1 + ] +). + +%%%% Fields +-export +( + [ + get_width_field/0, + get_height_field/0, + get_markers_field/0, + get_tile_instances_field/0 + ] +). + +%%%% Utility +-export +( + [ + update_from_list/5, + default/1 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec location_to_index + ( + non_neg_integer(), + shr_location:type() + ) + -> ('error' | non_neg_integer()). +location_to_index (ArrayWidth, {X, Y}) -> + if + (X < 0) -> error; + (Y < 0) -> error; + (X >= ArrayWidth) -> error; + true -> ((Y * ArrayWidth) + X) + end. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-spec get_owner (type()) -> shr_player:id(). +get_owner (Map) -> Map#map.owner. + +-spec get_width (type()) -> non_neg_integer(). +get_width (Map) -> Map#map.width. + +-spec get_height (type()) -> non_neg_integer(). +get_height (Map) -> Map#map.height. + +-spec get_tile_instances (type()) -> shr_tile:instances_tuple(). +get_tile_instances (Map) -> Map#map.tile_instances. + +-spec get_tile_instance (shr_location:type(), type()) -> shr_tile:instance(). +get_tile_instance (Location, Map) -> + TileIX = location_to_index(Map#map.width, Location), + element((TileIX + 1), Map#map.tile_instances). + +-spec get_markers (type()) -> shr_map_marker:collection(). +get_markers (Map) -> Map#map.markers. + +-spec get_marker + ( + shr_map_marker:name(), + type() + ) + -> ('not_found' | {'ok', shr_map_marker:type()}). +get_marker (Name, Map) -> + shr_map_marker:get(Name, Map#map.markers). + +%%%% Fields +-spec get_width_field () -> non_neg_integer(). +get_width_field () -> #map.width. + +-spec get_height_field () -> non_neg_integer(). +get_height_field () -> #map.height. + +-spec get_markers_field () -> non_neg_integer(). +get_markers_field () -> #map.markers. + +-spec get_tile_instances_field () -> non_neg_integer(). +get_tile_instances_field () -> #map.tile_instances. + +%%%% Utility +-spec get_used_tile_ids (type()) -> ordsets:ordset(shr_tile:class_id()). +get_used_tile_ids (Map) -> + UsedTileIDs = + lists:foldl + ( + fun (TileInstance, CurrentTileIDs) -> + ordsets:add_element + ( + shr_tile:extract_main_class_id(TileInstance), + CurrentTileIDs + ) + end, + ordsets:new(), + tuple_to_list(Map#map.tile_instances) + ), + + UsedTileIDs. + +-spec update_from_list + ( + type(), + non_neg_integer(), + non_neg_integer(), + shr_map_marker:collection(), + list(list(binary())) + ) + -> type(). +update_from_list (Map, Width, Height, Markers, List) -> + TileInstances = lists:map(fun shr_tile:instance_from_binary_list/1, List), + + Map#map + { + width = Width, + height = Height, + markers = Markers, + tile_instances = list_to_tuple(TileInstances) + }. + +-spec default (binary()) -> type(). +default (Owner) -> + DefaultTileInstance = shr_tile:default_tile_instance(), + + #map + { + owner = Owner, + width = 32, + height = 32, + markers = shr_map_marker:empty_collection(), + tile_instances = list_to_tuple(lists:duplicate(1024, DefaultTileInstance)) + }. |