【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】


3楼猫 发布时间:2022-04-29 16:47:21 作者:旦旦君 Language

艾尔登法环发售已过一个多月,恶兆妖鬼想必是大家比较熟悉的一个BOSS了,他会在法环中作为像黑魂里古达一样的新手导师会在前往史东威尔城的门口堵你,并且客观来看如果褪色者不进行刷级,从游戏开场一路平推跑到噩兆的BOSS房门口时进行挑战,此时玩家大概不到二十级,而恶兆妖鬼的经典快慢刀 延迟刀 神经刀以及能抬手在空中停滞2秒然后根据玩家行动再决定是否下劈的超延迟刀法 等等重量级刀法使得各位褪色者能喝上一大壶。同时这位BOSS与魂3新手导师古达设计思路截然不同

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第0张

传闻中的超延迟刀法

本文不已恶兆王蒙格特为样本分析,先以恶兆妖鬼玛尔基特作为基础先例,展开研究探讨一下他的AI逻辑结构以及机制等等,并且对AI设计的角度提出一些建议和改进想法

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第1张

法环新手老师

我会用解包工具来分析恶兆AI的逻辑与机制。主要以动画编辑器与fs社传统AI Lua脚本为主。

其中由于恶兆王和恶兆在骨骼与动画上完全引用一套东西,并且两者的AI脚本高度相似,恶兆妖鬼的代码中还存留着恶兆王的逻辑代码,只不过不执行恶兆王的动画,并且相当一部分完全就是给噩兆王用的代码在妖鬼的AI中没有删干净,所以我挑出代码中仅关于恶兆妖鬼的部分对大家进行分析。分析成果我也下了相当大的功夫用于测试考察,若有错误的部分也欢迎指出。

先从中断模块(Interrupt)开始吧(可以粗略的理解为派生模块)

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第2张

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的三个动作编号里均出现过

我们找其中一个动画来看(三个动画其实长得差不多),该动画通知放置的位置差不多是在恶兆攻击完正处于攻击后摇时。

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第3张

帧数只有2帧的一段动画通知,标记了5025的Effectid

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第4张

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,右方

后面会有很多类似的判断

制成图表示就是

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第5张

假如玩家处于离BOSS的扇形范围内就可当是判断条件成功

这时可以看出两个个判断条件成功的充分条件

  1. 首先是处于恶兆的5025动画Effectid的动画通知时

  2. 玩家处于上述表达的扇形范围内

则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代表玩家,这里讲过两次了,后面不再赘述

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第6张

3003编号动作

另外40%的概率恶兆会进行3001的攻击动画

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第7张

3001动画

那假如玩家不在以上的两个距离的话,接下来的代码还做了一步万能考虑

以上代码的几个充分判断条件有

  1. 玩家在360度全方位以自身为圆心的半径为8米范围的一个圆球内

  2. Getnumber(1)里面的值小于1(可以理解成一个数组,(1)代表1号索引里存储的值,是用来计数用的值,代表只能用一次,关于这个后面再详细说)

  3. BOSS身上有162000的EffectID

那么16200的EffectID是什么呢,是在恶兆转二阶段抬手时的一段动画通知里添加了该EffectID,可以理解为在动画编辑器内让AI用于传输信号的功能,让AI检测是否有添加这段EffectID来控制AI行为,等于是用于AI与动画之间的联通互动

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第8张

恶兆2阶段举起锤子时有大概10帧的动画通知片段加入了这个EffectID

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第9张

转二阶段必出的锤子捶地

这是一个二阶段追加boss连段设计,假如处于在a002_3000动画的后摇阶段玩家把BOSS血量打到65%以下时恶兆将会进入二阶段,恶兆会强制做出这个举锤子追击的动作后,会把number(1)里的值增加1(原本为0,则变为1)然后清除当前行为列表,使BOSS强制使出3013的追击动作.说白了其实就是假如BOSS正处于二阶段,则追加特殊连段combo的逻辑

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第10张

