| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src')
| -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). | 


