跳转到内容

伤害计算流程

伤害计算流程由多个步骤组成,不同的伤害计算方式彼此之间共享一部分计算流程,因此在这里只列出各个计算流程块。

用于记录这一伤害的特殊属性,在伤害计算开始前创建一个上下文实例,并在不同的计算流程块间传递,包括:

  • 伤害来源/持续伤害来源
  • 伤害目标
  • 伤害类型
  • 是否为普攻
  • 是否为技能
  • 是否为持续伤害
  • 是否为连击伤害
  • 是否为弹射物
  • 是否忽略护盾
  • 是否为真实伤害
  • 是否暴击

进入流程时,需要包含:伤害上下文,原始伤害值。

  1. 定义伤害值Damage(DMG)为原始伤害值。
  2. 根据伤害类型,决定增幅伤害的属性Bonus(BNS)
    1. 如果是物理伤害,使用力量作为增幅,BNS=Strength(STR)
    2. 如果是法术伤害,使用智慧作为增幅,BNS=Intelligence(INT)
    3. 如果是剧烈伤害,使用烈性作为增幅,BNS=Ferocity(FER)
    4. 否则,BNS=0,此情况通常不会发生。
  3. 如果攻击方是玩家,触发攻击前被动技能。
  4. 如果攻击方是玩家,收集玩家能够触发的全部攻击特效AE,并添加到伤害值上: DMG=DMG+AE
  5. 如果攻击方是玩家,计算暴击增幅。
    1. 获取暴击率CriticalChance(CRC)
    2. 如果触发暴击,触发暴击/普攻暴击/技能暴击被动技能,获取暴击伤害CriticalDamage(CRD)
    3. 使用暴击伤害增幅伤害DMG=DMG×(1+CRD)
  6. 获取攻击方的穿透Penetrate(PEN)、攻击强度AttackForce(ATF)、伤害加成DamageMultiplier(DM)、额外伤害ExtraDamage(ED) 、护盾伤害加成ArmorDamageMultiplier(ADM)、护盾穿透率ArmorPenetrateRate(APR)
  7. 判断攻击方是否具有力量效果,根据力量效果等级LVL增幅伤害加成DM=0.15×LVL,即每一级可以使伤害加成增加15%。
  8. 判定攻击方是否具有虚弱效果,根据虚弱效果等级LVL修正伤害DMG=DMG×(0.8^LVL),即每一级可以使伤害减少为上一级的80%。
  9. 计算伤害DMG=(DMG×(1+BNS)+ED)×(1+DM)
  10. 进入防御计算流程,携带参数:伤害上下文,伤害值DMG,穿透PEN,攻击强度ATF,护盾伤害加成ADM ,护盾穿透率APR,并得到最终伤害DMG

