【我帮鹰角修bug】护盾不被增伤加成,断崖飞刃被吞,因陀罗可闪避榴莲针,这究竟....
前言
这个系列内容大概是科学分析一些明日方舟游戏中一些bug或"bug"的原理并给出可能的解决方案
往期内容欢迎查看本人的专栏
本期的内容包括:
因陀罗可以闪避榴莲针,详见:https://ngabbs.com/read.php?tid=22409229
单位存在护盾时可能不会受到伤害加成效果,详见:https://ngabbs.com/read.php?tid=22523518
断崖2技能对阻挡单位的伤害有一定概率被吞,详见:https://ngabbs.com/read.php?tid=22533203或此视频
内容之间没有太多的相关性,都是一些近期发现的bug
一起解决了就做了个合集


因陀罗:我闪的究竟是什么?
因陀罗的闪避条件比较迷
虽然说的物理近战,但可以闪避部分物理无人机
最近甚至有大佬发现榴莲针都可以被其闪避
翻看因陀罗的buffTemplate
我们可以很清晰地发现鹰角将其闪避的条件设定为了"MELEE""PHYSICAL"(即物理近战)

那么很明显,问题并不是出在因陀罗自己身上,而是出在对于"MELEE"的判定或者阿的技能身上(或两者都有)
弄清楚这个问题之前,我们先需要介绍一个被称作"modifier"的东西(下一章也会讲到这东西)
modifier是游戏中一种记录变化以及变化的属性的数据结构
例如,伤害是一种记录HP变化,目的为伤害的modifier
反之,治疗是一种记录HP变化,目的为治疗的modifier
modifier记录的不仅仅是变化量以及目的
还有其它更多的属性,例如伤害类型(物理法术真实治疗),攻击类型(普通溅射buff),是否可致死,是否属于环境伤害等等......
近战与远程的判定,就是判定的伤害的modifier中一个名为apPLYWay的属性
apPLYWay是一个类似于二进制掩码的属性,一共两位
第一位代表近战,第二位代表远程
用二进制来表示时,无是00(0),近战是01(1),远程是10(2),近+远是11(3)
好,回到闪避的问题上来,我们知道了近战与远程是来源于apPLYWay属性,那么闪避具体是如何判定的呢?

可以看出,程序会将filter中的apPLYWay与modifier中的apPLYWay做二进制AND运算
若运算结果与modifier中的apPLYWay属性相同,则通过判定执行下一步
知道了判定机制,还剩下最后一个问题
如何知道一个伤害modifier中的apPLYWay属性到底是什么?
其实这个问题很简单
舟游的普通攻击大体分为两种,有弹道的和没弹道的
根据反编译结果,无弹道攻击的apPLYWay固定返回1,弹道攻击的apPLYWay固定返回2
所以这里可以得到第一个结论了
因陀罗闪避中的"近战"一般情况下是指无弹道攻击(所以可以闪避无人机)
阿的榴莲针明显有弹道,为什么因陀罗还会闪避他的攻击?
这是因为,虽然阿的榴莲针确实是弹道攻击,但是其伤害不来源于弹道,而是来源于一个固定值伤害的buff
翻看这个buff的生效机制,可以发现这个buff在计算伤害时,传入modifier的apPLYWay属性始终被设为0

结合上面的闪避的生效机制,当modifier中apPLYWay属性为0时,无论与什么变量做AND运算结果都是0
而0又与其本身相等,无论如何都能通过判定...
换言之,无论闪避是限定近战还是远程,阿的榴莲针都能够被闪避

