summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/query/character_turn')
-rw-r--r--src/query/character_turn/handle_character_attacking_2.erl59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/query/character_turn/handle_character_attacking_2.erl b/src/query/character_turn/handle_character_attacking_2.erl
new file mode 100644
index 0000000..3fd2687
--- /dev/null
+++ b/src/query/character_turn/handle_character_attacking_2.erl
@@ -0,0 +1,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
+ ).