summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/base_attributes.hrl121
-rw-r--r--src/balancer/struct/blc_armor.erl459
2 files changed, 261 insertions, 319 deletions
diff --git a/include/base_attributes.hrl b/include/base_attributes.hrl
index e0b61e3..2a5254e 100644
--- a/include/base_attributes.hrl
+++ b/include/base_attributes.hrl
@@ -2,60 +2,125 @@
-define(ATTRIBUTE_DAMAGE_MODIFIER_MAX, 300).
-define(ATTRIBUTE_DAMAGE_MODIFIER_DEFAULT, 100).
-define(ATTRIBUTE_DAMAGE_MODIFIER_COST, 1).
+-define
+(
+ ATTRIBUTE_DAMAGE_MODIFIER_MAX_POINTS,
+ (
+ (?ATTRIBUTE_DAMAGE_MODIFIER_MAX - ?ATTRIBUTE_DAMAGE_MODIFIER_MIN)
+ * ?ATTRIBUTE_DAMAGE_MODIFIER_COST
+).
-define(ATTRIBUTE_MOVEMENT_POINTS_MIN, 8).
-define(ATTRIBUTE_MOVEMENT_POINTS_MAX, 200).
-define(ATTRIBUTE_MOVEMENT_POINTS_DEFAULT, 32).
-define(ATTRIBUTE_MOVEMENT_POINTS_COST, 1).
+-define
+(
+ ATTRIBUTE_MOVEMENT_POINTS_MAX_POINTS,
+ (
+ (?ATTRIBUTE_MOVEMENT_POINTS_MAX - ?ATTRIBUTE_MOVEMENT_POINTS_MIN)
+ * ?ATTRIBUTE_MOVEMENT_POINTS_COST
+ )
+).
-define(ATTRIBUTE_HEALTH_MIN, 1).
-define(ATTRIBUTE_HEALTH_MAX, 500).
-define(ATTRIBUTE_HEALTH_DEFAULT, 100).
-define(ATTRIBUTE_HEALTH_COST, 1).
+-define
+(
+ ATTRIBUTE_HEALTH_MAX_POINTS,
+ ((?ATTRIBUTE_HEALTH_MAX - ?ATTRIBUTE_HEALTH_MIN) * ?ATTRIBUTE_HEALTH_COST)
+).
--define(ATTRIBUTE_DODGE_MIN, 0).
--define(ATTRIBUTE_DODGE_MAX, 175).
--define(ATTRIBUTE_DODGE_DEFAULT, 50).
--define(ATTRIBUTE_DODGE_COST, 1).
+-define(ATTRIBUTE_DODGE_CHANCE_MIN, 0).
+-define(ATTRIBUTE_DODGE_CHANCE_MAX, 175).
+-define(ATTRIBUTE_DODGE_CHANCE_DEFAULT, 50).
+-define(ATTRIBUTE_DODGE_CHANCE_COST, 1).
+-define
+(
+ ATTRIBUTE_DODGE_CHANCE_MAX_POINTS,
+ (
+ (?ATTRIBUTE_DODGE_CHANCE_MAX - ?ATTRIBUTE_DODGE_CHANCE_MIN)
+ * ?ATTRIBUTE_DODGE_CHANCE_COST
+ )
+).
--define(ATTRIBUTE_PARRIES_MIN, 0).
--define(ATTRIBUTE_PARRIES_MAX, 100).
--define(ATTRIBUTE_PARRIES_DEFAULT, 5).
--define(ATTRIBUTE_PARRIES_COST, 1).
+-define(ATTRIBUTE_PARRY_CHANCE_MIN, 0).
+-define(ATTRIBUTE_PARRY_CHANCE_MAX, 100).
+-define(ATTRIBUTE_PARRY_CHANCE_DEFAULT, 5).
+-define(ATTRIBUTE_PARRY_CHANCE_COST, 1).
+-define
+(
+ ATTRIBUTE_PARRY_CHANCE_MAX_POINTS,
+ (
+ (?ATTRIBUTE_PARRY_CHANCE_MAX - ?ATTRIBUTE_PARRY_CHANCE_MIN)
+ * ?ATTRIBUTE_PARRY_CHANCE_COST
+ )
+).
-define(ATTRIBUTE_ACCURACY_MIN, 0).
-define(ATTRIBUTE_ACCURACY_MAX, 100).
-define(ATTRIBUTE_ACCURACY_DEFAULT, 50).
-define(ATTRIBUTE_ACCURACY_COST, 1).
+-define
+(
+ ATTRIBUTE_ACCURACY_MAX_POINTS,
+ (
+ (?ATTRIBUTE_ACCURACY_MAX - ?ATTRIBUTE_ACCURACY_MIN)
+ * ?ATTRIBUTE_ACCURACY_COST
+ )
+).
--define(ATTRIBUTE_DOUBLE_HITS_MIN, 0).
--define(ATTRIBUTE_DOUBLE_HITS_MAX, 100).
--define(ATTRIBUTE_DOUBLE_HITS_DEFAULT, 5).
--define(ATTRIBUTE_DOUBLE_HITS_COST, 1).
+-define(ATTRIBUTE_DOUBLE_HIT_CHANCE_MIN, 0).
+-define(ATTRIBUTE_DOUBLE_HIT_CHANCE_MAX, 100).
+-define(ATTRIBUTE_DOUBLE_HIT_CHANCE_DEFAULT, 5).
+-define(ATTRIBUTE_DOUBLE_HIT_CHANCE_COST, 1).
+-define
+(
+ ATTRIBUTE_DOUBLE_HIT_CHANCE_MAX_POINTS,
+ (
+ (?ATTRIBUTE_DOUBLE_HIT_CHANCE_MAX - ?ATTRIBUTE_DOUBLE_HIT_CHANCE_MIN)
+ * ?ATTRIBUTE_DOUBLE_HIT_CHANCE_COST
+ )
+).
--define(ATTRIBUTE_CRITICAL_HITS_MIN, 0).
--define(ATTRIBUTE_CRITICAL_HITS_MAX, 100).
--define(ATTRIBUTE_CRITICAL_HITS_DEFAULT, 10).
--define(ATTRIBUTE_CRITICAL_HITS_COST, 1).
+-define(ATTRIBUTE_CRITICAL_HIT_CHANCE_MIN, 0).
+-define(ATTRIBUTE_CRITICAL_HIT_CHANCE_MAX, 100).
+-define(ATTRIBUTE_CRITICAL_HIT_CHANCE_DEFAULT, 10).
+-define(ATTRIBUTE_CRITICAL_HIT_CHANCE_COST, 1).
+-define
+(
+ ATTRIBUTE_CRITICAL_HIT_CHANCE_MAX_POINTS,
+ (
+ (?ATTRIBUTE_CRITICAL_HIT_CHANCE_MAX - ?ATTRIBUTE_CRITICAL_HIT_CHANCE_MIN)
+ * ?ATTRIBUTE_CRITICAL_HIT_CHANCE_COST
+ )
+).
-define(ATTRIBUTE_DEFENSE_SCORE_MIN, 0).
-define(ATTRIBUTE_DEFENSE_SCORE_MAX, 300).
-define(ATTRIBUTE_DEFENSE_SCORE_BASE, 50).
--define(ATTRIBUTE_DEFENSE_SCORE_COST, 1).
-
--define(ATTRIBUTE_ATTACK_SCORE_MIN, 0).
--define(ATTRIBUTE_ATTACK_SCORE_MAX, 300).
--define(ATTRIBUTE_ATTACK_SCORE_BASE, 50).
--define(ATTRIBUTE_ATTACK_SCORE_COST, 1).
+-define(ATTRIBUTE_DEFENSE_SCORE_COST, 1).
+-define
+(
+ ATTRIBUTE_DEFENSE_SCORE_MAX_POINTS,
+ (
+ (?ATTRIBUTE_DEFENSE_SCORE_MAX - ?ATTRIBUTE_DEFENSE_SCORE_MIN)
+ * ?ATTRIBUTE_DEFENSE_SCORE_COST
+ )
+).
+-define(ATTRIBUTE_ATTACK_SCORE_MIN, 0).
+-define(ATTRIBUTE_ATTACK_SCORE_MAX, 300).
+-define(ATTRIBUTE_ATTACK_SCORE_BASE, 50).
+-define(ATTRIBUTE_ATTACK_SCORE_COST, 1).
-define
(
- ATTRIBUTE_ARMOR_POINTS,
+ ATTRIBUTE_ATTACK_SCORE_MAX_POINTS,
(
- (?ATTRIBUTE_DAMAGE_MODIFIER_COST * ?ATTRIBUTE_DAMAGE_MODIFIER_BASE)
- + (?ATTRIBUTE_MOVEMENT_POINTS_COST * ?ATTRIBUTE_MOVEMENT_POINTS_BASE)
- + (?ATTRIBUTE_HEALTH_COST * ?ATTRIBUTE_HEALTH_BASE)
- + (?ATTRIBUTE_DODGE_COST * ?ATTRIBUTE_DODGE_BASE)
- + (?ATTRIBUTE_DEFENSE_SCORE_COST * ?ATTRIBUTE_DEFENSE_SCORE_BASE)
+ (?ATTRIBUTE_ATTACK_SCORE_MAX - ?ATTRIBUTE_ATTACK_SCORE_MIN)
+ * ?ATTRIBUTE_ATTACK_SCORE_COST
)
).
+
diff --git a/src/balancer/struct/blc_armor.erl b/src/balancer/struct/blc_armor.erl
index c465413..d8fafd8 100644
--- a/src/balancer/struct/blc_armor.erl
+++ b/src/balancer/struct/blc_armor.erl
@@ -2,6 +2,33 @@
-include("../../../include/base_attributes.hrl").
+-define
+(
+ ATTRIBUTE_ARMOR_POINTS,
+ (
+ (
+ ?ATTRIBUTE_DAMAGE_MODIFIER_COST
+ * (?ATTRIBUTE_DAMAGE_MODIFIER_BASE - ?ATTRIBUTE_DAMAGE_MODIFIER_MIN)
+ )
+ +
+ (
+ ?ATTRIBUTE_MOVEMENT_POINTS_COST
+ * (?ATTRIBUTE_MOVEMENT_POINTS_BASE - ?ATTRIBUTE_MOVEMENT_POINTS_MIN)
+ )
+ +
+ (
+ ?ATTRIBUTE_HEALTH_COST
+ * (?ATTRIBUTE_HEALTH_BASE - ?ATTRIBUTE_HEALTH_MIN)
+ )
+ +
+ (
+ ?ATTRIBUTE_DEFENSE_SCORE_COST
+ * (?ATTRIBUTE_DEFENSE_SCORE_BASE - ?ATTRIBUTE_DEFENSE_SCORE_MIN)
+ )
+ + (?ATTRIBUTE_DODGE_COST * (?ATTRIBUTE_DODGE_BASE - ?ATTRIBUTE_DODGE_MIN))
+ )
+).
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -15,77 +42,37 @@
damage_modifier :: non_neg_integer(),
dodge :: non_neg_integer(),
defense :: list(defense_entry()),
+ defense_coef :: list(defense_entry()),
defense_score :: non_neg_integer()
}
).
--record
-(
- factors,
- {
- health :: float(),
- damage_modifier :: float(),
- dodge :: float(),
- defense :: float()
- }
-).
-
-opaque proto_armor() :: #proto_armor{}.
--opaque factors() :: #factors{}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--export_type([proto_armor/0, factors/0]).
+-export_type([proto_armor/0]).
% FIXME: quick debug
-compile(export_all).
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%% Generic %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec get_relative_attribute
- (
- non_neg_integer(),
- non_neg_integer(),
- non_neg_integer()
- )
- -> non_neg_integer().
-get_relative_attribute (Value, BaseValue, BaseTarget) ->
- (
- BaseTarget
- -
- math:floor((Value - BaseValue) * (BaseTarget / BaseValue))
- ).
-
--spec get_modifier_from_movement_points
+-spec sort_defense_entries (list(defense_entry())) -> list(defense_entry()).
+sort_defense_entries (Entries) ->
+ lists:sort
(
- non_neg_integer(),
- non_neg_integer(),
- float()
- )
- -> integer().
-get_modifier_from_movement_points (BaseValue, MovementPoints, Factor) ->
- (
- (MovementPoints - ?BASE_MOVEMENT_POINTS_ATTRIBUTE)
- * (BaseValue / ?BASE_MOVEMENT_POINTS_ATTRIBUTE)
- * Factor
- * -1
+ fun ({_NameA, ValueA}, {_NameB, ValueB}) ->
+ (ValueA >= ValueB)
+ end,
+ Entries
).
-%%%% Defense %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-spec calc_defense_score (list(defense_entry())) -> non_neg_integer().
calc_defense_score (Defense) ->
- DescSortedDefense =
- lists:sort
- (
- fun ({_NameA, ValueA}, {_NameB, ValueB}) ->
- (ValueA >= ValueB)
- end,
- Defense
- ),
-
{_LastIndex, Result} =
lists:foldl
(
@@ -93,7 +80,7 @@ calc_defense_score (Defense) ->
{(Index + 1), (Current + (Index * ValueA))}
end,
{1, 0},
- DescSortedDefense
+ Defense
),
Result.
@@ -110,14 +97,13 @@ apply_defense_score_modifier (AbsModifier, Mod, S0DescSortedDefense) ->
lists:mapfoldl
(
fun ({Name, S0Value}, {Index, RemainingModifier}) ->
- case ((RemainingModifier > 0) and (S0Value > 0)) of
+ case ((RemainingModifier >= Index) and (S0Value > 0)) of
true ->
- S1Value = (S0Value + Mod),
{
- {Name, S1Value},
+ {Name, (S0Value + Mod)},
{
(Index + 1),
- RemainingModifier - (Index * S1Value)
+ RemainingModifier - Index
}
};
@@ -139,273 +125,164 @@ apply_defense_score_modifier (AbsModifier, Mod, S0DescSortedDefense) ->
)
end.
-%%%% Movement Points %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec get_maximum_movement_points_with_factors
+-spec generate_defense_worth
(
non_neg_integer(),
- non_neg_integer(),
- float()
+ list(defense_entry())
)
- -> non_neg_integer().
-get_maximum_movement_points_with_factors (Value, BaseValue, Factor) ->
- case (Factor == 0) of
- true -> (?BASE_MOVEMENT_POINTS_ATTRIBUTE * 3);
- false ->
+ -> list(defense_entry()).
+generate_defense_worth (TargetScore, SortedRatios) ->
+ [{T0, V0}, {T1, V1}, {T2, V2}] = SortedRatios,
+ Distribution = ((V0 + 2 * V1 + 3 * V2) / 100),
+ Base = TargetScore / Distribution,
+ UnderperformingDefense =
+ [
+ {T0, trunc(Base * (V0/100))},
+ {T1, trunc(Base * (V1/100))},
+ {T2, trunc(Base * (V2/100))}
+ ],
+ MissingScore = TargetScore - calc_defense_score(UnderperformingDefense),
+ case (MissingScore >= 0) of
+ true ->
+ apply_defense_score_modifier
(
- (
- Value
- /
- (
- Factor
- * (BaseValue / ?BASE_MOVEMENT_POINTS_ATTRIBUTE)
- )
- )
- )
- end.
-
--spec get_maximum_factor_with_movement_points
- (
- non_neg_integer(),
- non_neg_integer(),
- non_neg_integer()
- )
- -> float().
-get_maximum_factor_with_movement_points (Value, BaseValue, MovementPoints) ->
- MvtPointsBaseMod = (MovementPoints - ?BASE_MOVEMENT_POINTS_ATTRIBUTE),
+ MissingScore,
+ 1,
+ UnderperformingDefense
+ );
- case (MvtPointsBaseMod > 0) of
- false -> 1.0;
- true ->
+ false ->
+ apply_defense_score_modifier
(
- Value
- /
- (MvtPointsBaseMod * (BaseValue / ?BASE_MOVEMENT_POINTS_ATTRIBUTE))
+ (-1 * MissingScore),
+ -1,
+ UnderperformingDefense
)
end.
--spec proto_armor_auto_dodge
- (
- list(defense_entry()),
- non_neg_integer(),
- non_neg_integer()
- )
- -> proto_armor().
-proto_armor_auto_dodge (Defense, Health, DamageModifier) ->
- DefenseScore = calc_defense_score(Defense),
-
- Dodge =
- get_relative_attribute
- (
- DefenseScore,
- ?BASE_DEFENSE_SCORE,
- ?BASE_DODGE_ATTRIBUTE
- ),
-
- #proto_armor
- {
- health = Health,
- damage_modifier = DamageModifier,
- dodge = Dodge,
- defense = Defense,
- defense_score = DefenseScore
- }.
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec get_maximum_damage_modifier () -> non_neg_integer().
-get_maximum_damage_modifier () -> (?BASE_DAMAGE_MODIFIER_ATTRIBUTE * 2).
-
--spec get_maximum_movement_points () -> non_neg_integer().
-get_maximum_movement_points () -> (?BASE_MOVEMENT_POINTS_ATTRIBUTE * 2).
-
--spec get_maximum_health () -> non_neg_integer().
-get_maximum_health () -> (?BASE_HEALTH_ATTRIBUTE * 2).
-
--spec get_maximum_dodge () -> non_neg_integer().
-get_maximum_dodge () -> (?BASE_DODGE_ATTRIBUTE * 2).
-
--spec get_maximum_defense_score () -> non_neg_integer().
-get_maximum_defense_score () -> (?BASE_DEFENSE_SCORE * 2).
-
-
--spec get_maximum_movement_points
+-spec increase_health_by
(
- factors(),
+ non_neg_integer(),
proto_armor()
)
- -> non_neg_integer().
-get_maximum_movement_points (Factor, ProtoArmor) ->
- lists:min
- (
- [
- get_maximum_movement_points_with_factors
- (
- ProtoArmor#proto_armor.health,
- ?BASE_HEALTH_ATTRIBUTE,
- Factor#factors.health
- ),
- get_maximum_movement_points_with_factors
- (
- ProtoArmor#proto_armor.damage_modifier,
- ?BASE_DAMAGE_MODIFIER_ATTRIBUTE,
- Factor#factors.damage_modifier
- ),
- get_maximum_movement_points_with_factors
- (
- ProtoArmor#proto_armor.defense_score,
- ?BASE_DEFENSE_SCORE,
- Factor#factors.defense
- ),
- get_maximum_movement_points_with_factors
- (
- ProtoArmor#proto_armor.dodge,
- ?BASE_DODGE_ATTRIBUTE,
- Factor#factors.dodge
- )
- ]
- ).
+ -> {proto_armor(), non_neg_integer()}.
+increase_health_by (Amount, Armor) ->
+ NewHealth = Armor#proto_armor.health + Amount,
+ case (NewHealth > ?ATTRIBUTE_HEALTH_MAX) of
+ true ->
+ {
+ Armor#proto_armor{ health = ?ATTRIBUTE_HEALTH_MAX },
+ (
+ (?ATTRIBUTE_HEALTH_MAX - Armor#proto_armor.health)
+ * ?ATTRIBUTE_HEALTH_COST
+ )
+ };
--spec get_maximum_factors (non_neg_integer(), proto_armor()) -> factors().
-get_maximum_factors (MovementPoints, ProtoArmor) ->
- #factors
- {
- health =
- get_maximum_factor_with_movement_points
- (
- ProtoArmor#proto_armor.health,
- ?BASE_HEALTH_ATTRIBUTE,
- MovementPoints
- ),
- damage_modifier =
- get_maximum_factor_with_movement_points
- (
- ProtoArmor#proto_armor.damage_modifier,
- ?BASE_DAMAGE_MODIFIER_ATTRIBUTE,
- MovementPoints
- ),
- dodge =
- get_maximum_factor_with_movement_points
- (
- ProtoArmor#proto_armor.dodge,
- ?BASE_DODGE_ATTRIBUTE,
- MovementPoints
- ),
- defense =
- get_maximum_factor_with_movement_points
- (
- ProtoArmor#proto_armor.defense_score,
- ?BASE_DEFENSE_SCORE,
- MovementPoints
- )
- }.
+ false ->
+ {
+ Armor#proto_armor{ health = NewHealth },
+ (Amount * ?ATTRIBUTE_HEALTH_COST)
+ }
+ end.
--spec proto_armor_through_health
+-spec increase_damage_modifier_by
(
- list(defense_entry()),
- non_neg_integer()
+ non_neg_integer(),
+ proto_armor()
)
- -> proto_armor().
-proto_armor_through_health (Defense, Health) ->
- DamageModifier =
- get_relative_attribute
- (
- Health,
- ?BASE_HEALTH_ATTRIBUTE,
- ?BASE_DAMAGE_MODIFIER_ATTRIBUTE
- ),
+ -> {proto_armor(), non_neg_integer()}.
+increase_damage_modifier_by (Amount, Armor) ->
+ NewDamageModifier = Armor#proto_armor.damage_modifier + Amount,
+ case (NewDamageModifier > ?ATTRIBUTE_DAMAGE_MODIFIER_MAX) of
+ true ->
+ {
+ Armor#proto_armor
+ {
+ damage_modifier = ?ATTRIBUTE_DAMAGE_MODIFIER_MAX
+ },
+ (
+ (
+ ?ATTRIBUTE_DAMAGE_MODIFIER_MAX
+ - Armor#proto_armor.damage_modifier
+ )
+ * ?ATTRIBUTE_DAMAGE_MODIFIER_COST
+ )
+ };
- proto_armor_auto_dodge(Defense, Health, DamageModifier).
+ false ->
+ {
+ Armor#proto_armor{ damage_modifier = NewDamageModifier },
+ (Amount * ?ATTRIBUTE_DAMAGE_MODIFIER_COST)
+ }
+ end.
--spec proto_armor_through_damage_modifier
+-spec increase_dodge_chance_by
(
- list(defense_entry()),
- non_neg_integer()
+ non_neg_integer(),
+ proto_armor()
)
- -> proto_armor().
-proto_armor_through_damage_modifier (Defense, DamageModifier) ->
- Health =
- get_relative_attribute
- (
- DamageModifier,
- ?BASE_DAMAGE_MODIFIER_ATTRIBUTE,
- ?BASE_HEALTH_ATTRIBUTE
- ),
+ -> {proto_armor(), non_neg_integer()}.
+increase_dodge_chance_by (Amount, Armor) ->
+ NewDodgeChance = Armor#proto_armor.dodge + Amount,
+ case (NewDodgeChance > ?ATTRIBUTE_DODGE_CHANCE_MAX) of
+ true ->
+ {
+ Armor#proto_armor{ dodge = ?ATTRIBUTE_DODGE_CHANCE_MAX },
+ (
+ (?ATTRIBUTE_DODGE_CHANCE_MAX - Armor#proto_armor.dodge)
+ * ?ATTRIBUTE_DODGE_CHANCE_COST
+ )
+ };
- proto_armor_auto_dodge(Defense, Health, DamageModifier).
+ false ->
+ {
+ Armor#proto_armor{ dodge = NewDodgeChance },
+ (Amount * ?ATTRIBUTE_DODGE_CHANCE_COST)
+ }
+ end.
--spec finalize_to_omnimods
+-spec increase_defense_score_by
(
non_neg_integer(),
- factors(),
proto_armor()
)
- -> shr_omnimods:type().
-finalize_to_omnimods (MovementPoints, Factors, ProtoArmor) ->
- HealthMod =
- get_modifier_from_movement_points
- (
- ?BASE_HEALTH_ATTRIBUTE,
- MovementPoints,
- Factors#factors.health
- ),
-
- DamageModifierMod =
- get_modifier_from_movement_points
- (
- ?BASE_DAMAGE_MODIFIER_ATTRIBUTE,
- MovementPoints,
- Factors#factors.damage_modifier
- ),
-
- DodgeMod =
- get_modifier_from_movement_points
- (
- ?BASE_DODGE_ATTRIBUTE,
- MovementPoints,
- Factors#factors.dodge
- ),
-
- DefenseMod =
- get_modifier_from_movement_points
- (
- ?BASE_DEFENSE_SCORE,
- MovementPoints,
- Factors#factors.defense
- ),
-
- DefenseActualMod =
- case (DefenseMod >= 0) of
- true -> 1;
- false -> -1
- end,
-
- shr_omnimods:new
- (
- [
- {movement_points, MovementPoints},
- {
- health,
- shr_math_util:ceil(ProtoArmor#proto_armor.health + HealthMod)
- },
+ -> {proto_armor(), non_neg_integer()}.
+increase_defense_score_by (Amount, Armor) ->
+ NewDefenseScore = Armor#proto_armor.defense_score + Amount,
+ case (NewDefenseScore > ?ATTRIBUTE_DEFENSE_SCORE_MAX) of
+ true ->
{
- damage_modifier,
- shr_math_util:ceil
+ Armor#proto_armor
+ {
+ defense_score = ?ATTRIBUTE_DEFENSE_SCORE_MAX,
+ defense =
+ generate_defense_worth
+ (
+ NewDefenseScore,
+ Armor#proto_armor.defense_coef
+ )
+ },
(
- ProtoArmor#proto_armor.damage_modifier
- + DamageModifierMod
+ (?ATTRIBUTE_DEFENSE_SCORE_MAX - Armor#proto_armor.defense_score)
+ * Amount
)
- },
+ };
+
+ false ->
{
- dodge,
- shr_math_util:ceil(ProtoArmor#proto_armor.dodge + DodgeMod)
+ Armor#proto_armor
+ {
+ defense_score = NewDefenseScore,
+ defense =
+ generate_defense_worth
+ (
+ NewDefenseScore,
+ Armor#proto_armor.defense_coef
+ )
+ },
+ (Amount * ?ATTRIBUTE_DEFENSE_SCORE_COST)
}
- ],
- [],
- apply_defense_score_modifier
- (
- abs(DefenseMod),
- DefenseActualMod,
- ProtoArmor#proto_armor.defense
- )
- ).
+ end.