summaryrefslogtreecommitdiff |
diff options
author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2019-08-19 01:15:23 +0200 |
---|---|---|
committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2019-08-19 01:15:23 +0200 |
commit | 78f689ceed7819943b85e6c63e1c96396ca0e386 (patch) | |
tree | 4d98756fa463b30e4c3c3c00dc52ab57570880f4 /src/balancer/struct/blc_armor.erl | |
parent | 7a1686695e70b68b2d4ad49c0f5bc967fa6d1013 (diff) |
Adds naive collection generator.
Diffstat (limited to 'src/balancer/struct/blc_armor.erl')
-rw-r--r-- | src/balancer/struct/blc_armor.erl | 134 |
1 files changed, 133 insertions, 1 deletions
diff --git a/src/balancer/struct/blc_armor.erl b/src/balancer/struct/blc_armor.erl index cc23415..0c642e1 100644 --- a/src/balancer/struct/blc_armor.erl +++ b/src/balancer/struct/blc_armor.erl @@ -1,6 +1,7 @@ -module(blc_armor). -include("tacticians/attributes.hrl"). +-include("tacticians/damage_types.hrl"). -define ( @@ -75,7 +76,8 @@ ( [ new/1, - get_remaining_points/1 + get_remaining_points/1, + generate/1 ] ). @@ -124,6 +126,17 @@ increase_attribute_by (Attribute, S0Amount, Armor) -> } end. +-spec get_max_attribute_ratio (shr_attributes:meta_enum()) -> float(). +get_max_attribute_ratio (Attribute) -> + {AttMin, _AttDef, AttMax, AttCost} = blc_attribute:get_info(Attribute), + + Contrib = (AttCost * (AttMax - AttMin)), + + case (Contrib == 0) of + true -> 0.0; + false -> (?SPENDABLE_ARMOR_POINTS / Contrib) * 100.0 + end. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -313,3 +326,122 @@ increase_defense_score_for (GivenPoints, Armor) -> -spec get_remaining_points (type()) -> non_neg_integer(). get_remaining_points (Armor) -> Armor#proto_armor.remaining_points. + +-spec generate (non_neg_integer()) -> list(type()). +generate (Step) -> + MaxDamageModifier = get_max_attribute_ratio(?ATTRIBUTE_DAMAGE_MODIFIER), + MaxDodgeChance = get_max_attribute_ratio(?ATTRIBUTE_DODGE_CHANCE), + MaxMovementPoints = get_max_attribute_ratio(?ATTRIBUTE_MOVEMENT_POINTS), + MaxHealth = get_max_attribute_ratio(?ATTRIBUTE_HEALTH), + MaxDefenseScore = get_max_attribute_ratio(?ATTRIBUTE_DEFENSE_SCORE), + + Distributions = blc_distribution:generate(5, Step), + ValidDistributions = + lists:filtermap + ( + fun + ( + [ + DamageModifier, + DodgeChance, + MovementPoints, + Health, + DefenseScore + ] + ) -> + if + (DamageModifier > MaxDamageModifier) -> false; + (DodgeChance > MaxDodgeChance) -> false; + (MovementPoints > MaxMovementPoints) -> false; + (Health > MaxHealth) -> false; + (DefenseScore > MaxDefenseScore) -> false; + true -> + { + true, + [ + {?ATTRIBUTE_DAMAGE_MODIFIER, DamageModifier}, + {?ATTRIBUTE_DODGE_CHANCE, DodgeChance}, + {?ATTRIBUTE_MOVEMENT_POINTS, MovementPoints}, + {?ATTRIBUTE_HEALTH, Health}, + {?ATTRIBUTE_DEFENSE_SCORE, DefenseScore}%, +% { +% extra, +% ( +% 100 +% - +% ( +% DamageModifier +% + DodgeChance +% + MovementPoints +% + Health +% + DefenseScore +% ) +% ) +% } + ] + } + end + end, + Distributions + ), + + BaseArmorsCoefs = [{?DAMAGE_TYPE_SLASH, 100}], + + BaseArmor = new(BaseArmorsCoefs), + BaseArmors = + lists:map + ( + fun (Distribution) -> + PointsUsed = + lists:map + ( + fun ({Attribute, Percent}) -> + { + Attribute, + trunc((?SPENDABLE_ARMOR_POINTS * Percent) / 100) + } + end, + Distribution + ), + + FinalArmor = + lists:foldl + ( + fun ({Attribute, Points}, Armor) -> + case Attribute of + ?ATTRIBUTE_DEFENSE_SCORE -> + {ok, NewArmor} = + increase_defense_score_for(Points, Armor), + NewArmor; + + ?ATTRIBUTE_DODGE_CHANCE -> + {ok, NewArmor} = + increase_dodge_chance_for(Points, Armor), + NewArmor; + + ?ATTRIBUTE_HEALTH -> + {ok, NewArmor} = + increase_health_for(Points, Armor), + NewArmor; + + ?ATTRIBUTE_DAMAGE_MODIFIER -> + {ok, NewArmor} = + increase_damage_modifier_for(Points, Armor), + NewArmor; + + ?ATTRIBUTE_MOVEMENT_POINTS -> + {ok, NewArmor} = + increase_movement_points_for(Points, Armor), + NewArmor + end + end, + BaseArmor, + PointsUsed + ), + + FinalArmor + end, + ValidDistributions + ), + + BaseArmors. |