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

從游戲代碼和實(shí)驗(yàn)數(shù)據(jù)深入剖析Noita的法杖秘密,鏈鋸機(jī)槍流派達(dá)成?。。 皣}噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠噠”

傳送門:不想看過程的可以自行跳到 第4點(diǎn)-初步結(jié)論
1法杖基礎(chǔ)機(jī)制
想要知道這個(gè)問題的答案,我們就得了解法杖施法間隔的構(gòu)成,
施法間隔分為:施放延遲和充能時(shí)間兩個(gè)部分,
施放延遲:法杖每次施法后所需要等待的時(shí)間,相當(dāng)于開槍后“呯”“呯”兩槍之間的時(shí)間差
充能時(shí)間:法杖所有法術(shù)施放后下一輪需要等待的時(shí)間,相當(dāng)于打完全部子彈后的換彈時(shí)間

以初始法杖為例,初始法杖本身有0.17秒的施法延遲和0.40秒的充能時(shí)間,看起來好像施法間隔等于兩者之和,其實(shí)不然。因?yàn)榉ㄐg(shù)本身也有施放延遲!!

還是以初始法杖為例。初始法杖里帶了兩個(gè)火花彈,每個(gè)火花彈有0.05秒的施法延遲。因?yàn)檫@不是亂序杖,所以法杖內(nèi)的法術(shù)按順序施放。
“開槍總時(shí)間=第一槍時(shí)間+第二槍時(shí)間+換彈時(shí)間”
所以
總施法間隔
=(法杖施放延遲+火花彈1號(hào)施放延遲)?+?(法杖施放延遲+火花彈2號(hào)施放延遲)?+ 總充能時(shí)間
=? ? ? ? ? ? ? (0.17s+0.05s)? ? ? ? ? ? ? ? ?+? ? ? ? ? ? ? ? (0.17s+0.05s)? ? ? ? ? ? ? ? ?+? ?? 0.40s?
= 0.84s
經(jīng)由評(píng)論區(qū)Turfia提醒,特此勘誤:
充能時(shí)間會(huì)在法杖內(nèi)所有法術(shù)施放完時(shí)立即開始結(jié)算,而不等最后一發(fā)法術(shù)的施放延遲。
因?yàn)榉ㄕ仁┓叛舆t+火花彈2號(hào)施放延遲=0.17+0.05=0.22s<總充能時(shí)間0.4s
兩者在施放完第二發(fā)火花彈后同時(shí)開始結(jié)算
所以在充能時(shí)間走完之前第二發(fā)火花彈的施放延遲已經(jīng)結(jié)算完成了
∴總施法間隔
=(法杖施放延遲+火花彈1號(hào)施放延遲)+總充能時(shí)間
=? ? ? ? ? ? ? (0.17s+0.05s)? ? ? ? ? ? ? ? ? ??+? ?? 0.40s
=0.62s
每秒只能打一點(diǎn)幾發(fā),充其量只是一把小手槍,遠(yuǎn)遠(yuǎn)達(dá)不到我們法術(shù)加特林的標(biāo)準(zhǔn)。
射速(每秒攻擊次數(shù))= 1÷總施法間隔
所以要想達(dá)成法術(shù)加特林,這個(gè)總施法間隔必須足夠小。
2方法探究和代碼分析
那么有沒有什么辦法能減小這個(gè)數(shù)值呢?
此時(shí)就要介紹一下Noita中bug般的存在:鏈鋸

看起來似乎很不起眼,只不過讓充能時(shí)間減少0.17秒罷了。
只看紙面數(shù)據(jù)的話還比不上水滴,不光減充能0.17秒還減施放延遲0.25,更何況鏈鋸還有散射+3度的負(fù)面屬性。

那為什么還說鏈鋸是bug呢?讓我們先來看個(gè)例子

按理說這是把垃圾的不能再垃圾的杖,雖然別的屬性還不錯(cuò),可施放延遲達(dá)到了驚人的6.67秒,我想你應(yīng)該不會(huì)想要一把開一槍等6秒才能開第二槍的老爺槍,但是法術(shù)配好的效果卻令人意外。

可以看到火花彈密集的射出形成了光柱,這正是我們想要的法術(shù)機(jī)槍??!
為什么會(huì)這樣呢?
我們深挖背后的實(shí)現(xiàn)代碼就會(huì)發(fā)現(xiàn)鏈鋸的bug之處。

注意看其中這條

