summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/battlemap')
-rw-r--r--src/battlemap/bm_shim.erl4
-rw-r--r--src/battlemap/game-logic/bm_turn_actions.erl7
-rw-r--r--src/battlemap/struct/bm_attack.erl63
3 files changed, 34 insertions, 40 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
(