红警AI教程[多条件触发教程]
红警AI教程
大家好,这里是up主, 半暮南城,今天我来教大家怎么制作一款整体比较好的红警AI。
大家都觉得原版的AI太过于智障了,因为原版的AI进攻方式比较单一,而且也没有整体局面的一个把控程度,最简单的就是对面放空一大堆还在出基洛夫,又或者对面巨炮阵还在出陆军进攻,最最最智障的地方就是明明知道对方是尤里还在出坦克白给送钱,关键还是一波又一波。
那么原版的AI就简单的说到这里,首先我们要制作一款全新的AI就要从几个方面考虑:
1. 灵活性
2. 适应性
3. 合理性
首先把这几样东西弄清楚,后面编写AI的时候才好下手,我们先来一一的解说一下这些方面有什么用。
首先是第一点,什么是灵活性? 兵种的搭配,偷家的操作,场面的把控都是灵活性的体现,AI的灵活程度能决定AI编写的质量。
第二点是适应性,适应性顾名思义,就是这AI能适应在哪些场合,一般优质的AI补丁作品至少要能在大中型地图中能使用即稳定发挥,不会卡兵什么的。
第三点合理性,合理性是指AI触发的作战小队人数要合理,一般一支作战小队的单位数控制在12比较合理,步兵的话控制在30左右比较合理,这样的的话可以防止AI在一些稍微小一点的地图中出现卡兵的问题,另外还有不会给玩家疯狂爆兵的感觉,刚好输出的伤害也不低。
好说完了这些,接下来就可以开始简单的介绍如何编写AI程序,在这之前呢,我希望看的观众能先去了解一下编写AI的基本教程,在这里我推荐大家去看一下” MammamiaMadman”的AI教程下篇,了解一下AI最基本的四模块: 派遣部队, 脚本, 作战小队, 触发,在这里我就默认大家都会编写AI。
文章网址: https://www.bilibili.com/read/cv2592061?spm_id_from=333.999.0.0
首先是让AI如何变得”灵活”,想让AI变得像人那么灵活是不可能的,但我们可以让它相对的提升灵活度。
提升AI灵活度的设计思路:
1. 设计flag变量来达到多条件触发的逻辑
2. 拓展更多偷家套路
好,我们开始介绍如何来制作一个多条件触发系统,在这之前,大家要知道三个指令, 5号指令和31号指令以及58号指令,首先5号指令是原地等待指令。31号指令是自爆指令,只能用在flag更新上。58号指令是移动指令,移动到己方某个建筑上(需要用到红警内部建筑编号)
尤里的复仇全建筑编号表格文件链接: https://pan.baidu.com/s/113192ucrD70HFxGtOKFDlw?pwd=QWQI
提取码:QWQI
为了能够设计出“灵活的AI”多条件触发是必不可少的,我们需要认识一下二进制。
二进制: 一种只有0和1的进制 1011B == 11,【二进制1011对应着十进制中的11,其中B为二进制的后缀】如果对二进制感兴趣的话就自己去学学,在这里我们只需要掌握1,2,4,8就够用了。
现在我们来假设一下条件:
对手有盟军基地 == 1
我方有高科技 == 2
对手有巨炮 == 4
其他条件 == 8 【因为flag标志兵太多了,一般不启用】
当flag标志兵 == 1时表示着对手为盟军并且没巨炮我方无高科
当flag 标志兵 == 3 时 表示对手为盟军并且没巨炮我方有高科
当flag标志兵 == 7 时 表示对手为盟军并且有巨炮我方有高科
当flag标志兵 == 5 时 表示对手为盟军并且有巨炮我方无高科 【危!】
使用二进制当多条件触发有一点是无可替代的也是最容易出错的地方,就无论在什么情况下都记录都不会出错,但如果是多兵营的话记录分分钟就出错,因为只能每次+1不能加多了,所以要注意AI多建造厂或多兵营的情况,这个时候这一套就很容易出错了,但利大于弊,值得用这套。
在这里我解释一下上面的标志兵是什么,标志兵是一个假单位,在规则文件里存在,0元购,无声音,最好选套皮防空兵。
下面来解说一下:
;这是盟军标记巨炮的flag标志兵,注册名为AFG (Allied flag GTGCAN)
[AFG]
Image=GGI
UIName=Name:GuardianGI
Name=Guardian GI
Category=Soldier
Primary=M60
Secondary=MissileLauncher ;GEF New Guardian GI weapon
OpenTransportWeapon=1;defaults to -1 (decide normally) What weapon should I use in a Battle Fortress
Occupier=no;yes ; I can Occupy UC buildings
Prerequisite=GTGCAN002
CrushSound=InfantrySquish
Strength=100
Pip=white
Armor=none
TechLevel=2
Sight=6
Speed=3
Owner=British,French,Germans,Americans,Alliance
AllowedToStartInMultiplayer=no
Cost=0
Soylent=150
Points=10
IsSelectableCombatant=yes
Locomotor={4A582744-9839-11d1-B709-00A024DDAFD1}
PhysicalSize=1
MovementZone=Infantry
ThreatPosed=10 ; This value MUST be 0 for all building addons
ImmuneToVeins=yes
ImmuneToPsionics=no
Bombable=yes
Deployer=yes
DeployFire=yes
; DeployTime=.022 ; PCG; Unused for now. Was maybe going to make its way in if we did
; a more explicit state machine for deploying b/c of autodeploy.
VeteranAbilities=STRONGER,FIREPOWER,ROF,SIGHT,FASTER
EliteAbilities=SELF_HEAL,STRONGER,FIREPOWER,ROF
Size=1
Crushable=yes
DeployedCrushable=no
DeploySound=GuardianGIDeploy
UndeploySound=GIUndeploy
ElitePrimary=M60E
EliteSecondary=MissileLauncherE ;GEF New Guardian GI weapon
;EliteSecondary=ParaE
IFVMode=16
PixelSelectionBracketDelta=-6;gs higher number draws lower. Pixel difference from normal for selection bracket
仔细观察代码就会发现并没有声音的代码(因为被我删了)
注册表:
; use binary, 1 friend unit 0 enemy unit
; All flag updata wen N1 != N2 time-flag
; Refresh when the flag is False you can use 0,1 command to refresh every 5,128
66=SFA ; The flag is SvsA only enemy is A, 1: active, 2:1 NATECH!=0, 4: BFRT > 4, 8: 0 GTGCAN > 2
67=SFY ; The flag is SvsY only enemy is Y, 1: active, 2:1 NATECH!=0
68=SFS ; The flag is SvsS only enemy is S, 1: active, 2:1 NATECH!=0
69=AFA ; ······, 2:1 GATECH != 0, 4: 0 BFRT > 4, 8: 0 GTGCAN > 2
70=AFS ; ······, 2:1 GATECH !=0,
71=AFY ; ······, 2:1 GATECH != 0,
72=AFAK ; 72 ~ 74Allied SKY Arm only!
73=AFSK ;
74=AFYK ;
75=SFAG
76=FT ; Soviet exclusive check tank attack !
77=SFG ; Soviet flag GTGCAN! Hard Attack
78=AFG ; Allied flag GTGCAN! Hard Attack
我们就需要创建很多这样的假单位然后组织成队伍集合自爆循环达到实时战场检测的目的,flag更新的那段时段中,AI会自动的忽略那些不满足的标志兵触发[最好是连个条件作为一组触发这样就不容易出错],随后用一些通用部队来弥补空缺,比如偷家,防守什么的。
这是AI补丁已经写好的部分,如果有兴趣的话下载好后可以研究进行第二次开发。

