2016.03.0521:01

AI投技

Episode 5 投技

想必大家对投技都有一定的了解,投技嘛,不就是所谓的不可防,快,要么0帧指令,那我们今天就来看看投技到底有多么神奇
这里的投技指的是指令投,必杀技或者以上的抓取,带attackdist的那种

先来看一段投技的statedef,(statedef人物来源,JIN氏)

;---------------------------------------------------------------------------
; 投げ
; CNS レベル: 中級

[Statedef 800]
type = S
movetype = A
physics = S
juggle = 0
velset = 0,0
ctrl = 0
anim = 800
sprpriority = 2
facep2 = 1

[State 800, AttackDist] ;不可防御属性在这里,当value = 0时为不可防御
type = AttackDist
trigger1 = 1
value = 0

[State 800, ヒット定義(投げ用)]
type = HitDef
trigger1 = Time = 0
attr = S, NT ;攻撃属性: これは Standing, Normal Throw(立ち通常投げ)(站立通常投)
hitflag = M- ;相手がやられ状態ではない地上の時でしか掴む事が出来ません(对面被打的时候无法使hitdef生效)
priority = 1, Miss ;投げなので優先度を低く、かつmissかdodgeの属性でなければなりません(优先度为1,miss或者dodge属性不可缺少)
sparkno = -1 ;-1にすればヒットスパークが表示しなくなります(无打击火花,打击火花在p1stateno内)
p1sprpriority = 1 ;攻撃が当たった時に自分の画像表示優先度を1にします(p1的图层)
p2sprpriority = 0 ;攻撃が当たった時に相手の画像表示優先度を0にします(p2的图层)
p1facing = 1 ;攻撃が当たった時の自分の向き(攻击命中时候面向对手)
p2facing = 1 ;攻撃が当たった時の相手の向き(同上,但是是对手面向你)
p1stateno = 810 ;自分のステート変更(自己的stateno状态变更,投技用的最多)
p2stateno = 820 ;相手を制御するステートに行かせる(对手的状态变更,变为被打状态)
guard.dist = 0 ;相手がガード状態に移行出来る距離(現在は0なのでガード不可)(检测防御不可,前面有提到过)
fall = 1 ;1にすれば相手がダウン状態になる(对手变为下落状态)
numhits = 0 (不显示hitcombo)

hitflag分类:M(地面),M+(地面被打),M-(地面不被打),A(空中),F(下落),L(倒地),如果没有hitflag默认是MAF
guardflag分类:M(地面,站蹲都可以),H(站立,必须站防),L(蹲下,必须蹲防),A(空防),HL结合在一起叫M,所以HLA又叫MA,如果没有guardflag默认是不可防

[State 170, 無敵]
type = NotHitBy
trigger1 = time = 0
value = SCA,NT,ST,HT
time = 1

[State 800, ステート変更]
type = ChangeState
trigger1 = AnimTime = 0
value = 0
ctrl = 1

所以各位也看清楚了,所谓的投技不可防,其实是不可检测的防御,当然JIN氏这里没有写triggerall = p2stateno = [150,155]这种话,当然JIN氏这样写就算是对面防御了也一样被投...一般的投技大概是对面处于被打硬直的时候无法使hitdef生效,那么投技的AI,很好写,以指令投为例,指令投为0帧,那么先用一个var记录一个东西

;-----------------------------------------------------------------------------
;记录对手起身时候的防投无敌时间
;-----------------------------------------------------------------------------
[State -3, VarSet]
Type = VarSet
Trigger1 = EnemyNear,StateType = L
V = 53
Value = -1 ;(对面倒地时,为了不冲突记录,给var赋值-1)
IgnoreHitPause = 1

[State -3, VarSet]
Type = VarAdd
TriggerAll = var(53) > 0
Trigger1 = EnemyNear,StateType != L
V = 53
Value = -1 ;(随着时间减少,减到0为止)
IgnoreHitPause = 1

[State -3, VarSet]
Type = VarSet
TriggerAll = var(53) = -1
Trigger1 = EnemyNear,StateType != L
V = 53
Value = 12 ;(对面属性不是倒地属性,也就是转到了站立或者其他的属性,记录下12帧的无敌时间)
IgnoreHitPause = 1

