summaryrefslogtreecommitdiff |
diff options
-rw-r--r-- | src/battlemap/movement.erl | 87 | ||||
-rw-r--r-- | src/query/character_turn.erl | 10 | ||||
-rw-r--r-- | src/struct/battlemap.erl | 22 | ||||
-rw-r--r-- | src/struct/direction.erl | 36 | ||||
-rw-r--r-- | src/struct/location.erl | 45 |
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)). |