艾爾登法環發售已過一個多月,惡兆妖鬼想必是大家比較熟悉的一個BOSS了,他會在法環中作為像黑魂裡古達一樣的新手導師會在前往史東威爾城的門口堵你,並且客觀來看如果褪色者不進行刷級,從遊戲開場一路平推跑到噩兆的BOSS房門口時進行挑戰,此時玩家大概不到二十級,而惡兆妖鬼的經典快慢刀 延遲刀 神經刀以及能抬手在空中停滯2秒然後根據玩家行動再決定是否下劈的超延遲刀法 等等重量級刀法使得各位褪色者能喝上一大壺。同時這位BOSS與魂3新手導師古達設計思路截然不同
傳聞中的超延遲刀法
本文不已惡兆王蒙格特為樣本分析,先以惡兆妖鬼瑪爾基特作為基礎先例,展開研究探討一下他的AI邏輯結構以及機制等等,並且對AI設計的角度提出一些建議和改進想法
法環新手老師
我會用解包工具來分析惡兆AI的邏輯與機制。主要以動畫編輯器與fs社傳統AI Lua腳本為主。
其中由於惡兆王和惡兆在骨骼與動畫上完全引用一套東西,並且兩者的AI腳本高度相似,惡兆妖鬼的代碼中還存留著惡兆王的邏輯代碼,只不過不執行惡兆王的動畫,並且相當一部分完全就是給噩兆王用的代碼在妖鬼的AI中沒有刪乾淨,所以我挑出代碼中僅關於惡兆妖鬼的部分對大家進行分析。分析成果我也下了相當大的功夫用於測試考察,若有錯誤的部分也歡迎指出。
先從中斷模塊(Interrupt)開始吧(可以粗略的理解為派生模塊)
return false上面的部分可省略
其中local0定義了一個常量20-GetmapHitRadius(GetmapHitRadius參數在魂類AI裡很少看到,暫時不知其意義,猜想是計算地圖邊緣碰撞牆的距離,防止BOSS掉下懸崖) local1定義了常量0
local2定義了常量20
local3定義了boss與玩家間的直線距離(Target_SELF指代的是玩家)
local4定義了一個隨機整數在(1,100)間隨機生成 local5和local6為0
先來看第一句代碼
其中HasSpecialEffectID是(Target_self,5025)中的target_self是指BOSS自身實例,5025對應著的是某個effectid編號
在以上的例子中,5025的EffectID在惡兆的a002_003000 、a000_003016、a000_003000的三個動作編號裡均出現過
我們找其中一個動畫來看(三個動畫其實長得差不多),該動畫通知放置的位置差不多是在惡兆攻擊完正處於攻擊後搖時。
幀數只有2幀的一段動畫通知,標記了5025的Effectid
3000
接下來看代碼
IsInsideTargetCustom這首先是個function,其中的輸入參數有,TARGET_SELF(代表自身的位置), TARGET_ENE_0(代表玩家的位置), AI_DIR_TYPE_F(處於自身位置的前方), 160(自身位置像前方的160度的扇形角度), -1(未知參數,忽略), 5.5 + arg1:GetMapHitRadius(TARGET_SELF))(5.5為TARGET_SELF與TARGET_ENE_0之間的扇形半徑距離,後面的GetMapHitRadius為未知參數,此處可看成5.5)
其中AI_DIR_TYPE_F中F代表forward,前方
還有AI_DIR_TYPE_B B代表Back,後方 AI_DIR_TYPE_L L代表Left,
左方 AI_DIR_TYPE_R 代表Right,右方
後面會有很多類似的判斷
製成圖表示就是
假如玩家處於離BOSS的扇形範圍內就可當是判斷條件成功
這時可以看出兩個個判斷條件成功的充分條件
首先是處於惡兆的5025動畫Effectid的動畫通知時
玩家處於上述表達的扇形範圍內
則ClearSubGoal()
這個函數的意思是清除該AI正要進行的行為列表,比如惡兆正打算要對你打一記快慢刀,這個函數就可把這個行為清除。
此時再進行一步IsInsideTargetCustom判斷,如果玩家處於在他前方120度的扇形範圍內時,並且直線距離3.5內時並且local4<60時會進行一步AddSubGoal函數
其中Local4<60的意思為何呢?翻到上方我寫過local4是一個隨機整數在(1,100)間隨機生成。所以其實就是一步概率計算,有60%的概率可以讓惡兆進行ID為3003的動畫攻擊
ADDSubGoal就是為惡兆添加上新的行為列表,
(GOAL_COMMON_ComboRepeat, 10, 3003, TARGET_ENE_0, 0, 0, 0, 0, 0)
GOAL_COMMON_ComboRepeat,意味著技能命名屬性
10代表著在10秒內該行為會生效,超過10秒不生效 3003代表著動畫編號,
在下方展示 TARGET_ENE_0代表玩家,這裡講過兩次了,後面不再贅述
3003編號動作
另外40%的概率惡兆會進行3001的攻擊動畫
3001動畫
那假如玩家不在以上的兩個距離的話,接下來的代碼還做了一步萬能考慮
以上代碼的幾個充分判斷條件有
玩家在360度全方位以自身為圓心的半徑為8米範圍的一個圓球內
Getnumber(1)裡面的值小於1(可以理解成一個數組,(1)代表1號索引裡存儲的值,是用來計數用的值,代表只能用一次,關於這個後面再詳細說)
BOSS身上有162000的EffectID
那麼16200的EffectID是什麼呢,是在惡兆轉二階段抬手時的一段動畫通知裡添加了該EffectID,可以理解為在動畫編輯器內讓AI用於傳輸信號的功能,讓AI檢測是否有添加這段EffectID來控制AI行為,等於是用於AI與動畫之間的聯通互動
惡兆2階段舉起錘子時有大概10幀的動畫通知片段加入了這個EffectID
轉二階段必出的錘子捶地
這是一個二階段追加boss連段設計,假如處於在a002_3000動畫的後搖階段玩家把BOSS血量打到65%以下時惡兆將會進入二階段,惡兆會強制做出這個舉錘子追擊的動作後,會把number(1)裡的值增加1(原本為0,則變為1)然後清除當前行為列表,使BOSS強制使出3013的追擊動作.說白了其實就是假如BOSS正處於二階段,則追加特殊連段combo的邏輯
3013的錘子派生動作
小總結:這是在惡兆在一個豎劈動畫後搖中加上的後續Combo條件判定條件
這招結束後若玩家在中距離的位置(3.5與5.5之內),惡兆則會清空當前行為列表,重新進行一輪技能篩選,和玩家進行立回,但是假如處於二階段,並且符合二階段連段派生的判定條件,則惡兆會直接出這招3013的錘子砸地動作
倘若玩家在近距離(3.5米內),惡兆則會有60%的機率進行將3003的近戰追擊添加到自己下一部行為列表,另外40%的幾率進行3001的近戰追擊也是同理
玩家在遠處(8米外)惡兆的行為就沒有任何變化,該幹嘛的還是幹嘛
評價:這是用來追加combo的模塊,俗稱派生技能,派生技能是惡兆AI的核心模塊。在近戰範圍內則會繼續追加技能,同時讓處於中距離玩家重新調整與BOSS的戰鬥節奏。在不同距離的玩家下面對BOSS都有不同的情況表現,並且在固定動畫的後搖中若把玩家打出轉變二階段的動畫後,還會繼續追加連段。為AI添加了相當多的情況應對,設計的其實較為合理。
有了以上的分析基礎接下來的內容看懂接下來的內容就容易多了,我們繼續再往下看。
首先是5026是在a002_3001的動畫後搖階段添加的
3001
大家注意一下上個代碼片段3001編號的動畫
也就是說在具有5025的EffectID的a200_3000的下劈動畫後
3000
假如派生出了3001的動畫,這時在下面這塊代碼中還有派生
判斷條件有
玩家在120度半徑10.5米的扇形範圍內,且玩家與BOSS直線距離大於5米時
添加上3018的動畫
3018的動畫,衝刺一段距離追擊處於中距離玩家的動作
2.倘若不在上述的範圍內,玩家處於160度扇形半徑6米內的範圍時
追加3005的動畫,這是為近戰範圍內的玩家準備的
3005的動畫很明顯是為近戰玩家所準備的
同時這段代碼也可以看出玩家在a200_3001的後搖階段中玩家處於360度全方位半徑為8的扇形範圍內,倘若玩家把BOSS打到65%以下血量,BOSS出轉階段舉錘子動畫後會有3001的派生技能
3010派生動畫·
並且還會有一段派生技能的判斷
則這段代碼的判定條件為
玩家在120度半徑為40的扇形範圍內,並且玩家與BOSS直線距離超過7.5,以及Number(2)裡的數小於1時,
把number(2)裡的數設為3
使惡兆使出3017的追加動畫
3017飛刀二連,為處於中距離外的玩家準備的
然後這段代碼結束
截一下這一段代碼的圖
怕不清楚魂類遊戲裡距離概念的朋友,我這裡簡單說一下大概這些距離是多遠
比如上述的7.5米我們拿一張圖
在動畫編輯器中一個網格單位相當於是一米,7.5米的單位就大概這麼長
正面角度看就這大概這麼遠
這時會有個問題
這兩段代碼的判定條件如此相近,一個是10.5的扇形半徑範圍內,5.5的直線距離外成功
另一個是40的扇形半徑範圍內,7.5的直線距離外成功
那我站在直線距離為8的位置怎麼算呢?
首先代碼是從上到下執行,所以按優先級來說是會先執行上面的那段
但是假如玩家與BOSS直線距離超過10.5的話上一段代碼就不會執行了,改為執行下面那段代碼。
所以下面的那段代碼寫7.5我覺得沒有意義,應該寫為10.5才較為合理
因為玩家處於7.5-10.5的這段距離時肯定是上面的代碼會執行成功
所以下面那段代碼帶來的3017的飛刀二連動作派生實際上是要玩家實際在10.5外的距離才能生效
總結一下
在這一段代碼中,在動畫a002_3001動畫的後搖階段,同樣為處於中距離(5.5-10米內),近距離(6米內),遠距離(10.5米外)的玩家都準備了不同的反應模式,並且反應得動畫招式配置合理,沒有在近距離時還給你丟白給飛刀二連的滑稽。
a002_3001
然後剩下的部分我貼一下代碼大家就能知道剩餘的部分在幹嘛了
5027開始
其中先看向5027,其實就是上述5025代碼塊裡二階段派生中的3003的動畫編號,
所以這裡的意思其實就是在3003的動作後面繼續接派生,而派生的內容在上面的第二張圖就可以看到內容了,一如既往的還是通過距離範圍,隨機概率,以及是否進入二階段進行連招派生
將以上兩段代碼的邏輯可以做成以下思維導圖
以上則為惡兆妖鬼的派生連段思路,並且這只是兩段代碼的思路,惡兆妖鬼總共有350行左右的代碼用於此模塊,約佔了總代碼三分之一。以上思維導圖中3003,3018,3005的動畫完全也有可能擁有3001的後續派生技能邏輯,只不過我還沒有讀到這一部分
這樣說完大家懂了吧,惡兆臭名昭著的派生快慢刀抓翻滾的AI邏輯也是這麼做的,其實相當簡單
突然出現的快慢刀1
突然出現的快慢刀2
而這段派生的代碼在這
3039是快慢刀的動作編號,當然惡兆的快慢刀動畫有很多,這個只展示一個
可以看到想要避免被這種派生快慢刀打,方法大概是
簡單來說不要在他的以下這個動作後搖階段站在他3.8米的範圍內,不然他就會100%出快慢刀
然後我們對比一下2015年的血源詛咒dlc中科斯的孤兒的AI腳本的打斷模塊(Interrupt)
血源詛咒中最終BOSS:火力少年王
孤兒的AI腳本,打斷模塊約有150行代碼
科斯的孤兒的AI腳本中派生判定模塊一般只有距離作為條件,判斷是否達到執行條件,邏輯大多為
在XX距離內則符合判定條件則執行XX連招,在該範圍外則不執行
在XX距離內符合判定條件執行XX連招,在該距離範圍外執行XX連招
然後孤兒的AI將所有距離基本被劃分為兩個等級,近和遠
差不多沒了
沒有惡兆的AI中將距離的等級更加細化,劃分為三個等級,近,中,遠,每種情況應對的表現也不一樣
沒有惡兆的AI用了嚴謹的扇形半徑判定和0-100的隨機整數來間接決定出招慾望,以及擁有定時器的功能來控制派生連段中出現的二階段專屬技能使用不能超過1次(不能在一次combo中打出兩次二階段專屬技),並且內容量相當之大
惡兆做了極其奢侈的派生技能衍生,孤兒在這一塊的代碼只有150行左右,其中還包括了受傷檢測模塊(惡兆並沒有這個模塊,至於這是模塊是啥以後說),而惡兆在這一塊的代碼將近達到了400行,相當的奢侈,對其處理的較為細化。
剩下打斷模塊代碼就不一一解析了,接下來的400行的代碼都差不多用於細化打磨這個模塊
內容量太大,感興趣的人多的話下篇我再繼續講
我們現在講讀指令模塊
惡兆是否有讀指令呢?
有
由於本篇文字數量可能會超標,並且讀指令這塊的代碼比較繞,不夠直觀。這裡我就只寫出我得到的結論
指令分為Useitem喝藥檢測(聖盃瓶,丟壺,吃BUFF道具等)以及Shoot類遠程攻擊的指令檢測(法杖,聖印記,弓箭弩等)
1.惡兆在處理這兩種的應對方式幾乎一樣,只不過喝藥檢測的話要有八米的距離判定條件,8米外喝藥檢測無效,但是Shoot類指令依然生效
2.同時惡兆得處於walk狀態,惡兆的walk狀態有三種,前 左 右各三種,只有惡兆處於這三種狀態時才能觸發,其他動作不觸發
一旦玩家輸入這些指令
惡兆若在walk狀態就會轉為跑向你的狀態 (播放Dash衝刺動畫)
惡兆會用飛刀二連,然後重新進入技能篩選模塊
3017飛刀二連
沒了,就這些
至於兩種的概率問題我目前也沒弄懂,能弄明白的話後續會繼續更新吧
Walk狀態
Dash衝刺動畫
所以惡兆在這方面還是沒有熔爐騎士和神皮來的折磨,對讀指令的反應僅限於變得快速接近你和用飛刀換血,可以看到惡兆在讀指令還是很友好的
最後總結部分
惡兆妖鬼的AI比起以前的魂系列BOSS,其動畫數量極其品質相當優秀,在派生技能的衍生以及判斷條件都做了相當奢侈的堆量。按理來說玩家可以打的很爽,但其派生技能充斥著大量快慢刀、延遲刀設計,總會在玩家認為他的攻擊應該結束時突然給玩家來一記重量級刀法。並且派生連段數量過多,會造成BOSS做完一整套“廣播體操”的期間內近戰玩家沒有機會能夠碰到BOSS一下,同時惡兆的技能設計為近戰玩家更有挑戰性,因為在他的技能派生中近距離的經常是用快慢刀伺候,中距離乃至遠距離都是白給招。事實上這個問題在惡兆王蒙葛特身上的問題更加嚴重,惡兆王的派生技能衍生比惡兆妖鬼甚至還多的同時惡兆王本身動畫的連段數就超出一般人想象。對於近戰玩家的體驗設計不夠到位,少掉了魂系以往回合制打法能夠打的有來有回的樂趣。
喜歡我的薪王13連嗎
如何優化呢?
我給出我一點想法
可以通過計時器的CD冷卻功能來給快慢刀設計一個CD冷卻時長,目前法環的AI是完全擁有這個功能,在派生出一次快慢刀後設置一下這一招的CD,讓惡兆短時間內無法再次使用。事件可以設置為10s,20s.,至少可以讓近戰玩家不會連續被反直覺的快慢刀頻繁的被噁心到
給多攻擊判定的派生技能設置一定留空的概率。目前大風車是百分百接在3010動畫後六米距離內的,那我利用一個RandomInt,來設置40%的概率留空,讓他什麼都不做。進入下一輪技能篩選階段。這樣可以控制惡兆的攻擊慾望同時也降低近戰玩家的壓力
3034大風車
3010
3.在面對Shoot以及useItem類指令時,在8米-15米間的距離時,惡兆可以留40%的概率讓二階段的惡兆用錘子追擊來快速拉近與遠程玩家的距離來增加壓迫感以及降低他們的容錯率,平衡一下近戰和遠程玩家的體驗。
3027動作編號
本篇的內容差不多到此為止,其餘模塊的內容下篇我會繼續更新
點贊超過一千的話,我會找其他的熱門BOSS繼續分析他們的AI
最後也歡迎各位褪色者們前來討論研究