伤害计算
伤害计算流程由多个步骤组成,不同的伤害计算方式彼此之间共享一部分计算流程,因此在这里只列出各个计算流程块。
伤害上下文
用于记录这一伤害的特殊属性,在伤害计算开始前创建一个上下文实例,并在不同的计算流程块间传递,包括:
伤害来源/持续伤害来源
伤害目标
伤害类型
是否为普攻
是否为技能
是否为持续伤害
是否为连击伤害
是否为弹射物
是否忽略护盾
是否为真实伤害
是否暴击
通用攻击计算流程
进入流程时,需要包含:伤害上下文,原始伤害值。
定义伤害值
Damage(DMG)
为原始伤害值。根据伤害类型,决定增幅伤害的属性
Bonus(BNS)
。如果是物理伤害,使用力量作为增幅,
BNS
=Strength(STR)
。如果是法术伤害,使用智慧作为增幅,
BNS
=Intelligence(INT)
。如果是剧烈伤害,使用烈性作为增幅,
BNS
=Ferocity(FER)
。否则,
BNS
=0
,此情况通常不会发生。
如果攻击方是玩家,触发攻击前被动技能。
如果攻击方是玩家,计算暴击增幅。
获取暴击率
CriticalChance(CRC)
。如果触发暴击,触发暴击/普攻暴击/技能暴击被动技能,获取暴击伤害
CriticalDamage(CRD)
。使用暴击伤害增幅伤害
DMG=DMG×(1+CRD)
。
获取攻击方的穿透
Penetrate(PEN)
、攻击强度AttackForce(ATF)
、伤害加成DamageMultiplier(DM)
、额外伤害ExtraDamage(ED)
、护盾伤害加成ArmorDamageMultiplier(ADM)
、护盾穿透率ArmorPenetrateRate(APR)
。判断攻击方是否具有力量效果,根据力量效果等级
LVL
增幅伤害加成DM=0.15×LVL
,即每一级可以使伤害加成增加15%。判定攻击方是否具有虚弱效果,根据虚弱效果等级
LVL
修正伤害DMG=DMG×(0.8^LVL)
,即每一级可以使伤害减少为上一级的80%。计算伤害
DMG=(DMG×(1+BNS)+ED)×(1+DM)
。
通用防御计算流程
进入流程时,需要包含:伤害上下文,伤害值DMG
,穿透PEN
,攻击强度ATF
,护盾伤害加成ADM
,护盾穿透率APR
。后4个参数不存在时,视为0。
触发防御前伤害事件。
使用防御方易伤增幅伤害。
获取防御方易伤
Fragile(FG)
。如果防御方具有不幸效果,根据不幸效果等级
LVL
修正易伤FG=FG+0.1×LVL
,即每一级可以使易伤增加10%。计算易伤增幅伤害
DMG=DMG×(1+FG)
获取防御方的防御力
Defense(DEF)
、防御强度DefenseForce(DFC)
、护盾强度ArmorToughness(ART)
。根据伤害类型,获取防御方的对应防御属性增幅
Bonus(BNS)
。如果是物理伤害,使用物理防御作为增幅,
BNS
=(PhysicalDefenseBonus)PDE
。如果是法术伤害,使用法术防御作为增幅,
BNS
=(MagicalDefenseBonus)MDE
。如果是剧烈伤害,使用剧烈防御作为增幅,
BNS
=(ViolentDefenseBonus)VDE
。否则,
BNS
=0
,此情况通常不会发生。增幅防御力
DEF=DEF×(1+BNS)
使用伤害减免降低伤害。
计算等效减免比例。
获取伤害减免
DamageAbsorb(DA)
。如果
DA
<=0.5,等效减免比例Rate=DA
。如果
DA
>0.5,等效减免比例Rate=DA/(DA+0.5)
。
计算减免伤害
DMG=DMG×(1-Rate)
。
计算穿透百分比效率
PenetrateRate(PEN_R)=PEN/(PEN+150)
。计算攻击强度百分比效率
AttackForceRate(ATF_R)=ATF/(ATF+150+DFC)
。使用穿透和攻击强度降低防御力,计算防御力减伤系数
DefenseFactor(DF)
。DEF=DEF×(1-ATF_R)
DF=(DEF-PEN)/(DEF+150×(1-PEN_R))
。
[!] 可能改动 思考: 穿透是否需要降低防御力减伤系数计算过程中分母中的常数项? 可能的计算方式改动:
DF=(DEF-PEN)/(DEF-PEN+150)
。可能引起的问题:DEF-PEN
可能为负数,引起意外。如果不是真实伤害,使用防御力减伤系数降低伤害
DMG=DMG×(1-DF)
。如果是真实伤害或忽略护盾,直接返回伤害值
DMG
。使用攻击强度比例降低护盾强度
ART=ART-ATF_R×0.8
。获取防御方当前护盾值
Armor(AR)
。计算等效护盾值
EqualArmor(EAR)=AR×(1+ART)
。分配伤害到护盾和生命值。
本次伤害能够对护盾造成的最大伤害
MaxDamageOnArmor=DMG×(1+ADM)
,实际造成的伤害ExactDamageOnArmor=Min(EAR, MaxDamageOnArmor)
。计算对护盾造成伤害所消耗的原始伤害
RawDamageOnArmor=ExactDamageOnArmor/(1+ADM)
。修正对护盾造成的伤害
DamageOnArmor=ExactDamageOnArmor/(1+ART)
。使用护盾抵消伤害
Damage=Damage-RawDamageOnArmor
。计算穿透护盾的伤害
Damage=Damage+RawDamageOnArmor×APR
。
如果护盾被击破,触发攻击方的破盾被动和防御方的盾破被动。
触发防御后伤害事件。
返回最终伤害值
Damage
。
普通攻击计算流程
创建伤害上下文。
如果攻击方是弹射物或召唤物,重定向攻击方为其源头。
如果攻击不是连击,判断伤害间隔,若间隔过短,伤害计算结束,攻击被取消。
如果攻击由不同的攻击方发起,且距离上一次伤害的时间小于伤害间隔,本次攻击无法造成击退。
如果攻击方有失明效果,每一级有1/3的概率使攻击无法命中,若本次攻击未命中,伤害计算结束。
如果攻击方的伤害能够闪避,获取闪避率
DodgeRate(DOD)
,并判定是否闪避,闪避成功时触发闪避被动,并结束伤害计算。定义伤害总倍率
OverallMultiplier(OM)
为1。如果攻击方主手持弓或弩造成近战伤害,
OM=0.5
。如果攻击方造成了弹射物伤害,根据主副手实际持有的武器类型,调整本次伤害使用的主副手。
获取攻击方的攻击力
AttackDamage(ATK)
和攻击速度AttackSpeed(ATS)
。使用伤害总倍率
OM
修正伤害DMG=DMG×OM
。延迟,等待实际攻击发生。
如果攻击不是连击,计算连击发生概率
BonusAttackRate(BAR)
。如果
ATS
<0.5,BAR=ATS
。如果
ATS
≥0.5,BAR=ATS/(ATS+0.5)
。
如果攻击方是玩家,触发攻击后被动技能。
技能伤害计算流程
创建伤害上下文。
如果此次技能伤害允许被闪避,获取闪避率
DodgeRate(DOD)
,并判定是否闪避,闪避成功时触发闪避被动,并结束伤害计算。调整本体伤害使用的主副手为主手。
获取攻击方的攻击速度
AttackSpeed(ATS)
,获取初始伤害DMG
。如果防御方正在使用盾牌格挡,使盾牌格挡失效。
延迟,等待实际攻击发生。
如果攻击不是连击,计算连击发生概率
BonusAttackRate(BAR)
。技能的连击率修正为0.5,因此计算开始前,ATS
会被减半。如果
ATS
<0.5,BAR=ATS
。如果
ATS
≥0.5,BAR=ATS/(ATS+0.5)
。
如果攻击方是玩家,触发攻击后被动技能。
持续伤害计算流程
创建伤害上下文。
获取持续伤害的单次伤害值
DMG
。造成持续伤害,无视绝大部分取消条件。
环境伤害计算流程
创建伤害上下文。
根据环境伤害类型,获取伤害值
DMG
和伤害类型DTYPE
,定义是否无视护盾或是否为真实伤害。
最后更新于