【我?guī)旺椊切辀ug】囚犯們神秘的解放機(jī)制
前言和bug簡介
這個系列內(nèi)容大概是科學(xué)分析一些游戲bug或"bug"的原理并給出可能的解決方案
往期內(nèi)容歡迎查看本人專欄
本期的是新囚犯敵人專場,新囚犯敵人的解放機(jī)制上出現(xiàn)了2個bug
第一個:囚犯敵人處于警報模式時(即身上橙光閃爍),無法被重犯強(qiáng)制激活。詳情可見此視頻約1分30秒處
第二個:弓箭手囚犯解放后被禁錮,再次進(jìn)入解放模式僅需3次遠(yuǎn)程攻擊,且跳過警報模式
本期內(nèi)容中第2個bug的分析與fux2大佬共同完成,在此特別感謝

囚犯機(jī)制的詳解
在弄清楚bug的成因前,首先需要知道囚犯的詳細(xì)機(jī)制
囚犯一共擁有3種模式,分別為:禁錮模式,警報模式,解放模式
進(jìn)入禁錮模式時,會創(chuàng)建4層buff(以下簡稱為計數(shù)buff)
計數(shù)buff的效果為:在進(jìn)行攻擊前,減少一層計數(shù)buff(最低降至0),隨后判斷計數(shù)buff的層數(shù),如層數(shù)等于1,則切換至警報模式
進(jìn)入警報模式0.05s后,會創(chuàng)建另一個buff(以下簡稱為警報buff)
警報buff的效果為:在進(jìn)行攻擊前,減少一層計數(shù)buff(最低降至0),隨后切換至解放模式
警報buff屬于衍生buff,僅可存在于警報模式下(退出警報模式時自動結(jié)束)
解放模式下,會持有特征buff,方便禁錮裝置判斷目標(biāo)是否處于解放模式

無法強(qiáng)制解放的警報模式
首先是第一個bug,警報模式的囚犯無法被重犯(或杰斯頓)強(qiáng)制激活
重犯的強(qiáng)制解放的機(jī)制為,檢測敵人身上是否持有計數(shù)buff,如果持有計數(shù)buff,則清空計數(shù)buff(層數(shù)直接歸0),并直接將其切換至解放模式
這里可以直接進(jìn)行推測,由于某種原因,警報模式下的囚犯,身上不存在計數(shù)buff,因此無法被重犯強(qiáng)制解放
進(jìn)一步推測可以發(fā)現(xiàn),導(dǎo)致計數(shù)出問題的,只可能出現(xiàn)在“進(jìn)行攻擊前”這個節(jié)點(diǎn)上
讓我們實(shí)際推一遍囚犯計數(shù)buff的變化:
4層buff -> 攻擊前,4-1層,剩余3層 -> 第1次攻擊 -> 攻擊前,3-1層,剩余2層 -> 第2次攻擊 -> 攻擊前,2-1層,剩余1層,切換至警報模式
問題出現(xiàn)在這里,切換至警報模式后,原本還未進(jìn)行的攻擊由于模式切換不復(fù)存在,無法繼續(xù)進(jìn)行
而切換至新模式后,程序會立刻嘗試下一次攻擊,觸發(fā)成功后會再次觸發(fā)一個“進(jìn)行攻擊前”的節(jié)點(diǎn)
因此后續(xù)的邏輯為:
攻擊前,2-1層,剩余1層,切換至警報模式 -> 攻擊前,1-1層,剩余0層 -> 第3次攻擊
很明顯可以看出,在第3次攻擊開始后,計數(shù)buff由于“進(jìn)行攻擊前”節(jié)點(diǎn)的多次觸發(fā),已經(jīng)不復(fù)存在
因此,重犯無法強(qiáng)制激活警報模式下的敵人
修復(fù)方案1:進(jìn)入警報模式極短時間后,再創(chuàng)建一層計數(shù)buff(不推薦)
修復(fù)方案2:讓重犯在檢測到禁錮模式特征buff(enemy_confinement)或警報模式特征buff(enemy_liberty[warning])時,可強(qiáng)制解放目標(biāo)

只需三次攻擊解放的弓箭手
然后是第二個bug,弓箭手囚犯解放后被禁錮,再次進(jìn)入解放模式僅需3次遠(yuǎn)程攻擊,且跳過警報模式