现在来说明一下这个var的用途,对手起身一般要经过两个statedef,一个是5110,一个是5120,一个是躺下,一个是起身,从躺下到起身,type都是L,也就是倒地属性,然后5120会过渡到0,也就是站立,这就是起身的过程,但是common1的statedef 5120里面有这样一个东西

[State 5120, 5] ;Can't be thrown right after getting up
type = NotHitBy
trigger1 = AnimTime = 0
value = , NT,ST,HT
time = 12

[State 5120, 6] ;Can't be hit right after getting up (short time)
type = NotHitBy
trigger1 = AnimTime = 0
value2 = SCA
time = 3

3帧的全程无敌,12帧的防投无敌,并且两个无敌之间互相不冲突,所以为了在这个无敌时间内不出投技,所以要用var记录下这段时间,那么AI就可以这么写

[State -3, Throw]
Type = ChangeState
Value = 800
TriggerAll = var(59) = 1
TriggerAll = var(53) = 0 ;对面无敌时间消失
TriggerAll = RoundState = 2
TriggerAll = StateType != A
TriggerAll = PrevStateNo != 800 ;刚才的性能,投完了以后直接转0,AI这么写为了防止持续投的鬼畜现象
TriggerAll = EnemyNear,StateType != A ;对面在地面
TriggerAll = EnemyNear,StateType != L ;对面不能倒地
TriggerAll = EnemyNear,MoveType != H ;对面不能被打
TriggerAll = EnemyNear,StateNo != [30,49] ;起跳的准备动作也有一样的防投动作,所以不能在起跳的时候出,这里30-49是一个猜测
TriggerAll = EnemyNear,StateNo != 105 ;105是back step,对面44撤防时不出投
TriggerAll = EnemyNear,Facing != Facing || EnemyNear,StateNo = [700,999] ;也是一样的,一种猜测,700-999内AB的概率比较大,所以这个时候出比较好
TriggerAll = Ctrl || (StateNo = [20,22]) || (StateNo = [120,149]) ;跑的时候不出指令投
Trigger1 = P2BodyDist X < 15 ;指令投的距离,根据作者设计的不同距离不同
Trigger1 = ifelse(EnemyNear,MoveType = I && (EnemyNear,StateNo = [700,999]),Random < var(59)*30,Random < var(59)*10)
;当对面700-999之间概率翻3倍

当然这里只是个举例,一般一直出指令投的AI会很难看,尽量能不用就不用,指令投一般保命用比较好

如果是带失败动作的必杀指令投之类的,可以限制一下对面的状态号数字来抓对面硬直,TriggerAll = EnemyNear,Movetype = A这样的,比如说加一行TriggerAll = EnemyNear,StateNo < 1000,这样的话,1000以上为必杀的概率比较大,你的指令投判定持续时间一般只有1帧,对面有个无敌就直接给你打掉了,必杀技以上的技能,有没有无敌是不好说的,还是限制一下比较好,只抓轻起手比较好,如果投技有无敌时间,起手部分全为无敌的那种,或者速度超快,基本在5帧或者以下,也一样可以用来抓硬直,条件是TriggerAll = EnemyNear,AnimTime <= -X(X为投技判定触发时间,比如5帧的投技就是EnemyNear,AnimTime <= -5),抓硬直的话,还得注意一点,就是最好加上TriggerAll = EnemyNear,PrevStateNo != [150,155]这句话,因为抓硬直自己必须有TriggerAll = EnemyNear,Ctrl = 0,也就是对面不可控时,然后EnemyNear,PrevStateNo != [150,155]这句话呢,就可能是对面防御出CD反或者AB的时候了,考虑到防御下CD或者AB可能是无敌甚至全程无敌的,最好加上这句话也会保险一点

反正呢,自己确定使用的投技的具体用处,这个投技的价值,多看看其他人的这部分AI,能学到更多东西

好了,今天的课就先到这,如果您有什么问题的话可以私信我,我会第一时间给您答复,或者把问题发到我的邮箱

mizore@kotori.moe, 谢谢大家!

发表留言

秘密留言

アクセス

オンライン