| summaryrefslogtreecommitdiff | 
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2018-03-01 13:24:11 +0100 | 
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2018-03-01 13:24:11 +0100 | 
| commit | 55c32019f5b82fd488c4ceed8c80e1b7a0fa114f (patch) | |
| tree | b28565216098599b53b8cbe3619e51104c325e88 | |
| parent | 9b413bc5936994b66f3a1c693fbbfad0995c0b93 (diff) | |
Cleaning up the handling of character turns.
| -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)). | 


