凯恩酒馆吧 关注:132贴子:1,809
  • 18回复贴,共1

格挡(Blocking)判定流程

只看楼主收藏回复

原创作者:等风来
发布日期:2016-02-28


下面仅以投射物类攻击(Missile Attack)为代表,简单说一下关于遭受攻击时的格挡(Blocking)判定流程:


1. 判定是否为投射物,否则退出判定。
2. 判定投射物是否为有源投射物,否则判定失败,即无源或检测不到来源的投射物无法格挡。
3. 读取Missiles.txt,检测是否存在非法数据。
4. 判定投射物是否能被打断,如果ResultFlag_Hit=true,则跳过格挡判定流程,直接命中,即连续性投射物无法格挡,否则进入步骤4.1。
4.1 如果投射物的Missilestxt.GetHit=true,则判定为ResultFlag_GetHit=ture,进入步骤4.3,否则进入步骤4.2。
4.2 如果投射物的Missilestxt.SoftHit=ture,则判定为ResultFlag_SoftHit=ture,进入步骤4.3,否则进入步骤5。
4.3 如果Missiles.txt中投射物的Missilestxt.KnockBack>0,系统将在0与99之间取随机数,随机数小于Missiles.txt中的投射物KnockBack值,则判定为ResultFlag_KnockBack=ture。
5. 进入正式格挡判定流程,首先会检测是否为物理伤害,但此处无论检测的结果如何,都将直接转为调用近战攻击(Melee Attack)的格挡判定,换句话来说,从此处开始回归常规格挡判定。
5.1 调用人物基本数据进行格挡计算,如果返回值(BlockFlag)=0,则不触发格挡效果。
5.2 如果投射物的Missilestxt.GetHit=true和Missilestxt.KnockBack!=0 这两者中有任意一项不符合,则直接跳过格挡流程。
5.3 如果ResultFlag_GetHit=0且ResultFlag_SoftHit=ture,则直接判定为BlockFlag=0。
5.4 如果AMA的闪避类效果与格挡类效果联动触发,判定为ResultFlag_Block=ture 则格挡生效,即闪避类效果只能在格挡失败后起作用,武器格挡有自己独立的ResultFlag,不在此处判定。
5.5 一些特殊类效果有自己独特的判定方式,一旦判定成功,无论格挡是否判定成功都会生效,如穿透攻击等。
5.6 如果格挡类效果触发成功,则判定ResultFlag_Hit=false,即跳过伤害结算。

PS:从系统的角度来看,所有单独的投射物都可以格挡,但是某些投射物即使能够格挡也会造成伤害,因为SrvHitFunc和SrvDmgFunc的检测发生在格挡判定之前。


回复
1楼2017-02-12 21:57
    【盾牌格挡的相关设定补充】

    下面这些攻击方式或技能可以被盾牌格挡:
    近战攻击
    箭矢攻击
    标枪\飞斧\飞刀类投掷攻击
    附带物理伤害的投射物
    冥河娃娃Fetish 骨爆
    自杀者Suicide 自爆
    火焰强化Fire Enchanted 自爆

    下面这些攻击方式或技能不可以被盾牌格挡:
    技能等级>=50 的火箭Fire Arrow (<50可以被格挡)
    技能等级>=50 的冰箭Cold Arrow (<50可以被格挡)
    闪电球Lightning Bolt
    熔岩巨岩Molten Boulder 的爆炸伤害
    龙卷风Tornado 的周期性范围伤害
    毁天灭地Armageddon 的范围碰撞伤害
    NEC 尸体爆炸Corpse Explosion
    PAL 重击Smite
    怪物冲锋Charging
    Nihlathak 尸体爆炸Corpse Explosion


    回复
    2楼2017-08-15 15:45
      【格挡效果】

      当格挡判定成功时,100%会发生格挡效果,即抵消该次攻击。格挡判定只和格挡率CTB有关,和FBR无关。

      注:当处于跑步状态,人物格挡率降为1/3;当鼠标拿着东西时,人物无法格挡。格挡率在软代码中并没有规定上限,但是硬代码中规定了75%上限。修改D2Common.dll将人物格挡率上限提升到100%后,可以堆满格挡扔进牛堆里永不磨损。

      【格挡动画】

      当格挡判定成功时,除了特殊情况外,人物会立刻停止当前动作,并进入格挡动画状态。特殊情况主要包括不可打断动作和格挡动画本身。提高FBR可以缩短格挡动画。

      注:格挡动画本身并非不可打断动作,但在调用了格挡动画后,短时间内不会再调用新的格挡动画,这个不会触发格挡动画的时间被称为"Block-Lock"或"Block Timer",最短时间为10F,可以被FBR延长,由硬代码控制,有关这个概念,引用AB的原文来解释更为贴切。


      简单翻译上文的后半部分:当玩家变身为吸血鬼或冥河娃娃等无法格挡的怪物时,格挡依然会发挥作用,提高FBR可以延长Block-Lock时间。

      注:吸血鬼和冥河娃娃无对应的DCC且COF中无FBR相关数据,所以调用了打击恢复动画取代了格挡动画,并根据FHR来调节动画速度,且自身的打击恢复动作不受影响,依然独立判定。简而言之就是人物变身不影响自身格挡率。


      收起回复
      3楼2017-08-15 15:47
        【武器格挡】

        武器格挡是ASN的特有技能,需要装备双爪才能激活,格挡率和技能等级有关。当格挡判定成功时,会调用人物的格挡动画,提高FBR可以缩短格挡动画。

        注:当人物处于跑步或行走状态下无法进行武器格挡(在WW过程中相当于人物处于站立状态)。武器格挡率在硬代码未规定上限,但在软代码规定了上限为65%下限为20%,通过修改硬代码才可以使其他人物获得WB技能,其他相关补充在这里。

        【怪物格挡】

        怪物格挡主要包括以下两种。
        盾牌格挡:怪物自身装备盾牌并配有格挡动画,且在MonStats.txt中有格挡率的设定,这样的怪物类型并不多,常见的就是骷髅战士、沉沦魔、黑暗猎人、女猎人和投石怪等。
        非盾牌格挡:怪物自身没有装备盾牌且不配有格挡动画,但在MonStats.txt中定义了NoShldBlock=1并有格挡率设定,这样的怪物更少,常见的就是解答者、厄运骑士、各关底boss和其对应的uber版。

        【主要公式】

        人物的CTB(Chance TO Block)计算公式:
        CTB% = [∑Block% * (Dex - 15) / (cLvl * 2)]

        人物达到Block75%所需要敏捷的计算公式:
        Dex = {150% * cLvl / ∑Block% + 15}

        人物的FBR(Faster Block Rate)计算公式:
        EFBR = [FBR * 120 / (FBR + 120)] + FBR_Skill
        FPA = {256 * BlockBaseRate / [AnimationSpeed * (50 + EFBR) / 100]} - 1
        Block-Lock = 10 + [FBR/8]


        回复
        4楼2017-08-15 15:47
          原来武器格挡上限是65%呀😄不过挺难凑,后期几级技能白山哥一点格挡,还是手动点一点,装备技能点加成凑个50%多就好了


          回复
          来自Android客户端5楼2017-08-15 19:43
            怪物的格挡判定受怪物自身行为的影响吗?


            收起回复
            来自Android客户端6楼2017-09-16 02:38
              这吧要热闹了


              收起回复
              7楼2019-04-26 13:55