从本章开始,教程由net教授提供,本网站会为排版做些内容调整,该教程内容会与口水轩的初级ai教程有一部分重复。
先说一句,制作ai不是那么容易的,必须十分熟悉角色的各种性能,连段,立回,防御,压制都得考虑,是很耗时间的,
特别是要花大量时间作测试。万一出错还得debug……
即使如此你还是要做ai?那么……覚悟しろ!(师匠音)
本人才疏学浅,只是对mugen就ai方面有点了解,所以有错误欢迎各位高手指出。
注意事项
1 写ai时数学,标点符号请用英文半角,否则系统不认
2 永远记得改ai前把文件备份一次。否则后果自负……最好写到某个阶段就备份下,免得以后改出问题
3 未经过原人物作者同意,或原ai作者同意。
不得公开发布私自制作或改造的ai(主要就是别去mc新闻区这种公共场所发布)。 私底下小范围传播,自己用来做做视频没事。
4 请注意人物版本的对应。
要准备的东西
1 mugen主程序及人物。至少懂得加人物,打ai补丁之类的mugen基础知识。
2 记事本。推荐用notepad2,可以转码。
3 其他好像没啥要准备的了……
本文参考资料:
⑨氏主页上的ai相关资料
平成氏ai说明书
trigger表和script表,文档翻译版下载
其他……
Episode 0 trigger和type
最好看一下这2个表,尤其是trigger表,熟悉一下trigger(触发器)是啥东西。不看也无所谓……就在下面的教程中慢慢熟悉也可。
type表也有种说法是script表。
这2个表在\winmugen\docs里有。trigger.html和sctrls.html就是,不过是英文版
简单的说trigger就是“当发生啥情况的时候”,type就是“做什么”,trigger是条件,type是结果。
一般在ai里用得最多的type是changestate,其次是varset,其他的用的不多。
举个简单的例子
[state -1]
type = poweradd ;加气
triggerall = roundstate = 2 ;比赛必须在进行的时候(不是刚开始或者已经分出胜负的时候)
trigger1 = stateno = 500 ;处于state号为500的动作时(假设是聚气动作) trigger2 = life<=300 ;血小于300时
trigger2 = var(30) = 2 ;当某个变量var(30)为2的时候
value = 5 ;加气的值为5
其中triggerall是最主要的条件,满足后接下来才判断是否能满足trigger1或者trigger2。而trigger1和trigger2两者之间是或的关系。但2个trigger2之间是和的关系,2者都得满足,才算是真正满足trigger2。如果有3个trigger2,那3个的条件都得满足,依此类推。 只要满足triggerall,再满足trigger1或trigger2两者之一,就能执行type所定义的事情(这里是加气)。
注意:写的时候trigger1后面别直接跟trigger3,别跳号,会出问题的……
所以这个state的解读就是,当比赛进行中的前提下,在做state号为500的聚气动作的时候,或者血量小于300且var(30)=2的时候,就加5气。
由于mugen是每帧判断一次trigger,通常在60FPS下1秒有60帧,所以实际效果是在满足条件的时候,每秒钟回复300气。
PS:分号后是注释,你可以随便写点说明文字之类的话,程序不会把分号后的内容读进去的。但分号必须用英文半角(上面说过了)。
最后再介绍下常用的逻辑符号
&& 和
|| 或
! 否
比如trigger1 = (life > 500 && power<1000) || var(30)!=2
就是当血量大于500且能量小于1000,或var(30)不等于2的时候,trigger成立
另外像!var(59)这种表达,就相当于var(59)=0
Episode 1 ai开关
ai开关有什么用?是控制ai的开启和关闭的。
一个人物有被人操纵的时候,和被ai操纵的时候。
ai开关的作用,就是被人操纵的时候,不开启ai。而cpu操纵的时候,会自动判断并开启ai。所以说好的ai开关要判断出到底是人在操作,还是电脑在操纵。该开ai的时候开,不该开的时候不开。
首先要说明一点:mugen是有自带的ai的,只是这个ai是随机发招,防御而已,相当于乱按流,出招频率也不高,很纱布,但我们可以利用这个默认ai来判断是不是人在操作。
先给个ai开关的实例吧。
ai开关通常分2部分,第1部分通常在cmd里,就是为ai设计的指令,以下就是某体术青子的ai用cmd
; AI
[Command]
Name = "AI_01"
Command = a, b, c, x, y, z, s
Time = 0
[Command]
Name = "AI_02"
Command = x, y, z, a, b, c, s
Time = 0
[Command]
Name = "AI_03"
Command = z, y, x, c, b, a, s
Time = 0
[Command]
Name = "AI_04"
Command = c, b, a, z, y, x, s
Time = 0
[Command]
Name = "AI_05"
Command = a, b, c, z, y, x, s
Time = 0
[Command]
Name = "AI_06"
Command = z, y, x, a, b, c, s
Time = 0
[Command]
Name = "AI_07"
Command = x, y, z, c, b, a, s
Time = 0
[Command]
Name = "AI_08"
Command = c, b, a, x, y, z, s
Time = 0
[Command]
Name = "AI_09"
Command = a, a, a, a, a, s
Time = 0
[Command]
Name = "AI_10"
Command = b, b, b, b, b, s
Time = 0
[Command]
Name = "AI_11"
Command = c, c, c, c, c, s
Time = 0
[Command]
Name = "AI_12"
Command = x, x, x, x, x, s
Time = 0
[Command]
Name = "AI_13"
Command = y, y, y, y, y, s
Time = 0
[Command]
Name = "AI_14"
Command = z, z, z, z, z, s
Time = 0
[Command]
Name = "AI_15"
Command = s, s, s, s, s, s
Time = 0
[Command]
Name = "AI_16"
Command = U, U, U, U
Time = 0
[Command]
Name = "AI_17"
Command = D, D, D, D
Time = 0
[Command]
Name = "AI_18"
Command = F, F, F, F
Time = 0
[Command]
Name = "AI_19"
Command = B, B, B, B
Time = 0
这些指令应该能看懂吧,以防万一再说以下,U=UP(上),F=forward(前),B=back(后),D=down(下)
小写的a,b,c,x,y,z就表示6个拳脚之类的攻击键,s是start键,time就是表示必须在几F内输入指令才会成功。
至于其他符号
1.保持状态 (/) 例如:/D 意思为必须保持 "下" 这个按键不放.
当然也可以用在一组命令里,意为在按下控制键之前方向键保持按下状态,当然/后可以用控制键,不光是方向键.
注意:标记“~”用于设置按键状态为放开 例如: ~a表示这个键不用保持按下状态,可以按下后即放开.
在~前加一个数字,用于表达按下时间的长短.例如:~30a
2.动作方向 ($) 例如:$D 意为DB,DF 也在.
3.按键同时 (+) 例如:a+b+c 意为这三个键同时按下.
这些命令是可以组合的,例如: ~30$D,a+b
所以第一个“ai_0”的command的意思是
必须在0F内输入a, b, c, x, y, z, s,显然这是人办不到的,以下19个ai指令都必须在0F内输入,都是人类完成不了的事。
所以当人操作的时候,是不会成功按出这19个ai指令的,永远都不可能发出ai指令。 但是当cpu操纵的时候就不一样。mugen自带的ai虽然纱布,但是ai和人不一样,不用“输入”,便可以直接成功发出指令。
mugen自带的ai是只要是定义过的指令都会随机用。那样就会有相当概率发出ai指令。
发出ai指令的后果是怎样?当然不能没结果,我们要的结果就是当有一个人类不能完成的ai指令被发动时,就判断出这是cpu在操纵人物,
然后启动我们自己编写的ai
而这必须由ai开关的第二部分完成。看一下实例吧。
第2部分,ai的启动
[State -3, AI]
Type = VarSet ;设置变量的值
TriggerAll = Var(59) = 0 ;当var(59)=0(ai没有被开启的时候)
triggerall = RoundState = [1,2] ;当对局处于开始阶段或进行阶段的时候
Trigger1 = command = "AI_01"
Trigger2 = command = "AI_02"
Trigger3 = command = "AI_03"
Trigger4 = command = "AI_04"
Trigger5 = command = "AI_05"
Trigger6 = command = "AI_06"
Trigger7 = command = "AI_07"
Trigger8 = command = "AI_08"
Trigger9 = command = "AI_09"
Trigger10 = command = "AI_10"
Trigger11 = command = "AI_11"
Trigger12 = command = "AI_12"
Trigger13 = command = "AI_13"
Trigger14 = command = "AI_14"
Trigger15 = command = "AI_15"
Trigger16 = command = "AI_16"
Trigger17 = command = "AI_17"
Trigger18 = command = "AI_18"
Trigger19 = command = "AI_19" ;当以上19个ai指令中有一个被发动时
;trigger20 = 1 ;无条件触发,就是所谓的ai常时启动,不过此时这个trigger20被分号注释掉了,程序不会读
V = 59
Value = 1 ;这2行就是使var(59)这个变量的值为1
IgnoreHitPause = 1
这里var(59)这个变量就充当了ai的开关。
用其他var也可以,不过一般最常见的是var(59),之后的文章里假设ai开关就是var(59)。
var(59)=0的时候,ai不开启。
当mugen默认ai发动任何一个人类不可能发动的ai指令的时候,设置var(59)=1,此时对应此人物的专门的ai就开启了。
简而言之
ai开关的作用机制就是
检测到人在操作的时候-关闭ai
检测到mugen自带ai操作的时候-开启专门的ai
顺便说下
Trigger1 = command = "AI_01" 和
Trigger1 = command = "AI_01" = 1
是一回事,"= 1"可以省略。
当然"= 2"是不能省略的
ai的常时启动
注意下trigger20,如果把前面的分号去掉的话,程序就会读这一行trigger20 = 1,此时ai就会常时启动,这时你进训练模式,那ai也会自动启动,夺取你的控制权。
当然你要自己玩时,不可以让ai常时启动,但如果录ai比赛的视频时,推荐采取ai常时启动的方式。
为什么?因为前面说过,如果没有设置常时启动ai,要让自己编写的ai启动,得先让mugen自带的ai发动那19条ai指令之一,但mugen自带的ai又不聪明,它是随机发动指令的,要正好发动到那19条ai指令(而不是正常指令)需要一定时间,所以就会出现ai发呆的情况。
另外有些人物即使在ai已经启动的时候(var(59)=1时),某些情况下会不明原因自动关掉ai(使var(59)=0),这时ai又要花时间重新通过发动ai指令启动ai,在这段ai空白期内就会发生乱动或发呆的现象(mugen自带ai很纱布嘛)。所以有些人物ai常时启动与否可谓大不一样,比如GG的囧尼之类。
小技巧
通常ai开关也掌管ai等级。如果要在一片state里迅速找到控制ai等级的var,最好的方法就是搜索cmd里定义的ai指令的名字(比如"AI_15")。
往下拉就能看到了
以上教程由net教授撰写