Fighter Factory简称FF,是目前制作Mugen人物及其他资源最好用的工具

trigger和ai开关

从本章开始,教程由net教授提供,本网站会为排版做些内容调整,该教程内容会与口水轩的初级ai教程有一部分重复。


先说一句,制作ai不是那么容易的,必须十分熟悉角色的各种性能,连段,立回,防御,压制都得考虑,是很耗时间的,

特别是要花大量时间作测试。万一出错还得debug……

即使如此你还是要做ai?那么……覚悟しろ!(师匠音)

本人才疏学浅,只是对mugenai方面有点了解,所以有错误欢迎各位高手指出。

 

注意事项

1 ai时数学,标点符号请用英文半角,否则系统不认

2 永远记得改ai前把文件备份一次。否则后果自负……最好写到某个阶段就备份下,免得以后改出问题

3 未经过原人物作者同意,或原ai作者同意。

不得公开发布私自制作或改造的ai(主要就是别去mc新闻区这种公共场所发布)。 私底下小范围传播,自己用来做做视频没事。

4 请注意人物版本的对应。

要准备的东西

1 mugen主程序及人物。至少懂得加人物,打ai补丁之类的mugen基础知识。

2 记事本。推荐用notepad2,可以转码。

3 其他好像没啥要准备的了……

 

本文参考资料:

⑨氏主页上的ai相关资料

平成氏ai说明书

trigger表和script表,文档翻译版下载

其他……

 

Episode 0 triggertype

最好看一下这2个表,尤其是trigger表,熟悉一下trigger(触发器)是啥东西。不看也无所谓……就在下面的教程中慢慢熟悉也可。

type表也有种说法是script表。

2个表在\winmugen\docs里有。trigger.htmlsctrls.html就是,不过是英文版

简单的说trigger就是“当发生啥情况的时候”,type就是“做什么”,trigger是条件,type是结果。

一般在ai里用得最多的typechangestate,其次是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。而trigger1trigger2两者之间是或的关系。但2trigger2之间是和的关系,2者都得满足,才算是真正满足trigger2。如果有3trigger2,那3个的条件都得满足,依此类推。 只要满足triggerall,再满足trigger1trigger2两者之一,就能执行type所定义的事情(这里是加气)。

注意:写的时候trigger1后面别直接跟trigger3,别跳号,会出问题的……

所以这个state的解读就是,当比赛进行中的前提下,在做state号为500的聚气动作的时候,或者血量小于300var(30)=2的时候,就加5气。

由于mugen是每帧判断一次trigger,通常在60FPS1秒有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设计的指令,以下就是某体术青子的aicmd

; 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

这些指令应该能看懂吧,以防万一再说以下,UUP(上),Fforward(前),Bback(后),Ddown(下)

小写的a,b,c,x,y,z就表示6个拳脚之类的攻击键,sstart键,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,显然这是人办不到的,以下19ai指令都必须在0F内输入,都是人类完成不了的事。

所以当人操作的时候,是不会成功按出这19ai指令的,永远都不可能发出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" ;当以上19ai指令中有一个被发动时

;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发动那19ai指令之一,但mugen自带的ai又不聪明,它是随机发动指令的,要正好发动到那19ai指令(而不是正常指令)需要一定时间,所以就会出现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教授撰写

你,确定要这么做吗?
正在处理中...