summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/query')
-rw-r--r-- | src/query/character_turn.erl | 95 | ||||
-rw-r--r-- | src/query/character_turn/handle_character_instance_attacking_2.erl | 64 | ||||
-rw-r--r-- | src/query/load_state.erl | 16 |
3 files changed, 154 insertions, 21 deletions
diff --git a/src/query/character_turn.erl b/src/query/character_turn.erl index d8fe694..c920745 100644 --- a/src/query/character_turn.erl +++ b/src/query/character_turn.erl @@ -9,12 +9,12 @@ ( input, { - player_id, - session_token, - battlemap_instance_id, - character_instance_ix, - path, - target_ix + player_id :: player:id(), + session_token :: binary(), + battlemap_instance_id :: binary(), + character_instance_ix :: non_neg_integer(), + path :: list(binary()), + target_ix :: (-1 | non_neg_integer()) } ). @@ -22,8 +22,8 @@ ( query_state, { - battlemap_instance, - character_instance + battlemap_instance :: battlemap_instance:struct(), + character_instance :: character_instance:struct() } ). @@ -31,12 +31,15 @@ ( query_result, { - is_new_turn, - updated_character_instance_ixs, - updated_battlemap_instance + is_new_turn :: boolean(), + updated_character_instance_ixs :: list(non_neg_integer()), + updated_battlemap_instance :: battlemap_instance:struct() } ). +-type input() :: #input{}. +-type query_state() :: #query_state{}. +-type query_result() :: #query_result{}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -45,6 +48,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec parse_input (binary()) -> input(). parse_input (Req) -> JSONReqMap = jiffy:decode(Req, [return_maps]), CharacterInstanceIX = binary_to_integer(maps:get(<<"cix">>, JSONReqMap)), @@ -59,6 +63,7 @@ parse_input (Req) -> target_ix = TargetIX }. +-spec fetch_data (input()) -> query_state(). fetch_data (Input) -> PlayerID = Input#input.player_id, BattlemapInstanceID = Input#input.battlemap_instance_id, @@ -84,12 +89,17 @@ fetch_data (Input) -> character_instance = CharacterInstance }. +-spec assert_character_instance_can_be_played + ( + query_state(), + input() + ) + -> 'ok'. assert_character_instance_can_be_played (QueryState, Input) -> - %%% Var BattlemapInstance = QueryState#query_state.battlemap_instance, PlayerID = Input#input.player_id, ControlledCharacterInstance = QueryState#query_state.character_instance, - %%% Asserts + PlayerID = array:get ( @@ -104,8 +114,16 @@ assert_character_instance_can_be_played (QueryState, Input) -> ( character_instance:get_character(ControlledCharacterInstance) ), - true = character_instance:get_is_active(ControlledCharacterInstance). + true = character_instance:get_is_active(ControlledCharacterInstance), + ok. + +-spec handle_character_instance_moving + ( + query_state(), + input() + ) + -> {list(any()), query_state()}. handle_character_instance_moving (QueryState, Input) -> BattlemapInstance = QueryState#query_state.battlemap_instance, ControlledCharacterInstance = QueryState#query_state.character_instance, @@ -165,6 +183,12 @@ handle_character_instance_moving (QueryState, Input) -> UpdatedQueryState }. +-spec handle_character_instance_switching_weapons + ( + query_state(), + input() + ) + -> {list(any()), query_state()}. handle_character_instance_switching_weapons (QueryState, Input) -> ControlledCharacterInstance = QueryState#query_state.character_instance, ControlledCharacter = @@ -211,6 +235,7 @@ handle_character_instance_switching_weapons (QueryState, Input) -> -include("character_turn/handle_character_instance_attacking_2.erl"). +-spec get_type_of_turn (input()) -> list(atom()). get_type_of_turn (Input) -> case {Input#input.path, Input#input.target_ix} of {[], -1} -> [nothing, nothing]; @@ -221,14 +246,22 @@ get_type_of_turn (Input) -> {_, _} -> [move, attack] end. +-spec finalize_character_instance + ( + query_state(), + input() + ) + -> query_state(). finalize_character_instance (QueryState, Input) -> BattlemapInstance = QueryState#query_state.battlemap_instance, + FinalizedCharacterInstance = character_instance:set_is_active ( false, QueryState#query_state.character_instance ), + QueryState#query_state { battlemap_instance = @@ -245,6 +278,14 @@ finalize_character_instance (QueryState, Input) -> character_instance = FinalizedCharacterInstance }. +-spec activate_relevant_character_instances + ( + list(non_neg_integer()), + array:array(character_instance:struct()), + player:id(), + (-1 | non_neg_integer()) + ) + -> {list(non_neg_integer()), array:array(character_instance:struct())}. activate_relevant_character_instances (IXs, CharacterInstances, _Owner, -1) -> {IXs, CharacterInstances}; activate_relevant_character_instances (IXs, CharacterInstances, Owner, IX) -> @@ -275,6 +316,11 @@ activate_relevant_character_instances (IXs, CharacterInstances, Owner, IX) -> ) end. +-spec start_next_players_turn + ( + query_state() + ) + -> {list(non_neg_integer()), battlemap_instance:struct()}. start_next_players_turn (QueryState) -> BattlemapInstance = QueryState#query_state.battlemap_instance, PlayerIDs = battlemap_instance:get_player_ids(BattlemapInstance), @@ -315,6 +361,7 @@ start_next_players_turn (QueryState) -> ), {ActivatedCharacterInstanceIXs, UpdatedBattlemapInstance}. +-spec finalize_character_turn (query_state()) -> query_result(). finalize_character_turn (QueryState) -> BattlemapInstance = QueryState#query_state.battlemap_instance, CharacterInstances = @@ -351,6 +398,14 @@ finalize_character_turn (QueryState) -> } end. +-spec play + ( + list(any()), + query_state(), + list(atom()), + input() + ) + -> {list(any()), query_state()}. play (DiffUpdate, QueryState, [], _Input) -> {DiffUpdate, QueryState}; play (DiffUpdate, QueryState, [nothing|Next], Input) -> @@ -375,7 +430,6 @@ play (DiffUpdate, QueryState, [switch|Next], Input) -> Next, Input ); - play (DiffUpdate, QueryState, [attack|Next], Input) -> {AddedDiffContent, NewQueryState} = handle_character_instance_attacking(QueryState, Input), @@ -387,6 +441,7 @@ play (DiffUpdate, QueryState, [attack|Next], Input) -> Input ). +-spec send_to_database (query_result(), any(), input()) -> 'ok'. send_to_database (QueryResult, _TurnType, Input) -> PlayerID = Input#input.player_id, BattlemapInstanceID = Input#input.battlemap_instance_id, @@ -401,6 +456,7 @@ send_to_database (QueryResult, _TurnType, Input) -> BattlemapInstance ). +-spec update_cache (query_result(), input()) -> 'ok'. update_cache (QueryResult, Input) -> PlayerID = Input#input.player_id, BattlemapInstanceID = Input#input.battlemap_instance_id, @@ -414,6 +470,14 @@ update_cache (QueryResult, Input) -> BattlemapInstance ). +-spec generate_reply + ( + query_result(), + list(any()), + any(), + input() + ) + -> binary(). generate_reply (_QueryResult, DiffUpdate, _TurnType, _Input) -> %% TODO jiffy:encode @@ -426,6 +490,7 @@ generate_reply (_QueryResult, DiffUpdate, _TurnType, _Input) -> ] ). +-spec handle (binary()) -> binary(). handle (Req) -> Input = parse_input(Req), security:assert_identity(Input#input.player_id, Input#input.session_token), 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 5f34d05..6995c4c 100644 --- a/src/query/character_turn/handle_character_instance_attacking_2.erl +++ b/src/query/character_turn/handle_character_instance_attacking_2.erl @@ -1,4 +1,23 @@ -%% FIXME: parry not working as intended +% TODO: put all of that into separate modules. It's kind of a mess here. +-type hits() :: ('misses' | 'grazes' | 'hits'). +-type critical() :: ('critical' | 'basic'). +-type attack_category() :: + ( + 'first' + | 'second' + | 'counter' + | {'first', 'parry'} + | {'second', 'parry'} + ). +-type attack_effect() :: {hits(), critical(), non_neg_integer()}. +-type attack_desc() :: {attack_category(), attack_effect()}. + +-spec roll_hits + ( + statistics:struct(), + statistics:struct() + ) + -> hits(). roll_hits (AttackerStatistics, DefenderStatistics) -> DefenderDodges = statistics:get_dodges(DefenderStatistics), AttackerAccuracy = statistics:get_accuracy(AttackerStatistics), @@ -9,6 +28,12 @@ roll_hits (AttackerStatistics, DefenderStatistics) -> _ -> hits end. +-spec roll_damage + ( + statistics:struct(), + statistics:struct() + ) + -> {critical(), non_neg_integer()}. roll_damage (AttackerStatistics, _DefenderStatistics) -> {MinimumDamage, MaximumDamage} = statistics:get_damages(AttackerStatistics), MaximumRoll = max(1, MaximumDamage - MinimumDamage), @@ -19,6 +44,12 @@ roll_damage (AttackerStatistics, _DefenderStatistics) -> _ -> {basic, BaseDamage} end. +-spec handle_attack + ( + statistics:struct(), + statistics:struct() + ) + -> {hits(), critical(), non_neg_integer()}. handle_attack (AttackerStatistics, DefenderStatistics) -> Hits = roll_hits(AttackerStatistics, DefenderStatistics), {Critical, Damage} = roll_damage(AttackerStatistics, DefenderStatistics), @@ -28,7 +59,14 @@ handle_attack (AttackerStatistics, DefenderStatistics) -> hits -> {Hits, Critical, Damage} end. - +-spec handle_attacks + ( + list(attack_category()), + statistics:struct(), + statistics:struct(), + list(attack_desc()) + ) + -> list(attack_desc()). handle_attacks ([], _AttackerStatistics, _DefenderStatistics, Results) -> Results; handle_attacks @@ -150,6 +188,14 @@ handle_attacks ] ). +-spec apply_attacks_to_healths + ( + list(attack_desc()), + non_neg_integer(), + non_neg_integer(), + list(attack_desc()) + ) + -> {list(attack_desc()), non_neg_integer(), non_neg_integer()}. apply_attacks_to_healths ([], AttackerHealth, DefenderHealth, ValidEffects) -> {ValidEffects, AttackerHealth, DefenderHealth}; apply_attacks_to_healths @@ -202,6 +248,14 @@ when {ValidEffects, AttackerHealth, DefenderHealth} end. +-spec set_new_healths_in_query_state + ( + non_neg_integer(), + non_neg_integer(), + query_state(), + input() + ) + -> query_state(). set_new_healths_in_query_state ( RemainingAttackerHealth, @@ -246,6 +300,12 @@ set_new_healths_in_query_state ) }. +-spec handle_character_instance_attacking + ( + query_state(), + input() + ) + -> {list(attack_desc()), query_state()}. handle_character_instance_attacking (QueryState, Input) -> BattlemapInstance = QueryState#query_state.battlemap_instance, ControlledCharacterInstance = QueryState#query_state.character_instance, diff --git a/src/query/load_state.erl b/src/query/load_state.erl index 4ad1d45..f63a4b1 100644 --- a/src/query/load_state.erl +++ b/src/query/load_state.erl @@ -9,9 +9,9 @@ ( input, { - player_id, - session_token, - battlemap_instance_id + player_id :: player:id(), + session_token :: binary(), + battlemap_instance_id :: binary() } ). @@ -19,9 +19,13 @@ ( query_state, { - battlemap_instance + battlemap_instance :: battlemap_instance:struct() } ). + +-type input() :: #input{}. +-type query_state() :: #query_state{}. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -30,6 +34,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec parse_input (binary()) -> input(). parse_input (Req) -> JSONReqMap = jiffy:decode(Req, [return_maps]), PlayerID = maps:get(<<"pid">>, JSONReqMap), @@ -43,6 +48,7 @@ parse_input (Req) -> battlemap_instance_id = BattlemapInstanceID }. +-spec fetch_data (input()) -> query_state(). fetch_data (Input) -> PlayerID = Input#input.player_id, BattlemapInstanceID = Input#input.battlemap_instance_id, @@ -60,6 +66,7 @@ fetch_data (Input) -> battlemap_instance = BattlemapInstance }. +-spec generate_reply(query_state()) -> binary(). generate_reply (QueryState) -> BattlemapInstance = QueryState#query_state.battlemap_instance, jiffy:encode @@ -78,6 +85,7 @@ generate_reply (QueryState) -> ] ). +-spec handle (binary()) -> binary(). handle (Req) -> Input = parse_input(Req), security:assert_identity(Input#input.player_id, Input#input.session_token), |