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

【Noita探秘】如何掏出一把加特林大杀四方?

2020-01-16 13:01 作者:黑羽夜风  | 我要投稿

从游戏代码和实验数据深入剖析Noita的法杖秘密,链锯机枪流派达成!!!“哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒哒


传送门:不想看过程的可以自行跳到 第4点-初步结论

1法杖基础机制

想要知道这个问题的答案,我们就得了解法杖施法间隔的构成,

施法间隔分为:施放延迟充能时间两个部分,

施放延迟:法杖每次施法后所需要等待的时间,相当于开枪后“呯”“呯”两枪之间的时间差

充能时间:法杖所有法术施放后下一轮需要等待的时间,相当于打完全部子弹后的换弹时间

初始法杖

以初始法杖为例,初始法杖本身有0.17秒的施法延迟和0.40秒的充能时间,看起来好像施法间隔等于两者之和,其实不然。因为法术本身也有施放延迟!!

火花弹

还是以初始法杖为例。初始法杖里带了两个火花弹,每个火花弹有0.05秒的施法延迟。因为这不是乱序杖,所以法杖内的法术按顺序施放。

“开枪总时间=第一枪时间+第二枪时间+换弹时间”

所以

总施法间隔

=(法杖施放延迟+火花弹1号施放延迟) + (法杖施放延迟+火花弹2号施放延迟) + 总充能时间

=              (0.17s+0.05s)                 +                (0.17s+0.05s)                 +     0.40s 

= 0.84s

经由评论区Turfia提醒,特此勘误:

充能时间会在法杖内所有法术施放完时立即开始结算,而不等最后一发法术的施放延迟。

因为法杖施放延迟+火花弹2号施放延迟=0.17+0.05=0.22s<总充能时间0.4s

两者在施放完第二发火花弹后同时开始结算

所以在充能时间走完之前第二发火花弹的施放延迟已经结算完成了

∴总施法间隔

=(法杖施放延迟+火花弹1号施放延迟)+总充能时间

=              (0.17s+0.05s)                    +     0.40s

=0.62s

每秒只能打一点几发,充其量只是一把小手枪,远远达不到我们法术加特林的标准。

射速(每秒攻击次数)= 1÷总施法间隔

所以要想达成法术加特林,这个总施法间隔必须足够小。


2方法探究和代码分析

那么有没有什么办法能减小这个数值呢?

此时就要介绍一下Noita中bug般的存在:链锯

“链锯大法好”

看起来似乎很不起眼,只不过让充能时间减少0.17秒罢了。

只看纸面数据的话还比不上水滴,不光减充能0.17秒还减施放延迟0.25,更何况链锯还有散射+3度的负面属性。

水滴

那为什么还说链锯是bug呢?让我们先来看个例子

一把施放延迟6秒多的垃圾杖

按理说这是把垃圾的不能再垃圾的杖,虽然别的属性还不错,可施放延迟达到了惊人的6.67秒,我想你应该不会想要一把开一枪等6秒才能开第二枪的老爷枪,但是法术配好的效果却令人意外。

火花加特林?!

可以看到火花弹密集的射出形成了光柱,这正是我们想要的法术机枪!!

为什么会这样呢?

我们深挖背后的实现代码就会发现链锯的bug之处。

代码挖掘来自ZJoep

注意看其中这条

链锯的相关代码

这条语句的意思是将当前施放延迟设置为0,

(等一下,制作组,纸面数据只有减0.17秒充能时间啊喂!!哪冒出来的施放延迟置0??)

对比水滴的减15单位时间施放延迟(1单位≈0.017s)可是强太多了

水滴的相关代码

从代码来看只要我们 ”合理使用”链锯的话,就能达到让施放延迟为0的目的!!!!

3 实验分析

接着我们来看如何”合理使用”链锯。

由于实验数据过多(大约70组),其余不再展示,多组对照实验目的是为了排除干扰项

经过多组对照实验可以得到一个初步结论

4初步结论和公式

1.法杖的法术要以链锯结尾

(为了让法杖的本身的施放延迟被至0)

2.法术需要和链锯组成多重施法包且以链锯结尾。

(由于法术本身的施放延迟也会影响施法间隔)

3. 施放延迟多少关系不大,但充能时间一定要尽可能达到0

(链锯可以将施放延迟归0)

4.链锯数量会影响法术机枪攻速,越多攻速越低

(推测可能是因为法术本身有个最小施法延迟1帧即1个单位时间≈0.017s)

目前还未挖掘到官方ACTION_DRAW_RELOAD_TIME_INCREASE的函数实现,所以还不能下最终结论,如有新发现会继续更新。

链锯充能时间相关代码

目前得到的法术机枪公式:

多重施法(投射物+链锯结尾)+  N个减充能且无延迟法术 + 链锯结尾

法术机枪公式

补充说明1:其中减充能法术的数量由法杖和法术的总充能时间决定,直接进行加法计算,需要将总充能时间减至0或者0以下

补充说明2:初步结论中有一条很重要,链锯数量会影响法术机枪攻速,越多攻速越低。

解决办法就是多加几个多重(多重施法,多重散射均可)嵌套,使整个法术链变成一个法术包

补充说明3:公式中 【N个减充能法术】部分不一定是链锯,目的就是为了达到0充能时间,但是多重里的链锯和结尾链锯不可替换。

新更新公式:

A(可选)+ B(可多选)+【C+D(可多选)+链锯】+ 链锯+ E(可选)

条件非乱序杖 充能时间尽可能小施放延迟不用管

说明:

  • A 提升法力

机枪杖很容易缺蓝,如果缺蓝可在前面加上“提升法力”修正,非必须

  • B 多重施放

类型为多重施放均可
多重散射需要配额外的减小散射修正
  • C 非静态投射物

类型为投射物均可,不能是静态投射物
任意非静态的投射物都可以,这里只列举了一部分
  • D 减少“充能时间”法术

充能时间显示为负数即为减少

根据需要增加个数以让充能时间总和小于等于0

任意充能时间为负数的法术均可,这里只列举了一部分
  • E 投射修正或被动

可以让射速翻倍非必须

效果演示


举个例子:

我现在手上有一根非乱序杖想组成机枪杖,该如何配呢

可以看到魔杖的充能时间为0.68,所以需要有多个减充能法术将总充能减至0或0以下

所以一个可行的配法是:

火花弹和其他法术被多重打包在一起

2B(多重施放) +     【C(火花弹) +    2D(减充能法术) +         链锯 】+          链锯 +      E(火把) 

充能时间=0.68(魔杖) -0.17(链锯) -0.17(水滴) -0.17(链锯) -0.17(链锯)   =0     

满足总充能时间≤0的条件

鸣谢

感谢Nolla官方制作了这款游戏并开放mod接口

特别感谢ZJoep提供的代码数据挖掘

感谢 ZJoep和Kid在贴吧交流群里提出的建议和指导

黑羽拔毛群212270866 欢迎各位大佬进来拔毛~

业务范围:粉丝催更,游戏交流,翻译汉化,mod制作,艺术绘图,八卦闲聊



【Noita探秘】如何掏出一把加特林大杀四方?的评论 (共 条)

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