這條語句的意思是將當(dāng)前施放延遲設(shè)置為0,
(等一下,制作組,紙面數(shù)據(jù)只有減0.17秒充能時(shí)間啊喂??!哪冒出來的施放延遲置0??)
對(duì)比水滴的減15單位時(shí)間施放延遲(1單位≈0.017s)可是強(qiáng)太多了

從代碼來看只要我們?”合理使用”鏈鋸的話,就能達(dá)到讓施放延遲為0的目的?。。?!
3 實(shí)驗(yàn)分析
接著我們來看如何”合理使用”鏈鋸。

經(jīng)過多組對(duì)照實(shí)驗(yàn)可以得到一個(gè)初步結(jié)論
4初步結(jié)論和公式
1.法杖的法術(shù)要以鏈鋸結(jié)尾
(為了讓法杖的本身的施放延遲被至0)
2.法術(shù)需要和鏈鋸組成多重施法包且以鏈鋸結(jié)尾。
(由于法術(shù)本身的施放延遲也會(huì)影響施法間隔)
3.?施放延遲多少關(guān)系不大,但充能時(shí)間一定要盡可能達(dá)到0
(鏈鋸可以將施放延遲歸0)
4.鏈鋸數(shù)量會(huì)影響法術(shù)機(jī)槍攻速,越多攻速越低
(推測(cè)可能是因?yàn)榉ㄐg(shù)本身有個(gè)最小施法延遲1幀即1個(gè)單位時(shí)間≈0.017s)
目前還未挖掘到官方ACTION_DRAW_RELOAD_TIME_INCREASE的函數(shù)實(shí)現(xiàn),所以還不能下最終結(jié)論,如有新發(fā)現(xiàn)會(huì)繼續(xù)更新。


目前得到的法術(shù)機(jī)槍公式:
多重施法(投射物+鏈鋸結(jié)尾)+? N個(gè)減充能且無延遲法術(shù)?+ 鏈鋸結(jié)尾

補(bǔ)充說明1:其中減充能法術(shù)的數(shù)量由法杖和法術(shù)的總充能時(shí)間決定,直接進(jìn)行加法計(jì)算,需要將總充能時(shí)間減至0或者0以下
補(bǔ)充說明2:初步結(jié)論中有一條很重要,鏈鋸數(shù)量會(huì)影響法術(shù)機(jī)槍攻速,越多攻速越低。
解決辦法就是多加幾個(gè)多重(多重施法,多重散射均可)嵌套,使整個(gè)法術(shù)鏈變成一個(gè)法術(shù)包
補(bǔ)充說明3:公式中 【N個(gè)減充能法術(shù)】部分不一定是鏈鋸,目的就是為了達(dá)到0充能時(shí)間,但是多重里的鏈鋸和結(jié)尾鏈鋸不可替換。

新更新公式:
A(可選)+ B(可多選)+【C+D(可多選)+鏈鋸】+ 鏈鋸+ E(可選)
條件:①非亂序杖? ②總充能時(shí)間盡可能小,施放延遲不用管
說明:
A 提升法力
機(jī)槍杖很容易缺藍(lán),如果缺藍(lán)可在前面加上“提升法力”修正,非必須

B 多重施放


C 非靜態(tài)投射物


D 減少“充能時(shí)間”法術(shù)

根據(jù)需要增加個(gè)數(shù)以讓充能時(shí)間總和小于等于0

E 投射修正或被動(dòng)
可以讓射速翻倍,非必須

舉個(gè)例子:
我現(xiàn)在手上有一根非亂序杖想組成機(jī)槍杖,該如何配呢

可以看到魔杖的充能時(shí)間為0.68,所以需要有多個(gè)減充能法術(shù)將總充能減至0或0以下
所以一個(gè)可行的配法是:

2B(多重施放)?+? ? ?【C(火花彈)?+? ? 2D(減充能法術(shù))?+? ? ? ? ?鏈鋸?】+? ??? ? ? 鏈鋸 +? ? ? E(火把)?
充能時(shí)間=0.68(魔杖) -0.17(鏈鋸) -0.17(水滴) -0.17(鏈鋸) -0.17(鏈鋸)? ?=0? ? ?
滿足總充能時(shí)間≤0的條件

鳴謝
感謝Nolla官方制作了這款游戲并開放mod接口
特別感謝ZJoep提供的代碼數(shù)據(jù)挖掘
感謝 ZJoep和Kid在貼吧交流群里提出的建議和指導(dǎo)

黑羽拔毛群212270866 歡迎各位大佬進(jìn)來拔毛~
業(yè)務(wù)范圍:粉絲催更,游戲交流,翻譯漢化,mod制作,藝術(shù)繪圖,八卦閑聊等