1.5研究了远程敌人AI,之前看制作组那意思1.5应该是不改了,不过姑且还是放在这贴里
总结:
1.AI选取目标时,优先选目前有视线的目标,优先选旧、成年、非倒地、误伤敌方容易友方不易、想打自己、近的目标,机械族无视误伤
2.站原地且看得到目标时,脚下无障碍物且有掩体就会开枪,或者距离目标5格以内也会开枪
(另外不仅路障,像圣诞树、献祭旗、文化木雕和基因库等是0%掩体效果的障碍物,不过这些也算是家具)
3.人类选取射击位置避免接近5格内和火,优先掩体、回避炮塔密集火力区、避免更长移动、接近0.8倍射程距离
机械族和虫族无视炮塔火力区,机械族反而会回避掩体邻格,并且很倾向于选择原地开枪
常规远程敌人AI:
一.选取目标:
1.筛出所有有效的敌意事物作为可能目标。(通常不会算非作战人员、无威胁对象、武器不对口的目标等,可通过通过开发者模式的Write Attack Targets查看)
2.判断56格内有无可直接射得到的目标,若有则对这些目标评分,按最终分数为权重随机选一个作为最终目标。
①基础60分,减去自己与目标之间的直线距离,最多减40

②如果目标瞄准自己(后摇中也算),加10分
③如果自己在5秒内攻击过目标,加40分
④减去面对目标的掩体百分比*10 (比如20%掩体-2分)
⑤目标如果是非作战人员(60秒内未拿武器的幼年或动物)减50分,如果是作战幼年则是只减25分
⑥目标如果倒地减50分

⑦自己的武器是帝王业火炮,对远程武器目标加50分
⑧统计与目标之间弹道和目标邻格上所有可能的拦截事物,加分=(事物属性*拦截概率中的距离倍率*敌意属性)的总和
其中事物属性在拦截事物为单位时为18,动物7,非单位(如炮塔)10
敌意属性在拦截事物为敌对时为0.6,友方则是-1
机械族不会统计这个因素
(部分AOE类武器则是另一套算法,根据目标附近单位来算,具体就懒得写了)

⑨如果目标是虫巢,分数乘以0.4
(以上分数结果可以通过开发者模式的Darw Attack Target Scores查看实际情况)
⑩所有目标的分数低于1时,直接选择最高分作为最终目标
⑪只筛选出分数在[最高分-30,最高分]范围内的目标,并将目标的分数在此范围内对0~100%的插值作为最终分数。
3.在第二步的判断中,若没有则直接选择一个最近的作为最终目标。
二、判断是否站在原地开枪
满足以下其中一条即必会原地开枪
1.原地可射击目标,且面对目标存在有效掩体,且脚下无障碍物,且未有队友预定此位置
(有障碍物指小人征召后无法直接右键走上去的情况)
2.原地可射击目标,且距离目标在5格直线距离内
3.选取射击位置时选取到原地,见后文

三、选取射击位置
1.首先判定原地的分数,不低于1则直接选取原地
2.选取范围为以目标为中心、半边长为自己射程的正方形,边长最大为57
3.在自己与目标的连线上,在目标处做垂线,将选取范围以垂线分为两半,先对自己这一侧的所有格进行选取,如果最高分数低于0.33则再对另一侧选取。
(站在目标横方向上有BUG,仅对选取范围内的所有格进行一次选取)

4.对每格进行评分,选取分数最高的格作为射击位置
(分数可以通过开发者模式的Darw Cast Position Search查看实际值)
①无法射击目标、有障碍物、无法抵达、有队友预定、地面有火或"对自己的防守位置超出射程"的格子的评分无效
②基础分0.3
③自己射程大于5格时,加上(0.55*面对目标的掩体百分比)分
(仅指袭击进攻情况)
④机械族统计8邻格的掩体效果的总和,加(8 - 掩体效果总和)分
⑤分数乘以0.967的x次方,x=自己与格之间直线距离,"自己与目标距离"超过100格时,x还需减去超出的距离,x最低0
⑥分数乘以理想距离因素,=1-0.3*格与目标直线距离和理想射击距离的远离程度
理想射击距离为射程的0.8倍处
远离程度=两个距离的平方差/理想距离平方
⑦如果"格与目标直线距离"低于5格,分数减半
⑧如果自己不是机械族或虫族,分数乘以炮塔因素,= (37.5 - 格被炮塔射程覆盖的炮塔数量)/37.5,因素最低取0.1
5.如果所有格都评分无效,那么选取原地
(JobGiver_AIFightEnemy.TryGiveJob、JobGiver_AIFightEnemy.UpdateEnemyTarget、GetShootingTargetScore、TryFindCastPosition)
③附图

④附图

⑤~⑦附图:

⑧附图:
