欢迎光临散文网 会员登陆 & 注册

【MJ相关研究】你浑身上下都是破绽!

2021-03-07 16:35 作者:Crescebdo  | 我要投稿

真理往往是简单的。当你发现它后,会大呼宝开SB。


写在前面


本文是对最近舞王以及伴舞几个bug的研究小结。以下所有结论皆已用高精度工具验证,但无代码层支持,请辩证性看待,勿轻信。



正文


几个常识:

1. 目前来看,上下前后左右伴舞毫无区别。栈位理论在这里没有任何贡献。

2. 舞王和伴舞各自有不同的bug,不可混为一谈,但究其原理是相通的。

3. IZE有一个特性叫速度重置。刚出生的僵尸若500cs内不受攻击,进入速度重置,每一帧都随机重置速度;受过攻击的僵尸若525cs内不受攻击,也进入速度重置。处于速度重置状态的僵尸受攻击后该状态立刻解除,速度固定为受攻击这一帧随机重置到的速度。


先说下对两者都适用的速度刷新】机制。


满足以下任意条件时,触发舞王/伴舞的速度刷新:

① 处于踏步相位(且自身不在啃食状态);

② 处于速度重置状态;

③ 啃食完毕任意植物;

④ (伴舞限定)首次出土完毕的瞬间,且此时没有任何队友卡位。


注意:④和①~③略有不同,是唯一一个要求队友不卡位的。


这个速度刷新有什么用呢?


比如舞王本体原速,但有伴舞被减速时,舞王和其他伴舞从原速变为减速的判定,是包含在速度刷新里的。类似地,伴舞从减速变回原速也是一样的道理。



舞王有一个特殊bug是【抽风】,具体表现为脚步动画加速(帧速*2),前进速度翻倍。抽风的判定点是舞王每次召唤后第一次进入前进动画的瞬间。舞王所处位置没有植物的话,就是召唤后200cs;否则是舞王啃完该植物的瞬间。此时,若有任意伴舞在啃食任意植物,舞王就会进入抽风状态,直到速度刷新。


抽风状态是持续有效的(直至速度刷新为止)。抽风的舞王只要不被伴舞卡位,就会加速前进。伴舞怎么死的不重要,被大嘴花吃掉乃至被冰豆打死都无所谓,隔了多久被打死也无所谓。关键是期间不能触发舞王的速度刷新。



接下来是伴舞。伴舞除了和舞王通用的【速度刷新】外,还有一套专属的【初始化】机制。


满足以下任意条件,会触发伴舞的速度初始化

① 处于踏步相位(且自身处于非啃食状态);

② 处于速度重置状态,且不被队友卡位;

③ 啃食完毕任意植物,且不被队友卡位;

④ 首次出土完毕的瞬间,且不被队友卡位。


①适用于踏步相位,②~④适用于前进相位。


诶?好像有点眼熟?没错,其实速度初始化速度刷新的原理类似,①和④是完全相通的,而②~③继承自速度刷新,只是附加了其他队友不能卡位的条件。


现在让我们来脑补一下代码层发生了什么事。首先,踏步相位进行了特殊处理,对全体伴舞进行速度刷新,但对正在啃食的僵尸进行了特殊处理,跳过刷新。除此之外,速度重置和啃食完毕这两个事件也进行了特殊处理,用于“恢复速度”。然而,如果其他同伴卡位,那么速度就恢复成了0。所以此二者也可以理解为是“失败”的速度刷新。


而至于④,我认为是宝开亡羊补牢式的后期处理,下面会详细讨论。


没有经历过初始化的伴舞,在前进相位时就会发愣,也就是著名的发愣bug了。发愣也是持续性的,直到伴舞完成速度初始化。


游戏是从每个僵尸出生算起,每隔4cs计算一次该僵尸的啃食判定。伴舞召唤到出土150cs,但152cs才会检测啃食,所以中间有2cs的空隙。如果初始相位为踏步,那么在这2cs内伴舞就已经完成速度初始化了(符合条件①),因此后续不会发愣。


对于普通的【大喷 花 花】模型而言,前伴舞会发愣的间隔只有80cs,这是因为得同时满足初始相位为前进和啃完花后的相位仍为前进两个条件。


理论计算一下:

从伴舞出生算起,150cs出土完毕,152cs开啃,452cs啃完。在150cs、452cs相位都得是前进。那么踏步最晚在451cs结束,最早可以在153cs开始(先暂时各留了1cs)。按踏步总长230cs算,求得的容差是68cs。


emmm好像和80cs对不上啊。翻这个老贴:https://tieba.baidu.com/f?kz=699121249,发现一句很神奇的话。