进入流程时,需要包含:伤害上下文,伤害值DMG,穿透PEN,攻击强度ATF,护盾伤害加成ADM,护盾穿透率APR。后4个参数不存在时,视为0。

  1. 触发防御前伤害事件。
  2. 使用防御方易伤增幅伤害。
    1. 获取防御方易伤Fragile(FG)
    2. 如果防御方具有不幸效果,根据不幸效果等级LVL修正易伤FG=FG+0.1×LVL,即每一级可以使易伤增加10%。
    3. 计算易伤增幅伤害DMG=DMG×(1+FG)
  3. 获取防御方的防御力Defense(DEF)、防御强度DefenseForce(DFC)、护盾强度ArmorToughness(ART)
  4. 根据伤害类型,获取防御方的对应防御属性增幅Bonus(BNS)
    1. 如果是物理伤害,使用物理防御作为增幅,BNS=(PhysicalDefenseBonus)PDE
    2. 如果是法术伤害,使用法术防御作为增幅,BNS=(MagicalDefenseBonus)MDE
    3. 如果是剧烈伤害,使用剧烈防御作为增幅,BNS=(ViolentDefenseBonus)VDE
    4. 否则,BNS=0,此情况通常不会发生。
    5. 增幅防御力DEF=DEF×(1+BNS)
  5. 使用伤害减免降低伤害。
    1. 计算等效减免比例,如果是玩家:
      1. 获取伤害减免DamageAbsorb(DA)
      2. 如果DA≤0.5,等效减免比例Rate=DA
      3. 如果DA>0.5,等效减免比例Rate=DA/(DA+0.5)
    2. 如果不是玩家,等效减免比例Rate=DA
    3. 计算减免伤害DMG=DMG×(1-Rate)
  6. 计算攻击强度百分比效率AttackForceRate(ATF_R)=ATF/(ATF+150+DFC)
  7. 使用攻击强度降低防御力DEF=DEF×(1-ATF_R)
  8. 使用穿透降低防御力,计算防御力减伤系数DefenseFactor(DF)
    1. 如果PEN≤DEF,计算有效防御力EffectiveDefense=DEF-PEN,防御力减伤系数DF=EffectiveDefense/(EffectiveDefense+150),防御力减伤系数不会高于0.998。
    2. 如果PEN>DEF,计算溢出值Overflow=PEN-DEF,溢出增幅OverflowRate=1.25×sqrt(Overflow/Max(DEF,150)),防御力减伤系数DF=-OverflowRate
  9. 如果不是真实伤害,使用防御力减伤系数降低伤害DMG=DMG×(1-DF)
  10. 如果是真实伤害或忽略护盾,直接返回伤害值DMG
  11. 使用攻击强度比例降低护盾强度ART=ART-ATF_R×0.8
  12. 获取防御方当前护盾值Armor(AR)
  13. 计算等效护盾值EqualArmor(EAR)=AR×(1+ART)
  14. 分配伤害到护盾和生命值。
    1. 本次伤害能够对护盾造成的最大伤害MaxDamageOnArmor=DMG×(1+ADM) ,实际造成的伤害ExactDamageOnArmor=Min(EAR, MaxDamageOnArmor)
    2. 计算对护盾造成伤害所消耗的原始伤害RawDamageOnArmor=ExactDamageOnArmor/(1+ADM)
    3. 修正对护盾造成的伤害DamageOnArmor=ExactDamageOnArmor/(1+ART)
    4. 使用护盾抵消伤害Damage=Damage-RawDamageOnArmor
    5. 计算穿透护盾的伤害Damage=Damage+RawDamageOnArmor×APR
  15. 如果护盾被击破,触发攻击方的破盾被动和防御方的盾破被动。
  16. 触发防御后伤害事件。
  17. 返回最终伤害值Damage
  1. 创建伤害上下文。
  2. 如果攻击方是弹射物或召唤物,重定向攻击方为其源头。
  3. 如果攻击不是连击,判断伤害间隔,若间隔过短,伤害计算结束,攻击被取消。
  4. 如果攻击由不同的攻击方发起,且距离上一次伤害的时间小于伤害间隔,本次攻击无法造成击退。
  5. 如果攻击方有失明效果,每一级有1/3的概率使攻击无法命中,若本次攻击未命中,伤害计算结束。
  6. 如果攻击方的伤害能够闪避,获取闪避率DodgeRate(DOD),并判定是否闪避,闪避成功时触发闪避被动,并结束伤害计算。
  7. 定义伤害总倍率OverallMultiplier(OM)为1。
  8. 如果攻击方主手持弓或弩造成近战伤害,OM=0.5
  9. 如果攻击方造成了弹射物伤害,根据主副手实际持有的武器类型,调整本次伤害使用的主副手。
  10. 如果无法定位到攻击方的位置,使用原始伤害作为DMG,并提前进入攻击计算流程(跳过后续2步),得到最终伤害DMG
  11. 获取攻击方的攻击力AttackDamage(ATK)和攻击速度AttackSpeed(ATS)
  12. 进入攻击计算流程,得到最终伤害DMG
  13. 使用伤害总倍率OM修正伤害DMG=DMG×OM
  14. 延迟,等待实际攻击发生。
  15. 如果攻击不是连击,计算连击发生概率BonusAttackRate(BAR)
    1. 如果ATS<0.5BAR=ATS
    2. 如果ATS≥0.5BAR=ATS/(ATS+0.5)
  16. 如果连击发生,触发连击被动,重新进入普通攻击计算流程,额外造成一次伤害,无视绝大部分取消条件。
  17. 如果攻击方是玩家,触发攻击后被动技能。
  1. 创建伤害上下文。
  2. 如果此次技能伤害允许被闪避,获取闪避率DodgeRate(DOD),并判定是否闪避,闪避成功时触发闪避被动,并结束伤害计算。
  3. 调整本体伤害使用的主副手为主手。
  4. 获取攻击方的攻击速度AttackSpeed(ATS),获取初始伤害DMG
  5. 进入攻击计算流程,得到最终伤害DMG
  6. 如果防御方正在使用盾牌格挡,使盾牌格挡失效。
  7. 延迟,等待实际攻击发生。
  8. 如果攻击不是连击,计算连击发生概率BonusAttackRate(BAR)。技能的连击率修正为0.5,因此计算开始前,ATS会被减半。
    1. 如果ATS<0.5BAR=ATS
    2. 如果ATS≥0.5BAR=ATS/(ATS+0.5)
  9. 如果连击发生,触发连击被动,重新进入技能伤害计算流程,额外造成一次伤害,无视绝大部分取消条件。
  10. 如果攻击方是玩家,触发攻击后被动技能。
  1. 创建伤害上下文。
  2. 获取持续伤害的单次伤害值DMG
  3. 进入攻击计算流程,得到最终伤害DMG,无法造成暴击。
  4. 造成持续伤害,无视绝大部分取消条件。
  1. 创建伤害上下文。
  2. 根据环境伤害类型,获取伤害值DMG和伤害类型DTYPE,定义是否无视护盾或是否为真实伤害。
  3. 将部分环境伤害转化为持续伤害,进入持续伤害计算流程,并结束伤害计算。
  4. 进入防御计算流程,得到最终伤害DMG

