summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2018-02-23 18:46:05 +0100
committernsensfel <SpamShield0@noot-noot.org>2018-02-23 18:46:05 +0100
commitf512cb83df8dea9fb39bd98540b0616fe7607f6d (patch)
tree1e11c44c66533a3ce6e55c1c7533f9a0c04a662d /src/query/character_turn
parentacf9e9f1eb880ffb8ab918c40724eda566aefcc7 (diff)
Rewritting "character_turn.erl"...
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
+ ).