为尊重作者的劳动成果,请认真阅读作者声明,切勿将资源私自修改并发布公开

防御

虽说进入防御状态时,就脱离立回的状态了。
但是防御的确是格斗里最重要的一种动作。
当攻击无法打到对手,或者攻击处于不利的局面的时候,就是该防御的时候了。

这里先说点基本的。
一般的防御代码是这样的。

;---------------------------------------------------------------------------
[State -3,蹲防]
type = ChangeState
value = 131                ;蹲防的stateno
triggerall = var(59) && statetype !=A         ;ai开启且自身不在空中
triggerall = p2statetype = C 
triggerall = ctrl && p2statetype !=A          ;这里加一个对手不在空中保险起见。
trigger1 = inguarddist              ;inguarddist下面再详细解释
trigger2 = p2bodydist x < 0 && p2movetype = A       ;当对手在你背后时不算在inguarddist内
;---------------------------------------------------------------------------
[State -3,立防]
type = ChangeState
value = 130                ;站防stateno
triggerall = var(59) && statetype !=A
triggerall = p2statetype != C
triggerall = ctrl
trigger1 = inguarddist
trigger2 = p2bodydist x < 0 && p2movetype = A
;---------------------------------------------------------------------------
[State -3,空防]
type = ChangeState
value = 132         ;空防stateno
triggerall = var(59)
triggerall = statetype = A                  ;自身在空中
trigger1 = inguarddist
trigger2 = p2bodydist x < 0 && p2movetype = A
;---------------------------------------------------------------------------

INGUARDDIST

什么叫inguarddist?字面意思是在防御距离以内。
那防御距离如何定义?

具体来说,当敌人的攻击接近你到一定距离以内,此时你按后,不再是后退,而是做防御动作,这个距离以内就叫做防御距离。此时也就是inguarddist。
对手不攻击或攻击离你太远,自然就!inguarddist。注意并不是说打得到你才是inguarddist,得看是不是在某个距离以内。
这个要看对手攻击的attackdist的定义。没有的话就用默认的值(好像是普通攻击160,道具90)
如果有一招把attackdist定义为0,那这招就算不是投技也没法防御。
其实实际运用时,你根本不需要知道inguarddist的定义,但这里解释下清楚一点。


防御和进攻的平衡

众所周知,防御的时候是不能进攻的,但不进攻就不能赢。
进攻的时候是无法防御的(除非你防御代码不加ctrl,这样是作弊),进攻必定出现破绽。
这就是防御与进攻平衡的难题。

给大家2个建议

1 强烈推荐除了可以用来凹的招以外,所有其他招都加上triggerall = !inguarddist。这样在对手先出手的情况下不会贸然进攻。

2 有特殊防御系统的(比如精防,弹刀),但进攻不是很强的可以适当限制下进攻。
如对手0.5秒内不攻击,才先出手。不过别太ws,比如等个10s再出招。这样会打得很难看。


蹲防和站防
在地面时,一般是对手蹲下时或对手的攻击属性为C时选择蹲防,其他的时候选择站防。
一般在空中不太会打出下段(这种情况也有,但极少,比如efz的狐狸的2424系列的空中扫射),
蹲下时一般不可能打出中段。


要注意中段才是蹲防不能,上段是蹲防和站防皆可,这是格斗基本知识,很多人搞错

但站立时既能打出下段的攻击,又能打出中段的攻击,经常见到ai被这种攻击打中。


原因就是对手站立时出招的属性难以判断。
这种时候可能需要用ai记忆攻击来做对策,我对这方面也不太清楚。

偷懒的话,可以尝试用蹲防完全代替站防,因为蹲防可以防下大部分的地面攻击,


对手在地面只能用中段技来打蹲防。
但中段技通常发生很慢,通常有足够空隙让你凹,甚至直接轻拳插掉。
话说回来,正因为如此,所以推荐让ai在有道具掩护等有利情况下再用中段技崩对手的蹲防。
所以对于完美的ai来说并不推荐这样偷懒的方法。。。

 


另外还有一个大问题,上面写的蹲防,站防代码只适用于第1次攻击。
对于之后ai在连携压制中的站蹲转换,系统是随机切换站蹲防的。。。
所以要改common1.cns。一般就是前面所说的winmugen\data下的那个系统默认的common1.cns
(不一定所有人物都用这个文件,看def里定义的stcommon)

如果是要改那个系统默认的common1.cns,请复制到此人物自己的目录里再改,最好再新建个文件夹(比如ai)
def里改一下stcommon = ai/common1.cns
因为这个common1是公用的,你改了这个会影响到所有人物。

我们一般要改的是common1.cns里的120-155这段的state
先看120,首先找到

[statedef 120]

 
看到这2段没有?
[State 120, Hi to Lo]
type = StateTypeSet
trigger1 = statetype = S && command = "holddown"
statetype = C
physics = C

 
[State 120, Lo to Hi]
type = StateTypeSet
trigger1 = statetype = C && command != "holddown"
statetype = S
physics = S

这就是人操作时的站蹲防切换指令。


我们把这2段改一下。


[state 120,Hi to Lo]
type = StateTypeSet
triggerall = statetype = S
trigger1 = var(59) = 0
trigger1 = command = "holddown"
trigger2 = var(59) > 0 
trigger2 = p2statetype = C || (p2statetype = S && random >= 500)  ;对手蹲下时蹲防,对手站立时,50%概率蹲防。
statetype = C
physics = C

 
[state 120,Lo to Hi]
type = StateTypeSet
triggerall = statetype = C 
trigger1 = var(59) = 0
trigger1 = command != "holddown"
trigger2 = var(59) > 0 
trigger2 = p2statetype = A || (p2statetype = S && random < 500)  ;对手空中时立防,对手站立时,50%概率立防。
statetype = S
physics = S

 

然后再把
[State 120, Stop Guarding]
type = ChangeState
trigger1 = command != "holdback"
trigger2 = !inguarddist
value = 140

trigger1下面再加一行trigger1 = var(59) = 0
下面130-132的stop guarding也一样修改。就不多说了。


接着看state 130和131
[State 130, Hi to Lo]
type = ChangeState
trigger1 = command = "holddown"
value = 131


这里改成
[State 130, Hi to Lo]
type = ChangeState
trigger1 = var(59) = 0
trigger1 = command = "holddown"
trigger2 = var(59) > 0 
trigger2 = p2statetype = C || (p2statetype = S && random >= 500)
value = 131

 
[State 131, Lo to Hi]
type = ChangeState
trigger1 = command != "holddown"
value = 130
改成
[State 131, Lo to Hi]
type = ChangeState
trigger1 = var(59) = 0
trigger1 = command != "holddown"
trigger2 = var(59) > 0 
trigger2 = p2statetype = A || (p2statetype = S && random < 500)
value = 130

 
下面的state 140-142,state 150-153的
hi to lo和lo to hi的改法和120的基本一致,就不说了,注意state号别写错就行。

最后就是改state 150-155了

 
[State 150, 2]
type = ChangeState
trigger1 = HitShakeOver
value = 151 + 2*(command = "holddown")

这里改成
[State 150, 2]
type = ChangeState
trigger1 = HitShakeOver
value = 151 + 2*ifelse(var(59) = 0,(command = "holddown"),(p2statetype = C || (p2statetype = S && random >=500)))

 

[State 152, 3]
type = ChangeState
trigger1 = HitShakeOver
value = 151 + 2*(command = "holddown")
这里也一样改掉

这样,防御中对敌人的中下段切换就会做出应对了。


以上教程由net教授撰写

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