因防御力属性的减伤公式为除法形式,减伤比例会随着防御力的提升快速体现出边际效应,这可能进一步引发误解,产生“只增长了0.1%”的错觉。 为了更好地估算防御力对生存能力的影响,可以使用“等效生命值”(Effective Health, EHP)的概念。

防御力的减伤比例为DF=DEF/(DEF+150),这一计算公式等价于, 在生命值不变的情况下,一个目标在生命值被消耗完之前,实际能够承受的伤害总量为MHP/(1-DF)=MHP×(DEF+150)/150=MHP×(1+DEF/150)。 因此,可以定义等效生命值为EHP=MHP×(1+DEF/150)。 即,每提升150点防御力,相当于提升了100%的生命值。

因存在对应属性的防御加成属性,实际代入的防御力应为DEF×(1+DEF Bonus),即拥有100点防御力和50%物理防御加成时,在计算承受物理伤害的等效生命值时,应使用DEF=100×(1+50%)=150进行计算。

护盾也能够像生命值一样承受伤害,因此在计算等效生命值时,可以将护盾值也纳入计算。 但不同于生命值,护盾值还受到护盾强度属性ART的影响,护盾强度提高时,护盾抵消伤害的能力也会提升。 因此,计算护盾部分的等效生命值时,应使用AR×(1+ART)×(1+DEF/150)进行计算。

此外,攻击强度和穿透极大地影响防御力的实际效果,因此在计算战斗中等效生命值时,应先使用攻击强度和穿透调整防御力数值,再进行计算。 同时,攻击强度还会削减护盾强度的效果,因此在计算护盾部分的等效生命值时,也应使用调整后的护盾强度数值。 一个简单的估算方式为:

  1. 计算攻击强度的穿防比例效率IgnoreRate(ATF_R)=ATF/(ATF+150+DFC)
  2. 使用攻击强度降低防御力DEF=DEF×(1-ATF_R),使用攻击强度降低护盾强度ART=ART-ATF_R×0.8
  3. 使用穿透降低防御力,DEF=DEF-PEN

如果此时防御力依然大于0,则使用调整后的防御力进行等效生命值的计算;否则,防御力视为0,并反向计算溢出穿透的伤害增幅。 溢出穿透的伤害增幅计算方式为1.25×sqrt(Overflow/Max(DEF,150))(这里的DEF收攻击强度削减,但还未被穿透削减)。

综合以上内容,等效生命值的计算方式为:

IgnoreRate = ATF / (ATF + 150 + DFC)
Adjusted_DEF = DEF × (1 - IgnoreRate) - PEN
Adjusted_ART = ART - IgnoreRate × 0.8
EHP = (MHP + AR × (1 + Adjusted_ART)) × (1 + Adjusted_DEF / 150)

若仅考虑玩家的生存能力,则DFC视为0:

IgnoreRate = ATF / (ATF + 150)
Adjusted_DEF = DEF × (1 - IgnoreRate) - PEN
Adjusted_ART = ART - IgnoreRate × 0.8
EHP = (MHP + AR × (1 + Adjusted_ART)) × (1 + Adjusted_DEF / 150)

目前,绝大多数的敌对生物的攻击强度均在0-50之间,少数Boss的攻击强度可以达到300-500左右。 在伤害来源的攻击强度和穿透分别为150和150时,玩家的实际防御力为DEF×0.5-150,护盾强度会被削减0.5×0.8=0.4。 因此,一个拥有800点生命值和900点防御力的玩家,在面对这一伤害来源时,实际的等效生命值为(800+0)×(1+(900×0.5-150)/150)=2400,即在没有治疗和护盾的情况下,最多能够承受2400点伤害。 护盾的保护能力可以通过比较护盾强度和伤害来源的攻击强度来估算,护盾强度高于0.8×IgnoreRate时,护盾能够比生命值更有效地保护玩家。 因IgnoreRate向1.0趋近,表明大于80%的护盾强度在任何情况下都确保护盾能够比生命值更有效地保护玩家。

对抗100级(100点防御强度),拥有20000生命值,1200防御力的敌对生物时,其默认等效生命值为20000×(1+1200/150)=180000,即如果玩家没有任何攻击强度和穿透属性,则需要输出180000点伤害才能将其击败。 若玩家拥有150点攻击强度和150点穿透,则敌对生物的实际防御力为1200×(1-150/(150+150+100))-150=600,等效生命值为20000×(1+600/150)=100000,大幅降低了需要输出的伤害量。

生存属性

伤害来源属性

计算结果

等效生命值: 0.00
攻击强度穿防比例: 0.00%
调整后防御力: 0.00
调整后护盾强度: 0.00%
等效护盾值: 0.00
溢出穿透: 0.00
伤害增幅: 0.00%