1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
roll_hits (AttackerStatistics, DefenderStatistics) ->
MissChance =
max
(
0,
(
statistics:get_dodges(DefenderStatistics)
-
statistics:get_accuracy(AttackerStatistics)
)
),
case roll:percentage() of
X when (X < MissChance) -> misses;
X when (X < (MissChance * 2)) -> grazes;
_ -> hits
end.
roll_damage (AttackerStatistics, _DefenderStatistics) ->
{MinimumDamage, MaximumDamage} = statistics:get_damages(AttackerStatistics),
MaximumRoll = max(1, MaximumDamage - MinimumDamage),
MinimumDamage + (rand:uniform(MaximumRoll) - 1).
handle_character_attacking (QueryState, Input) ->
BattlemapInstance = QueryState#query_state.battlemap_instance,
ControlledCharacterInstance = QueryState#query_state.character_instance,
ControlledCharacter =
character_instance:get_character(ControlledCharacterInstance),
ControlledCharacterStatistics =
character:get_statistics(ControlledCharacter),
TargettedCharacterInstance =
array:get
(
Input#input.target_id,
battlemap_instance:get_characters(BattlemapInstance)
),
TargettedCharacter =
character_instance:get_character(TargettedCharacterInstance),
TargettedCharacterStatistics = character:get_statistics(TargettedCharacter),
RequiredRange =
movement:steps_between
(
character_instance:get_location(ControlledCharacterInstance),
character_instance:get_location(TargettedCharacterInstance)
),
{AttackingWeaponID, _} = character:get_weapon_ids(ControlledCharacter),
AttackingWeapon = weapon:from_id(AttackingWeaponID),
{_, AttackingWeaponRange} = weapon:get_ranges(AttackingWeapon),
{DefendingWeaponID, _} = character:get_weapon_ids(TargettedCharacter),
DefendingWeapon = weapon:from_id(DefendingWeaponID),
{DefendingWeaponRange, _} = weapon:get_ranges(DefendingWeapon),
true = (RequiredRange =< AttackingWeaponRange),
{Rolls, HealthMod} =
handle_attack
(
ControlledCharacterStatistics,
TargettedCharacterStatistics
).
|