sff文件体积过大的人物包在1.1下运行时可能会报错

def,cmd和cns

(一) ai写在什么地方?

最常见的有2种情况
1 写在cmd里,使用state -1
2 写在cns里,使用state -3

一般state -2的cns是定义声音,效果,修正和各种辅助变量(各种var和fvar)用的。
虽然也有少数人会把ai写在state -2里,但一般不这么做。
而0以上的state是定义招式性质用的。

新手的话推荐先写在cmd里,用state -1,因为可以方便查找state号。另外不容易出错。
要写在cns里也行,用state -3。写在cns里有个好处就是不必和人用的指令混在一起,不会影响其他文件。老手推荐写在-3里面。

1 如果决定写在cmd里面,就直接在下面接着写就可以了。
2 如果决定写在cns里面
如果有现成的含state -3的cns,就接着写在下面即可。
如果没有就新建个-3.cns或ai.cns(名字随便你改)
然后首先加入下面一行
[Statedef -3]  ;定义state -3,如果没有cns定义过state -3则一定要定义,有其他cns定义过state -3就不要写
然后在下面写ai

最后别忘记def文件要加入你新建的那个cns

举个例子
[Files]
Cmd      = Meirin.cmd
Cns          = Meirin.cns
St           = Meirin.cns
St0          = Meirin_Special.Cns
St1          = Meirin_Spell.Cns
St2          = Helper.Cns
St3          = -2.cns
St4          = -3.cns    ;这个就是你新加的cns,加个st的定义就可以,注意和trigger一样别跳号。
StCommon     = Meirin_Common.cns
Sprite       = Meirin.Sff
Anim         = Meirin.Air
Sound        = Meirin.Snd
Pal1         = Meirin1.Act
Pal2         = Meirin2.Act

ai绿色化
有时我们想在写ai的同时,保持原有文件,可以有以下2种做法。
先把def复制一下,改一个文件名(比如meirin ai.def)。
记得在select.def里指定这个def载入人物


把要改的文件复制后改名,比如要改meirin.cmd,我们可以复制个复件,然后把复件改名为meirin ai.cmd
再进入meirin ai.def里就改一下相关的cmd文件名。
[Files]
Cmd      = Meirin ai.cmd

这样原有的def,cmd就全保留着。要用ai启动时载入meirin ai.def就行了。cns啥的也一样
不过有些人物不支持这种方法。可以试试下面的

B

在要改的人物的目录底下新建一个文件夹,比如ai
然后把要改的文件复制进去,再改就行。
def里就这么改
[Files]
Cmd      = ai/Meirin.cmd ;注意是正斜杠

个人推荐用方法B


PS:注意def的info里
name不可以改,displayname可以改。


(二)AI开关的书写

首先我们先做一个ai开关(改别人的ai的话,ai开关肯定已经做好了,你只要找到就可以了)

第1部分的ai指令,这个必须写在cmd里面。

然后是第2部分。
假设是从零开始写ai的话,
如果要写在cmd里,就写在cmd最下面。如果要写在cns里,就直接写在[Statedef -3]下面

举个例子,首先在cmd里写ai开关第一部分。这里为了举例方便,只写了5个ai指令,实际上最好多写点,这样会灵敏点(发呆时间少点,cmd一共支持128个指令,蛋疼的话全部用上也无所谓,不过一般50-60个足够了)
指令稍微写复杂点,time最好都写0,免得人操作的时候误触发

; 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

然后在如果cmd里写,就在文件底部写一个state(改ai的话直接查找"ai_01"就能看到ai开关了)

[State -1, AI] ;逗号后面的内容可以当注释随便改,方便你自己记忆就行。记得别漏了另一半方括号
Type = VarSet 
TriggerAll = Var(59) = 0 && RoundState != 3
Trigger1   = command = "AI_01"
Trigger2   = command = "AI_02"
Trigger3   = command = "AI_03"
Trigger4   = command = "AI_04"
Trigger5   = command = "AI_05"
;trigger6 = 1 
V = 59
Value = 1 
IgnoreHitPause = 1

如果是在-3.cns里写,就把state -1改成state -3,其他不必改,写在[Statedef -3]下面即可

偷懒的话,直接复制前面教程里的ai开关也可以。。。。
然后再把具体的ai写在ai开关的下面

(三)人用指令和ai的区别

不多说,直接看例子。要注意到因为我们已经写好了ai开关,var(59)这个变量就在这里起到了作用。
state号就是动作的代号

这是cmd里的人用指令的定义
;立a
[State -1]
Type = ChangeState ;转换动作(可以理解为做动作)
Value = 200
TriggerAll = Var(59) = 0  ;ai没有开启
TriggerAll = Command = "a"  ;输入了"a"
TriggerAll = Command != "holddown" ;没有按着“下”
TriggerAll = StateType != A ;不在空中
Trigger1 = Ctrl ;可以自由行动的状态

解读下就是在ai没开启的状态下,输入了a,没有按着下,不在空中,可以自由行动的状态下,出立a(做出立a的动作)。


这是ai
;立a
[State -3]
Type = ChangeState
Value = 200
TriggerAll = Var(59) > 0   ;ai开启
TriggerAll = StateType != A
Trigger1 = Ctrl 

这个应该能自己解读了吧。。。

看出来ai和人用指令的最大区别在哪里了么?
首先是var(59)的值
第2就是ai出招不用输入指令。

所以我们要把人用指令转换为ai指令

首先triggerall里面除了var(59)和command,其他条件一定要完全复制,这样才能保证ai不会做出系统所不允许的动作。否则ai就可能做出不满气都能出超杀,或者还没到条件就直接用死星技,在空中出地面技等作弊行为。
这也意味着,我们最好把这些系统所限制的条件都写到triggerall里面。而不是写在trigger1,2里面。

然后var(59) = 0改为var(59) > 0。
没有关于var(59)的triggeall就加上var(59) > 0(所有人用指令最好也加上var(59)=0,以免mugen自带的ai捣乱)

最后把command的部分删除。

至于trigger1,2的ai具体怎么写,下一章再详细讲。


以上教程由net教授撰写

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