summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battlemap/movement.erl87
-rw-r--r--src/query/character_turn.erl10
-rw-r--r--src/struct/battlemap.erl22
-rw-r--r--src/struct/direction.erl36
-rw-r--r--src/struct/location.erl45
5 files changed, 130 insertions, 70 deletions
diff --git a/src/battlemap/movement.erl b/src/battlemap/movement.erl
index 9eb45db..02f0ebc 100644
--- a/src/battlemap/movement.erl
+++ b/src/battlemap/movement.erl
@@ -7,46 +7,12 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--export
-(
- [
- cross/4,
- steps_between/2
- ]
-).
+-export([cross/4]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec location_after_step
- (
- binary(),
- integer(),
- integer()
- )
- -> {integer(), integer()}.
-location_after_step (Step, X, Y) ->
- case Step of
- <<"L">> -> {(X - 1), Y};
- <<"R">> -> {(X + 1), Y};
- <<"U">> -> {X, (Y - 1)};
- <<"D">> -> {X, (Y + 1)}
- end.
--spec location_to_array_index
- (
- non_neg_integer(),
- integer(),
- integer()
- )
- -> ('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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -54,29 +20,23 @@ location_to_array_index (ArrayWidth, X, Y) ->
-spec cross
(
battlemap:struct(),
- array:array(non_neg_integer(), non_neg_integer()),
- list(binary()),
+ array:array(location:type()),
+ list(direction:enum()),
non_neg_integer(),
- non_neg_integer(),
- non_neg_integer()
+ location:type()
)
- -> {{non_neg_integer(), non_neg_integer()}, non_neg_integer()}.
-cross (_Battlemap, _ForbiddenLocations, [], Cost, X, Y) ->
- {{X, Y}, Cost};
-cross (Battlemap, ForbiddenLocations, [Step|NextSteps], Cost, X, Y) ->
- BattlemapWidth = battlemap:get_width(Battlemap),
- BattlemapTiles = battlemap:get_tile_ids(Battlemap),
-
- {NextX, NextY} = location_after_step(Step, X, Y),
- NextTileIX =
- location_to_array_index(BattlemapWidth, NextX, NextY),
- NextTile = array:get(NextTileIX, BattlemapTiles),
+ -> {location:type(), non_neg_integer()}.
+cross (_Battlemap, _ForbiddenLocations, [], Cost, Location) ->
+ {Location, Cost};
+cross (Battlemap, ForbiddenLocations, [Step|NextSteps], Cost, Location) ->
+ NextLocation = direction:apply_to(Step, Location),
+ NextTile = battlemap:get_tile_id(Battlemap, NextLocation),
NextCost = (Cost + tile:get_cost(NextTile)),
IsForbidden =
array:foldl
(
- fun (_IX, Location, Prev) ->
- (Prev or ({NextX, NextY} == Location))
+ fun (_IX, ForbiddenLocation, Prev) ->
+ (Prev or (NextLocation == ForbiddenLocation))
end,
false,
ForbiddenLocations
@@ -84,24 +44,15 @@ cross (Battlemap, ForbiddenLocations, [Step|NextSteps], Cost, X, Y) ->
IsForbidden = false,
- cross(Battlemap, ForbiddenLocations, NextSteps, NextCost, NextX, NextY).
+ cross(Battlemap, ForbiddenLocations, NextSteps, NextCost, NextLocation).
-spec cross
(
battlemap:struct(),
- array:array(non_neg_integer(), non_neg_integer()),
- list(binary()),
- {non_neg_integer(), non_neg_integer()}
- )
- -> {{non_neg_integer(), non_neg_integer()}, non_neg_integer()}.
-cross (Battlemap, ForbiddenLocations, Path, {X, Y}) ->
- cross(Battlemap, ForbiddenLocations, Path, 0, X, Y).
-
--spec steps_between
- (
- {non_neg_integer(), non_neg_integer()},
- {non_neg_integer(), non_neg_integer()}
+ array:array(location:type()),
+ list(direction:enum()),
+ location:type()
)
- -> non_neg_integer().
-steps_between ({OX, OY}, {DX, DY}) ->
- (abs(DY - OY) + abs(DX - OX)).
+ -> {location:type(), non_neg_integer()}.
+cross (Battlemap, ForbiddenLocations, Path, Location) ->
+ cross(Battlemap, ForbiddenLocations, Path, 0, Location).
diff --git a/src/query/character_turn.erl b/src/query/character_turn.erl
index b24e038..cb4e8ea 100644
--- a/src/query/character_turn.erl
+++ b/src/query/character_turn.erl
@@ -1,4 +1,5 @@
-module(character_turn).
+% FIXME: There's still too much of a mess in this module.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -48,16 +49,21 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+decode_action (EncodedAction) ->
+ JSONActionMap = jiffy:decode(EncodedAction, [return_maps]),
+
-spec parse_input (binary()) -> input().
parse_input (Req) ->
JSONReqMap = jiffy:decode(Req, [return_maps]),
CharacterInstanceIX = binary_to_integer(maps:get(<<"cix">>, JSONReqMap)),
TargetIX = binary_to_integer(maps:get(<<"tix">>, JSONReqMap)),
+ EncodedActions = maps:get(<<"act">>, JSONReqMap),
+ Actions = decode_action_sequence(EncodedActions),
#input
{
player_id = maps:get(<<"pid">>, JSONReqMap),
session_token = maps:get(<<"stk">>, JSONReqMap),
- battlemap_instance_id = maps:get(<<"bmi">>, JSONReqMap),
+ battle_id = maps:get(<<"bid">>, JSONReqMap),
character_instance_ix = CharacterInstanceIX,
path = maps:get(<<"p">>, JSONReqMap),
target_ix = TargetIX
@@ -138,6 +144,8 @@ handle_character_instance_moving (QueryState, Input) ->
ControlledCharacterMovementPoints =
statistics:get_movement_points(ControlledCharacterStatistics),
+ % FIXME: The controlled character's old location should not be considered to
+ % be a forbidden location.
ForbiddenLocations =
array:map
(
diff --git a/src/struct/battlemap.erl b/src/struct/battlemap.erl
index 8f85bbb..9204084 100644
--- a/src/struct/battlemap.erl
+++ b/src/struct/battlemap.erl
@@ -30,7 +30,8 @@
get_id/1,
get_width/1,
get_height/1,
- get_tile_ids/1
+ get_tile_ids/1,
+ get_tile_id/2
]
).
@@ -65,6 +66,20 @@ generate_random_tile_ids (PreviousTileID, Result, X, Y, Width) ->
end,
generate_random_tile_ids(NewTile, [NewTile|Result], (X - 1), Y, Width).
+-spec location_to_array_index
+ (
+ non_neg_integer(),
+ 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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -81,6 +96,11 @@ get_height (Battlemap) -> Battlemap#battlemap.height.
-spec get_tile_ids (struct()) -> array:array(tile:id()).
get_tile_ids (Battlemap) -> Battlemap#battlemap.tile_ids.
+-spec get_tile_id (location:type(), struct()) -> tile:id().
+get_tile_id (Location, Battlemap) ->
+ TileIX = location_to_array_index(Battlemap#battlemap.width, Location),
+ array:get(TileIX, Battlemap#battlemap.tile_ids).
+
-spec random
(
non_neg_integer(),
diff --git a/src/struct/direction.erl b/src/struct/direction.erl
new file mode 100644
index 0000000..074cadf
--- /dev/null
+++ b/src/struct/direction.erl
@@ -0,0 +1,36 @@
+-module(direction).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-type enum() :: ('up' | 'down' | 'left' | 'right').
+
+-export_type([enum/0]).
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export
+(
+ [
+ from_binary/1,
+ to_binary/1
+ ]
+).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec from_binary (binary()) -> enum().
+from_binary (<<"U">>) -> up;
+from_binary (<<"D">>) -> down;
+from_binary (<<"L">>) -> left;
+from_binary (<<"R">>) -> right.
+
+to_binary (up) -> <<"U">>;
+to_binary (down) -> <<"D">>;
+to_binary (left) -> <<"L">>;
+to_binary (right) -> <<"R">>.
diff --git a/src/struct/location.erl b/src/struct/location.erl
new file mode 100644
index 0000000..624fe56
--- /dev/null
+++ b/src/struct/location.erl
@@ -0,0 +1,45 @@
+-module(location).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-type type() :: {non_neg_integer(), non_neg_integer()}.
+
+-export_type([type/0]).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-export
+(
+ [
+ apply_direction/2,
+ dist/2
+ ]
+).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec validate ({integer(), integer()}) -> type().
+validate ({X, Y}) ->
+ true = (X >= 0),
+ true = (Y >= 0),
+ {X, Y}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec apply_direction (direction:enum(), type()) -> type().
+apply_direction (left, {X, Y}) ->
+ validate({(X - 1), Y});
+apply_direction (right, {X, Y}) ->
+ validate({(X + 1), Y});
+apply_direction (up, {X, Y}) ->
+ validate({X, (Y - 1)});
+apply_direction (down, {X, Y}) ->
+ validate({X, (Y + 1)}).
+
+-spec dist(type(), type()) -> non_neg_integer().
+dist ({OX, OY}, {DX, DY}) ->
+ (abs(DY - OY) + abs(DX - OX)).