這個bug比較詭異,我們可以先從邏輯上進(jìn)行一些推理
首先,不考慮其它單位的情況下,能切換至解放模式只有一種手段,就是觸發(fā)了警報buff(即在已經(jīng)獲得了警報buff的情況下,觸發(fā)一次“進(jìn)行攻擊前”節(jié)點(diǎn))
但是獲取警報buff只有一種途徑,即切換至警報模式0.05s后
所以,從理論上來講,警報模式不可能被跳過,只是持續(xù)了一個極短的時間
但是,最令人迷惑的點(diǎn)不是上面的內(nèi)容,而是:為什么解放后再禁錮會導(dǎo)致前后出現(xiàn)差異?這其中發(fā)生了什么變化嗎?
多遍確認(rèn)后,可以確定:對比再次禁錮前后的禁錮模式,buff并沒有發(fā)生任何變化
那么可以確定變化并不是出在buff身上
這個bug還有一點(diǎn)很特殊的地方在于
囚犯敵人中僅弓箭手會出現(xiàn)這個bug
經(jīng)測試后發(fā)現(xiàn),出現(xiàn)這個bug的條件是使用遠(yuǎn)程攻擊,弓箭手使用近戰(zhàn)攻擊時并不會觸發(fā)這個bug
對于敵方單位來說,近戰(zhàn)攻擊和遠(yuǎn)程攻擊的不同之處在于狀態(tài)機(jī)的不同(近戰(zhàn)阻擋使用Combat,遠(yuǎn)程攻擊使用Attack)
而狀態(tài)機(jī)的不同,帶來的一個區(qū)別是,敵人的遠(yuǎn)程攻擊需要使用觸發(fā)器(Trigger)來判斷條件進(jìn)行觸發(fā),而近戰(zhàn)攻擊不需要這個,可以直接觸發(fā)
每個模式使用不同的觸發(fā)器
最常用的一種觸發(fā)器是選擇觸發(fā)器(SelectorTrigger)
大概邏輯就是,攻擊范圍內(nèi)有指定個符合選擇器條件的單位時,觸發(fā)攻擊
這種觸發(fā)器有一個很有意思的地方,就是它是有冷卻的
每次搜索目標(biāo)后,觸發(fā)器都會進(jìn)入持續(xù)3幀的冷卻。在這段時間內(nèi),嘗試搜索目標(biāo)都會直接失敗
對機(jī)制比較熟悉的朋友應(yīng)該能想到,這就是所謂的“索敵幀”(其實(shí)我不喜歡這個稱呼,因為它并不準(zhǔn)確,我會在下文中稱其為“索敵冷卻”)
那么,在考慮了索敵冷卻后,我們再來推一遍禁錮前囚犯身上發(fā)生的變化,為了簡便直接從身上剩余2層計數(shù)buff開始:
2層計數(shù)buff -> 嘗試觸發(fā)攻擊,成功,禁錮模式觸發(fā)器進(jìn)入3幀冷卻 -> 攻擊前,2-1層,剩余1層,切換至警報模式 -> 嘗試觸發(fā)攻擊,成功,警報模式觸發(fā)器進(jìn)入3幀冷卻 -> 攻擊前,1-1層,剩余0層 -> 第3次攻擊開始 -> 獲得警報buff -> 第3次攻擊結(jié)束 ->?嘗試觸發(fā)攻擊,成功,警報模式觸發(fā)器進(jìn)入3幀冷卻 -> 攻擊前,切換至解放模式
毫無問題是嗎?
我們現(xiàn)在加入一個條件,切換至一個模式后,其它模式的選擇觸發(fā)器不會進(jìn)行冷卻更新
注意上面過程中加粗的地方,由于在警報模式的觸發(fā)器進(jìn)入冷卻后,立刻從警報模式切換至了解放模式,因此警報模式的觸發(fā)器,在再次切換至警報模式前,始終保持3幀的冷卻
讓我們推一遍,保持著這個冷卻的情況下,也就是再次禁錮后,囚犯身上發(fā)生的變化:
2層計數(shù)buff -> 嘗試觸發(fā)攻擊,成功,禁錮模式觸發(fā)器進(jìn)入3幀冷卻 -> 攻擊前,2-1層,剩余1層,切換至警報模式 ->?嘗試觸發(fā)攻擊,失?。?警報模式觸發(fā)器仍處于3幀冷卻) -> 獲得警報buff(3幀>0.05s) -> 嘗試觸發(fā)攻擊,成功,警報模式觸發(fā)器進(jìn)入3幀冷卻 -> 攻擊前,1-1,剩余0層;切換至解放模式 -> 第3次攻擊開始
注意上文的加粗部分
由于觸發(fā)器的冷卻,導(dǎo)致禁錮后再次切換至警報模式后,攻擊無法立刻觸發(fā),需等待3幀
而3幀的時間>添加警報buff所需的0.05s
第3次攻擊觸發(fā)后,警報buff已經(jīng)被添加,因此這次攻擊前的行動節(jié)點(diǎn)會直接將弓箭手切換至解放模式
警報模式僅僅存在了3幀,一般情況下很難觀察到

修復(fù)方案1:切換模式時,重置切換前模式攻擊觸發(fā)器的索敵冷卻
修復(fù)方案2:延長進(jìn)入警報狀態(tài)后添加警報buff的延遲時間至0.1s以上
本文原載于NGA:https://ngabbs.com/read.php?tid=24802079
作者為本人
此專欄以CC BY-NC-SA 4.0協(xié)議發(fā)布