3013的锤子派生动作

小总结:这是在恶兆在一个竖劈动画后摇中加上的后续Combo条件判定条件

这招结束后若玩家在中距离的位置(3.5与5.5之内),恶兆则会清空当前行为列表,重新进行一轮技能筛选,和玩家进行立回,但是假如处于二阶段,并且符合二阶段连段派生的判定条件,则恶兆会直接出这招3013的锤子砸地动作

倘若玩家在近距离(3.5米内),恶兆则会有60%的机率进行将3003的近战追击添加到自己下一部行为列表,另外40%的几率进行3001的近战追击也是同理

玩家在远处(8米外)恶兆的行为就没有任何变化,该干嘛的还是干嘛

评价:这是用来追加combo的模块,俗称派生技能,派生技能是恶兆AI的核心模块。在近战范围内则会继续追加技能,同时让处于中距离玩家重新调整与BOSS的战斗节奏。在不同距离的玩家下面对BOSS都有不同的情况表现,并且在固定动画的后摇中若把玩家打出转变二阶段的动画后,还会继续追加连段。为AI添加了相当多的情况应对,设计的其实较为合理。

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第11张

有了以上的分析基础接下来的内容看懂接下来的内容就容易多了,我们继续再往下看。

首先是5026是在a002_3001的动画后摇阶段添加的

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第12张

3001

大家注意一下上个代码片段3001编号的动画

也就是说在具有5025的EffectID的a200_3000的下劈动画后

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第13张

3000

假如派生出了3001的动画,这时在下面这块代码中还有派生

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第14张

判断条件有

  1. 玩家在120度半径10.5米的扇形范围内,且玩家与BOSS直线距离大于5米时

添加上3018的动画

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第15张

3018的动画,冲刺一段距离追击处于中距离玩家的动作

2.倘若不在上述的范围内,玩家处于160度扇形半径6米内的范围时

追加3005的动画,这是为近战范围内的玩家准备的

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第16张

3005的动画很明显是为近战玩家所准备的

同时这段代码也可以看出玩家在a200_3001的后摇阶段中玩家处于360度全方位半径为8的扇形范围内,倘若玩家把BOSS打到65%以下血量,BOSS出转阶段举锤子动画后会有3001的派生技能

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第17张

3010派生动画·

并且还会有一段派生技能的判断

则这段代码的判定条件为

  1. 玩家在120度半径为40的扇形范围内,并且玩家与BOSS直线距离超过7.5,以及Number(2)里的数小于1时,

  • 把number(2)里的数设为3

  • 使恶兆使出3017的追加动画

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第18张

3017飞刀二连,为处于中距离外的玩家准备的

然后这段代码结束

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第19张

截一下这一段代码的图

怕不清楚魂类游戏里距离概念的朋友,我这里简单说一下大概这些距离是多远

比如上述的7.5米我们拿一张图

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第20张

在动画编辑器中一个网格单位相当于是一米,7.5米的单位就大概这么长

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第21张

正面角度看就这大概这么远

这时会有个问题

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第22张

这两段代码的判定条件如此相近,一个是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米外)的玩家都准备了不同的反应模式,并且反应得动画招式配置合理,没有在近距离时还给你丢白给飞刀二连的滑稽。

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第23张

a002_3001

然后剩下的部分我贴一下代码大家就能知道剩余的部分在干嘛了

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第24张

5027开始

其中先看向5027,其实就是上述5025代码块里二阶段派生中的3003的动画编号,

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第25张

所以这里的意思其实就是在3003的动作后面继续接派生,而派生的内容在上面的第二张图就可以看到内容了,一如既往的还是通过距离范围,随机概率,以及是否进入二阶段进行连招派生

将以上两段代码的逻辑可以做成以下思维导图

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第26张

以上则为恶兆妖鬼的派生连段思路,并且这只是两段代码的思路,恶兆妖鬼总共有350行左右的代码用于此模块,约占了总代码三分之一。以上思维导图中3003,3018,3005的动画完全也有可能拥有3001的后续派生技能逻辑,只不过我还没有读到这一部分

