summaryrefslogtreecommitdiff |
diff options
author | nsensfel <SpamShield0@noot-noot.org> | 2018-06-08 16:18:40 +0200 |
---|---|---|
committer | nsensfel <SpamShield0@noot-noot.org> | 2018-06-08 16:18:40 +0200 |
commit | e10b050d9224f52031e3a24521f2c63c33d3b2de (patch) | |
tree | ba4466b8082cc3a1576afe10561e33c859666bdc | |
parent | 0416d506aa9d20f2b65ce0123e9c54798a00411e (diff) |
Takes armor benefits into account.
-rw-r--r-- | src/battlemap/bm_shim.erl | 4 | ||||
-rw-r--r-- | src/battlemap/game-logic/bm_turn_actions.erl | 7 | ||||
-rw-r--r-- | src/battlemap/struct/bm_attack.erl | 63 | ||||
-rw-r--r-- | src/shared/struct/sh_armor.erl | 27 |
4 files changed, 60 insertions, 41 deletions
diff --git a/src/battlemap/bm_shim.erl b/src/battlemap/bm_shim.erl index fb5146b..ee11290 100644 --- a/src/battlemap/bm_shim.erl +++ b/src/battlemap/bm_shim.erl @@ -96,8 +96,8 @@ generate_random_characters %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -spec generate_random_battle () -> bm_battle:type(). generate_random_battle () -> - BattlemapWidth = sh_roll:between(16, 64), - BattlemapHeight = sh_roll:between(16, 64), + BattlemapWidth = sh_roll:between(16, 32), + BattlemapHeight = sh_roll:between(16, 32), Battlemap = bm_battlemap:random(0, BattlemapWidth, BattlemapHeight), Characters = generate_random_characters(1, 8, 8, 0, Battlemap, [], []), PlayersAsList = [bm_player:new(<<"0">>), bm_player:new(<<"1">>)], diff --git a/src/battlemap/game-logic/bm_turn_actions.erl b/src/battlemap/game-logic/bm_turn_actions.erl index 0c16bbd..7808d1f 100644 --- a/src/battlemap/game-logic/bm_turn_actions.erl +++ b/src/battlemap/game-logic/bm_turn_actions.erl @@ -195,9 +195,6 @@ handle_attack_sequence TargetCharacter, AttackSequence ) -> - CharacterStatistics = bm_character:get_statistics(Character), - TargetCharacterStatistics = bm_character:get_statistics(TargetCharacter), - AttackPlannedEffects = lists:map ( @@ -205,8 +202,8 @@ handle_attack_sequence bm_attack:get_description_of ( AttackStep, - CharacterStatistics, - TargetCharacterStatistics + Character, + TargetCharacter ) end, AttackSequence diff --git a/src/battlemap/struct/bm_attack.erl b/src/battlemap/struct/bm_attack.erl index c647dae..af55606 100644 --- a/src/battlemap/struct/bm_attack.erl +++ b/src/battlemap/struct/bm_attack.erl @@ -86,27 +86,44 @@ roll_parry (DefenderStatistics) -> -spec effect_of_attack ( order(), - sh_statistics:type(), - sh_statistics:type(), + bm_character:type(), + bm_character:type(), boolean() ) -> type(). -effect_of_attack (Order, AttackerStatistics, DefenderStatistics, CanParry) -> +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), - ActualDamage = + 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 { @@ -134,46 +151,26 @@ encode_precision (misses) -> <<"m">>. -spec get_description_of ( step(), - sh_statistics:type(), - sh_statistics:type() + bm_character:type(), + bm_character:type() ) -> maybe_type(). -get_description_of -( - {first, CanParry}, - AttackerStatistics, - DefenderStatistics -) -> - effect_of_attack(first, AttackerStatistics, DefenderStatistics, CanParry); -get_description_of -( - {second, CanParry}, - AttackerStatistics, - DefenderStatistics -) -> +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, - AttackerStatistics, - DefenderStatistics, - CanParry - ); + effect_of_attack (second, Attacker, Defender, CanParry); _ -> nothing end; -get_description_of -( - {counter, CanParry}, - AttackerStatistics, - DefenderStatistics -) -> - effect_of_attack(counter, DefenderStatistics, AttackerStatistics, CanParry). +get_description_of ({counter, CanParry}, Attacker, Defender) -> + effect_of_attack(counter, Defender, Attacker, CanParry). -spec apply_to_healths ( diff --git a/src/shared/struct/sh_armor.erl b/src/shared/struct/sh_armor.erl index 04b82d6..f328fdf 100644 --- a/src/shared/struct/sh_armor.erl +++ b/src/shared/struct/sh_armor.erl @@ -42,7 +42,8 @@ [ random_id/0, from_id/1, - apply_to_attributes/2 + apply_to_attributes/2, + get_resistance_to/2 ] ). @@ -142,3 +143,27 @@ apply_to_attributes (Ar, Att) -> ) ) end. + +-spec get_resistance_to (sh_weapon:damage_type(), type()) -> non_neg_integer(). +get_resistance_to (DamageType, Armor) -> + ArmorCategory = Armor#armor.category, + BaseResistance = + case {DamageType, ArmorCategory} of + {slash, kinetic} -> 0.0; + {slash, leather} -> 5.0; + {slash, chain} -> 10.0; + {slash, plate} -> 10.0; + {blunt, kinetic} -> 10.0; + {blunt, leather} -> 5.0; + {blunt, chain} -> 5.0; + {blunt, plate} -> 5.0; + {pierce, kinetic} -> 5.0; + {pierce, leather} -> 5.0; + {pierce, chain} -> 5.0; + {pierce, plate} -> 10.0 + end, + + ArmorCoefficient = Armor#armor.coef, + ActualResistance = (ArmorCoefficient * BaseResistance), + + erlang:ceil(ActualResistance). |