summaryrefslogtreecommitdiff |
diff options
author | nsensfel <SpamShield0@noot-noot.org> | 2018-02-23 22:47:43 +0100 |
---|---|---|
committer | nsensfel <SpamShield0@noot-noot.org> | 2018-02-23 22:47:43 +0100 |
commit | 96c35eb8c79826fa07d2b00bbac039d9ec95eb3c (patch) | |
tree | 94d7fef850637be6fd800f139a59d578763ba671 /src/struct/statistics.erl | |
parent | 959b994bced0863d4b8a984f38f5ac61aa3620e0 (diff) |
...
Diffstat (limited to 'src/struct/statistics.erl')
-rw-r--r-- | src/struct/statistics.erl | 92 |
1 files changed, 42 insertions, 50 deletions
diff --git a/src/struct/statistics.erl b/src/struct/statistics.erl index 0668fea..f5a4650 100644 --- a/src/struct/statistics.erl +++ b/src/struct/statistics.erl @@ -34,14 +34,16 @@ get_damage_max/1, get_accuracy/1, get_double_hits/1, - get_critical_hits/1 + get_critical_hits/1, + + get_damages/1 ] ). -export ( [ - calc_for/2 + new/2 ] ). @@ -78,6 +80,12 @@ sudden_exp_growth (V) -> float_to_int(math:pow(4, V / 25)). % Seems too generous, values for attributes below 50 should dip faster and % lower. already_high_slow_growth (V) -> float_to_int(30 * math:log((V + 5)/4)). + +damage_base_modifier (Strength) -> ((math:pow(Strength, 1.8) / 2000.0) - 0.75). + +apply_damage_base_modifier (Modifier, BaseValue) -> + max(0, float_to_int(BaseValue + (BaseValue * Modifier))). + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -92,28 +100,36 @@ get_accuracy (Stats) -> Stats#statistics.accuracy. get_double_hits (Stats) -> Stats#statistics.double_hits. get_critical_hits (Stats) -> Stats#statistics.critical_hits. -calc_for (Att, _Wp) -> +get_damages (Stats) -> + { + Stats#statistics.damage_min, + Stats#statistics.damage_max + }. + +new (BaseAttributes, WeaponIDs) -> + {ActiveWeaponID, _} = WeaponIDs, + ActiveWeapon = weapon:from_id(ActiveWeaponID), + {MinDamage, MaxDamage} = weapon:get_damages(ActiveWeapon), + Attributes = weapon:apply_to_attributes(ActiveWeapon, BaseAttributes), + Constitution = attributes:get_constitution(Attributes), + Dexterity = attributes:get_dexterity(Attributes), + Intelligence = attributes:get_intelligence(Attributes), + Mind = attributes:get_mind(Attributes), + Speed = attributes:get_speed(Attributes), + Strength = attributes:get_strength(Attributes), + DamageBaseModifier = damage_base_modifier(Strength), + #statistics { - movement_points = gentle_squared_growth(attributes:get_speed(Att)), - health = gentle_squared_growth(attributes:get_constitution(Att)), - dodges = - min_max + movement_points = + gentle_squared_growth ( - 0, - 100, - sudden_exp_growth - ( - average - ( - [ - attributes:get_dexterity(Att), - attributes:get_mind(Att), - attributes:get_speed(Att) - ] - ) - ) + average([Mind, Constitution, Constitution, Speed, Speed, Speed]) ), + health = + gentle_squared_growth(average([Mind, Constitution, Constitution])), + dodges = + min_max(0, 100, sudden_exp_growth(average([Dexterity, Mind, Speed]))), parries = min_max ( @@ -121,37 +137,13 @@ calc_for (Att, _Wp) -> 75, sudden_exp_growth ( - average - ( - [ - attributes:get_dexterity(Att), - attributes:get_speed(Att), - attributes:get_strength(Att) - ] - ) + average([Dexterity, Intelligence, Speed, Strength]) ) ), - damage_min = 0, - damage_max = 100, - accuracy = - % Hitting should involve this stat (not with this formula though), but - % also the target's dodge stat, with three possible results: - % - Missed - % - Grazed (Halved damage) - % - Hit - % Stat = (target.dodge - char.accuracy) - % Roll = RAND(0, 100) - % if (Roll >= (Stat * 2)): Hit - % else if (Roll >= Stat): Grazed - % else: Missed. - min_max - ( - 0, - 100, - sudden_squared_growth(attributes:get_dexterity(Att)) - ), + damage_min = apply_damage_base_modifier(DamageBaseModifier, MinDamage), + damage_max = apply_damage_base_modifier(DamageBaseModifier, MaxDamage), + accuracy = min_max(0, 100, sudden_squared_growth(Dexterity)), double_hits = - min_max(0, 100, sudden_squared_growth(attributes:get_speed(Att))), - critical_hits = - min_max(0, 100, sudden_squared_growth(attributes:get_intelligence(Att))) + min_max(0, 100, sudden_squared_growth(average([Mind, Speed]))), + critical_hits = min_max(0, 100, sudden_squared_growth(Intelligence)) }. |