From b251f5165ea3530747657b522773c4a8f44b16fa Mon Sep 17 00:00:00 2001 From: nsensfel Date: Mon, 18 Jun 2018 18:35:53 +0200 Subject: Separates tiles from their icon images IDs. The client has yet to be updated to support the new exchanges. --- src/battlemap/bm_shim.erl | 17 +++++- src/battlemap/game-logic/bm_movement.erl | 4 +- src/battlemap/query/bm_load_state.erl | 10 +++ src/battlemap/reply/bm_set_map.erl | 5 +- src/battlemap/struct/bm_battle.erl | 15 +++-- src/battlemap/struct/bm_battlemap.erl | 61 +++--------------- src/battlemap/struct/bm_tile.erl | 102 +++++++++++++++++++++++++------ 7 files changed, 139 insertions(+), 75 deletions(-) diff --git a/src/battlemap/bm_shim.erl b/src/battlemap/bm_shim.erl index 74f8c9d..4fdff05 100644 --- a/src/battlemap/bm_shim.erl +++ b/src/battlemap/bm_shim.erl @@ -154,6 +154,20 @@ generate_random_battle () -> Characters ), + UsedTileIDs = + array:sparse_foldl + ( + fun (_IX, TileClassID, CurrentTileIDs) -> + sets:add_element + ( + bm_tile:class_id_to_type_id(TileClassID), + CurrentTileIDs + ) + end, + sets:new(), + bm_battlemap:get_tile_class_ids(Battlemap) + ), + Battle = bm_battle:new ( @@ -162,7 +176,8 @@ generate_random_battle () -> Battlemap, Characters, sets:to_list(UsedWeaponIDs), - sets:to_list(UsedArmorIDs) + sets:to_list(UsedArmorIDs), + sets:to_list(UsedTileIDs) ), Battle. diff --git a/src/battlemap/game-logic/bm_movement.erl b/src/battlemap/game-logic/bm_movement.erl index ed4c38c..8bf2c5b 100644 --- a/src/battlemap/game-logic/bm_movement.erl +++ b/src/battlemap/game-logic/bm_movement.erl @@ -30,7 +30,9 @@ cross (_Battlemap, _ForbiddenLocations, [], Cost, Location) -> {Location, Cost}; cross (Battlemap, ForbiddenLocations, [Step|NextSteps], Cost, Location) -> NextLocation = bm_location:apply_direction(Step, Location), - NextTile = bm_battlemap:get_tile_id(NextLocation, Battlemap), + NextTileClassID = bm_battlemap:get_tile_class_id(NextLocation, Battlemap), + NextTileID = bm_tile:class_id_to_type_id(NextTileClassID), + NextTile = bm_tile:from_id(NextTileID), NextCost = (Cost + bm_tile:get_cost(NextTile)), IsForbidden = lists:foldl diff --git a/src/battlemap/query/bm_load_state.erl b/src/battlemap/query/bm_load_state.erl index 1406b4e..d7c53c7 100644 --- a/src/battlemap/query/bm_load_state.erl +++ b/src/battlemap/query/bm_load_state.erl @@ -102,11 +102,21 @@ generate_reply (QueryState, Input) -> bm_battle:get_used_armor_ids(Battle) ), + AddTileList = + lists:map + ( + fun (TileID) -> + bm_add_tile:generate(bm_tile:from_id(TileID)) + end, + bm_battle:get_used_tile_ids(Battle) + ), + OutputList = ( [SetTimeline, SetMap | AddWeaponList] ++ AddArmorList ++ AddCharList + ++ AddTileList ), Output = jiffy:encode(OutputList), diff --git a/src/battlemap/reply/bm_set_map.erl b/src/battlemap/reply/bm_set_map.erl index 992581b..9989fa0 100644 --- a/src/battlemap/reply/bm_set_map.erl +++ b/src/battlemap/reply/bm_set_map.erl @@ -23,6 +23,9 @@ generate (Battlemap) -> {<<"msg">>, <<"set_map">>}, {<<"w">>, bm_battlemap:get_width(Battlemap)}, {<<"h">>, bm_battlemap:get_height(Battlemap)}, - {<<"t">>, array:sparse_to_list(bm_battlemap:get_tile_ids(Battlemap))} + { + <<"t">>, + array:sparse_to_list(bm_battlemap:get_tile_class_ids(Battlemap)) + } ] }. diff --git a/src/battlemap/struct/bm_battle.erl b/src/battlemap/struct/bm_battle.erl index c4207e8..4c93460 100644 --- a/src/battlemap/struct/bm_battle.erl +++ b/src/battlemap/struct/bm_battle.erl @@ -10,8 +10,9 @@ battle, { id :: id(), - used_armor_ids:: list(sh_armor:id()), + used_armor_ids :: list(sh_armor:id()), used_weapon_ids :: list(sh_weapon:id()), + used_tile_ids :: list(bm_tile:id()), battlemap :: bm_battlemap:type(), characters :: array:array(bm_character:type()), players :: array:array(bm_player:type()), @@ -33,6 +34,7 @@ get_id/1, get_used_weapon_ids/1, get_used_armor_ids/1, + get_used_tile_ids/1, get_battlemap/1, get_characters/1, get_character/2, @@ -57,7 +59,7 @@ -export ( [ - new/6 + new/7 ] ). @@ -90,6 +92,9 @@ get_used_weapon_ids (Battle) -> Battle#battle.used_weapon_ids. -spec get_used_armor_ids (type()) -> list(sh_armor:id()). get_used_armor_ids (Battle) -> Battle#battle.used_armor_ids. +-spec get_used_tile_ids (type()) -> list(bm_tile:id()). +get_used_tile_ids (Battle) -> Battle#battle.used_tile_ids. + -spec get_battlemap (type()) -> bm_battlemap:type(). get_battlemap (Battle) -> Battle#battle.battlemap. @@ -183,15 +188,17 @@ set_current_player_turn (PlayerTurn, Battle) -> bm_battlemap:type(), list(bm_character:type()), list(sh_weapon:id()), - list(sh_armor:id()) + list(sh_armor:id()), + list(bm_tile:id()) ) -> type(). -new (ID, PlayersAsList, Battlemap, CharactersAsList, UWIDs, UAIDs) -> +new (ID, PlayersAsList, Battlemap, CharactersAsList, UWIDs, UAIDs, UTIDs) -> #battle { id = ID, used_weapon_ids = UWIDs, used_armor_ids = UAIDs, + used_tile_ids = UTIDs, battlemap = Battlemap, characters = array:from_list(CharactersAsList), players = array:from_list(PlayersAsList), diff --git a/src/battlemap/struct/bm_battlemap.erl b/src/battlemap/struct/bm_battlemap.erl index 6c9fbf9..77d3041 100644 --- a/src/battlemap/struct/bm_battlemap.erl +++ b/src/battlemap/struct/bm_battlemap.erl @@ -12,7 +12,7 @@ id :: id(), width :: integer(), height :: integer(), - tile_ids :: array:array(bm_tile:id()) + tile_class_ids :: array:array(bm_tile:class_id()) } ). @@ -30,15 +30,14 @@ get_id/1, get_width/1, get_height/1, - get_tile_ids/1, - get_tile_id/2 + get_tile_class_ids/1, + get_tile_class_id/2 ] ). -export ( [ - random/3, from_list/4 ] ). @@ -46,27 +45,6 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec generate_random_tile_ids - ( - bm_tile:id(), - list(bm_tile:id()), - non_neg_integer(), - non_neg_integer(), - non_neg_integer() - ) - -> list(bm_tile:id()). -generate_random_tile_ids (_PreviousTileID, Result, _X, 0, _Width) -> - Result; -generate_random_tile_ids (PreviousTileID, Result, 0, Y, Width) -> - generate_random_tile_ids(PreviousTileID, Result, Width, (Y - 1), Width); -generate_random_tile_ids (PreviousTileID, Result, X, Y, Width) -> - NewTile = - case sh_roll:percentage() of - N when (N >= 10) -> PreviousTileID; - _ -> bm_tile:random_id() - end, - generate_random_tile_ids(NewTile, [NewTile|Result], (X - 1), Y, Width). - -spec location_to_array_index ( non_neg_integer(), @@ -94,32 +72,13 @@ get_width (Battlemap) -> Battlemap#battlemap.width. -spec get_height (type()) -> integer(). get_height (Battlemap) -> Battlemap#battlemap.height. --spec get_tile_ids (type()) -> array:array(bm_tile:id()). -get_tile_ids (Battlemap) -> Battlemap#battlemap.tile_ids. +-spec get_tile_class_ids (type()) -> array:array(bm_tile:class_id()). +get_tile_class_ids (Battlemap) -> Battlemap#battlemap.tile_class_ids. --spec get_tile_id (bm_location:type(), type()) -> bm_tile:id(). -get_tile_id (Location, Battlemap) -> +-spec get_tile_class_id (bm_location:type(), type()) -> bm_tile:class_id(). +get_tile_class_id (Location, Battlemap) -> TileIX = location_to_array_index(Battlemap#battlemap.width, Location), - array:get(TileIX, Battlemap#battlemap.tile_ids). - --spec random - ( - non_neg_integer(), - non_neg_integer(), - non_neg_integer() - ) - -> type(). -random (ID, Width, Height) -> - InitialTile = bm_tile:random_id(), - TileIDs = generate_random_tile_ids(InitialTile, [], Width, Height, Width), - - #battlemap - { - id = list_to_binary(integer_to_list(ID)), - width = Width, - height = Height, - tile_ids = array:from_list(TileIDs) - }. + array:get(TileIX, Battlemap#battlemap.tile_class_ids). -spec from_list ( @@ -130,12 +89,12 @@ random (ID, Width, Height) -> ) -> type(). from_list (ID, Width, Height, List) -> - TileIDs = lists:map(fun bm_tile:id_from_int/1, List), + TileClassIDs = lists:map(fun bm_tile:class_id_from_int/1, List), #battlemap { id = list_to_binary(integer_to_list(ID)), width = Width, height = Height, - tile_ids = array:from_list(TileIDs) + tile_class_ids = array:from_list(TileClassIDs) }. diff --git a/src/battlemap/struct/bm_tile.erl b/src/battlemap/struct/bm_tile.erl index ce04898..36c22dc 100644 --- a/src/battlemap/struct/bm_tile.erl +++ b/src/battlemap/struct/bm_tile.erl @@ -3,17 +3,35 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-record +( + tile, + { + id :: id(), + name :: binary(), + cost :: non_neg_integer(), + class_range_min :: non_neg_integer(), + class_range_max :: non_neg_integer() + } +). + -opaque id() :: non_neg_integer(). --opaque type() :: id(). +-opaque class_id() :: non_neg_integer(). +-opaque type() :: #tile{}. --export_type([type/0, id/0]). +-export_type([type/0, class_id/0, id/0]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -export ( [ + get_id/1, + get_name/1, get_cost/1, + get_range_minimum/1, + get_range_maximum/1, + from_id/1, cost_when_oob/0 ] ). @@ -21,8 +39,8 @@ -export ( [ - random_id/0, - id_from_int/1 + class_id_to_type_id/1, + class_id_from_int/1 ] ). @@ -33,21 +51,71 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +-spec class_id_to_type_id (class_id()) -> id(). +class_id_to_type_id (ClassID) -> + case ClassID of + 0 -> 0; + 1 -> 1; + 2 -> 2; + N when ((N >= 3) and (N =< 16)) -> 3 + end. + +-spec from_id (id()) -> type(). +from_id (0) -> + #tile + { + id = 0, + name = <<"[Grassland] Grass">>, + cost = 6, + class_range_min = 1, + class_range_max = 1 + }; +from_id (1) -> + #tile + { + id = 1, + name = <<"[Grassland] Mushroom Infestation">>, + cost = 12, + class_range_min = 1, + class_range_max = 1 + }; +from_id (2) -> + #tile + { + id = 2, + name = <<"[Grassland] Tree Remains">>, + cost = 24, + class_range_min = 2, + class_range_max = 2 + }; +from_id (3) -> + #tile + { + id = 2, + name = <<"[Grassland] Clear Water">>, + cost = cost_when_oob(), + class_range_min = 3, + class_range_max = 17 + }. + -spec cost_when_oob () -> non_neg_integer(). cost_when_oob () -> 255. --spec get_cost (id()) -> non_neg_integer(). -get_cost (N) -> - case N of - 0 -> 6; - 1 -> 12; - 2 -> 24; - _ -> cost_when_oob() - end. +-spec get_id (type()) -> non_neg_integer(). +get_id (Tile) -> Tile#tile.id. + +-spec get_cost (type()) -> non_neg_integer(). +get_cost (Tile) -> Tile#tile.cost. + +-spec get_name (type()) -> binary(). +get_name (Tile) -> Tile#tile.name. + +-spec get_range_minimum (type()) -> non_neg_integer(). +get_range_minimum (Tile) -> Tile#tile.class_range_min. --spec random_id () -> id(). -random_id () -> - sh_roll:between(0, 15). +-spec get_range_maximum (type()) -> non_neg_integer(). +get_range_maximum (Tile) -> Tile#tile.class_range_max. --spec id_from_int (non_neg_integer()) -> id(). -id_from_int (I) -> I. +-spec class_id_from_int (non_neg_integer()) -> id(). +class_id_from_int (I) -> I. -- cgit v1.2.3-70-g09d2