| summaryrefslogtreecommitdiff | 
diff options
| author | nsensfel <SpamShield0@noot-noot.org> | 2018-02-26 17:16:08 +0100 | 
|---|---|---|
| committer | nsensfel <SpamShield0@noot-noot.org> | 2018-02-26 17:16:08 +0100 | 
| commit | 6494b74a45e27085fd81836f7b8c969431e8ff3c (patch) | |
| tree | e344a24fa2e9a2ee198314c0552c46b235072009 /src | |
| parent | fd4d031ab5b31763d376c663cc049f62ee389243 (diff) | |
Got it to work, I think.
Diffstat (limited to 'src')
| -rw-r--r-- | src/battlemap/movement.erl | 8 | ||||
| -rw-r--r-- | src/query/character_turn.erl | 111 | ||||
| -rw-r--r-- | src/query/character_turn/handle_character_instance_attacking_2.erl | 30 | ||||
| -rw-r--r-- | src/query/load_state.erl | 8 | ||||
| -rw-r--r-- | src/reply/add_char.erl | 4 | ||||
| -rw-r--r-- | src/reply/set_map.erl | 2 | ||||
| -rw-r--r-- | src/shim/database_shim.erl | 9 | ||||
| -rw-r--r-- | src/struct/battlemap.erl | 2 | ||||
| -rw-r--r-- | src/struct/battlemap_instance.erl | 36 | ||||
| -rw-r--r-- | src/struct/player_turn.erl | 10 | ||||
| -rw-r--r-- | src/struct/weapon.erl | 11 | 
11 files changed, 149 insertions, 82 deletions
| diff --git a/src/battlemap/movement.erl b/src/battlemap/movement.erl index 7fc5db1..513d032 100644 --- a/src/battlemap/movement.erl +++ b/src/battlemap/movement.erl @@ -41,12 +41,13 @@ location_to_array_index (ArrayWidth, X, Y) ->  cross (_Battlemap, _ForbiddenLocations, [], Cost, X, Y) ->     {{X, Y}, Cost};  cross (Battlemap, ForbiddenLocations, [Step|NextSteps], Cost, X, Y) -> -   BattlemapTiles = battlemap:get_tiles(Battlemap), +   BattlemapWidth = battlemap:get_width(Battlemap), +   BattlemapTiles = battlemap:get_tile_ids(Battlemap),     {NextX, NextY} = location_after_step(Step, X, Y),     NextTileIX = -      location_to_array_index(array:size(BattlemapTiles), NextX, NextY), -   NextTile = array:get(array:get(NextTileIX, BattlemapTiles)), +      location_to_array_index(BattlemapWidth, NextX, NextY), +   NextTile = array:get(NextTileIX, BattlemapTiles),     NextCost = (Cost + tile:get_cost(NextTile)),     IsForbidden =        array:foldl @@ -54,6 +55,7 @@ cross (Battlemap, ForbiddenLocations, [Step|NextSteps], Cost, X, Y) ->           fun (_IX, Location, Prev) ->              (Prev or ({NextX, NextY} == Location))           end, +         false,           ForbiddenLocations        ), diff --git a/src/query/character_turn.erl b/src/query/character_turn.erl index 0519a80..33684d9 100644 --- a/src/query/character_turn.erl +++ b/src/query/character_turn.erl @@ -91,11 +91,11 @@ assert_character_instance_can_be_played (QueryState, Input) ->     ControlledCharacterInstance = QueryState#query_state.character_instance,     %%% Asserts     PlayerID = -      arrays:get +      array:get        (           player_turn:get_player_ix           ( -            battlemap_instance:get_player_turn(BattlemapInstance) +            battlemap_instance:get_current_player_turn(BattlemapInstance)           ),           battlemap_instance:get_player_ids(BattlemapInstance)        ), @@ -111,6 +111,8 @@ handle_character_instance_moving (QueryState, Input) ->     ControlledCharacterInstance = QueryState#query_state.character_instance,     ControlledCharacter =        character_instance:get_character(ControlledCharacterInstance), +   ControlledCharacterIX = Input#input.character_instance_ix, +     Path = Input#input.path,     Battlemap = battlemap_instance:get_battlemap(BattlemapInstance),     ControlledCharacterStatistics = @@ -121,7 +123,9 @@ handle_character_instance_moving (QueryState, Input) ->     ForbiddenLocations =        array:map        ( -         fun character_instance:get_location/1, +         fun (_IX, CharacterInstance) -> +            character_instance:get_location(CharacterInstance) +         end,           battlemap_instance:get_character_instances(BattlemapInstance)        ),     {NewLocation, Cost} = @@ -133,19 +137,35 @@ handle_character_instance_moving (QueryState, Input) ->           character_instance:get_location(ControlledCharacterInstance)        ), +   io:format +   ( +      "~nMoving from ~p to ~p (cost ~p) with ~p movement points.~n", +      [ +         character_instance:get_location(ControlledCharacterInstance), +         NewLocation, +         Cost, +         ControlledCharacterMovementPoints +      ] +   ), +     true = (Cost =< ControlledCharacterMovementPoints), -   QueryState#query_state +   UpdatedQueryState = +      QueryState#query_state +      { +         character_instance = +            character_instance:set_location +            ( +               NewLocation, +               ControlledCharacterInstance +            ) +      },     { -      character_instance = -         character_instance:set_location -         ( -            NewLocation, -            ControlledCharacterInstance -         ) +      [{move, ControlledCharacterIX, NewLocation}], +      UpdatedQueryState     }. -handle_character_instance_switching_weapons (QueryState) -> +handle_character_instance_switching_weapons (QueryState, Input) ->     ControlledCharacterInstance = QueryState#query_state.character_instance,     ControlledCharacter =        character_instance:get_character(ControlledCharacterInstance), @@ -153,6 +173,7 @@ handle_character_instance_switching_weapons (QueryState) ->        character:get_attributes(ControlledCharacter),     {PrimaryWeapon, SecondaryWeapon} =        character:get_weapons(ControlledCharacter), +   ControlledCharacterIX = Input#input.character_instance_ix,     UpdatedWeapons = {SecondaryWeapon, PrimaryWeapon},     UpdatedControlledCharacterStatistics = @@ -176,10 +197,15 @@ handle_character_instance_switching_weapons (QueryState) ->           UpdatedControlledCharacter,           ControlledCharacterInstance        ), +   UpdatedQueryState = +      QueryState#query_state +      { +         character_instance = UpdatedControlledCharacterInstance +      }, -   QueryState#query_state     { -      character_instance = UpdatedControlledCharacterInstance +      [{switch_weapons, ControlledCharacterIX}], +      UpdatedQueryState     }.  -include("character_turn/handle_character_instance_attacking_2.erl"). @@ -197,7 +223,7 @@ get_type_of_turn (Input) ->  finalize_character_instance (QueryState, Input) ->     BattlemapInstance = QueryState#query_state.battlemap_instance,     FinalizedCharacterInstance = -      character_instance:set_active +      character_instance:set_is_active        (           false,           QueryState#query_state.character_instance @@ -251,7 +277,7 @@ activate_relevant_character_instances (IXs, CharacterInstances, Owner, IX) ->  start_next_players_turn (QueryState) ->     BattlemapInstance = QueryState#query_state.battlemap_instance,     PlayerIDs = battlemap_instance:get_player_ids(BattlemapInstance), -   PlayerTurn = battlemap_instance:get_player_turn(BattlemapInstance), +   PlayerTurn = battlemap_instance:get_current_player_turn(BattlemapInstance),     CurrentPlayerIX = player_turn:get_player_ix(PlayerTurn),     CurrentTurnNumber = player_turn:get_number(PlayerTurn),     CharacterInstances = @@ -299,6 +325,7 @@ finalize_character_turn (QueryState) ->           fun (_IX, CharacterInstance, Prev) ->              (Prev or character_instance:get_is_active(CharacterInstance))           end, +         false,           CharacterInstances        ), @@ -321,29 +348,38 @@ finalize_character_turn (QueryState) ->           }     end. -play (QueryState, [], _Input) -> -   QueryState; -play (QueryState, [nothing|Next], Input) -> -   play(QueryState, Next, Input); -play (QueryState, [move|Next], Input) -> +play (DiffUpdate, QueryState, [], _Input) -> +   {DiffUpdate, QueryState}; +play (DiffUpdate, QueryState, [nothing|Next], Input) -> +   play(DiffUpdate, QueryState, Next, Input); +play (DiffUpdate, QueryState, [move|Next], Input) -> +   {AddedDiffContent, NewQueryState} = +      handle_character_instance_moving(QueryState, Input),     play     ( -      handle_character_instance_moving(QueryState, Input), +      (AddedDiffContent ++ DiffUpdate), +      NewQueryState,        Next,        Input     ); -play (QueryState, [switch|Next], Input) -> +play (DiffUpdate, QueryState, [switch|Next], Input) -> +   {AddedDiffContent, NewQueryState} = +      handle_character_instance_switching_weapons(QueryState, Input),     play     ( -      handle_character_instance_switching_weapons(QueryState), +      (AddedDiffContent ++ DiffUpdate), +      NewQueryState,        Next,        Input     ); -play (QueryState, [attack|Next], Input) -> +play (DiffUpdate, QueryState, [attack|Next], Input) -> +   {AddedDiffContent, NewQueryState} = +      handle_character_instance_attacking(QueryState, Input),     play     ( -      handle_character_instance_attacking(QueryState, Input), +      (AddedDiffContent ++ DiffUpdate), +      NewQueryState,        Next,        Input     ). @@ -375,29 +411,36 @@ update_cache (QueryResult, Input) ->        BattlemapInstance     ). -generate_reply (_QueryResult, _TurnType, _Input) -> -   unimplemented. +generate_reply (_QueryResult, DiffUpdate, _TurnType, _Input) -> +   %% TODO +   jiffy:encode +   ( +      [ +         [ +            <<"raw">>, +            list_to_binary(io_lib:format("~p", [DiffUpdate])) +         ] +      ] +   ).  handle (Req) ->     Input = parse_input(Req),     security:assert_identity(Input#input.player_id, Input#input.session_token),     security:lock_queries(Input#input.player_id),     QueryState = fetch_data(Input), -   assert_character_instance_can_be_played(Input, QueryState), +   assert_character_instance_can_be_played(QueryState, Input),     TurnType = get_type_of_turn(Input), +   {DiffUpdate, UpdatedQueryState} = play([], QueryState, TurnType, Input),     QueryResult =        finalize_character_turn        ( -         finalize_character_instance -         ( -            play(QueryState, TurnType, Input), -            Input -         ) +         finalize_character_instance(UpdatedQueryState, Input)        ),     send_to_database(QueryResult, TurnType, Input),     update_cache(QueryResult, Input), +   io:format("~nCharacter turn result:~n~p~n", [DiffUpdate]),     security:unlock_queries(Input#input.player_id), -   generate_reply(QueryResult, TurnType, Input). +   generate_reply(QueryResult, DiffUpdate, TurnType, Input).  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/src/query/character_turn/handle_character_instance_attacking_2.erl b/src/query/character_turn/handle_character_instance_attacking_2.erl index 52c3f3d..5f34d05 100644 --- a/src/query/character_turn/handle_character_instance_attacking_2.erl +++ b/src/query/character_turn/handle_character_instance_attacking_2.erl @@ -1,3 +1,4 @@ +%% FIXME: parry not working as intended  roll_hits (AttackerStatistics, DefenderStatistics) ->     DefenderDodges = statistics:get_dodges(DefenderStatistics),     AttackerAccuracy = statistics:get_accuracy(AttackerStatistics), @@ -28,7 +29,6 @@ handle_attack (AttackerStatistics, DefenderStatistics) ->     end. -%% FIXME: parry not working as intended  handle_attacks ([], _AttackerStatistics, _DefenderStatistics, Results) ->     Results;  handle_attacks @@ -53,7 +53,7 @@ handle_attacks     DefenderStatistics,     Results  ) -> -   SecondHitChance = statistics:get_second_hits(AttackerStatistics), +   SecondHitChance = statistics:get_double_hits(AttackerStatistics),     UpdatedResults =        case roll:percentage() of           X when (X =< SecondHitChance) -> @@ -100,7 +100,7 @@ handle_attacks     DefenderStatistics,     Results  ) -> -   SecondHitChance = statistics:get_second_hits(AttackerStatistics), +   SecondHitChance = statistics:get_double_hits(AttackerStatistics),     ParryChance = statistics:get_parries(DefenderStatistics),     AttackResult =        case roll:percentage() of @@ -172,7 +172,7 @@ when ((Action == first) or (Action == second)) ->           );        false -> -         ValidEffects +         {ValidEffects, AttackerHealth, DefenderHealth}     end;  apply_attacks_to_healths  ( @@ -199,7 +199,7 @@ when           );        false -> -         ValidEffects +         {ValidEffects, AttackerHealth, DefenderHealth}     end.  set_new_healths_in_query_state @@ -231,16 +231,18 @@ set_new_healths_in_query_state                 TargettedCharacterInstanceIX,                 character_instance:set_current_health                 ( -                  TargettedCharacterInstance, -                  RemainingDefenderHealth -               ) -            ) +                  RemainingDefenderHealth, +                  TargettedCharacterInstance +               ), +               CharacterInstances +            ), +            BattlemapInstance           ),        character_instance =           character_instance:set_current_health           ( -            ControlledCharacterInstance, -            RemainingAttackerHealth +            RemainingAttackerHealth, +            ControlledCharacterInstance           )     }. @@ -286,9 +288,9 @@ handle_character_instance_attacking (QueryState, Input) ->     Actions =        case {CanDefend, CanParry} of           {true, true} -> -            [{attack, parry}, counter, {attack, parry}]; +            [{second, parry}, counter, {first, parry}];           {true, false} -> -            [second, counter, no_parry]; +            [second, counter, first];           {false, _} ->              [second, first]        end, @@ -313,9 +315,9 @@ handle_character_instance_attacking (QueryState, Input) ->        RemainingEffects,        set_new_healths_in_query_state        ( -         QueryState,           RemainingAttackerHealth,           RemainingDefenderHealth, +         QueryState,           Input        )     }. diff --git a/src/query/load_state.erl b/src/query/load_state.erl index d17c78d..4ad1d45 100644 --- a/src/query/load_state.erl +++ b/src/query/load_state.erl @@ -65,15 +65,13 @@ generate_reply (QueryState) ->     jiffy:encode     (        [ -         set_map:generate(battlemap_instange:get_battlemap(BattlemapInstance)) +         set_map:generate(battlemap_instance:get_battlemap(BattlemapInstance))           | -         array:to_list +         array:sparse_to_list           (              array:map              ( -               fun (CharacterInstance) -> -                  add_char:generate(CharacterInstance) -               end, +               fun add_char:generate/2,                 battlemap_instance:get_character_instances(BattlemapInstance)              )           ) diff --git a/src/reply/add_char.erl b/src/reply/add_char.erl index 5e2bf56..7d30bac 100644 --- a/src/reply/add_char.erl +++ b/src/reply/add_char.erl @@ -28,7 +28,7 @@ encode (IX, CharacterInstance) ->     Character = character_instance:get_character(CharacterInstance),     {X, Y} = character_instance:get_location(CharacterInstance),     Attributes = character:get_attributes(Character), -   {ActiveWeapon, SecondaryWeapon} = character:get_weapons(Character), +   {ActiveWeapon, SecondaryWeapon} = character:get_weapon_ids(Character),     jiffy:encode     ( @@ -44,7 +44,7 @@ encode (IX, CharacterInstance) ->              },              {<<"lcx">>, X},              {<<"lcy">>, Y}, -            {<<"tem">>, character:get_owner_id(Character)}, +            {<<"pla">>, character:get_owner_id(Character)},              {<<"ena">>, character_instance:get_is_active(CharacterInstance)},              {<<"att">>, attributes_as_json(Attributes)},              {<<"awp">>, ActiveWeapon}, diff --git a/src/reply/set_map.erl b/src/reply/set_map.erl index ba1ddbb..5a2cf55 100644 --- a/src/reply/set_map.erl +++ b/src/reply/set_map.erl @@ -19,7 +19,7 @@ encode (Battlemap) ->           [              {<<"w">>, battlemap:get_width(Battlemap)},              {<<"h">>, battlemap:get_height(Battlemap)}, -            {<<"t">>, array:to_list(battlemap:list_tiles(Battlemap))} +            {<<"t">>, array:sparse_to_list(battlemap:get_tile_ids(Battlemap))}           ]        }     ). diff --git a/src/shim/database_shim.erl b/src/shim/database_shim.erl index 1589d14..af49ca0 100644 --- a/src/shim/database_shim.erl +++ b/src/shim/database_shim.erl @@ -70,7 +70,12 @@ generate_random_characters     TotalCharacterCount,     Result  ) -> -   NewCharacter = character:random(TotalCharacterCount, MaxPlayerID), +   NewCharacter = +      character:random +      ( +         TotalCharacterCount, +         list_to_binary(integer_to_list(MaxPlayerID)) +      ),     generate_random_characters     (        MaxPlayerID, @@ -95,7 +100,7 @@ generate_db (Heir) ->     Characters = generate_random_characters(1, 7, 8, 0, []),     PlayersAsList = [<<"0">>, <<"1">>],     BattlemapInstance = -      battlemap_instance_shim:random +      battlemap_instance:random        (           <<"0">>,           PlayersAsList, diff --git a/src/struct/battlemap.erl b/src/struct/battlemap.erl index b999436..733f76c 100644 --- a/src/struct/battlemap.erl +++ b/src/struct/battlemap.erl @@ -68,5 +68,5 @@ random (ID, Width, Height) ->        id = ID,        width = Width,        height = Height, -      tile_ids = TileIDs +      tile_ids = array:from_list(TileIDs)     }. diff --git a/src/struct/battlemap_instance.erl b/src/struct/battlemap_instance.erl index d031ccd..bae7a4a 100644 --- a/src/struct/battlemap_instance.erl +++ b/src/struct/battlemap_instance.erl @@ -10,7 +10,7 @@        id,        battlemap,        character_instances, -      players, +      player_ids,        current_player_turn,        last_turns_effects     } @@ -26,13 +26,13 @@        get_id/1,        get_battlemap/1,        get_character_instances/1, -      get_players/1, +      get_player_ids/1,        get_current_player_turn/1,        get_last_turns_effects/1,        set_battlemap/2,        set_character_instances/2, -      set_players/2, +      set_player_ids/2,        set_current_player_turn/2,        set_last_turns_effects/2     ] @@ -61,8 +61,8 @@ get_battlemap (BattlemapInstance) ->  get_character_instances (BattlemapInstance) ->     BattlemapInstance#battlemap_instance.character_instances. -get_players (BattlemapInstance) -> -   BattlemapInstance#battlemap_instance.players. +get_player_ids (BattlemapInstance) -> +   BattlemapInstance#battlemap_instance.player_ids.  get_current_player_turn (BattlemapInstance) ->     BattlemapInstance#battlemap_instance.current_player_turn. @@ -82,10 +82,10 @@ set_character_instances (CharacterInstances, BattlemapInstance) ->        character_instances = CharacterInstances     }. -set_players (Players, BattlemapInstance) -> +set_player_ids (Players, BattlemapInstance) ->     BattlemapInstance#battlemap_instance     { -      players = Players +      player_ids = Players     }.  set_current_player_turn (PlayerTurn, BattlemapInstance) -> @@ -103,10 +103,11 @@ set_last_turns_effects (Effects, BattlemapInstance) ->  random (ID, PlayersAsList, Battlemap, Characters) ->     BattlemapWidth = battlemap:get_width(Battlemap),     BattlemapHeight = battlemap:get_height(Battlemap), -   CharacterInstancesAsList = +   {CharacterInstancesAsList, _ForbiddenLocations} =        lists:mapfoldl        (           fun (Character, ForbiddenLocations) -> +            CharacterOwner = character:get_owner_id(Character),              NewCharacterInstance =                 character_instance:random                 ( @@ -115,13 +116,26 @@ random (ID, PlayersAsList, Battlemap, Characters) ->                    BattlemapHeight,                    ForbiddenLocations                 ), +            NewCharacterInstanceActive = +               case CharacterOwner of +                  <<"0">> -> +                     character_instance:set_is_active +                     ( +                        true, +                        NewCharacterInstance +                     ); + +                  _ -> +                     NewCharacterInstance +               end,              NewCharacterInstanceLocation = -               character_instance:get_location(NewCharacterInstance), +               character_instance:get_location(NewCharacterInstanceActive),              { -               NewCharacterInstance, +               NewCharacterInstanceActive,                 [NewCharacterInstanceLocation|ForbiddenLocations]              }           end, +         [],           Characters        ), @@ -130,7 +144,7 @@ random (ID, PlayersAsList, Battlemap, Characters) ->        id = ID,        battlemap = Battlemap,        character_instances = array:from_list(CharacterInstancesAsList), -      players = array:from_list(PlayersAsList), +      player_ids = array:from_list(PlayersAsList),        current_player_turn = player_turn:new(0, 0),        last_turns_effects = []     }. diff --git a/src/struct/player_turn.erl b/src/struct/player_turn.erl index b973135..e49156e 100644 --- a/src/struct/player_turn.erl +++ b/src/struct/player_turn.erl @@ -8,7 +8,7 @@     player_turn,     {        number, -      player_id +      player_ix     }  ). @@ -27,7 +27,7 @@  (     [        get_number/1, -      get_player_id/1 +      get_player_ix/1     ]  ). @@ -39,13 +39,13 @@  %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  %%%% Accessors -new (Number, PlayerID) -> +new (Number, PlayerIX) ->     #player_turn     {        number = Number, -      player_id = PlayerID +      player_ix = PlayerIX     }.  get_number (PlayerTurn) -> PlayerTurn#player_turn.number. -get_player_id (PlayerTurn) -> PlayerTurn#player_turn.player_id. +get_player_ix (PlayerTurn) -> PlayerTurn#player_turn.player_ix. diff --git a/src/struct/weapon.erl b/src/struct/weapon.erl index ca74ada..41f99f8 100644 --- a/src/struct/weapon.erl +++ b/src/struct/weapon.erl @@ -24,16 +24,17 @@  (     [        get_id/1, -      random_id/0 +      get_range_type/1, +      get_ranges/1, +      get_damages/1     ]  ).  -export  (     [ +      random_id/0,        from_id/1, -      get_ranges/1, -      get_damages/1,        apply_to_attributes/2     ]  ). @@ -57,6 +58,8 @@ damages_of_type (melee, light) -> {15, 30}.  %%%% Accessors  get_id (Wp) -> Wp#weapon.id. +get_range_type (Wp) -> Wp#weapon.range_type. +  get_ranges (Wp) ->     ranges_of_type(Wp#weapon.range_type, Wp#weapon.range_mod).  get_damages (Wp) -> @@ -293,7 +296,7 @@ random_id () ->  apply_to_attributes (Attributes, Weapon) ->     Dexterity = attributes:get_dexterity(Attributes), -   Speed = attributes:get_dexterity(Attributes), +   Speed = attributes:get_speed(Attributes),     RangeModifier = Weapon#weapon.range_mod,     DamageModifier = Weapon#weapon.damage_mod,     WithRangeModifier = | 


