From 65a2b95f7355b6b495516b95dafa63f8ccaa2bb0 Mon Sep 17 00:00:00 2001 From: nsensfel Date: Wed, 23 Oct 2019 17:46:45 +0200 Subject: ... --- src/battle/mechanic/action/btl_action_attack.erl | 2 +- src/battle/struct/btl_attack.erl | 69 ++---------------- src/battle/struct/btl_character.erl | 28 +------- src/battle/struct/btl_condition.erl | 7 +- src/battle/struct/btl_turn_result.erl | 91 +++++++++++++++++++----- src/bounty/bnt_join_battle.erl | 10 ++- src/shared/struct/shr_condition.erl | 9 +++ 7 files changed, 105 insertions(+), 111 deletions(-) diff --git a/src/battle/mechanic/action/btl_action_attack.erl b/src/battle/mechanic/action/btl_action_attack.erl index 26e1190..ea7857a 100644 --- a/src/battle/mechanic/action/btl_action_attack.erl +++ b/src/battle/mechanic/action/btl_action_attack.erl @@ -259,7 +259,7 @@ handle_start_of_attack (S0AttackSequence, Action, S0Update) -> S1Update = btl_character_turn_update:add_to_timeline ( - btl_turn_result:new_targeting + btl_turn_result:new_character_targetted ( btl_action:get_actor_index(Action), btl_action:get_target_index(Action) diff --git a/src/battle/struct/btl_attack.erl b/src/battle/struct/btl_attack.erl index 27436f2..7e0a834 100644 --- a/src/battle/struct/btl_attack.erl +++ b/src/battle/struct/btl_attack.erl @@ -6,41 +6,26 @@ -type category() :: ('first' | 'second' | 'counter'). -type precision() :: ('misses' | 'grazes' | 'hits'). --record -( - attack, - { - category :: category(), - precision :: precision(), - is_critical :: boolean(), - is_parry :: boolean(), - damage :: non_neg_integer() - } -). - --opaque type() :: #attack{}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export_type([type/0, category/0, precision/0]). - --export -( - [ - new/5 - ] -). +-export_type([category/0, precision/0]). -export ( [ - encode/1 + encode_category/1, + encode_precision/1 ] ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec encode_category (category()) -> binary(). encode_category (first) -> <<"f">>; encode_category (counter) -> <<"c">>; @@ -50,43 +35,3 @@ encode_category (second) -> <<"s">>. encode_precision (hits) -> <<"h">>; encode_precision (grazes) -> <<"g">>; encode_precision (misses) -> <<"m">>. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec new - ( - category(), - precision(), - boolean(), - boolean(), - non_neg_integer() - ) - -> type(). -new (Category, Precision, IsCritical, IsParry, Damage) -> - #attack - { - category = Category, - precision = Precision, - is_critical = IsCritical, - is_parry = IsParry, - damage = Damage - }. - --spec encode (type()) -> {list(any())}. -encode (Attack) -> - Category = Attack#attack.category, - Precision = Attack#attack.precision, - IsCritical = Attack#attack.is_critical, - IsParry = Attack#attack.is_parry, - Damage = Attack#attack.damage, - - { - [ - {<<"ord">>, encode_category(Category)}, - {<<"pre">>, encode_precision(Precision)}, - {<<"cri">>, IsCritical}, - {<<"par">>, IsParry}, - {<<"dmg">>, Damage} - ] - }. diff --git a/src/battle/struct/btl_character.erl b/src/battle/struct/btl_character.erl index 51d6191..6a4fe2f 100644 --- a/src/battle/struct/btl_character.erl +++ b/src/battle/struct/btl_character.erl @@ -102,7 +102,6 @@ resolve/2, is_unresolved/1, to_unresolved/1, - decode/1, encode/1 ] ). @@ -490,7 +489,7 @@ ataxia_set_conditions (Conditions, Char) -> rank(), shr_location:type(), shr_character:type(), - list(btl_condition:type()) + btl_condition:collection() ) -> type(). new @@ -563,25 +562,6 @@ get_base_character_field () -> #btl_char_ref.base. -spec get_conditions_field() -> non_neg_integer(). get_conditions_field () -> #btl_char_ref.conditions. --spec decode (map()) -> unresolved(). -decode (Map) -> - #btl_char_ref - { - player_ix = maps:get(?PLAYER_IX_FIELD, Map), - rank = maps:get(?RANK_FIELD, Map), - location = shr_location:decode(maps:get(?LOCATION_FIELD, Map)), - current_health = maps:get(?CURRENT_HEALTH_FIELD, Map), - is_active = maps:get(?IS_ACTIVE_FIELD, Map), - is_defeated = maps:get(?IS_DEFEATED_FIELD, Map), - base = shr_character:decode(maps:get(?BASE_CHAR_FIELD, Map)), - conditions = - lists:map - ( - fun btl_condition:decode/1, - maps:get(?CONDITIONS_FIELD, Map) - ) - }. - -spec encode (unresolved()) -> {list({binary(), any()})}. encode (CharRef) -> { @@ -595,11 +575,7 @@ encode (CharRef) -> {?BASE_CHAR_FIELD, shr_character:encode(CharRef#btl_char_ref.base)}, { ?CONDITIONS_FIELD, - lists:map - ( - fun btl_condition:encode/1, - CharRef#btl_char_ref.conditions - ) + btl_condition:encode_collection(CharRef#btl_char_ref.conditions) } ] }. diff --git a/src/battle/struct/btl_condition.erl b/src/battle/struct/btl_condition.erl index 546c38b..695830b 100644 --- a/src/battle/struct/btl_condition.erl +++ b/src/battle/struct/btl_condition.erl @@ -74,7 +74,8 @@ -export ( [ - encode/1 + encode/1, + encode_collection/1 ] ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -436,6 +437,8 @@ new (CondID, Triggers, Params) -> -spec new_collection () -> collection(). new_collection () -> orddict:new(). - -spec encode (type()) -> {list({binary(), any()})}. encode (Condition) -> {[]}. % TODO + +-spec encode_collection (collection()) -> {list({binary(), any()})}. +encode_collection (Conditions) -> {[]}. % TODO diff --git a/src/battle/struct/btl_turn_result.erl b/src/battle/struct/btl_turn_result.erl index eaf974b..3e1be50 100644 --- a/src/battle/struct/btl_turn_result.erl +++ b/src/battle/struct/btl_turn_result.erl @@ -24,16 +24,30 @@ -record ( - attacked, + hit, { attacker_ix :: non_neg_integer(), defender_ix :: non_neg_integer(), - sequence :: list(btl_attack:type()), + category :: btl_attack:category(), + precision :: btl_attack:precision(), + is_critical :: boolean(), + is_parry :: boolean(), + damage :: non_neg_integer(), attacker_luck :: integer(), defender_luck :: integer() } ). +-record +( + targetted, + { + attacker_ix :: non_neg_integer(), + defender_ix :: non_neg_integer() + } +). + + -record ( player_won, @@ -61,7 +75,8 @@ -opaque type() :: ( #switched_weapon{} | #moved{} - | #attacked{} + | #hit{} + | #targetted{} | #player_won{} | #player_lost{} | #player_turn_started{} @@ -80,7 +95,8 @@ new_player_turn_started/1, new_character_switched_weapons/1, new_character_moved/3, - new_character_attacked/5 + new_character_hit/9, + new_character_targetted/2 ] ). @@ -129,28 +145,48 @@ new_character_moved (CharacterIX, Path, NewLocation) -> new_location = NewLocation }. --spec new_character_attacked +-spec new_character_targetted (non_neg_integer(), non_neg_integer()) -> type(). +new_character_targetted (AttackerIX, DefenderIX) -> + #targetted + { + attacker_ix = AttackerIX, + defender_ix = DefenderIX + }. + +-spec new_character_hit ( non_neg_integer(), non_neg_integer(), - list(btl_attack:type()), + btl_attack:category(), + btl_attack:precision(), + boolean(), + boolean(), + non_neg_integer(), integer(), integer() ) -> type(). -new_character_attacked +new_character_hit ( AttackerIX, DefenderIX, - AttackSequence, + Category, + Precision, + IsCritical, + IsParry, + Damage, AttackerLuck, DefenderLuck ) -> - #attacked + #hit { attacker_ix = AttackerIX, defender_ix = DefenderIX, - sequence = AttackSequence, + category = Category, + precision = Precision, + is_critical = IsCritical, + is_parry = IsParry, + damage = Damage, attacker_luck = AttackerLuck, defender_luck = DefenderLuck }. @@ -181,25 +217,42 @@ encode (TurnResult) when is_record(TurnResult, moved) -> {<<"nlc">>, EncodedNewLocation} ] }; -encode (TurnResult) when is_record(TurnResult, attacked) -> - AttackerIX = TurnResult#attacked.attacker_ix, - DefenderIX = TurnResult#attacked.defender_ix, - Sequence = TurnResult#attacked.sequence, - AttackerLuck = TurnResult#attacked.attacker_luck, - DefenderLuck = TurnResult#attacked.defender_luck, - - EncodedSequence = lists:map(fun btl_attack:encode/1, Sequence), +encode (TurnResult) when is_record(TurnResult, hit) -> + AttackerIX = TurnResult#hit.attacker_ix, + DefenderIX = TurnResult#hit.defender_ix, + Category = TurnResult#hit.category, + Precision = TurnResult#hit.precision, + IsCritical = TurnResult#hit.is_critical, + IsParry = TurnResult#hit.is_parry, + Damage = TurnResult#hit.damage, + AttackerLuck = TurnResult#hit.attacker_luck, + DefenderLuck = TurnResult#hit.defender_luck, { [ {<<"t">>, <<"atk">>}, {<<"aix">>, AttackerIX}, {<<"dix">>, DefenderIX}, - {<<"seq">>, EncodedSequence}, + {<<"ord">>, btl_attack:encode_category(Category)}, + {<<"pre">>, btl_attack:encode_precision(Precision)}, + {<<"cri">>, IsCritical}, + {<<"par">>, IsParry}, + {<<"dmg">>, Damage}, {<<"alk">>, AttackerLuck}, {<<"dlk">>, DefenderLuck} ] }; +encode (TurnResult) when is_record(TurnResult, targetted) -> + AttackerIX = TurnResult#targetted.attacker_ix, + DefenderIX = TurnResult#targetted.defender_ix, + + { + [ + {<<"t">>, <<"tar">>}, + {<<"aix">>, AttackerIX}, + {<<"dix">>, DefenderIX} + ] + }; encode (TurnResult) when is_record(TurnResult, player_won) -> PlayerIX = TurnResult#player_won.player_ix, diff --git a/src/bounty/bnt_join_battle.erl b/src/bounty/bnt_join_battle.erl index 68a3358..4e6f7fe 100644 --- a/src/bounty/bnt_join_battle.erl +++ b/src/bounty/bnt_join_battle.erl @@ -82,8 +82,16 @@ create_character (PlayerIX, RosterChar, Map, ForbiddenLocations) -> ResolvedBaseChar = shr_character:resolve(TileOmnimods, RosterChar), % TODO: link rank to roster. + % TODO: link conditions to roster. Result = - btl_character:new(PlayerIX, optional, Location, ResolvedBaseChar, []), + btl_character:new + ( + PlayerIX, + optional, + Location, + ResolvedBaseChar, + btl_condition:new_collection() + ), btl_character:to_unresolved(Result). diff --git a/src/shared/struct/shr_condition.erl b/src/shared/struct/shr_condition.erl index 13c3426..25504fa 100644 --- a/src/shared/struct/shr_condition.erl +++ b/src/shared/struct/shr_condition.erl @@ -13,6 +13,7 @@ { id :: id(), name :: binary(), + module :: atom(), description :: binary(), % can it be removed or stolen? Not ranks, for example. is_transferable :: boolean() @@ -29,6 +30,8 @@ -export ( [ + from_id/1, + get_module/1 ] ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -38,3 +41,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec get_module (type()) -> atom(). +get_module (#condition{ module = Module }) -> Module. + +-spec from_id (id()) -> type(). +from_id (ID) -> + error({condition, unknown, ID}). -- cgit v1.2.3-70-g09d2