这样小队的通用脚本为:
[flag-nop]
Name=标志兵站位防卡
0=58,131145
1=58,131137
2=5,512
3=49,0
4=31,0
[A-k-flag]
Name=偷袭环境监测集合
0=58,196608
1=58,9
2=5,256
3=31,0
[flag-tech]
Name=flag集结
0=58,6
1=58,10
2=5,512
3=31,0
他们最大的区别就是部队集合的地点不一样.。
至于怎么编写一个完整的触发就去看一下我的补丁文件中aimd.ini文件的内容吧,在这里我只提供思路,而且那段代码太长了不适合展示,能看到这里,相信你们也一定能看得懂。
最新版AI补丁链接:https://pan.baidu.com/s/19F0JOp6fTzfClcBApEzDgA?pwd=QWQI
提取码:QWQI
简单展示一下内容。
好,有了多条件触发思路后,剩下的就是对战时的方案了,首先就是不讲武德的偷家,这个只要直接判断对手有没有要偷的目标就好了。再然后就是对战时的细节以及AI的联动,首先我们用检测好的战场条件然后让AI自己去使用对应作战方案,如果敌人打进来了那我们想想会发生什么,首先会因为标志兵会被击杀而失效,这个时候AI会自动偏重那些直接判断的触发比如防御部队,或偷家什么的,或者其他什么情况下都能用的方案。显得AI做好了放手一搏的准备了。
接下来就是AI细节处理了,建议大家直接用我的规则文件,毕竟这里我全部设置好了,无需再动手设置,我在规则文件(Rulesms.ini)里做了一些中文注释,大家去文件里看看。
首先是CloseEnough=8192
这本是接近命令,但如果被赋予了一个很大的值AI就会认为自己时时刻刻都接近了,在aimd.ini中的有Suicide=yes的小队会无视此语句并贴脸目标位置 no则受到攻击或遇到敌人时移动指令会被中断进而执行接下来的指令。
一般接5、9,0、47、0 号指令等或者与6号指令形成一个闭环。
其次是Aggressive 与 Suicide这两个属性, 决定了部队能否进行走A(非锁定式)
在CloseEnough=8192下效果会非常显著,最显著的就是AI辐射遇到敌人会蹲下来,当然是要写到脚本进行循环的。
[S-deso-nahand]
Name=辐射蹲苏军兵营
0=58,9
1=14,0
2=43,0
3=53,0
4=47,131083
5=8,2
6=9,0
7=5,32
8=47,131083
9=9,0
10=5,32
11=6,9
这个是非绝对性蹲下脚本
[S-deso-nahand]
Name=辐射蹲苏军兵营
0=58,9
1=14,0
2=43,0
3=53,0
4=47,131083
5=8,2
6=9,0
7=5,32
8=47,131083
9=9,0
10=5,32
11=6,9
这个是绝对性蹲下脚本
他们的区别就是一个5,2命令(集合并原地等待2帧)可以理解为集体集合延时。这样的话可以丝毫执行下一条指令,如果没有的话,辐射不一定会蹲下来,那个时候就是计算对手的威胁值了,大的话就会蹲,小的话就会原地罚站32帧。配合履带车,就可以实现履带车遇到敌人就立马下辐射原地蹲了,其中一定要有延迟不然刚蹲下就起来了。
本教程到此结束,感谢大家的观看,如果遇到什么不明白的不要问我,我是不会回答的,因为本AI的更新到此结束,在这里我只是把我的AI设计思路分享一下,更多的还是与其他的教程结合吧。
最后的最后补一下我与测试员之间的问答(精简过,不是自夸!):
最主观的感受: 被盟军飞机卡科技,发育不起来,慢慢的守不住了。其他的不足为惧。如果玩苏军或尤里还有戏。
灵活度: 比大多AI补丁好多了,确实是这样。
电脑进攻的猛烈程度: 能接受 1v2轻松, 1v3困难,刚刚好。
电脑整体作战方案触发合不合理: 合理,没啥不明显不对的地方,挺流畅的。
电脑在劣势的情况下白给的多不多: 电脑毕竟是电脑,期望不能和人一样,不太多。还行。
电脑有没有反复用同一个战术白给: 基本不会有。
电脑盟军给不给力: 可以,和对面一样的猛烈。
电脑基地内堵塞的情况严不严重: 中、大地图不严重,小地图没办法。
注: 电脑是作战型AI,其他型AI不计在内。