summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/battle')
-rw-r--r-- | src/battle/mechanic/turn_action/btl_turn_actions_attack.erl | 18 | ||||
-rw-r--r-- | src/battle/struct/btl_attack.erl | 255 |
2 files changed, 192 insertions, 81 deletions
diff --git a/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl b/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl index ad6b7e4..462e868 100644 --- a/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl +++ b/src/battle/mechanic/turn_action/btl_turn_actions_attack.erl @@ -71,7 +71,7 @@ handle_attack_sequence [NextAttack | AttackSequence], Result ) -> - {AttackEffect, NewAttackerLuck, NewDefenderLuck} = + AttackEffect = btl_attack:get_description_of ( NextAttack, @@ -81,17 +81,25 @@ handle_attack_sequence DefenderLuck ), - {AttackResult, NewAttackerHealth, NewDefenderHealth} = - btl_attack:apply_to_healths + { + AttackResult, + NewAttackerHealth, + NewAttackerLuck, + NewDefenderHealth, + NewDefenderLuck + } = + btl_attack:apply_to_healths_and_lucks ( AttackEffect, AttackerHealth, - DefenderHealth + AttackerLuck, + DefenderHealth, + DefenderLuck ), NextResult = case AttackResult of - nothing -> Result; + {nothing, _, _} -> Result; _ -> [AttackResult|Result] end, diff --git a/src/battle/struct/btl_attack.erl b/src/battle/struct/btl_attack.erl index 61c58be..f0778f5 100644 --- a/src/battle/struct/btl_attack.erl +++ b/src/battle/struct/btl_attack.erl @@ -14,12 +14,14 @@ precision :: precision(), is_critical :: boolean(), is_parry :: boolean(), - damage :: non_neg_integer() + damage :: non_neg_integer(), + attacker_luck_mod :: integer(), + defender_luck_mod :: integer() } ). -opaque type() :: #attack{}. --type maybe_type() :: ('nothing' | type()). +-type maybe_type() :: ({'nothing', integer(), integer()} | type()). -opaque step() :: {order(), boolean()}. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -31,7 +33,7 @@ [ get_sequence/3, get_description_of/5, - apply_to_healths/3 + apply_to_healths_and_lucks/5 ] ). @@ -145,7 +147,7 @@ get_damage (Precision, IsCritical, AtkModifier, ActualAtkOmni, ActualDefOmni) -> integer(), integer() ) - -> {type(), integer(), integer()}. + -> type(). effect_of_attack ( Order, @@ -157,15 +159,12 @@ effect_of_attack ) -> DefStats = btl_character_current_data:get_statistics(DefCurrData), - {ParryIsSuccessful, PositiveModifier, NegativeModifier} = + {ParryIsSuccessful, ParryPositiveLuckMod, ParryNegativeLuckMod} = case CanParry of true -> roll_parry(DefStats, DefenderLuck); false -> {false, 0, 0} end, - S0DefenderLuck = (DefenderLuck + PositiveModifier), - S0AttackerLuck = (AttackerLuck + NegativeModifier), - { ActualAtkData, ActualDefData, @@ -173,8 +172,8 @@ effect_of_attack ActualDefLuck } = case ParryIsSuccessful of - true -> {DefCurrData, AtkCurrData, S0DefenderLuck, S0AttackerLuck}; - false -> {AtkCurrData, DefCurrData, S0AttackerLuck, S0DefenderLuck} + true -> {DefCurrData, AtkCurrData, DefenderLuck, AttackerLuck}; + false -> {AtkCurrData, DefCurrData, AttackerLuck, DefenderLuck} end, ActualAtkStats = btl_character_current_data:get_statistics(ActualAtkData), @@ -182,7 +181,7 @@ effect_of_attack ActualDefStats = btl_character_current_data:get_statistics(ActualDefData), ActualDefOmni = btl_character_current_data:get_omnimods(ActualDefData), - {Precision, S0PositiveModifier, S0NegativeModifier} = + {Precision, PrecisionPositiveLuckMod, PrecisionNegativeLuckMod} = roll_precision ( ActualAtkStats, @@ -190,15 +189,9 @@ effect_of_attack ActualDefLuck ), - % Precision roll is actually the defender attempting to evade. - S0ActualDefLuck = (ActualDefLuck + S0PositiveModifier), - S0ActualAtkLuck = (ActualAtkLuck + S0NegativeModifier), - - {IsCritical, S1PositiveModifier, S1NegativeModifier} = - roll_critical_hit(ActualAtkStats, S0ActualAtkLuck), - S1ActualAtkLuck = (S0ActualAtkLuck + S1PositiveModifier), - S1ActualDefLuck = (S0ActualDefLuck + S1NegativeModifier), + {IsCritical, CriticalPositiveLuckMod, CriticalNegativeLuckMod} = + roll_critical_hit(ActualAtkStats, ActualAtkLuck), AtkDamageModifier = shr_statistics:get_damage_modifier(ActualAtkStats), Damage = @@ -211,23 +204,94 @@ effect_of_attack ActualDefOmni ), - {FinalAttackerLuck, FinalDefenderLuck} = - case ParryIsSuccessful of - true -> {S1ActualDefLuck, S1ActualAtkLuck}; - false -> {S1ActualAtkLuck, S1ActualDefLuck} + {FinalAttackerLuckMod, FinalDefenderLuckMod} = + case {ParryIsSuccessful, Precision} of + {true, misses} -> + { + ( + % Attacker wasn't the one parrying + ParryNegativeLuckMod + % Attacker was the one evading + + PrecisionPositiveLuckMod + % miss -> no critical hit luck modifier + ), + ( + % Defender was the one parrying + ParryPositiveLuckMod + % Defender wasn't the one evading + + PrecisionNegativeLuckMod + % miss -> no critical hit luck modifier + ) + }; + + {true, _} -> + { + ( + % Attacker wasn't the one parrying + ParryNegativeLuckMod + % Attacker was the one evading + + PrecisionPositiveLuckMod + % Attacker wasn't the one doing a critical + + CriticalNegativeLuckMod + ), + ( + % Defender was the one parrying + ParryPositiveLuckMod + % Defender wasn't the one evading + + PrecisionNegativeLuckMod + % Defender was the one doing a critical + + CriticalPositiveLuckMod + ) + }; + + {false, misses} -> + { + ( + % Attacker wasn't the one parrying + ParryNegativeLuckMod + % Defender was the one evading + + PrecisionNegativeLuckMod + % miss -> no critical hit luck modifier + ), + ( + % Defender was the one parrying + ParryPositiveLuckMod + % Defender was the one evading + + PrecisionPositiveLuckMod + % miss -> no critical hit luck modifier + ) + }; + + {false, _} -> + { + ( + % Attacker wasn't the one parrying + ParryNegativeLuckMod + % Attacker wasn't the one evading + + PrecisionNegativeLuckMod + % Attacker was the one doing a critical + + CriticalPositiveLuckMod + ), + ( + % Defender was the one parrying + ParryPositiveLuckMod + % Defender was the one evading + + PrecisionPositiveLuckMod + % Defender wasn't the one doing a critical + + CriticalNegativeLuckMod + ) + } end, + #attack { - #attack - { - order = Order, - precision = Precision, - is_critical = IsCritical, - is_parry = ParryIsSuccessful, - damage = Damage - }, - FinalAttackerLuck, - FinalDefenderLuck + order = Order, + precision = Precision, + is_critical = IsCritical, + is_parry = ParryIsSuccessful, + damage = Damage, + attacker_luck_mod = FinalAttackerLuckMod, + defender_luck_mod = FinalDefenderLuckMod }. -spec encode_order (order()) -> binary(). @@ -252,7 +316,7 @@ encode_precision (misses) -> <<"m">>. integer(), integer() ) - -> {maybe_type(), integer(), integer()}. + -> maybe_type(). get_description_of ( {first, CanParry}, @@ -289,17 +353,26 @@ get_description_of case IsSuccessful of true -> - effect_of_attack - ( - second, - AtkCurrData, - DefCurrData, - CanParry, - NewAtkLuck, - NewDefLuck - ); - - _ -> {nothing, NewAtkLuck, NewDefLuck} + Result = + effect_of_attack + ( + second, + AtkCurrData, + DefCurrData, + CanParry, + NewAtkLuck, + NewDefLuck + ), + + Result#attack + { + attacker_luck_mod = + (Result#attack.attacker_luck_mod + PositiveModifier), + defender_luck_mod = + (Result#attack.defender_luck_mod + NegativeModifier) + }; + + _ -> {nothing, PositiveModifier, NegativeModifier} end; get_description_of ( @@ -309,50 +382,74 @@ get_description_of AtkLuck, DefLuck ) -> - {Effect, NewDefLuck, NewAtkLuck} = - effect_of_attack - ( - counter, - DefCurrData, - AtkCurrData, - CanParry, - DefLuck, - AtkLuck - ), - {Effect, NewAtkLuck, NewDefLuck}. - + effect_of_attack + ( + counter, + DefCurrData, + AtkCurrData, + CanParry, + DefLuck, + AtkLuck + ). --spec apply_to_healths +-spec apply_to_healths_and_lucks ( maybe_type(), non_neg_integer(), - non_neg_integer() + integer(), + non_neg_integer(), + integer() ) - -> {maybe_type(), non_neg_integer(), non_neg_integer()}. -apply_to_healths -( - nothing, - AttackerHealth, - DefenderHealth -) -> - {nothing, AttackerHealth, DefenderHealth}; -apply_to_healths + -> + { + maybe_type(), + non_neg_integer(), + integer(), + non_neg_integer(), + integer() + }. +apply_to_healths_and_lucks ( _Attack, AttackerHealth, - DefenderHealth + AttackerLuck, + DefenderHealth, + DefenderLuck ) when ( (AttackerHealth =< 0) or (DefenderHealth =< 0) ) -> - {nothing, AttackerHealth, DefenderHealth}; -apply_to_healths + { + {nothing, 0, 0}, + AttackerHealth, + AttackerLuck, + DefenderHealth, + DefenderLuck + }; +apply_to_healths_and_lucks +( + {nothing, AttackerLuckMod, DefenderLuckMod}, + AttackerHealth, + AttackerLuck, + DefenderHealth, + DefenderLuck +) -> + { + {nothing, AttackerLuckMod, DefenderLuckMod}, + AttackerHealth, + (AttackerLuck + AttackerLuckMod), + DefenderHealth, + (DefenderLuck + DefenderLuckMod) + }; +apply_to_healths_and_lucks ( Attack, AttackerHealth, - DefenderHealth + AttackerLuck, + DefenderHealth, + DefenderLuck ) when ( @@ -371,13 +468,17 @@ when { Attack, AttackerHealth, - (DefenderHealth - Damage) + (AttackerLuck + Attack#attack.attacker_luck_mod), + (DefenderHealth - Damage), + (DefenderLuck + Attack#attack.defender_luck_mod) }; -apply_to_healths +apply_to_healths_and_lucks ( Attack, AttackerHealth, - DefenderHealth + AttackerLuck, + DefenderHealth, + DefenderLuck ) when ( @@ -396,7 +497,9 @@ when { Attack, (AttackerHealth - Damage), - DefenderHealth + (AttackerLuck + Attack#attack.attacker_luck_mod), + DefenderHealth, + (DefenderLuck + Attack#attack.defender_luck_mod) }. -spec get_sequence |