summaryrefslogtreecommitdiff |
diff options
author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2019-08-15 15:19:38 +0200 |
---|---|---|
committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2019-08-15 15:19:38 +0200 |
commit | 49bd70107f41fec789b8617d2775b50ed2b3c7ae (patch) | |
tree | 23de922e9362c3a6a220bf32fc39b531bab44100 | |
parent | 9d45e68f8daa748c58e28c77434b1377c508e32f (diff) |
...
-rw-r--r-- | include/base_attributes.hrl | 121 | ||||
-rw-r--r-- | src/balancer/struct/blc_armor.erl | 459 |
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. |