| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/battlemap')
| -rw-r--r-- | src/battlemap/bm_shim.erl | 17 | ||||
| -rw-r--r-- | src/battlemap/game-logic/bm_movement.erl | 4 | ||||
| -rw-r--r-- | src/battlemap/query/bm_load_state.erl | 10 | ||||
| -rw-r--r-- | src/battlemap/reply/bm_set_map.erl | 5 | ||||
| -rw-r--r-- | src/battlemap/struct/bm_battle.erl | 15 | ||||
| -rw-r--r-- | src/battlemap/struct/bm_battlemap.erl | 61 | ||||
| -rw-r--r-- | 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. | 


