summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2018-06-18 18:35:53 +0200
committernsensfel <SpamShield0@noot-noot.org>2018-06-18 18:35:53 +0200
commitb251f5165ea3530747657b522773c4a8f44b16fa (patch)
tree68d830acec3fe8c171429ac903a16944ed31120c /src/battlemap
parenta174bc2cc95b94c0b7d786e764c48de72206d7c5 (diff)
Separates tiles from their icon images IDs.
The client has yet to be updated to support the new exchanges.
Diffstat (limited to 'src/battlemap')
-rw-r--r--src/battlemap/bm_shim.erl17
-rw-r--r--src/battlemap/game-logic/bm_movement.erl4
-rw-r--r--src/battlemap/query/bm_load_state.erl10
-rw-r--r--src/battlemap/reply/bm_set_map.erl5
-rw-r--r--src/battlemap/struct/bm_battle.erl15
-rw-r--r--src/battlemap/struct/bm_battlemap.erl61
-rw-r--r--src/battlemap/struct/bm_tile.erl102
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.