2016.03.0818:38

AI连段-2 当对手在空中的浮空连

Episode 6-2 连段(当对手在空中的浮空连)

最近可能会比较高产,我也不知道为什么_(:з」∠)_

好了闲话少说下面切入正题,今天要谈的东西会比前一篇复杂一些,浮空连,因为是需要记忆的,所以今天要提到一些变量的使用

首先是达成浮空连段必须要让对手处于type = A并且movetype = H的状态,并且确定juggle(注释①)要够用

注释①. Juggle
MUGEN有一套Juggle系统可以让你攻击已被击上空中的对手或是还躺在地上的对手。我们可以设定juggle points,内定值是15,每次人物进入掉落(fall就例如当人物被打离地面时,并不会恢复可操作状态,而会一直掉落得地面)状态时开始计算。如果人物在空中或是在还躺在地上时被攻击juggle points就会持续下降,而当攻击对方所需要的juggle points比对方剩馀的还要多时,这次的攻击就会miss掉。任何会使对手进入掉落状态的动作,从刚击中对手时juggle point就会开始减少。
例如,人物有5个juggle点数,有一个需要2个juggle point的攻击动作理论上可以让你击中对方两次,直到对手剩下一个juggle point,接下去的攻击会miss。
Juggle系统是为了要防止被无限段连续攻击。

先来用1个var来记下tag,以后要用到,双打用
;------------------------------------------------------------------
[State -3,tag]
type = varset
trigger1 = var(59)
var(58) = IfElse((!EnemyNear,Alive && NumEnemy = 2),1,0)

这样可以记下来近敌为0,远为1,用法就是triggerx = enemynear(var(58)),xxx这样的格式,因为enemynear只能读取0,1,所以用var刚好可以控制,enemynear(0)代表近的,enemynear(1)代表远的

然后再用一个fvar记录下y方向加速度

;-----------------------------------------------------------------------------
; AI用重力加速度計測
;-----------------------------------------------------------------------------
[State -2, yaccel]
type = VarSet
trigger1 = fvar(20) != enemynear(var(58)),const(movement.yaccel)
trigger1 = enemynear(var(58)),stateno != [5000,5210]
trigger1 = enemynear(var(58)),Vel Y != 0
FV = 20
value = enemynear(var(58)),const(movement.yaccel)
ignorehitpause = 1

[State -2, yaccel]
type = VarSet
trigger1 = fvar(20) != enemynear(var(58)),GetHitVar(yaccel)
trigger1 = enemynear(var(58)),stateno = [5000,5210]
trigger1 = enemynear(var(58)),Vel Y != 0
FV = 20
value = enemynear(var(58)),GetHitVar(yaccel);(打撃当てた時のyaccel値)
ignorehitpause = 1

;敵が空中じゃない時
[State -2, yaccel]
type = VarSet
trigger1 = fvar(20) != 0
trigger1 = enemynear(var(58)),Vel Y = 0
FV = 20
value = 0;(打撃当てた時のyaccel値)
ignorehitpause = 1

因为对手通常状态加速度为enemynear(var(58)),const(movement.yaccel),被打如果取得被打yaccel则变为enemynear(var(58)),gethitvar(yaccel),为了方便代入,这里用fvar直接记下来了

先用这两个var,我们来举例子,用JIN的kyo的重75改浮空连为例子

;------------------------------------------------------------------------------
;强七拾五式・改
[State -1, S 75]
type = ChangeState
value = 1250
triggerall = ......
.........

不管什么方法,让75改出招并成功击中对手,2段目的连段可以写在statedef内

一般会有这种东西,原版是这样

[State 1000, ]
type = Varset
triggerall = AnimElemtime(5) >= 0 && AnimElemtime(8) < 0
trigger1 = command = "b"
var(16) = 1

[State 1000,]
type = ChangeState
trigger1 = AnimElemtime(7) >= 0 && AnimElemtime(8) < 0
trigger1 = var(16) = 1
value = 1255

我们改一下,改成这样

[State 1000, ]
type = Varset
triggerall = AnimElemtime(5) >= 0 && AnimElemtime(8) < 0
trigger1 = var(59) = 0
trigger1 = command = "b"
trigger2 = var(59)!= 0
trigger2 = movehit
var(16) = 1

[State 1000,]
type = ChangeState
trigger1 = AnimElemtime(7) >= 0 && AnimElemtime(8) < 0
trigger1 = var(16) = 1
value = 1255

限制了一下command,可以防止AI下CPU乱按自动出招(虽然说对这个没什么用),然后还补了一行,1段目movehit后切换到2段目状态继续连段

接下来对手应该会处在一个浮空状态,在juggle够用的前提下,你可以继续追打对面,注意,juggle的计算是消耗自己的juggle,而不是消耗对面的juggle,千万别弄错了

选一套juggle够用的连招来进行浮空追打

再消耗一个var来记录75改2段目的对手浮空情况

;---------------------------------------------------------------------------
[State -3, VarSet]
Type = VarSet
TriggerAll = var(59)
TriggerAll = RoundState = 2
TriggerAll = EnemyNear(var(58)),StateType = A
TriggerAll = EnemyNear(var(58)),StateType != L
TriggerAll = EnemyNear(var(58)),MoveType = H
Trigger1 = StateNo = 1255 && MoveHit && NumTarget
var(50) = 1

当然也可以在触发75改1段(1250)的那个AI里(见上方)给条件套上var(50) := 1直接赋值,效果一样的,用法就是在每个分支trigger下补一句话
triggerx = var(50) := 1,有几个trigger补几个trigger,trigger1 = var(50) := 1,trigger2 = var(50) := 1....这样写

