正在加载

星球基地AI代码解析全角色执行任务优先级汇总

时间:2020-10-05 来源:未知 作者:佚名

星球基地 AI代码解析角色执行任务优先级汇总

首先,请允许我向大家隆重介绍下面这一段代码,就是它葬送了无数大好局势和无数贱民的生命!

星球基地AI代码解析全角色执行任务优先级汇总 1

它就是整个AI算法的核心:当你的角色状态处于空闲时,自动进入相应的任务优先级列表的判定,简单点来说就是一个触发机制,并且一但这个机制被触发,这个角色就会进入相应的任务状态,不会被打断,不!会!被!打!断!

首先,我将要向大家介绍的是一个物种:保安

有人肯定要问,为什么说是个物种?因为游戏角色的AI类型划分是这样的:

搬运机器人

建筑机器人

挖矿机器人

保安

人类(其它殖民者)

入侵者

游客

所以说,这个故事告诉我们千万不要把保安当做正常的人类来看。

以下便是保安这个物种的优先级:

星球基地AI代码解析全角色执行任务优先级汇总 2

所有的优先级依次是:

拿武器后消灭入侵者

生存需求

去看有优先级的监控

去看监控

去喝饮料

去放松(锻炼)

回到室内建筑

在室内看风景

你木有看错,对于所有的保安(其实包括人类),消灭入侵者比满足生存需求的优先级更高。满足survivalrule这是一个子项,里面包含的是各种属性低了就去补的触发机制,具体结构可以参考我在楼顶介绍的那个逻辑算法。

早上看见一位小伙伴的悲惨遭遇,保安到死都在看监控没去反击入侵者。所以,现在你明白了么?

没错,我去打入侵者的优先级是比看监控(Go Operate)要高,但问题是我已经在看监控了呀,你在我看完监控之前休想让我进入这个空闲判定机制。

耿直的保安,卒。

接下来便是贱民们的优先级列表,制作组总算是展现了点诚意,先不说合不合理,至少是非常用心的:

星球基地AI代码解析全角色执行任务优先级汇总 3

首先说明,制作组把所有职业的任务混在了一起,请自行对应相应职业。贱民的任务优先级从高到低分别是:

拿武器攻击入侵者(这里指的不是保安,保安不算人类!)

攻击完入侵者后扔掉武器

去修被陨石砸的室内建筑(这个我看了下代码,没有室外也是醉)

生存需求(吃饭 ,睡觉 ,blablabla)

去维持紧急的食物需求,造食物(生物学家专属技能)

去搬交易需要的货物到飞船

去建造

去休闲(注意,这里限制了是当状态非常不开心的时候)

去拿零件之后维修

去拿医疗包救人

去高优先级的矿场挖矿

去制作各种东西

去拿建筑材料之后运送建筑材料(知道为什么要多造机器人了吧,工人如果有矿挖优先级绝不搬这些 )

去找那些制作台所需的资源然后存放到制作台

去找喝的

去休闲(当状态有点不开心的时候)

去挖矿(无优先级,事实证明如果么有优先级人类非常不想去挖矿)

去搬东西到仓库

进到室内

让路(给其它优先级高的角色)

在室内闲逛接下来就是星际海盗们的世界观了:

星球基地AI代码解析全角色执行任务优先级汇总 4

排序从高到低:

攻击殖民者(理所当然)

进入室内

在室内闲逛

没了。

有人可能会说,怎么这么简单?还有,你要去攻击殖民者不就包含进入室内了么,怎么下面还有个进入室内?由于入侵者这个项比较少,我决定展开来解释嵌套关系,来让大家更好的理解这套AI逻辑的运行方法 。

首先让我们进入第一个优先级的函数:去攻击殖民者,让我们去看一下它是怎样被定义的:

星球基地AI代码解析全角色执行任务优先级汇总 5

第一个if的地方判定的是角色的身份,我就不再一一赘述statusflag12代表的内容了。然后这个函数会去寻找离强盗们最近的站着的角色。

让我们再来到findneareststanding函数被定义的地方:

这里就很明了了,该函数会枚举所有你的殖民者们,并且如果它们当前状态不是死亡,或者被打倒的状态时,函数会计算一个限制距离内所有殖民者中离你最近的一个,并把结果返回上一级。

让我们回到这里:

星球基地AI代码解析全角色执行任务优先级汇总 6

现在,我们得到了findnearsetstanding函数传回的离你最近并且可用的殖民者了,我们的下一个目标便是要接近她,这个目标则由goTarget实现。

我们来详细看一看gotarget:

我们真正输入的参数其实是当前处理的这个强盗和这个强盗将要选定目标的被害人,而这个函数的作用就是使强盗走向被害人,而其中就包含了goToBestAirlock(走向选定的最佳气闸)。至于这个函数是如何定义的就不再解释,太过复杂,也考虑到了其它正在执行的任务对流量造成的影响。

星球基地AI代码解析全角色执行任务优先级汇总 7

至此,强盗开始了自己入侵的过程,补充下前面setradius参数指的是当强盗离目标8个单位时,强盗会开始开火。

而我们看到,如果在findneareststanding(查找最近的目标)函数阶段,所有的目标都在范围之外,那么这个函数将会返回一个空值,下面一阶段的if条件不会被 满足,然后整个大函数会返回一个false的值,这也就代表了在任务优先级列表中,第一个优先级的任务(攻击殖民者)的条件不满足,开始按顺序进行优先级列表中的下一个任务。

所以说了那么多,我想表达的就是,其实在攻击殖民者这个任务里包括了许许多多逻辑AI,其中就包括进入气闸这一项。至于第二个优先级任务安排进入室内的原因是,如果强盗周边在规定范围内没有符合要求的目标,那么强盗就会进入室内。

在此之后,强盗满足了处于室内的状态,优先级顺位中第二位的进入室内的条件返回也会变成false,这时候,强盗会执行第三顺位的任务:在室内随机游荡,直到在下一次判定的时候第一顺位任务的条件被触发,那么强盗就会去攻击那个被选中的倒霉蛋了。