summaryrefslogtreecommitdiff |
diff options
Diffstat (limited to 'src/shared/struct/shr_omnimods.erl')
-rw-r--r-- | src/shared/struct/shr_omnimods.erl | 149 |
1 files changed, 143 insertions, 6 deletions
diff --git a/src/shared/struct/shr_omnimods.erl b/src/shared/struct/shr_omnimods.erl index b87f2cd..2d06493 100644 --- a/src/shared/struct/shr_omnimods.erl +++ b/src/shared/struct/shr_omnimods.erl @@ -4,15 +4,16 @@ %% TYPES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -type entry() :: {atom(), integer()}. +-type mods() :: dict:dict(atom(), integer()). -record ( omnimods, { - attmods = list(entry()), - stamods = list(entry()), - atkmods = list(entry()), - defmods = list(entry()) + attmods :: mods(), + stamods :: mods(), + atkmods :: mods(), + defmods :: mods() } ). @@ -26,7 +27,8 @@ -export ( [ - new/4 + new/4, + new_dirty/4 ] ). @@ -34,14 +36,149 @@ -export ( [ + merge/2, + apply_coefficient/2 + ] +). + +-export +( + [ + apply_to_attributes/3, + apply_to_statistics/3, + get_attack_damage/3 ] ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% LOCAL FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +-spec cleanup_entry_list (list(entry())) -> list(entry()). +cleanup_entry_list (ModList) -> + [First|Rem] = ModList, + case First of + {none, _} -> Rem; + _ -> ModList + end. + +-spec apply_coefficient_to_mods (float(), mods()) -> mods(). +apply_coefficient_to_mods (Coef, Mods) -> + dict:map(fun ({_Name, Val}) -> shr_util:ceil(Coef * Val) end, Mods). + +-spec merge_mods (mods(), mods()) -> mods(). +merge_mods (ModsA, ModsB) -> + dict:merge(fun (_Name, ValA, ValB) -> (ValA + ValB) end, ModsA, ModsB). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% EXPORTED FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% +%%% Creation +-spec new +( + list(entry()), + list(entry()), + list(entry()), + list(entry()) + ) + -> type(). +new (AttributeMods, StatisticMods, AttackMods, DefenseMods) -> + #omnimods + { + attmods = dict:from_list(AttributeMods), + stamods = dict:from_list(StatisticMods), + atkmods = dict:from_list(AttackMods), + defmods = dict:from_list(DefenseMods) + }. + +-spec new_dirty +( + list(entry()), + list(entry()), + list(entry()), + list(entry()) + ) + -> type(). +new_dirty(AttributeMods, StatisticMods, AttackMods, DefenseMods) -> + new + ( + cleanup_entry_list(AttributeMods), + cleanup_entry_list(StatisticMods), + cleanup_entry_list(AttackMods), + cleanup_entry_list(DefenseMods) + ). + +%%% Modification +-spec merge (type(), type()) -> type(). +merge (OmniA, OmniB) -> + OmniA#omnimods + { + attmods = merge_mods(OmniA#omnimods.attmods, OmniB#omnimods.attmods), + stamods = merge_mods(OmniA#omnimods.stamods, OmniB#omnimods.stamods), + atkmods = merge_mods(OmniA#omnimods.atkmods, OmniB#omnimods.atkmods), + defmods = merge_mods(OmniA#omnimods.defmods, OmniB#omnimods.defmods) + }. + +-spec apply_coefficient (float(), type()) -> type(). +apply_coefficient (Coef, Omnimods) -> + Omnimods#omnimods + { + attmods = apply_coefficient_to_mods(Coef, Omnimods#omnimods.attmods), + stamods = apply_coefficient_to_mods(Coef, Omnimods#omnimods.stamods), + atkmods = apply_coefficient_to_mods(Coef, Omnimods#omnimods.atkmods), + defmods = apply_coefficient_to_mods(Coef, Omnimods#omnimods.defmods) + }. + +%%% Application +-spec apply_to_attributes + ( + fun((atom(), integer(), shr_attributes:type()) -> shr_attributes:type()), + type(), + shr_attributes:type() + ) + -> shr_attributes:type(). +apply_to_attributes (UpdateFun, Omnimods, Attributes) -> + dict:fold + ( + UpdateFun, + Attributes, + Omnimods#omnimods.attmods + ). + +-spec apply_to_statistics + ( + fun((atom(), integer(), shr_statistics:type()) -> shr_statistics:type()), + type(), + shr_statistics:type() + ) + -> shr_statistics:type(). +apply_to_statistics (UpdateFun, Omnimods, Statistics) -> + dict:fold + ( + UpdateFun, + Statistics, + Omnimods#omnimods.attmods + ). + +-spec get_attack_damage (float(), type(), type()) -> non_neg_integer(). +get_attack_damage (AttackModifier, AttackerOmnimods, DefenderOmnimods) -> + AttackerOmnimodsAttmods = AttackerOmnimods#omnimods.atkmods, + DefenderOmnimodsDefmods = DefenderOmnimods#omnimods.defmods, + + S0Calc = + apply_coefficient_to_mods(-1*AttackModifier, AttackerOmnimodsAttmods), + S1Calc = merge_mods(DefenderOmnimodsDefmods, S0Calc), + + Result = + dict:fold + ( + fun (_Name, Val, CurrResult) -> + case (Val > 0) of + true -> (CurrResult + Val); + _ -> CurrResult + end + end, + 0, + S1Calc + ), + + Result. |