| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/query/character_turn')
| -rw-r--r-- | src/query/character_turn/handle_character_attacking_2.erl | 59 | 
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 +      ).  | 


