破墙袭击路径生成机制
破墙路径在生成袭击时即决定好。
一、 起点
破墙袭击的出现方式一定是从地图边缘步入。而这种方式只会选择地图最边缘一圈上没有屋顶的地方作为入口。

二、 终点
终点必须可破墙抵达。
在所有非免费的、有主的床中随机选择一个作为终点,其中囚犯的床、婴儿床、动物的床也算,医疗用途的床不算,死眠棺材也算,不过只是绑定但不指定主人的不算。
如果都没有则随机选择一个非免费、不被敌方无视、不是战斗设施、可拆卸的殖民者建筑作为终点。
如果都没有则随机选择一个殖民者的位置作为终点。
如果都没有则随机选择一个位置作为终点。
(不过破墙袭击并不会破坏终点的建筑,抵达后只会在所有床之间来回动)

三、 连接为路径
基于通用的路径机制生成,这里只讲一部分。(AI.PathFinder.FindPath)
大体上是从起点开始,每步向八个方向试探,优先选择路径成本最少的,最后连到终点。不过不同AI有些不同算法,破墙袭击AI会有些随机性。
① 每格基础成本13,斜向时则为18
② 不可通过墙体每格成本加10+耐久度*0.01,如果是自然岩体就再加20
(对于蹒跚怪来说,每格墙体为固定75,无法破坏殖民者建筑以外的墙体)
③ 如果格中有东西或地形,额外增加它的通过成本,水地形额外加18
(不会因连着的建筑而无视成本)
④ 对于聪明袭击,格中每被一个炮塔的威胁范围覆盖,成本增加360,最多增加2040,格中如果有陷阱,成本增加800。
(炮塔的威胁范围比显示的大四格半径。非聪明袭击无视炮塔威胁范围和陷阱)
⑤ 每次破墙袭击会生成一些随机斑驳的地块,地块中的格子会增加30路径成本
⑥ 对于破墙袭击,每格都要统计与前进到此格的方向垂直的两侧两格,按照第②条统计这两格的总和,但也将可通过的可破坏建筑算上,成本加上此总和。
(路径直径5时为两侧4个格子)
⑦ 迷雾内的房间内如果有虫巢、远古低温休眠舱或未揭示的单位,统计第⑥条时房间内每格都会额外增加600


四、 破墙路径的属性
(破墙路径在开发者选项Draw Breaching Grid打开后可以看到)
破墙单位正常只能在破墙路径以及额外范围上行走,其他单位跟随破墙单位。(破墙单位死后选择其他单位成为破墙单位)
破墙路径的直径当袭击人数达到60及以上时,为5格,否则为3格。
破墙路径的额外范围在路径两边向外扩展,当袭击人数达到45及以上时,扩展4格,15及以上为3格,否则为2格。

五、 破哪些墙
① 仅破坏在路径上有耐久度的非免费建筑
② 仅破坏墙体(墙体是指不可通过的建筑,但包括敞开的门)
③ 不会破坏机械族的建筑
④ 不会破坏不允许破坏的建筑(比如血肉墙)
⑤ 无法破坏四周都是墙体的建筑(例如营养膏合成机,建筑中心附近都是建筑本身的墙体)
⑥ 仅破坏”值得破坏的墙”
优先选择靠前的、旁边是可直接抵达的格最多的墙体。图中标了蓝圆的墙就是当前要拆的墙,标最大的就是最先拆的。

六、 值得破坏的墙
(所有标蓝的墙就是值得的,标红的就是不值得的)
① 门无论开着关着都一定值得破坏
② 对于在路径边缘上的墙体,分别向每个面向路径内的方向,一个个地数"直径+1"个格:先从此墙起,记数连着的墙体格子,遇到非墙体格子后记数连着的非墙体格子
如果非墙体格数≥2(直径5时为3),则墙不值破坏。只要有一个方向满足条件就不值破坏,否则值得破坏。
③对于不在路径边缘的墙体,如果它八邻格上都没有墙体,则不值得破坏,否则值得破坏。
⑧ 非墙体不值得破坏
(对于不止一格的建筑,应以中心作为起点)
以下分别为②与③规则的示意图,其中√代表不值得破坏,×代表值得破坏


七、 瘫痪AI
已经广为人知的两种方法:
① 预判破墙路径,临时造墙遮住要被拆的墙
② 墙被拆干净后,迅速堵上
还有几种方法,不过对基地要求都很:
③ 基地里全部用免费的睡眠点,并用足够多的栅栏覆盖基地,在地图最远离基地的角落造一个至少5*6的小屋子,里面放一个床然后指定主人。
④ 针对远程破墙,可以通过特殊布局让可以看见目标的地方铺上障碍物,造成无法开炮。不过这个方法要求方型基地且床在正中间,基地离地图边缘越近就要越多栅栏。
以上①②④方法会使破墙袭击移动到地图最左下角,③方法则是在床附近徘徊。

八、破墙路径生成代码
BlocksBreaching、DebugDrawBreachingGrid、CreateBreachPath、JobGiver_AIBreaching、FindBuildingToBreach
蹒跚怪攻城:JobGiver_ShamblerFight