Formula

CommonFun.DoCalcDamage

formula.lua
1function CommonFun.DoCalcDamage(srcUser, targetUser, params, logger)
2  local damage = 0
3  local damageType
4  local RealDamage = targetUser:GetProperty("RealDamage")
5  if targetUser:HasBuffID(96050_LEX_AETERNA_:MAX_STACK_0) and 1 <= RealDamage then
6    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
7    if skillID == 359_RUNE_KNIGHT:PRESSURE then
8      RealDamage = RealDamage - 1
9    end
10  end
11  local MaxHp = targetUser:GetProperty("MaxHp")
12  local BaseLv = targetUser.BaseLv
13  local BaseLv1 = srcUser.BaseLv
14  local TransformID = srcUser:GetProperty("TransformID")
15  local MRefine = srcUser:GetProperty("MRefine")
16  local skillParams = Table_Skill[params.skillIDAndLevel]
17  local damageParamList = skillParams.Damage
18  for i = 1, #damageParamList do
19    local damageParam = damageParamList[i]
20    local func = CommonFun.CalcDamageFuncs[damageParam.type]
21    if nil ~= func then
22      local partDamage, partDamageType = func(srcUser, targetUser, params, damageParam, logger)
23      local elementDam = CommonFun.DoCalcElementDam(srcUser, targetUser, params, damageParam)
24      local stateDam = CommonFun.DoCalcStateEffectDam(srcUser, targetUser)
25      local srcAtkElement = CommonFun.GetUserAtkAttr(srcUser, targetUser, params, damageParam)
26      if (targetUser:HasBuffID(116813_WHITE_BARRIER_SNARE_:MAX_STACK_0) or targetUser:HasBuffID(116817_WHITE_BARRIER_SLOW_:MAX_STACK_0) or targetUser:HasBuffID(186150_WHITE_BARRIER_COMPOUND_MAGIC_SLOW_:MAX_STACK_0) or targetUser:HasBuffID(156111_WHITE_BARRIER_:MAX_STACK_0) or targetUser:HasBuffID(135271_SOUL_OF_THE_WIZARD_WHITE_BARRIER_:MAX_STACK_0) or targetUser:HasBuffID(232130_WHITE_BARRIER_:MAX_STACK_0) or targetUser:HasBuffID(116810_WHITE_IMPRISON_SNARE_:MAX_STACK_0) and targetUser.boss == false and targetUser.mini == false) and 0 < partDamage then
27        local Numjianyu = srcUser:GetRunePoint(223021_AESIR_DIVINE_DESTRUCTION_SLASH_AND_DRAGON_SLASH_CAN_DEAL_20_DMG_TO_ENEMY_UNITS_IN_THE_WHITE_IMPRISON_STATE)
28        local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
29        local GemValue = srcUser:GetGemValue(21161_NEW_THOUGHT_ELEMENTAL_BALL_THOUGHT_ATK_PERCENTAGE)
30        if skillID == 1915_HUNTER:RAGNA_BLADE or skillID == 1908_HUNTER:DRAG_SLAVE or skillID == 1941_SNIPER:DIVINE_DESTRUCTION_SLASH_LIGHTNING_BOLT_SMASH then
31          if 1 <= Numjianyu and targetUser:HasBuffID(116810_WHITE_IMPRISON_SNARE_:MAX_STACK_0) then
32            partDamage = partDamage * Numjianyu * 0.2
33          else
34            partDamage = 0
35            partDamageType = CommonFun.DamageType.WeaponBlock
36          end
37        elseif skillID == 1164_THIEF:TETRA_VORTEX then
38          if targetUser:HasBuffID(116810_WHITE_IMPRISON_SNARE_:MAX_STACK_0) and srcUser:HasBuffID(22000010_ELEMENTAL_EDDY_CAN_ATTACK_WHITE_PRISON_:MAX_STACK_0) then
39          elseif 0 < GemValue and srcAtkElement == 8 then
40          elseif 0 < GemValue and srcAtkElement ~= 8 then
41            partDamage = 0
42          else
43            partDamage = 0
44            partDamageType = CommonFun.DamageType.WeaponBlock
45          end
46        elseif srcAtkElement ~= 8 then
47          partDamage = 0
48          partDamageType = CommonFun.DamageType.WeaponBlock
49        end
50      end
51      if srcUser:HasBuffID(107480_REAPER_DAMAGE_CONVERTED_TO_LIFE_LOSS_:MAX_STACK_0) == false and skillID == 4855_PHANTOM_DANCER:TEMPORAL_EROSION_BUBBLE and skillID == 4856_PHANTOM_DANCER:TEMPORAL_EROSION_BUBBLE and skillID == 4857_PHANTOM_DANCER:SINGULARITY_OF_SILENCE and skillID == 4858_PHANTOM_DANCER:SINGULARITY_OF_SILENCE then
52        if srcAtkElement == 5 or srcAtkElement == 6 or srcAtkElement == 8 then
53          if targetUser:HasBuffID(154910_3274_:MAX_STACK_0) then
54            partDamage = 0
55          end
56          if srcAtkElement == 6 and targetUser:HasBuffID(107441_SACRED_IMMUNITY_:MAX_STACK_0) then
57            partDamage = 0
58          end
59        end
60        if srcAtkElement == 3 and (targetUser:HasBuffID(154920_3276_:MAX_STACK_0) or targetUser:HasBuffID(107437_WATER_IMMUNITY_:MAX_STACK_0)) then
61          partDamage = 0
62        end
63        if srcAtkElement == 4 and (targetUser:HasBuffID(154920_3276_:MAX_STACK_0) or targetUser:HasBuffID(10570_FIRE_DAMAGE_IMMUNITY_:MAX_STACK_0) or targetUser:HasBuffID(107439_FIRE_IMMUNITY_:MAX_STACK_0)) then
64          partDamage = 0
65        end
66        if srcAtkElement == 1 or srcAtkElement == 2 then
67          if targetUser:HasBuffID(154930_3278_:MAX_STACK_0) then
68            partDamage = 0
69          end
70          if srcAtkElement == 1 and targetUser:HasBuffID(107433_WIND_IMMUNITY_:MAX_STACK_0) then
71            partDamage = 0
72          end
73          if srcAtkElement == 2 and targetUser:HasBuffID(107435_NEGATE_EARTH_:MAX_STACK_0) then
74            partDamage = 0
75          end
76        end
77        if (srcAtkElement == 7 or srcAtkElement == 9) and targetUser:HasBuffID(154940_3280_:MAX_STACK_0) then
78          partDamage = 0
79        end
80        if srcAtkElement == 10 and (targetUser:HasBuffID(154940_3280_:MAX_STACK_0) or targetUser:HasBuffID(10580_POISON_DAMAGE_IMMUNITY_:MAX_STACK_0)) then
81          partDamage = 0
82        end
83      end
84      if srcAtkElement == 1 and targetUser:HasBuffID(49160_WIND_ANCIENT_RELICS_:MAX_STACK_0) and 0 < partDamage then
85        partDamage = partDamage * 0.4
86      end
87      if srcAtkElement == 2 and targetUser:HasBuffID(49170_EARTH_ANCIENT_RELICS_:MAX_STACK_0) then
88        partDamage = partDamage * 0.4
89      end
90      if srcAtkElement == 3 and targetUser:HasBuffID(49180_WATER_ANCIENT_RELICS_:MAX_STACK_0) then
91        partDamage = partDamage * 0.4
92      end
93      if srcAtkElement == 4 and targetUser:HasBuffID(49190_FIRE_ANCIENT_RELICS_:MAX_STACK_0) then
94        partDamage = partDamage * 0.4
95      end
96      if srcAtkElement == 6 and targetUser:HasBuffID(49270_HOLY_ATTRIBUTE_ANCIENT_RELIC_:MAX_STACK_0) and 0 < partDamage then
97        partDamage = partDamage * 0.4
98      end
99      if srcAtkElement == 7 and targetUser:HasBuffID(49280_DARK_ATTRIBUTE_ANCIENT_RELIC_:MAX_STACK_0) then
100        partDamage = partDamage * 0.4
101      end
102      if srcAtkElement == 8 and targetUser:HasBuffID(49290_GHOST_ANCIENT_RELICS_:MAX_STACK_0) then
103        partDamage = partDamage * 0.4
104      end
105      if srcAtkElement == 10 and targetUser:HasBuffID(49300_POISON_ATTRIBUTE_ANCIENT_RELIC_:MAX_STACK_0) then
106        partDamage = partDamage * 0.4
107      end
108      if srcAtkElement == 5 and targetUser:HasBuffID(49310_NEUTRAL_ANCIENT_RELIC_:MAX_STACK_0) then
109        partDamage = partDamage * 0.4
110      end
111      if (srcAtkElement == 3 or srcAtkElement == 4) and targetUser:HasBuffID(159570_FROST_:MAX_STACK_0) then
112        partDamage = partDamage * 0.8
113      end
114      if (srcAtkElement == 2 or srcAtkElement == 4) and targetUser:HasBuffID(159571_FLAME_:MAX_STACK_0) then
115        partDamage = partDamage * 0.8
116      end
117      if (srcAtkElement == 1 or srcAtkElement == 2) and targetUser:HasBuffID(159572_GREAT_LAND_:MAX_STACK_0) then
118        partDamage = partDamage * 0.8
119      end
120      if (srcAtkElement == 1 or srcAtkElement == 3) and targetUser:HasBuffID(159573_HIGHWIND_:MAX_STACK_0) then
121        partDamage = partDamage * 0.8
122      end
123      if srcAtkElement ~= 8 and targetUser:HasBuffID(159574_UNREAL_:MAX_STACK_0) then
124        partDamage = partDamage * 0.8
125      end
126      if srcAtkElement == 6 and targetUser:HasBuffID(159575_PILGRIMAGE_:MAX_STACK_0) then
127        partDamage = partDamage * 0.8
128      end
129      if srcUser:HasBuffID(178100_TOXIN_PROFICIENCY_:MAX_STACK_0) and targetUser:HasBuffID(177930_DEGENERATE_CORRUPTION_:MAX_STACK_12) then
130        local fuhua = targetUser:GetBuffLayer(177930_DEGENERATE_CORRUPTION_:MAX_STACK_12)
131        partDamage = partDamage * (1 + math.min(fuhua * 0.2, 0.6))
132      end
133      partDamage = partDamage * elementDam * stateDam
134      damage = damage + partDamage
135      if nil ~= partDamageType then
136        damageType = partDamageType
137      end
138    else
139      logger.error(string.format("CommonFun.CalcDamageFuncs[%s] is nil", tostring(damageParam.type)))
140    end
141  end
142  damage = math.floor(damage)
143  if 0 < damage and targetUser:GetNpcID() == 30043_YEAR_YEAR then
144    local damageParam = damageParamList[1]
145    if damageParam ~= nil and damageParam.type ~= 8002 then
146      return 1, CommonFun.DamageType.Normal
147    end
148  end
149  if 0 < damage and (targetUser:GetNpcID() == 56008_GOMORA_GOMORA or targetUser:GetNpcID() == 56009_BALTAN_BALTAN or targetUser:GetNpcID() == 56010_GOLZA_GOLZA or targetUser:GetNpcID() == 56011_BEMSTAR_BEMSTAR or targetUser:GetNpcID() == 56012_ELEKING_ELEKING or targetUser:GetNpcID() == 56013_KING_JOE_KING_JOE) then
150    local damageParam = damageParamList[1]
151    if damageParam ~= nil and damageParam.type ~= 8020 and damageParam.type ~= 8021 then
152      return 1, CommonFun.DamageType.Normal
153    end
154  end
155  if 0 < damage and (targetUser:GetNpcID() == 56107_THE_FOURTH_ANGEL_THE_FOURTH_ANGEL or targetUser:GetNpcID() == 56108_THE_TENTH_ANGEL_THE_TENTH_ANGEL or targetUser:GetNpcID() == 56109_THE_SIXTH_ANGEL_THE_SIXTH_ANGEL) then
156    local damageParam = damageParamList[1]
157    if damageParam ~= nil and damageParam.type ~= 8010 and damageParam.type ~= 8011 then
158      return 1, CommonFun.DamageType.Normal
159    end
160  end
161  if targetUser:HasBuffID(155031_3294_:MAX_STACK_0) then
162    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
163    if skillID == 79338_:MURDER_OF_ILLUSORY_CROWS then
164      return 0, CommonFun.DamageType.Miss
165    end
166  end
167  if srcUser:GetNpcID() == 300102_BRAGI or srcUser:GetNpcID() == 301300_BRAGI or srcUser:GetNpcID() == 301301_BRAGI or srcUser:GetNpcID() == 301302_BRAGI or srcUser:GetNpcID() == 301303_BRAGI then
168    local skillID, skillLevel = CommonFun.UnmergeSkillID(params.skillIDAndLevel)
169    if skillID == 79342_:BALLAD_OF_ONE_THOUGHT then
170      local targetid = targetUser:GetGuid()
171      local distance = srcUser:GetDistance(targetid)
172      if distance <= 7 then
173        return 0, CommonFun.DamageType.None
174      end
175    end
176  end
177  if srcUser.boss and targetUser.boss == false then
178    local mapid, maptype = srcUser:GetMapInfo()
179    if maptype == 5 then
180      return math.floor(damage * (1 + RealDamage)), damageType
181    elseif srcUser:GetNpcID() == 291100_NIGHTMARE_OF_EDDGA or srcUser:GetNpcID() == 291200_NIGHTMARE_OF_EDDGA or srcUser:GetNpcID() == 291300_NIGHTMARE_OF_EDDGA or srcUser:GetNpcID() == 292100_SHADOW_OF_STROUF or srcUser:GetNpcID() == 292200_SHADOW_OF_STROUF or srcUser:GetNpcID() == 292300_SHADOW_OF_STROUF or srcUser:GetNpcID() == 293100_SHADOW_OF_MORROC or srcUser:GetNpcID() == 293200_SHADOW_OF_MORROC or srcUser:GetNpcID() == 293300_SHADOW_OF_MORROC then
182      return math.floor(damage * (1 + RealDamage)), damageType
183    elseif srcUser:GetNpcID() == 294104_RUNEMASTER or srcUser:GetNpcID() == 294105_DEMON_KING or srcUser:GetNpcID() == 294204_RUNEMASTER or srcUser:GetNpcID() == 294205_DEMON_KING or srcUser:GetNpcID() == 294304_RUNEMASTER or srcUser:GetNpcID() == 294305_DEMON_KING or srcUser:GetNpcID() == 295107_DARK_ASSASSIN_CROSS_EREMES or srcUser:GetNpcID() == 295207_DARK_ASSASSIN_CROSS_EREMES or srcUser:GetNpcID() == 295307_DARK_ASSASSIN_CROSS_EREMES then
184      return math.floor(damage * (1 + RealDamage)) + math.floor(MaxHp * math.random(1, 5) / 100) * (1 + (BaseLv1 - BaseLv) / 200), damageType
185    elseif BaseLv <= BaseLv1 and 70 <= BaseLv1 then
186      return math.floor(damage * (1 + RealDamage)) + math.floor(BaseLv1 * math.random(10, 25) + MRefine * 5 + MaxHp * math.random(1, 5) / 100) * (1 + (BaseLv1 - BaseLv) / 200), damageType
187    else
188      return math.floor(damage * (1 + RealDamage)) + math.floor(BaseLv1 * math.random(10, 25) + MRefine * 5 + MaxHp * math.random(1, 5) / 100) * (1 - (BaseLv - BaseLv1) / 200), damageType
189    end
190  end
191  if targetUser.boss and srcUser:GetNpcID() == 0 and BaseLv >= BaseLv1 then
192    return math.floor(damage * (1 + RealDamage)) * (1 - (BaseLv - BaseLv1) / 200), damageType
193  end
194  if TransformID ~= 0 then
195    local AttrEffect = srcUser:GetProperty("AttrEffect2")
196    local bits = CommonFun.getBits(AttrEffect)
197    local temp = false
198    if bits[CommonFun.AttrEffect2.BoliBianshen] == 1 or bits[CommonFun.AttrEffect2.GonghuiBianshen] == 1 then
199      temp = true
200    end
201    if bits[CommonFun.AttrEffect2.BCatBianshen] == 1 and targetUser:GetNpcID() == 30043_YEAR_YEAR then
202      temp = true
203    end
204    if 240000 <= TransformID and TransformID <= 240050 then
205      temp = true
206    end
207    if bits[CommonFun.AttrEffect2.UltraMan] == 1 and (targetUser:GetNpcID() == 56008_GOMORA_GOMORA or targetUser:GetNpcID() == 56009_BALTAN_BALTAN or targetUser:GetNpcID() == 56010_GOLZA_GOLZA or targetUser:GetNpcID() == 56011_BEMSTAR_BEMSTAR or targetUser:GetNpcID() == 56012_ELEKING_ELEKING or targetUser:GetNpcID() == 56013_KING_JOE_KING_JOE) then
208      temp = true
209    end
210    if bits[CommonFun.AttrEffect2.UltraMan] == 1 and (targetUser:GetNpcID() == 56107_THE_FOURTH_ANGEL_THE_FOURTH_ANGEL or targetUser:GetNpcID() == 56108_THE_TENTH_ANGEL_THE_TENTH_ANGEL or targetUser:GetNpcID() == 56109_THE_SIXTH_ANGEL_THE_SIXTH_ANGEL) then
211      temp = true
212    end
213    if TransformID == 62052 or TransformID == 62143 or TransformID == 62142 then
214      temp = true
215    end
216    if TransformID == 56634 or TransformID == 56635 then
217      temp = true
218    end
219    if TransformID == 455003 or TransformID == 455004 or TransformID == 455005 or TransformID == 280118 or TransformID == 280119 or TransformID == 280120 then
220      temp = true
221    end
222    if 80089 <= TransformID and TransformID <= 80094 then
223      temp = true
224    end
225    if temp == false then
226      return 6
227    end
228  end
229  local index = params.hitedIndex
230  if 100 <= index and math.floor(params.skillIDAndLevel / 1000) == 144 then
231    local Buff1 = srcUser:HasBuffID(45000130_DOUBLE_HEALING_:MAX_STACK_0)
232    local Num0 = srcUser:GetRunePoint(52001_AESIR_SKILL_LEVEL_OF_DOUBLE_HEALING_1_AFTER_CASTING_THE_PRIEST_RECEIVES_DOUBLE_HEALING_FOR_10_SECONDS_THE_NEXT_HEALING_SPELL_WILL_CURE_ONE_MORE_PARTY_MEMBER_WITH_THE_LOWEST_HP_THE_RECOVERY_VALUE_EQUALS_TO_10_OF_YOUR_HEALING_AMOUNT)
233    local Num1 = srcUser:GetRunePoint(52040_AESIR_SKILL_LEVEL_OF_DOUBLE_HEALING_1_AFTER_CASTING_THE_PRIEST_RECEIVES_DOUBLE_HEALING_FOR_10_SECONDS_THE_NEXT_HEALING_SPELL_WILL_CURE_ONE_MORE_PARTY_MEMBER_WITH_THE_LOWEST_HP_THE_RECOVERY_VALUE_EQUALS_TO_10_OF_YOUR_HEALING_AMOUNT)
234    local Num2 = srcUser:GetRunePoint(52041_AESIR_SKILL_LEVEL_OF_DOUBLE_HEALING_1_AFTER_CASTING_THE_PRIEST_RECEIVES_DOUBLE_HEALING_FOR_10_SECONDS_THE_NEXT_HEALING_SPELL_WILL_CURE_ONE_MORE_PARTY_MEMBER_WITH_THE_LOWEST_HP_THE_RECOVERY_VALUE_EQUALS_TO_10_OF_YOUR_HEALING_AMOUNT)
235    local Num3 = srcUser:GetRunePoint(52042_AESIR_SKILL_LEVEL_OF_DOUBLE_HEALING_1_AFTER_CASTING_THE_PRIEST_RECEIVES_DOUBLE_HEALING_FOR_10_SECONDS_THE_NEXT_HEALING_SPELL_WILL_CURE_ONE_MORE_PARTY_MEMBER_WITH_THE_LOWEST_HP_THE_RECOVERY_VALUE_EQUALS_TO_10_OF_YOUR_HEALING_AMOUNT)
236    local Num4 = srcUser:GetRunePoint(52003_AESIR_DURATION_OF_DOUBLE_HEALING_3_SECONDS_RECOVERY_VALUE_OF_DOUBLE_HEALING_3)
237    local RuneDamage = (Num0 + Num1 + Num2 + Num3) * 0.1 + Num4 * 0.03
238    local BuffRate = 0
239    if Buff1 == true then
240      BuffRate = RuneDamage
241    end
242    return damage * BuffRate, damageType
243  end
244  if damage < 0 then
245    RealDamage = 0
246  end
247  if index ~= 1 and (math.floor(params.skillIDAndLevel / 1000) == 74 or math.floor(params.skillIDAndLevel / 1000) == 79 or math.floor(params.skillIDAndLevel / 1000) == 107 or math.floor(params.skillIDAndLevel / 1000) == 1902) then
248    local Num1 = srcUser:GetRunePoint(22070_AESIR_SPLASH_DAMAGE_OF_ELEMENT_DIFFUSION_2)
249    local Num2 = srcUser:GetRunePoint(22033_AESIR_SPLASH_DAMAGE_OF_ELEMENT_DIFFUSION_2)
250    local Num3 = srcUser:GetRunePoint(22080_AESIR_FIRE_BOLT_COLD_BOLT_LIGHTNING_BOLT_SPLASHES_TO_3_TARGETS_DEALING_SPLASH_DAMAGE_EQUAL_TO_5_SKILL_DAMAGE_SP_COST_25)
251    local Num4 = srcUser:GetRunePoint(223008_AESIR_SPLASH_DAMAGE_OF_ELEMENT_DIFFUSION_2)
252    local Num5 = srcUser:GetRunePoint(223012_AESIR_MAKE_FLAME_ARROW_TO_SPLASH_AT_3_NEARBY_TARGETS_SPLASH_DMG_IS_EQUAL_TO_5_OF_SKILL_DMG_SP_CONSUMPTION_25)
253    local RuneDamage = (Num1 + Num2 + Num4) * 0.02 + (Num3 + Num5) * 0.05
254    return math.floor(damage * RuneDamage * (1 + RealDamage)), damageType
255  end
256  return math.floor(damage * (1 + RealDamage)), damageType
257end
Formula Graph

Connected Archive Data

See which cards, equipment, headwears, buffs, and other archived records connect to this formula.

Loading graph filters

CommonFun.DoCalcDamage

commonfun-docalcdamage

Nodes

0

Edges

0

Related Nodes

Select at least one node type.