summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/battlemap/struct/bm_attack.erl')
-rw-r--r-- | src/battlemap/struct/bm_attack.erl | 306 |
1 files changed, 0 insertions, 306 deletions
diff --git a/src/battlemap/struct/bm_attack.erl b/src/battlemap/struct/bm_attack.erl deleted file mode 100644 index a1ce027..0000000 --- a/src/battlemap/struct/bm_attack.erl +++ /dev/null @@ -1,306 +0,0 @@ --module(bm_attack). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --type order() :: ('first' | 'second' | 'counter'). --type precision() :: ('misses' | 'grazes' | 'hits'). - --record -( - attack, - { - order :: order(), - precision :: precision(), - is_critical :: boolean(), - is_parry :: boolean(), - damage :: non_neg_integer() - } -). - --opaque type() :: #attack{}. --type maybe_type() :: ('nothing' | type()). --opaque step() :: {order(), boolean()}. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --export_type([type/0, maybe_type/0, step/0]). - --export -( - [ - get_sequence/3, - get_description_of/3, - apply_to_healths/3 - ] -). - --export -( - [ - encode/1 - ] -). - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --spec roll_precision - ( - sh_statistics:type(), - sh_statistics:type() - ) - -> precision(). -roll_precision (AttackerStatistics, DefenderStatistics) -> - DefenderDodges = sh_statistics:get_dodges(DefenderStatistics), - AttackerAccuracy = sh_statistics:get_accuracy(AttackerStatistics), - MissChance = max(0, (DefenderDodges - AttackerAccuracy)), - case sh_roll:percentage() of - X when (X =< MissChance) -> misses; - X when (X =< (MissChance * 2)) -> grazes; - _ -> hits - end. - --spec roll_damage - ( - sh_statistics:type(), - sh_statistics:type() - ) - -> {non_neg_integer(), boolean()}. -roll_damage (AttackerStatistics, _DefenderStatistics) -> - {MinimumDamage, MaximumDamage} = - sh_statistics:get_damages(AttackerStatistics), - MaximumRoll = max(1, MaximumDamage - MinimumDamage), - BaseDamage = MinimumDamage + (rand:uniform(MaximumRoll) - 1), - CriticalHitChance = sh_statistics:get_critical_hits(AttackerStatistics), - case sh_roll:percentage() of - X when (X =< CriticalHitChance) -> {(BaseDamage * 2), true}; - _ -> {BaseDamage, false} - end. - --spec roll_parry (sh_statistics:type()) -> boolean(). -roll_parry (DefenderStatistics) -> - DefenderParryChance = sh_statistics:get_parries(DefenderStatistics), - (sh_roll:percentage() =< DefenderParryChance). - --spec effect_of_attack - ( - order(), - bm_character:type(), - bm_character:type(), - boolean() - ) - -> type(). -effect_of_attack (Order, Attacker, Defender, CanParry) -> - AttackerStatistics = bm_character:get_statistics(Attacker), - DefenderStatistics = bm_character:get_statistics(Defender), - - ParryIsSuccessful = (CanParry and roll_parry(DefenderStatistics)), - - {ActualAtkStatistics, ActualDefStatistics} = - case ParryIsSuccessful of - true -> {DefenderStatistics, AttackerStatistics}; - false -> {AttackerStatistics, DefenderStatistics} - end, - {ActualAttacker, ActualDefender} = - case ParryIsSuccessful of - true -> {Defender, Attacker}; - false -> {Attacker, Defender} - end, - - ActualDefArmor = sh_armor:from_id(bm_character:get_armor_id(ActualDefender)), - {ActualAtkWeaponID, _} = bm_character:get_weapon_ids(ActualAttacker), - ActualAtkWeaponDmgType = - sh_weapon:get_damage_type(sh_weapon:from_id(ActualAtkWeaponID)), - - Precision = roll_precision(ActualAtkStatistics, ActualDefStatistics), - {Damage, IsCritical} = roll_damage(ActualAtkStatistics, ActualDefStatistics), - S0Damage = - case Precision of - misses -> 0; - grazes -> trunc(Damage / 2); - hits -> Damage - end, - ArmorResistance = - sh_armor:get_resistance_to(ActualAtkWeaponDmgType, ActualDefArmor), - ActualDamage = max(0, (S0Damage - ArmorResistance)), - - #attack - { - order = Order, - precision = Precision, - is_critical = IsCritical, - is_parry = ParryIsSuccessful, - damage = ActualDamage - }. - --spec encode_order (order()) -> binary(). -encode_order (first) -> <<"f">>; -encode_order (counter) -> <<"c">>; -encode_order (second) -> <<"s">>. - --spec encode_precision (precision()) -> binary(). -encode_precision (hits) -> <<"h">>; -encode_precision (grazes) -> <<"g">>; -encode_precision (misses) -> <<"m">>. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - --spec get_description_of - ( - step(), - bm_character:type(), - bm_character:type() - ) - -> maybe_type(). -get_description_of ({first, CanParry}, Attacker, Defender) -> - effect_of_attack(first, Attacker, Defender, CanParry); -get_description_of ({second, CanParry}, Attacker, Defender) -> - AttackerStatistics = bm_character:get_statistics(Attacker), - AttackerDoubleAttackChange = - sh_statistics:get_double_hits(AttackerStatistics), - - case sh_roll:percentage() of - X when (X =< AttackerDoubleAttackChange) -> - effect_of_attack (second, Attacker, Defender, CanParry); - - _ -> - nothing - end; -get_description_of ({counter, CanParry}, Attacker, Defender) -> - effect_of_attack(counter, Defender, Attacker, CanParry). - --spec apply_to_healths - ( - maybe_type(), - non_neg_integer(), - non_neg_integer() - ) - -> {maybe_type(), non_neg_integer(), non_neg_integer()}. -apply_to_healths -( - nothing, - AttackerHealth, - DefenderHealth -) -> - {nothing, AttackerHealth, DefenderHealth}; -apply_to_healths -( - _Attack, - AttackerHealth, - DefenderHealth -) -when -( - (AttackerHealth =< 0) - or (DefenderHealth =< 0) -) -> - {nothing, AttackerHealth, DefenderHealth}; -apply_to_healths -( - Attack, - AttackerHealth, - DefenderHealth -) -when -( - ( - (not Attack#attack.is_parry) - and ((Attack#attack.order == first) or (Attack#attack.order == second)) - ) - or - ( - Attack#attack.is_parry - and (Attack#attack.order == counter) - ) -) -> - Damage = Attack#attack.damage, - - { - Attack, - AttackerHealth, - (DefenderHealth - Damage) - }; -apply_to_healths -( - Attack, - AttackerHealth, - DefenderHealth -) -when -( - ( - (not Attack#attack.is_parry) - and (Attack#attack.order == counter) - ) - or - ( - Attack#attack.is_parry - and ((Attack#attack.order == first) or (Attack#attack.order == second)) - ) -) -> - Damage = Attack#attack.damage, - - { - Attack, - (AttackerHealth - Damage), - DefenderHealth - }. - --spec get_sequence - ( - non_neg_integer(), - sh_weapon:type(), - sh_weapon:type() - ) - -> list(step()). -get_sequence (AttackRange, AttackerWeapon, DefenderWeapon) -> - {AttackerDefenseRange, AttackerAttackRange} = - sh_weapon:get_ranges(AttackerWeapon), - {DefenderDefenseRange, DefenderAttackRange} = - sh_weapon:get_ranges(DefenderWeapon), - - AttackerCanAttack = (AttackRange =< AttackerAttackRange), - AttackerCanAttack = true, - AttackerCanDefend = - (AttackerCanAttack and (AttackRange > AttackerDefenseRange)), - AttackerCanParry = - (AttackerCanDefend and sh_weapon:can_parry(AttackerWeapon)), - - DefenderCanAttack = (AttackRange =< DefenderAttackRange), - DefenderCanDefend = - (DefenderCanAttack and (AttackRange > DefenderDefenseRange)), - DefenderCanParry = - (DefenderCanDefend and sh_weapon:can_parry(DefenderWeapon)), - - First = {first, DefenderCanParry}, - Second = {second, DefenderCanParry}, - Counter = {counter, AttackerCanParry}, - - if - (not DefenderCanDefend) -> - [First, Second]; - - true -> - [First, Counter, Second] - end. - --spec encode (type()) -> {list(any())}. -encode (Attack) -> - Order = Attack#attack.order, - Precision = Attack#attack.precision, - IsCritical = Attack#attack.is_critical, - IsParry = Attack#attack.is_parry, - Damage = Attack#attack.damage, - - { - [ - {<<"ord">>, encode_order(Order)}, - {<<"pre">>, encode_precision(Precision)}, - {<<"cri">>, IsCritical}, - {<<"par">>, IsParry}, - {<<"dmg">>, Damage} - ] - }. |