这样说完大家懂了吧,恶兆臭名昭著的派生快慢刀抓翻滚的AI逻辑也是这么做的,其实相当简单

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第27张

突然出现的快慢刀1

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第28张

突然出现的快慢刀2

而这段派生的代码在这

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第29张

3039是快慢刀的动作编号,当然恶兆的快慢刀动画有很多,这个只展示一个

可以看到想要避免被这种派生快慢刀打,方法大概是

简单来说不要在他的以下这个动作后摇阶段站在他3.8米的范围内,不然他就会100%出快慢刀

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第30张

然后我们对比一下2015年的血源诅咒dlc中科斯的孤儿的AI脚本的打断模块(Interrupt)

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第31张

血源诅咒中最终BOSS:火力少年王

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第32张

孤儿的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冲刺动画)

  • 恶兆会用飞刀二连,然后重新进入技能筛选模块

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第33张

3017飞刀二连

没了,就这些

至于两种的概率问题我目前也没弄懂,能弄明白的话后续会继续更新吧

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第34张

Walk状态

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第35张

Dash冲刺动画

所以恶兆在这方面还是没有熔炉骑士和神皮来的折磨,对读指令的反应仅限于变得快速接近你和用飞刀换血,可以看到恶兆在读指令还是很友好的

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第36张

最后总结部分

恶兆妖鬼的AI比起以前的魂系列BOSS,其动画数量极其品质相当优秀,在派生技能的衍生以及判断条件都做了相当奢侈的堆量。按理来说玩家可以打的很爽,但其派生技能充斥着大量快慢刀、延迟刀设计,总会在玩家认为他的攻击应该结束时突然给玩家来一记重量级刀法。并且派生连段数量过多,会造成BOSS做完一整套“广播体操”的期间内近战玩家没有机会能够碰到BOSS一下,同时恶兆的技能设计为近战玩家更有挑战性,因为在他的技能派生中近距离的经常是用快慢刀伺候,中距离乃至远距离都是白给招。事实上这个问题在恶兆王蒙葛特身上的问题更加严重,恶兆王的派生技能衍生比恶兆妖鬼甚至还多的同时恶兆王本身动画的连段数就超出一般人想象。对于近战玩家的体验设计不够到位,少掉了魂系以往回合制打法能够打的有来有回的乐趣。

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第37张

喜欢我的薪王13连吗

如何优化呢?

我给出我一点想法

  1. 可以通过计时器的CD冷却功能来给快慢刀设计一个CD冷却时长,目前法环的AI是完全拥有这个功能,在派生出一次快慢刀后设置一下这一招的CD,让恶兆短时间内无法再次使用。事件可以设置为10s,20s.,至少可以让近战玩家不会连续被反直觉的快慢刀频繁的被恶心到

  2. 给多攻击判定的派生技能设置一定留空的概率。目前大风车是百分百接在3010动画后六米距离内的,那我利用一个RandomInt,来设置40%的概率留空,让他什么都不做。进入下一轮技能筛选阶段。这样可以控制恶兆的攻击欲望同时也降低近战玩家的压力

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第38张

3034大风车

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第39张

3010

3.在面对Shoot以及useItem类指令时,在8米-15米间的距离时,恶兆可以留40%的概率让二阶段的恶兆用锤子追击来快速拉近与远程玩家的距离来增加压迫感以及降低他们的容错率,平衡一下近战和远程玩家的体验。

【法环解包分析】恶兆妖鬼AI逻辑剖析【派生技能设计篇】-第40张

3027动作编号

本篇的内容差不多到此为止,其余模块的内容下篇我会继续更新

点赞超过一千的话,我会找其他的热门BOSS继续分析他们的AI

最后也欢迎各位褪色者们前来讨论研究


© 2022 3楼猫 下载APP 站点地图 广告合作:asmrly666@gmail.com