护盾:我到底能不能吃到伤害加成?
最近有大佬发现,部分情况下,泥岩的法术护盾存在时,会使其受到的法术伤害吃不到伤害加成
如果一直都吃不到还能用特性解释,一会吃得到一会吃不到就很神秘了
详情见:https://ngabbs.com/read.php?tid=22523518
要解决这个问题,需要明白护盾和伤害加成本质上是怎么生效的
(此处略去作为补充内容的伤害/治疗的生效的详细步骤,有兴趣的可以去NGA原贴查看)
根据反编译结果,受击伤害倍率调整,反伤,闪避,抵挡,护盾等等一系列行为全部会在一个事件节点(ON_TAKE_DAMAGE)上执行
护盾的逻辑大概是先判断伤害类型和modifier是否有效
如有效则用取护盾值与modifier值中的较小值,然后用护盾值-较小值设为新的护盾值
最后用modifier值-较小值获取理论值,如理论值小于等于0则cancel掉modifier并将modifier值设为0
否则将modifier值设为理论值
注意,以上护盾的逻辑完全没有伤害倍率的参与
伤害倍率的逻辑大概是先判断伤害类型和modifier是否有效
如有效则将modifier值*伤害倍率得到新的modifier值
这里同样也没有护盾的参与
很明显,这二者的在执行并不会相互调用
先结算护盾时,护盾如果完全生效,则会将modifier取消掉,伤害倍率提升由于其逻辑不会执行
先结算护盾时,护盾如果只抵消一部分,伤害倍率提升由于其逻辑只会对抵消后的modifier值生效
先结算伤害倍率提升时,modifier值会被增加,护盾值的扣减也会被伤害倍率提升加成
说白了就是一个行动的结算顺序问题
由于这二者的行为位于一个行动节点,按照鹰角目前的逻辑,其行动会按照其在buffContainer中的顺序(绝大部分时候为添加顺序)进行结算
也就是说,
先加护盾,再加易伤,护盾吃不到伤害加成
先加易伤,再加护盾,护盾可以吃到伤害加成
解决方法:把护盾或伤害倍率更变转移至其它行动节点(备选:ON_APPLYING_MODIFIER,ON_BEFORE_APPLYING_MODIFIER)
或者是给行动加一个优先度之类的属性,让二者在同一行动节点进行结算时能够保证固定的顺序

断崖:我的飞刃呢???
新干员断崖,2技能对阻挡单位的伤害有一定概率不会触发
详情可以查看此视频
楼主经过大量的测试后发现:
这个吞攻击的现象触发毫无规律,而且二倍速下触发概率比正常情况下大了非常多
上个拥有这种特征的现象叫掉帧
如果假定断崖被吞攻击是掉帧引起的,那么为什么其它攻击不会被吞,被吞的只有对阻挡单位的伤害?
首先,我们了解一下断崖对阻挡单位伤害的机制
断崖对阻挡单位进行伤害的机制属于额外能力,正常情况下不会被触发
只有使用triggerAbility之类的行为,才能使其触发
所以,断崖2技能开始时,会给自己上一个buff,buff的效果是
在持有者位于OnAbilitySpellOn事件时(这个事件的时间可以大致看做普攻前摇结束的瞬间),触发buff持有者名为HitBlockee的能力
所以,正常情况下,断崖会在普攻发出弹道的瞬间对阻挡单位造成一次伤害
而攻击被吞,就是这个额外能力没有在指定事件时被成功触发
那么为什么掉帧会导致额外能力无法成功触发?
所有能力都有一个冷却,这个冷却模式由timemode变量控制(之前在安洁篇讲过)
timeMode=0 为 FROM_ATTACK_SPEED。即冷却依赖于攻击速度。至于怎么让动画适应间隔是别的变量的内容。典型例子是各类普攻。
timeMode=1 为 FROM_ANIMATION。即冷却无条件依赖于动画,与攻速无关。动画按默认速度播放,不受攻击间隔影响。典型例子是绝影。
timeMode=2 为 SPECIFIED。即冷却需要指定,与动画攻速均无关联。典型例子钙质化,柏喙扔飞刀,爱国者的真伤光环。
timeMode=3 为 LOAD_FROM_BLACKBOARD。即冷却从blackboard中加载,因此可以根据技能等级变化。目前只有早露3技能使用。
主动能力必须冷却完毕才可再次触发(有一些手段可以重置冷却)
断崖额外攻击阻挡目标的能力,和普攻一样,timeMode=0,即冷却跟随攻击速度。
那么原因已经很明显了
断崖对阻挡目标的攻击,由于冷却的原因,其间隔必须大于等于攻击间隔
而在二倍速存在一定掉帧的情况下,由于断崖2技能额外攻击和普攻的冷却周期不完全同步(注意额外攻击是以普通攻击的SPELL_ON为一个周期的起始进行冷却的)
很可能出现普通攻击到达SPELL_ON时间时,额外攻击还没有冷却好的情况
和普通攻击不同的是,在尝试触发额外攻击失败后,并不会在短时间内再尝试第二次。而是会等到下一个普攻SPELL_ON事件再尝试触发
因此尝试触发失败的那次,飞刃自然就被吞了
解决方法:
解决掉帧几乎是不可能的,但是可以解决掉帧带来的巨大影响
最简单的方法就是手动设置冷却,把冷却设短一点
例如把timeMode设成2,cooldown设成0.1之类的
这样即使在2倍速下也不会出现吞攻击的情况
UP自行将断崖bug修复了一下(方案是timeMode设成2,cooldown设成0.1)
修复后视频:https://www.bilibili.com/video/BV1hf4y1R79S
可以明显看到即使是2倍速也不会吞攻击了
本文原载于NGA:https://ngabbs.com/read.php?tid=22540222
作者为本人
此专栏以CC BY-NC-SA 4.0协议发布