这样就是可以在这行trigger触发的同时给var(50)赋值1,和上面的道理是一样的,但个人感觉第一种方法好,因为你是第一段记下来的,并不代表第二段一定命中,而第一种方法直接记录第二段命中的情况,以后如果有那种只打1段击飞并要继续连的也可以这样用

然后接下来,比如我要接毒咬这招,我可以估算好x距离和y距离,比如说我举个例子

;百拾五式・毒咬み
[State -1, DOKUGAMI]
Type = ChangeState
Value = 1700
TriggerAll = var(59) = 1
TriggerAll = var(50) = 1 ;前面记录的1255击中了以后就是var(50) = 1
TriggerAll = RoundState = 2
TriggerAll = StateType != A
TriggerAll = EnemyNear(var(58)),StateType = A ;确认对手浮空,并且被打状态
TriggerAll = EnemyNear(var(58)),MoveType = H
TriggerAll = Abs(EnemyNear(var(58)),Pos X - Pos X) < 150 ;x距离,自己要量一下
TriggerAll = P2BodyDist Y = [-20-floor(17*(EnemyNear(var(58)),Vel Y)+(17*(17+1)/2)*fvar(20)),0-floor(17*(EnemyNear(var(58)),Vel Y)+(17*(17+1)/2)*fvar(20))] ;y距离使用方法(注释②)
Trigger1 = Ctrl || (StateNo = [20,22]) || (StateNo = [100,101]) || (StateNo = [120,149])

注释②,分析一下,如果把后面那一串长长的去掉,那就是P2BodyDist Y = [-20,0],但-20这个位置太低,毒咬发生有17帧,这点时间肯定来不及,怎么办呢,刚才提到的记录y方向加速度公式就起作用了,原公式其实变一下很多人就看得懂了
P2BodyDist Y = [-A-floor(B*(EnemyNear,Vel Y)+(B*(B+1)/2)*EnemyNear,GetHitVar(yaccel)),C-floor(B*(EnemyNear,Vel Y)+(B*(B+1)/2)*EnemyNear,GetHitVar(yaccel))],怎么样,是不是有点眼熟?就是原来的下落速度计算公式

用法很简单,A代表B帧以后判定击打的最上距离,C代表最下距离,B代表出招判定帧数,此处多用就能理解了

接下来毒咬2段目,3段目,4段目的连段方法和75改追击的方法相同,就不多提了

现在打完了一套,该消去这个var的值了,怎么消去呢?

分这些情况讨论,1是对手不处于被打状态,2是对手可控制的情况,3是对手处于倒地状态,不算浮空了,4是回合结束

那么接下来的消去应该这么写

[State -3, VarSet]
Type = VarSet
TriggerAll = var(59)
TriggerAll = var(50)
Trigger1 = RoundState != 2
Trigger2 = EnemyNear(var(58)),Ctrl = 1
Trigger3 = EnemyNear(var(58)),StateType = L
Trigger4 = EnemyNear(var(58)),MoveType = A
Trigger5 = EnemyNear(var(58)),MoveType != H
Trigger6 = EnemyNear(var(58)),StateNo = [0,159]
Trigger7 = EnemyNear(var(58)),StateNo = [5100,5300)
;Trigger8 = StateNo = XXXX && MoveHit ;(这里可以记录一些直接用完全部juggle值或者让自己无法继续打浮空连段的技能,比如2D,CD,JCD,独乐属这种的,当然都是因人而异的,比如刚才的毒咬,4段目打完了就可以给他记录下来)
var(50) = 0

然后还有一个问题,我要让AI在浮空连的时候不乱走,乱跳该怎么办呢?前面有提到AI走路,跑步的,现在可以用上了

再加一段文字,加在AI浮空连(var(50) = 0赋值那一段)的上面

;-----------------------------------------------------------------------
[State -3, WALK]
Type = ChangeState
Value = 19 ;AI前走
Ctrl = 0 ;不可控标记,防止AI乱动
TriggerAll = var(59) = 1
TriggerAll = var(50) = 1
TriggerAll = RoundState = 2
TriggerAll = StateType != A
TriggerAll = EnemyNear(var(58)),StateType = A
TriggerAll = EnemyNear(var(58)),MoveType = H
TriggerAll = Time > 0 && AnimTime = 0
Trigger1 = StateNo = 1160 ;(JIN这个1160是75改2段目的落地状态号,在这里记下来即可,1160结束后立即变为走路状态)

接下来75改2段落地结束后立即转为19(走路状态),但并不是Ctrl,所以要把刚才的控制那一栏改一下

把这个Trigger1 = Ctrl || (StateNo = [20,22]) || (StateNo = [100,101]) || (StateNo = [120,149])

改变成Trigger1 = Ctrl || (StateNo = [19,22]) || (StateNo = [100,101]) || (StateNo = [120,149])

这样就包括19这个状态号了,也就是说在19这个状态号里面依然可以出招

当然不能让AI一直走吧,得消去这个不可控状态

[State -3, 停止解除]
Type = ChangeState
Value = 0
Ctrl = 1 ;对手变为默认0状态并且恢复可控
TriggerAll = var(59)
TriggerAll = var(50)
TriggerAll = StateType != A
TriggerAll = StateNo = 0 || (StateNo = [19,22])
TriggerAll = Ctrl = 0
Trigger1 = P2BodyDist Y >= 0
Trigger2 = RoundState != 2

好了,一个完整的浮空连写好了,接下来还可以用自己的思路创造更多的浮空连

其实juggle记录var这种东西,要不是很多连段的就没有必要说了,一般自己算好一套不超过juggle最大值就可以了

接下来的课题可能会较为抽象,如果不懂的要及时来问我

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

mizore@kotori.moe, 谢谢大家!

发表留言

秘密留言

アクセス

オンライン