summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/struct/statistics.erl')
-rw-r--r-- | src/struct/statistics.erl | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/src/struct/statistics.erl b/src/struct/statistics.erl new file mode 100644 index 0000000..0668fea --- /dev/null +++ b/src/struct/statistics.erl @@ -0,0 +1,157 @@ +-module(statistics). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-record +( + statistics, + { + movement_points, + health, + dodges, + parries, + damage_min, + damage_max, + accuracy, + double_hits, + critical_hits + } +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +-export +( + [ + get_movement_points/1, + get_health/1, + get_dodges/1, + get_parries/1, + get_damage_min/1, + get_damage_max/1, + get_accuracy/1, + get_double_hits/1, + get_critical_hits/1 + ] +). + +-export +( + [ + calc_for/2 + ] +). + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +ceil (F) -> + I = trunc(F), + case (F > I) of + true -> (I + 1); + _ -> I + end. + +float_to_int (F) -> trunc(ceil(F)). +min_max (Min, Max, V) -> min(Max, max(Min, V)). + +average ([]) -> 0; +average (L) -> lists:sum(L) / length(L). + +% V | 010 | 030 | 050 | 070 | 100 | +% F | 004 | 023 | 058 | 104 | 200 | +gentle_squared_growth (V) -> float_to_int(math:pow(V, 1.8) / 20). + +% V | 010 | 030 | 050 | 070 | 100 | +% F | 001 | 005 | 018 | 041 | 100 | +sudden_squared_growth (V) -> float_to_int(math:pow(V, 2.5) / 1000). + +% V | 010 | 030 | 050 | 070 | 100 | +% F | 002 | 006 | 016 | 049 | 256 | +sudden_exp_growth (V) -> float_to_int(math:pow(4, V / 25)). + +% V | 010 | 030 | 050 | 070 | 100 | +% F | 040 | 066 | 079 | 088 | 099 | +% 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)). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%% Accessors +get_movement_points (Stats) -> Stats#statistics.movement_points. +get_health (Stats) -> Stats#statistics.health. +get_dodges (Stats) -> Stats#statistics.dodges. +get_parries (Stats) -> Stats#statistics.parries. +get_damage_min (Stats) -> Stats#statistics.damage_min. +get_damage_max (Stats) -> Stats#statistics.damage_max. +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) -> + #statistics + { + movement_points = gentle_squared_growth(attributes:get_speed(Att)), + health = gentle_squared_growth(attributes:get_constitution(Att)), + dodges = + min_max + ( + 0, + 100, + sudden_exp_growth + ( + average + ( + [ + attributes:get_dexterity(Att), + attributes:get_mind(Att), + attributes:get_speed(Att) + ] + ) + ) + ), + parries = + min_max + ( + 0, + 75, + sudden_exp_growth + ( + average + ( + [ + attributes:get_dexterity(Att), + attributes:get_speed(Att), + attributes:get_strength(Att) + ] + ) + ) + ), + 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)) + ), + 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))) + }. |