“一个周期长(4.6s±0.005s),包括(2.3s±0.05s)舞蹈(2.3s±0.05s)行走但舞蹈的末尾约0.1s是前进性的”


踏步相位末尾0.1s是前进性的?嗯?


于是我重新测了一下。逐帧读取舞王坐标及状态,得到了完整舞蹈周期如下:


44前进(240cs)→ 45(20cs) → 47(60cs) → 46(60cs) → 49(60cs) → 48(20cs) → 循环


其中状态44为前进,状态45~49均为踏步(以有无坐标变化区分)。


所以准确来说,前进相位有240cs,而踏步相位是220cs(被分割成了多个状态)。


回到前面的计算。用新数据的话,容差变为了78cs。和实际差的2cs,很有可能就是边界值了。


重新来一遍:假设152cs开啃的这一帧,相位已经可以是踏步了。同时452cs啃完的这一帧,踏步刚刚结束,也是允许的。这样踏步最早可在152cs开始,最晚在452cs结束。踏步总长220cs,因而452 - (152 + 220) = 80cs,分毫不差。



现在还有最后一个问题。有时候上/下伴舞被冰豆打残打死时,舞王新召唤的前伴舞是个愣在原地不动的!然后喜闻乐见地被小喷干翻了(


结合上面对发愣的解释,这个就很好理解了。众所周知,除了首次召唤,舞王总是固定在踏步相位的一开始召唤,也就是状态45的第一帧。以这一帧为原点,42cs后舞王召唤,192cs后伴舞出土,194cs后伴舞开啃。踏步总长度220cs,可见192-193cs期间伴舞的相位必然是踏步,满足速度初始化的条件②,故不会发愣。


但是如果MJ被减速,则召唤动作慢一倍,召唤总用时变为84cs。那么伴舞就是234cs出土,236cs开啃,踏步状态(220cs)已经过去了,其初始相位为前进!因而像这样的伴舞就会发愣。


推论:有伴舞卡位时,减速MJ召唤的所有伴舞都是发愣的。伴舞在刚刚出土完毕后会特别进行一次判定,但若此时有小队成员被卡位,就不满足④,无法完成速度初始化了。


这其实就是为什么之前说④是后期亡羊补牢式的处理。如果没有④,减速舞王召唤的所有伴舞都会直接原地发愣…… 为了让舞王行为正常,宝开可能后期补上了伴舞召唤完毕时进行速度刷新的逻辑(然后忘了其他成员卡位时,速度刷新会失败这件事)。



然后说下舞王不召唤这件事。


这个就比较清晰易懂了。用跟上面逐帧读取舞王内存类似的办法,发现从舞王进入前进相位算起,经过160cs时会进行判定。此时若有任意伴舞消失(视觉上是尸体消亡),舞王就会召唤,否则跳过召唤。


注意:前进相位整整有240cs,且如果要召唤,舞王召唤动作本身耗时42cs(减速则84cs)。然而,虽然【是否要召唤】已经提前钦定了,具体召唤几个是看召唤动作完毕时缺少的伴舞数量!!


也就说,以前进相位的第一帧为原点,t=160cs时做出决策是否召唤,但t=282cs时(减速则t=324cs)才会真正判定有几个伴舞从土里冒出来……真是无力吐槽了。特别是舞王减速时,从【决策】到【生效】差了整整164cs。


原版舞王之所以不漏脑,很大程度上要归功于走出地图范围被程序清理掉的前伴舞。由于检测到前伴舞空缺,舞王在底线才会持续召唤,否则就他这判定逻辑,漏个脑太容易了……



最后说说以上结论可能的应用。


舞王抽风,算是比较容易触发了。只要舞王本体不在速度重置里,伴舞出生后团灭(或者说不被卡位),舞王就会飞速前进。允许女仆的话,甚至可以一直保持这个状态,直到吃掉脑子hhh。


当然,伴舞的死法是有讲究的。都被土豆炸死显然不行,因为50cs的那个点必须有伴舞在啃食。大嘴花是一个很好用的介质,触发到生效70cs,那么形似【大嘴 + 某植物】的型就能轻松触发抽风。这也是为啥平常最常见的抽风发生在即死,舞王过地刺时伴舞被大嘴吃掉,然后舞王加速前进。地刺保证了舞王不被速度重置;大嘴保证了伴舞50cs处在啃食,但之后迅速gg不挡路。


关于发愣,因为其容差是80cs,那么随机丢一个舞王,前伴舞啃完4列后的发愣概率就是精确的80 / 460 = 17.4%。至于这个数据有什么用,就待各位继续挖掘了。



【MJ相关研究】你浑身上下都是破绽!的评论 (共 条)

分享到微博请遵守国家法律