aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornsensfel <SpamShield0@noot-noot.org>2019-09-06 17:35:01 +0200
committernsensfel <SpamShield0@noot-noot.org>2019-09-06 17:35:01 +0200
commit9a3e0fb6c22d54bbd445e2d792a7554015acacad (patch)
tree0defd22c936bbdbcc0f6707ece15ff5e87ea10e6
parent621505c168ec61194f3c495ec8c2d6cbbfdab781 (diff)
downloadtacticians-server-9a3e0fb6c22d54bbd445e2d792a7554015acacad.zip
tacticians-server-9a3e0fb6c22d54bbd445e2d792a7554015acacad.tar.bz2
Removes omnimods from glyph boards.
-rw-r--r--src/balancer/struct/blc_glyph.erl255
-rw-r--r--src/shared/reply/shr_add_glyph_board.erl6
-rw-r--r--src/shared/struct/inventory/shr_glyph_board.erl.m413
3 files changed, 249 insertions, 25 deletions
diff --git a/src/balancer/struct/blc_glyph.erl b/src/balancer/struct/blc_glyph.erl
index c6b2735..c88f381 100644
--- a/src/balancer/struct/blc_glyph.erl
+++ b/src/balancer/struct/blc_glyph.erl
@@ -1,9 +1,9 @@
-module(blc_glyph).
-include("tacticians/attributes.hrl").
+-include("tacticians/damage_types.hrl").
-define(SPENDABLE_GLYPH_POINTS, 100).
--define(NEGATIVE_POINTS_MULTIPLIER, 1.25).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -35,9 +35,9 @@
(
[
increase_attribute_by/3,
- decrease_attribute_by/3,
+ decrease_attribute_by/4,
increase_attribute_for/3,
- decrease_attribute_for/3,
+ decrease_attribute_for/4,
set_attack_coefficients/2,
set_defense_coefficients/2
]
@@ -47,14 +47,69 @@
(
[
new/2,
+ new/4,
+ generate/0,
get_remaining_positive_points/1,
- get_points_balance/1
+ get_points_balance/1,
+ export/1
]
).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+-spec attribute_coefficent
+ (
+ shr_attributes:meta_enum(),
+ shr_attributes:meta_enum()
+ )
+ -> ({ok, float()} | error).
+attribute_coefficent (Attr0, Attr1) ->
+ case {Attr0, Attr1} of
+ {?ATTRIBUTE_ACCURACY, ?ATTRIBUTE_CRITICAL_HIT_CHANCE} -> {ok, 0.75};
+ {?ATTRIBUTE_ACCURACY, ?ATTRIBUTE_DODGE_CHANCE} -> {ok, 0.75};
+ {?ATTRIBUTE_ACCURACY, ?ATTRIBUTE_HEALTH} -> {ok, 1.00};
+ {?ATTRIBUTE_ACCURACY, ?ATTRIBUTE_MOVEMENT_POINTS} -> {ok, 1.00};
+
+ {?ATTRIBUTE_CRITICAL_HIT_CHANCE, ?ATTRIBUTE_DOUBLE_HIT_CHANCE} ->
+ {ok, 0.75};
+ {?ATTRIBUTE_CRITICAL_HIT_CHANCE, ?ATTRIBUTE_DAMAGE_MODIFIER} ->
+ {ok, 0.75};
+ {?ATTRIBUTE_CRITICAL_HIT_CHANCE, ?ATTRIBUTE_DODGE_CHANCE} -> {ok, 1.00};
+ {?ATTRIBUTE_CRITICAL_HIT_CHANCE, ?ATTRIBUTE_PARRY_CHANCE} -> {ok, 1.00};
+
+ {?ATTRIBUTE_DOUBLE_HIT_CHANCE, ?ATTRIBUTE_ACCURACY} -> {ok, 0.75};
+ {?ATTRIBUTE_DOUBLE_HIT_CHANCE, ?ATTRIBUTE_DAMAGE_MODIFIER} -> {ok, 0.75};
+ {?ATTRIBUTE_DOUBLE_HIT_CHANCE, ?ATTRIBUTE_HEALTH} -> {ok, 1.00};
+ {?ATTRIBUTE_DOUBLE_HIT_CHANCE, ?ATTRIBUTE_MOVEMENT_POINTS} -> {ok, 1.00};
+
+ {?ATTRIBUTE_DAMAGE_MODIFIER, ?ATTRIBUTE_DODGE_CHANCE} -> {ok, 1.00};
+ {?ATTRIBUTE_DAMAGE_MODIFIER, ?ATTRIBUTE_HEALTH} -> {ok, 0.75};
+ {?ATTRIBUTE_DAMAGE_MODIFIER, ?ATTRIBUTE_MOVEMENT_POINTS} -> {ok, 1.00};
+ {?ATTRIBUTE_DAMAGE_MODIFIER, ?ATTRIBUTE_DEFENSE_SCORE} -> {ok, 0.75};
+
+ {?ATTRIBUTE_DODGE_CHANCE, ?ATTRIBUTE_HEALTH} -> {ok, 0.75};
+ {?ATTRIBUTE_DODGE_CHANCE, ?ATTRIBUTE_PARRY_CHANCE} -> {ok, 0.75};
+
+ {?ATTRIBUTE_HEALTH, ?ATTRIBUTE_MOVEMENT_POINTS} -> {ok, 0.75};
+ {?ATTRIBUTE_HEALTH, ?ATTRIBUTE_ATTACK_SCORE} -> {ok, 0.75};
+
+ {?ATTRIBUTE_MOVEMENT_POINTS, ?ATTRIBUTE_DODGE_CHANCE} -> {ok, 0.75};
+ {?ATTRIBUTE_MOVEMENT_POINTS, ?ATTRIBUTE_ATTACK_SCORE} -> {ok, 0.75};
+ {?ATTRIBUTE_MOVEMENT_POINTS, ?ATTRIBUTE_DEFENSE_SCORE} -> {ok, 1.00};
+
+ {?ATTRIBUTE_PARRY_CHANCE, ?ATTRIBUTE_ACCURACY} -> {ok, 0.75};
+ {?ATTRIBUTE_PARRY_CHANCE, ?ATTRIBUTE_MOVEMENT_POINTS} -> {ok, 0.75};
+ {?ATTRIBUTE_PARRY_CHANCE, ?ATTRIBUTE_ATTACK_SCORE} -> {ok, 1.00};
+ {?ATTRIBUTE_PARRY_CHANCE, ?ATTRIBUTE_DEFENSE_SCORE} -> {ok, 0.75};
+
+ {?ATTRIBUTE_ATTACK_SCORE, ?ATTRIBUTE_CRITICAL_HIT_CHANCE} -> {ok, 0.75};
+
+ {?ATTRIBUTE_DEFENSE_SCORE, ?ATTRIBUTE_DOUBLE_HIT_CHANCE} -> {ok, 0.75};
+
+ _ -> error
+ end.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -194,17 +249,24 @@ increase_attribute_by (Attribute, S0Amount, Glyph) ->
(
shr_attributes:meta_enum(),
non_neg_integer(),
+ float(),
type()
)
-> ({ok, type()} | blc_error:type()).
-decrease_attribute_by (?ATTRIBUTE_ATTACK_SCORE, Amount, Glyph) ->
+decrease_attribute_by
+(
+ ?ATTRIBUTE_ATTACK_SCORE,
+ Amount,
+ PointsMultiplier,
+ Glyph
+) ->
NewAttackScore = (Glyph#proto_glyph.attack_score + Amount),
Cost =
trunc
(
(Amount * ?ATTRIBUTE_ATTACK_SCORE_COST)
- * ?NEGATIVE_POINTS_MULTIPLIER
+ * PointsMultiplier
),
if
@@ -234,14 +296,20 @@ decrease_attribute_by (?ATTRIBUTE_ATTACK_SCORE, Amount, Glyph) ->
}
}
end;
-decrease_attribute_by (?ATTRIBUTE_DEFENSE_SCORE, Amount, Glyph) ->
+decrease_attribute_by
+(
+ ?ATTRIBUTE_DEFENSE_SCORE,
+ Amount,
+ PointsMultiplier,
+ Glyph
+) ->
NewDefenseScore = (Glyph#proto_glyph.defense_score + Amount),
Cost =
trunc
(
(Amount * ?ATTRIBUTE_DEFENSE_SCORE_COST)
- * ?NEGATIVE_POINTS_MULTIPLIER
+ * PointsMultiplier
),
if
@@ -271,13 +339,13 @@ decrease_attribute_by (?ATTRIBUTE_DEFENSE_SCORE, Amount, Glyph) ->
}
}
end;
-decrease_attribute_by (Attribute, Amount, Glyph) ->
+decrease_attribute_by (Attribute, Amount, PointsMultiplier, Glyph) ->
{_AttMin, _AttDef, _AttMax, AttCost} = blc_attribute:get_info(Attribute),
CurrentOmnimods = Glyph#proto_glyph.omnimods,
CurrentValue =
shr_omnimods:get_attribute_modifier(Attribute, CurrentOmnimods),
- Cost = trunc((Amount * AttCost) * ?NEGATIVE_POINTS_MULTIPLIER),
+ Cost = trunc((Amount * AttCost) * PointsMultiplier),
if
(CurrentValue > 0) -> {error, incompatible};
@@ -417,6 +485,46 @@ new (AttackCoefficients, DefenseCoefficients) ->
defense_sign = 0
}.
+-spec new
+ (
+ list(blc_damage_type:coefficient()),
+ list(blc_damage_type:coefficient()),
+ shr_attributes:meta_enum(),
+ shr_attributes:meta_enum()
+ )
+ -> ({ok, type()} | error).
+new (AttackCoefficients, DefenseCoefficients, IncreasedAtt, DecreasedAtt) ->
+ case attribute_coefficent(IncreasedAtt, DecreasedAtt) of
+ error -> error;
+ {ok, PointsReduction} ->
+ PointsMultiplier = (2.0 - PointsReduction),
+ S0Result = new(AttackCoefficients, DefenseCoefficients),
+ case
+ decrease_attribute_for
+ (
+ DecreasedAtt,
+ get_remaining_positive_points(S0Result),
+ PointsMultiplier,
+ S0Result
+ )
+ of
+ {ok, S1Result} ->
+ case
+ increase_attribute_for
+ (
+ IncreasedAtt,
+ get_points_balance(S1Result),
+ S1Result
+ )
+ of
+ {ok, S2Result} -> {ok, S2Result};
+ _ -> error
+ end;
+
+ _ -> error
+ end
+ end.
+
-spec increase_attribute_for
(
shr_attributes:meta_enum(),
@@ -433,15 +541,16 @@ increase_attribute_for (Attribute, GivenPoints, Glyph) ->
(
shr_attributes:meta_enum(),
non_neg_integer(),
+ float(),
type()
)
-> ({ok, type} | blc_error:type()).
-decrease_attribute_for (Attribute, GivenPoints, Glyph) ->
+decrease_attribute_for (Attribute, GivenPoints, PointsMultiplier, Glyph) ->
{_AttMin, _AttDef, _AttMax, AttCost} = blc_attribute:get_info(Attribute),
AmountOfDecrease =
- trunc(GivenPoints / (?NEGATIVE_POINTS_MULTIPLIER * AttCost)),
+ trunc(GivenPoints / (PointsMultiplier * AttCost)),
- decrease_attribute_by(Attribute, AmountOfDecrease, Glyph).
+ decrease_attribute_by(Attribute, AmountOfDecrease, PointsMultiplier, Glyph).
-spec get_remaining_positive_points (type()) -> non_neg_integer().
get_remaining_positive_points (Glyph) ->
@@ -450,3 +559,123 @@ get_remaining_positive_points (Glyph) ->
-spec get_points_balance (type()) -> non_neg_integer().
get_points_balance (Glyph) ->
Glyph#proto_glyph.points_balance.
+
+-spec generate () -> list(type()).
+generate () ->
+ Attributes =
+ [
+ ?ATTRIBUTE_ACCURACY,
+ ?ATTRIBUTE_ATTACK_SCORE,
+ ?ATTRIBUTE_CRITICAL_HIT_CHANCE,
+ ?ATTRIBUTE_DAMAGE_MODIFIER,
+ ?ATTRIBUTE_DEFENSE_SCORE,
+ ?ATTRIBUTE_DODGE_CHANCE,
+ ?ATTRIBUTE_DOUBLE_HIT_CHANCE,
+ ?ATTRIBUTE_HEALTH,
+ ?ATTRIBUTE_MOVEMENT_POINTS,
+ ?ATTRIBUTE_PARRY_CHANCE
+ ],
+
+ DamageTypeDistributions =
+ lists:map
+ (
+ fun ([A, B, C]) ->
+ [
+ {?DAMAGE_TYPE_SLASH, A},
+ {?DAMAGE_TYPE_PIERCE, B},
+ {?DAMAGE_TYPE_BLUNT, C}
+ ]
+ end,
+ blc_distribution:generate(3, 25)
+ ),
+
+ S0Result =
+ shr_lists_util:product
+ (
+ fun (IncreasedAttribute, DecreasedAttribute) ->
+ case {IncreasedAttribute, DecreasedAttribute} of
+ {A, B} when
+ (
+ (
+ (A =:= ?ATTRIBUTE_DEFENSE_SCORE)
+ or (B =:= ?ATTRIBUTE_ATTACK_SCORE)
+ )
+ and
+ (
+ (A =:= ?ATTRIBUTE_ATTACK_SCORE)
+ or (B =:= ?ATTRIBUTE_DEFENSE_SCORE)
+ )
+ ) ->
+ shr_lists_util:product
+ (
+ fun (AttackCoefs, DefenseCoefs) ->
+ new
+ (
+ AttackCoefs,
+ DefenseCoefs,
+ IncreasedAttribute,
+ DecreasedAttribute
+ )
+ end,
+ DamageTypeDistributions,
+ DamageTypeDistributions
+ );
+
+ {A, B} when
+ (
+ (A =:= ?ATTRIBUTE_DEFENSE_SCORE)
+ or (B =:= ?ATTRIBUTE_DEFENSE_SCORE)
+ ) ->
+ lists:map
+ (
+ fun (DefenseCoefs) ->
+ new
+ (
+ [],
+ DefenseCoefs,
+ IncreasedAttribute,
+ DecreasedAttribute
+ )
+ end,
+ DamageTypeDistributions
+ );
+
+ {A, B} when
+ (
+ (A =:= ?ATTRIBUTE_ATTACK_SCORE)
+ or (B =:= ?ATTRIBUTE_ATTACK_SCORE)
+ ) ->
+ lists:map
+ (
+ fun (AttackCoefs) ->
+ new
+ (
+ AttackCoefs,
+ [],
+ IncreasedAttribute,
+ DecreasedAttribute
+ )
+ end,
+ DamageTypeDistributions
+ );
+
+ _ -> [new([], [], IncreasedAttribute, DecreasedAttribute)]
+ end
+ end,
+ Attributes,
+ Attributes
+ ),
+
+ lists:filtermap
+ (
+ fun (Candidate) ->
+ case Candidate of
+ {ok, Result} -> {true, Result};
+ _ -> false
+ end
+ end,
+ lists:flatten(S0Result)
+ ).
+
+-spec export (type()) -> list().
+export (Glyph) -> shr_omnimods:export(Glyph#proto_glyph.omnimods).
diff --git a/src/shared/reply/shr_add_glyph_board.erl b/src/shared/reply/shr_add_glyph_board.erl
index 1d694f1..5776568 100644
--- a/src/shared/reply/shr_add_glyph_board.erl
+++ b/src/shared/reply/shr_add_glyph_board.erl
@@ -23,10 +23,6 @@ generate (GlyphBoard) ->
{<<"msg">>, <<"add_glyph_board">>},
{<<"id">>, shr_glyph_board:get_id(GlyphBoard)},
{<<"nam">>, shr_glyph_board:get_name(GlyphBoard)},
- {<<"slot">>, shr_glyph_board:get_slots(GlyphBoard)},
- {
- <<"omni">>,
- shr_omnimods:encode(shr_glyph_board:get_omnimods(GlyphBoard))
- }
+ {<<"slot">>, shr_glyph_board:get_slots(GlyphBoard)}
]
}.
diff --git a/src/shared/struct/inventory/shr_glyph_board.erl.m4 b/src/shared/struct/inventory/shr_glyph_board.erl.m4
index 3324997..2d3311e 100644
--- a/src/shared/struct/inventory/shr_glyph_board.erl.m4
+++ b/src/shared/struct/inventory/shr_glyph_board.erl.m4
@@ -11,7 +11,6 @@
{
id :: id(),
name :: binary(),
- omnimods :: shr_omnimods:type(),
slots :: list(integer())
}
).
@@ -35,7 +34,6 @@
[
get_id/1,
get_name/1,
- get_omnimods/1,
get_slots/1
]
).
@@ -82,9 +80,6 @@ get_id (GlyphBoard) -> GlyphBoard#glyph_board.id.
-spec get_name (type()) -> binary().
get_name (GlyphBoard) -> GlyphBoard#glyph_board.name.
--spec get_omnimods (type()) -> shr_omnimods:type().
-get_omnimods (GlyphBoard) -> GlyphBoard#glyph_board.omnimods.
-
-spec get_slots (type()) -> list(non_neg_integer()).
get_slots (GlyphBoard) -> GlyphBoard#glyph_board.slots.
@@ -104,11 +99,15 @@ default () -> from_id(<<"0">>).
)
-> shr_omnimods:type().
get_omnimods_with_glyphs (Glyphs, GlyphBoard) ->
- BoardOmnimods = GlyphBoard#glyph_board.omnimods,
BoardSlots = GlyphBoard#glyph_board.slots,
{ok, Omnimods} =
- get_omnimods_with_glyphs_internals(BoardOmnimods, Glyphs, BoardSlots),
+ get_omnimods_with_glyphs_internals
+ (
+ shr_omnimods:new(),
+ Glyphs,
+ BoardSlots
+ ),
Omnimods.