6:AIのサンプル

アットウィキモードだと容量がオーバーしてしまうため、
テキストモードで項目を作成しました。ご了承ください。

和訳KFM(パッチ済み)を基にしたAI記述の例文
例文だが、そのまま使う事も出来る
上記に記している内容で、おおまかな仕組みは理解出来てるはずなので、細かな記述は省略する
(ただし、上記に無い要素は、個別に解説している)

下記の記述には「優先順位」も考慮してる場合があり、その場合は個別に注釈を入れてある

サンプルAIの強さは、ほどほど程度
そのまま使うも、強くするも弱くするも、ご自由に


-----------------------------------------------------------------------------------------
<対空技・超必殺技>

Before
-------------------------------
;スマッシュカンフーアッパー(ゲージレベル1)
[State -1, Smash Kung Fu Upper]
type = ChangeState
value = 3050
triggerall = command = "SmashKFUpper"
triggerall = power >= 1000 ;パワーゲージがレベル1以上溜まっている時でしか入力出来ません(1000 = Lv.1)
triggerall = statetype != A ;「 != 」は否定(~では無い時)の意味の条件になります
trigger1 = ctrl
trigger2 = hitdefattr = SC, NA, SA, HA ;キャラクター本体の地上攻撃判定が出ている時の条件(詳細はdocs参照)
trigger2 = stateno != [3050,3100]
trigger2 = movecontact
-------------------------------

after
-------------------------------
;対空打ち上げ。エアリアルには繋がらない。判定は強い
;スマッシュカンフーアッパー(ゲージレベル1)
[State -1, Smash Kung Fu Upper]
type = ChangeState
value = 3050
triggerall = var(59) = 1 && RoundState = 2
triggerall = power >= 1000 && P2BodyDist X= [0,18]
triggerall = statetype != A && (p2statetype = S || p2statetype = A)
trigger1 = ctrl && random <= 200 && p2movetype != I
trigger2 = stateno = 3000
trigger2 = AnimElem = 12,>=6 && movehit
-------------------------------
 概要
共通条件:AI起動中。戦闘中。ゲージ1本以上あり、自分が地上にいて、立ち、または空中状態の相手が、近くにいる時
条件1:自分が行動可能で、相手が攻撃中、または食らい中なら、高確率で「スマッシュカンフーアッパー」を発動する
条件2:「三烈カンフー突き手」の2段目以降がヒットしてたら、キャンセル「スマッシュカンフーアッパー」を発動する

 <注意点>
AnimElem = 12,>=0は「現在のアニメ(anim)の表示がが12枚目以降であるなら」の意
ステート番号3000(三烈カンフー突き手)で使われてる、anim(airファイル指定された動作の番号)
の12枚目(12コマ目)は、3段ヒット技の三烈カンフー突き手の2段目に当たる
ようするに、2ヒット目以降で、他の条件も満たしてるなら、キャンセルして「スマッシュカンフーアッパー」を出す

上記の条件に、相手の高さを含めていないので、届かない高さにいる相手に、技を繰り出す場合がある
P2BodyDist Yを条件に入れれば解消出来るが、お勧めしない
理由は二つ。ひとつは、普通の相手なら「届かない高さ」にいること自体がめったに無いため
もうひとつは、P2BodyDist Yを指定すると、条件が厳しくなりすぎて、逆に使えなくなるなることが多いため
(実際に試せば、Y軸を条件に入れると、対空の成功率=発動率が極端に低下するのが分かると思う。
 相手の落下速度が千差万別なのが原因)

-----------------------------------------------------------------------------------------
<対空技・必殺技>

Before
-------------------------------
;速いカンフーアッパー(ゲージレベル1/3)
[State -1, Fast Kung Fu Upper]
type = ChangeState
value = 1120
triggerall = command = "upper_xy"
triggerall = power >= 330
trigger1 = statetype != A
trigger1 = ctrl
trigger2 = (stateno = [200,299]) || (stateno = [400,499]) ; 「 || 」はどちらかが成立( or )する時の意味です
trigger2 = stateno != 440 ;ステート番号440では出せません、という命令
trigger2 = movecontact

;カンフーアッパー(弱)
[State -1, Light Kung Fu Upper]
type = ChangeState
value = 1100
triggerall = command = "upper_x"
trigger1 = statetype != A
trigger1 = ctrl
trigger2 = (stateno = [200,299]) || (stateno = [400,499])
trigger2 = stateno != 440
trigger2 = movecontact
-------------------------------

after
-------------------------------
;対空打ち上げ。エアリアル可能。判定はかなり強い
;速いカンフーアッパー(ゲージレベル1/3)
[State -1, Fast Kung Fu Upper]
type = ChangeState
value = 1120
triggerall = var(59) = 1 && RoundState = 2
triggerall = power >= 330
trigger1 = statetype != A && p2statetype = A
trigger1 = ctrl && random <= 700 && p2movetype != H && P2BodyDist X= [0,50]
trigger2 = stateno = 410 && power < 1000
trigger2 = movecontact && random <=400 && P2BodyDist X= [0,18]

;出が速いが、リーチが短い。最速ならエアリアル可能
;カンフーアッパー(弱)
[State -1, Light Kung Fu Upper]
type = ChangeState
value = 1100
triggerall = var(59) = 1 && RoundState = 2
trigger1 = P2BodyDist X= [0,50]
trigger1 = statetype != A && p2statetype = A
trigger1 = ctrl && random <= 700 && p2movetype = A
trigger2 = stateno = 410 && P2BodyDist X= [0,18]
trigger2 = movecontact && random <=400
-------------------------------
 概要1
共通条件:AI起動中。戦闘中。ゲージ3分の1以上あり。自分が地上にいて、立ち、または空中状態の相手が、近くにいる時
条件1:自分が行動可能で、相手が攻撃中なら、高確率で「速いカンフーアッパー」を発動する
条件2「屈み強パンチ」が当たった時に、ゲージが330~999の間なら、
一定確率でキャンセルして「速いカンフーアッパー」を繰り出す

 概要2
共通条件:AI起動中。戦闘中。自分が地上にいて、立ち、または空中状態の相手が、かなり近くにいる時
条件1:自分が行動可能で、相手が攻撃中なら、高確率で「速いカンフーアッパー」を発動する
条件2「屈み強パンチ」が当たった時に、一定確率でキャンセルして「速いカンフーアッパー」を繰り出す

 <注意点>
「ゲージが330~999の間」と限定してるのは、後述する「屈み強パンチ→三烈カンフー突き手」のコンボを成立させるため
より正確に言うなら、ゲージが1000以上あるなら「速いカンフーアッパー」より「三烈カンフー突き手」に派生したほうが良いので、
そうなるように「ゲージが330~999の間」と限定している

弱と速いは、それぞれ条件が重複してるので、優先順位が重要となる
「弱」を「速い」より上位に記述して、優先順位を入れ替えると、ゲージに余裕があっても「速い」を使わなくなるので、
迂闊に入れ替えたりしないように
(実際はrandom要素があるため、全く使わないってことはない。が、確率が異常に低下するのでお勧め出来ない)

-----------------------------------------------------------------------------------------
 <対空技・通常>

Before
-------------------------------
;しゃがみ強パンチ
[State -1, Crouching Strong Punch]
type = ChangeState
value = 410
triggerall = command = "y"
triggerall = command = "holddown"
trigger1 = statetype = C
trigger1 = ctrl
trigger2 = (stateno = 400) || (stateno = 430)
trigger2 = (time > 9) || (movecontact && time > 5)
-------------------------------

after
-------------------------------
;密着2ヒットの打撃技。1ヒット目は空中ガード不可。対空にも使える?
;しゃがみ強パンチ
[State -1, Crouching Strong Punch]
type = ChangeState
value = 410
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && p2movetype != A
trigger1 = ctrl && random <=400 && p2statetype = A && P2BodyDist X = [-5,40]
trigger2 = (stateno = 430) && P2BodyDist X <= 20
trigger2 = (movecontact && time > 5)
-------------------------------
 概要
共通条件:AI起動中。戦闘中。自分が地上にいて、相手が攻撃モーション中の場合、以外
条件1:自分が行動可能で、相手が間合い内で、空中にいたら、屈み強パンチで撃墜する
条件2:屈み弱キックが、密着状態で相手に当たった場合、キャンセルして、屈み強パンチに繋ぐ

 <注意点>
対空技としての性能は弱いため、上記の「スマッシュカンフーアッパー」より下方に記述して、優先順位を下げた方が良い
また、対空技は、実際に当たる間合いより、少し長めの距離を指定した方が良い
(相手が動いてるので、ギリギリだと、間に合わないことが多いため)
 
条件2により、stateno = 400(屈み弱パンチ)を除外した理由は、
AIに「屈み弱パンチ→屈み強パンチ」のコンボを使わせないためである
なぜなら、屈み弱パンチからは、後述する「基本コンボ」で「屈み弱パンチ→カンフー蹴り」などに派生させる予定だからだ

優先順位などを考慮すれば調整できるが、基本的にAIの場合、人間と違って「使い分け」をしてくれないので、
「条件」はなるべく重ならないようにした方が良い

「statetype = C」から「statetype !=A」に変更してあるのは、AIだと屈み状態になることはめったにないため
(ようするに、屈み攻撃するために、屈んだりしないってこと
 屈みに移行するためのステートをわざわざ用意するなら「C」のままでも良いが、お勧めはしない)

 <発展系>
「屈み弱キック→屈み強パンチ」のルートが組みあがったので、さらに、
「三烈カンフー突き手」にも派生するようにしてみる
(「三烈カンフー突き手」の元の条件に、屈み強パンチからのキャンセル条件が含まれてるので無問題)

三烈カンフー突き手の条件2を、
-------------------------------
trigger2 = (stateno = [1000,1010]) || stateno = 210
-------------------------------
から、
-------------------------------
trigger2 = (stateno = [1000,1010]) || stateno = 210 || stateno = 410
-------------------------------
に変更する

これで、「屈み弱キック→屈み強パンチ→三烈カンフー突き手」が、AIの使うコンボとして成立する
また「三烈カンフー突き手」からの「スマッシュカンフーアッパー」も成立済であるため

結果として、ゲージ2本(2000)あれば、
「屈み弱キック→屈み強パンチ→三烈カンフー突き手→スマッシュカンフーアッパー」の強力なコンボが成立する
逆にゲージが無い場合でも、「屈み弱キック→屈み強パンチ→カンフーアッパー(弱)」が成立する

-----------------------------------------------------------------------------------------
 <基本コンボ・始動技1>
 
Before
-------------------------------
;しゃがみ弱パンチ
[State -1, Crouching Light Punch]
type = ChangeState
value = 400
triggerall = command = "x"
triggerall = command = "holddown"
trigger1 = statetype = C
trigger1 = ctrl
-------------------------------

after
-------------------------------
;リーチ短。出が速い。牽制&コンボ始動技
;しゃがみ弱パンチ
[State -1, Crouching Light Punch]
type = ChangeState
value = 400
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && (p2statetype = S || p2statetype = C)
triggerall = ctrl && (P2BodyDist X = [0,15]) && random <=700
trigger1 = p2movetype != A
trigger2 = p2movetype = A && life >= lifemax / 2
-------------------------------
 概要
共通条件:AI起動中。戦闘中。自分が地上にいて行動可能な時、相手がダウン中以外で近くにいる時に高確率で、
条件1:相手が攻撃中以外の時
条件2:相手が攻撃中の時。ただし、自分のライフに余裕があるなら

------
life >= lifemax / 2
------
「life」はライフの現在値。「lifemax」はライフの最大値。「/ 2」は「÷2」
ようするに「現在のライフが半分以上残ってる時のみ」の意味

<注意点>
------
life >= lifemax / 2
------

------
life >= 500
------
でも同じ意味となる(プレイヤーのライフ設定が1000の場合のみ)

-----------------------------------------------------------------------------------------
 <基本コンボ・派生技1>

Before
-------------------------------
;カンフー突き手(強)
[State -1, Strong Kung Fu Palm]
type = ChangeState
value = 1010
triggerall = command = "QCF_y"
trigger1 = statetype != A
trigger1 = ctrl
trigger2 = (stateno = [200,299]) || (stateno = [400,499])
trigger2 = stateno != 440
trigger2 = movecontact
-------------------------------

after
-------------------------------
;リーチが長い。コンボの繋ぎに最適
;カンフー突き手(強)
[State -1, Strong Kung Fu Palm]
type = ChangeState
value = 1010
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && random <=400 && (P2BodyDist X = [30,80])
trigger1 = ctrl && p2movetype = H && p2statetype = A && enemynear,vel Y >= 0
trigger2 = (stateno = [200,210]) && p2statetype != L|| (stateno = 430 && p2statetype != L)
trigger2 = movecontact
trigger3 = ctrl && p2movetype = A && enemynear,vel Y >= 0 && enemynear,time >=10
-------------------------------
 概要
共通条件:AI起動中。戦闘中。自分が地上にいて、敵が離れたところにいるときに一定確率で、
条件1:自分が行動可能で、相手が空中食らい中で、さらに落下中の時
条件2:立ち弱パンチか立ち強パンチの時に相手がダウン中以外なら「カンフー突き手」に繋ぐ
または、屈み弱キック中で、相手が屈み、もしくは空中にいるときに「カンフー突き手」に繋ぐ
条件3:相手が攻撃中で、地上、または落下中で10フレーム以上経過してたら、「カンフー突き手」に繋ぐ

<注意点>
共通条件で、離れた間合いを指定してるのは、条件が重複して、コンボの阻害をしないため
条件1は、カンフーアッパーで浮かした相手が落ちてきた所を拾うため(だが、旨くいかないことが多いw)
条件2で、相手の立ち状態を除外してるのは、相手が立ち状態なら、屈み強キックに派生した方が良いため
また、stateno400を抜いたのも、後述の、カンフー蹴りの条件と重複させないためである
条件3は、後述する「シールド」成功時の迎撃用
-----------------------------------------------------------------------------------------
 <基本コンボ・派生技2>

Before
-------------------------------
;カンフー蹴り(弱)
[State -1, Light Kung Fu Knee]
type = ChangeState
value = 1050
triggerall = command = "FF_a"
trigger1 = statetype != A
trigger1 = ctrl
trigger2 = (stateno = [200,299]) || (stateno = [400,499])
trigger2 = stateno != 440
trigger2 = movecontact
-------------------------------

after
-------------------------------
;二段蹴り。出は速い。速めに出せば対空にも使えそうだが隙も大きく使い難い。二段目は追加入力。連続技専用?
;カンフー蹴り(弱)
[State -1, Light Kung Fu Knee]
type = ChangeState
value = 1050
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && p2statetype != L
trigger1 = stateno = 400 && random <=200
trigger1 = movecontact
-------------------------------
 概要
共通条件:AI起動中。戦闘中。自分が地上にいて行動可能な時、相手がダウン中、以外の場合
条件1:屈み弱パンチが相手に当たった場合、低確率でキャンセル・カンフー蹴り(弱)に派生する


<注意点>
ctrlが無いのは、AIに、キャンセル時にしか使わせないため
技の特性上、ぶっ放しで使うメリットが低いため
対空にも使えそうだが、問題ありそうなのでAIでは除外

また、条件に相手の距離や行動が入ってないのは、
屈み弱パンチが「相手に当たってる」状況は、それだけでかなり限定されるため
わざわざ入れる必要がないからである

 <重要>
カンフー蹴り(弱)は、追加入力が存在し、それはCNSの方に記述されている
そのため、2段目をAIに確実に使用させるには、CNSの方の記述も変更する必要がある


DEFファイルを開き、それに記載されている
---------------
Cns      = kfm.cns          ;基本ステータス情報ファイルの登録
St       = kfm.cns          ;動作プログラムファイルの登録(最大10個くらい増やせます(St,St0,St1,St2......))
---------------
のファイルを開き「カンフー蹴り(弱)」に当たるステート番号「statedef 1050]を検索する
見つかった「statedef 1050]を見ていくと、途中で[statedef 1051]に移動しているのが分かるので、
[statedef 1051]も見ていくと、
---------------
[State 1051, ステート変更] ;追加入力用
type = ChangeState
trigger1 = Command = "a" || Command = "b"
trigger1 = Vel y < -1
value = 1055
---------------
と、「command」を条件にしたステートコントローラーが見つかるのでそれを、
---------------
[State 1051, ステート変更] ;追加入力用
type = ChangeState
triggerall = var(59) = 0
trigger1 = Command = "a" || Command = "b"
trigger1 = Vel y < -1
value = 1055
---------------
と書き加える。続いて、それ全文をコピー&ペーストして[statedef 1051]の中に入れ
---------------
[State 1051, ステート変更] ;追加入力用
type = ChangeState
triggerall = var(59) = 1 && RoundState = 2
trigger1 = p2movetype = H
trigger1 = Vel y < -1
value = 1055
---------------
と書き換える。

最終的に、
---------------
[State 1051, ステート変更] ;追加入力用
type = ChangeState
triggerall = var(59) = 0
trigger1 = Command = "a" || Command = "b"
trigger1 = Vel y < -1
value = 1055

[State 1051, ステート変更] ;追加入力用
type = ChangeState
triggerall = var(59) = 1 && RoundState = 2
trigger1 = p2movetype = H
trigger1 = Vel y < -1
value = 1055
---------------
となる

これで、相手が食らい状態(ようするに連続技となる場合)、追加攻撃を繰り出すようになる

<注意点>
ステートコントローラーの内容や意味が分からない場合は、ググること
(一覧が見つかるはず)
「movecontact」ではなく「p2statetype = H」にしてる理由は、
「statedef1051」にステートコントローラーの「hitdef」が無いため
(movecontactなどは、hitdefの効果中しか認識されない)


-----------------------------------------------------------------------------------------
 <基本コンボ・派生技3(始動技2)>

Before
-------------------------------
;立ち弱パンチ
[State -1, Stand Light Punch]
type = ChangeState
value = 200
triggerall = command = "x"
triggerall = command != "holddown"
trigger1 = statetype = S
trigger1 = ctrl
trigger2 = stateno = 200
trigger2 = time > 6 ;7フレーム以上になったら有効
-------------------------------

after
-------------------------------
;出が速い。連打可能。コンボ始動に最適だが、屈み状態の相手や、背の低い相手には当たらない
;立ち弱パンチ
[State -1, Stand Light Punch]
type = ChangeState
value = 200
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && (p2statetype = A || p2statetype = S) && p2movetype != A && P2BodyDist X = [0,20]
trigger1 = ctrl && random <= 700
trigger2 = stateno = 200
trigger2 = time > 6
-------------------------------
 概要
共通条件:AI起動中。戦闘中。自分が地上にいて行動可能で、相手が立ち、または空中状態でかつ、攻撃中以外で密着してる時
条件1:自分が行動可能な時に、高確率で立ち弱パンチを繰り出す
条件2:弱パンチ連打処理。共通条件を見たしてる限り、連打し続ける

キャンセル条件に「屈み弱パンチ」は含まれていないが、相手との距離が16~20になると、
こっちの条件が満たされるため、結果的に「屈み弱パンチ→立ち弱パンチ」の「連携」が成立する

この「連携」はキャンセルを伴わないが、相手の硬直時間の関係上「屈み弱パンチ→立ち弱パンチ」と繋がるため、
コンボとして成立している

ただし、これは「屈みパンチ→カンフー蹴り(弱)」に派生しなかった場合の話である
(カンフー蹴り(弱)の確率を低くしているのはそのため)

<注意点>
条件が「屈み弱パンチ」と重複しているが、こっちの方が指定距離が長いため、問題ない
ただし、優先順位が「屈み弱パンチ」や「カンフー蹴り(弱)」より高いと、
屈み弱パンチやカンフー蹴り(弱)が出なくなるので注意
(実際は条件にrandomがあるので、全く出さないってことは無い。が、確率が非常に低くなる)

<発展系>

「屈み弱パンチ→立ち弱パンチ」が成立した場合、上記で設定した「立ち強パンチ」へのキャンセル条件も満たすことになる
よって、結果的に「屈み弱パンチ→立ち弱パンチ→立ち強パンチ」のコンボも成立する

さらに「立ち強パンチ→三烈カンフー突き手」や「三烈カンフー突き手→スマッシュカンフーアッパー」成立済なため、
ゲージが2本あれば「屈み弱パンチ→立ち弱パンチ→立ち強パンチ→三烈カンフー突き手→スマッシュカンフーアッパー」の
強力なコンボが成立する

また、立ち弱パンチ→立ち強パンチは、random要素が大きいため、1~2ヒットの範囲で立ち弱パンチが多く入ることもある
そのため、結果的にジャッグルポイント(詳細は和訳KFM参照)の関係で、全段は当たらなくなることもある

だが、このままだと派生パターンに無理が生じるので「立ち強パンチ」の条件を、
---------------------
trigger1 = ctrl && random <=400 && p2movetype != A && (p2statetype = S || p2statetype = A)
trigger2 = (stateno = 200) && time > 5 && random <=700
trigger3 = (stateno = 230) && time > 6 && random <=300
---------------------
から、
---------------------
trigger1 = (stateno = 200) && time > 5 && random <=400
---------------------
に変更し「カンフー蹴り(弱)」と同様に、コンボ専用にする


-----------------------------------------------------------------------------------------
 <基本コンボ・始動技3>
 
Before
-------------------------------
;しゃがみ弱キック
[State -1, Crouching Light Kick]
type = ChangeState
value = 430
triggerall = command = "a"
triggerall = command = "holddown"
trigger1 = statetype = C
trigger1 = ctrl
trigger2 = (stateno = 400) || (stateno = 430)
trigger2 = (time > 9) || (movecontact && time > 5)
-------------------------------

after
-------------------------------
;リーチ並。出が速い。牽制&コンボ始動技
;しゃがみ弱キック
[State -1, Crouching Light Kick]
type = ChangeState
value = 430
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && (p2statetype = S || p2statetype = C) && p2movetype != A
trigger1 = ctrl && random <= 700 &&  P2BodyDist X = [20,30]
trigger2 = (stateno = 400) && p2statetype = S
trigger2 = movecontact && time > 5
-------------------------------
 概要
共通条件:AI起動中。戦闘中。自分が地上にいる時、相手が立ち、または屈み中で、攻撃中以外の場合
条件1:自分が行動可能で、相手が密着以外で近くにいる時に高確率で屈み弱キックを使う
条件2:屈み弱パンチが、立ってる相手に当たった時に、屈み弱キックを繰り出す

条件2は、立ちガード崩しを想定してる

<注意点>
条件が「立ち弱パンチ」と重複してるため、それより優先順位を高くする必要がある

-----------------------------------------------------------------------------------------
 <基本コンボ・派生技2>
 
Before
-------------------------------
;しゃがみ強キック
[State -1, Crouching Strong Kick]
type = ChangeState
value = 440
triggerall = command = "b"
triggerall = command = "holddown"
trigger1 = statetype = C
trigger1 = ctrl
trigger2 = (stateno = 400) || (stateno = 430)
trigger2 = (time > 9) || (movecontact && time > 5)
-------------------------------

after
-------------------------------
;リーチが長い。出が速い。ダウン技。ダウン追い討ち可能。連携の〆
;しゃがみ強キック
[State -1, Crouching Strong Kick]
type = ChangeState
value = 440
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && p2movetype != A
trigger1 = ctrl && random <= 700 && p2statetype = S && P2BodyDist X = [21,40]
trigger2 = (stateno = 430) && p2statetype = S && P2BodyDist X = [21,40]
trigger2 = (time > 9) || (movecontact && time > 5)
trigger3 = ctrl && random <= 700 && p2statetype = L && P2BodyDist X = [0,60]

-------------------------------
概要
共通条件:AI起動中。戦闘中。自分が地上にいる時、相手が攻撃中以外
条件1:自分が行動可能で、相手が立ってる場合で少し離れた所にいる場合、高確率で、足払いを出す
条件2:屈み弱キック中に、相手が少し離れた位置にいたら、キャンセルして足払いに繋ぐ
条件3:間合い内で相手がダウンしたら追い討ちを入れる

<注意点>
コンボの条件が「屈み強パンチ」と重複してるように見えるが、距離が重複してないので無問題
だが、「屈み弱キック」とは大きく重複してるため「屈み弱キック」より上位に記述して、優先順位を上げる必要がある

具体的には
「立ち弱パンチ」
「立ち強パンチ」
「屈み弱パンチ」
「屈み弱キック」
「屈み強キック」
から
「屈み弱キック」
「立ち弱パンチ」
「屈み弱パンチ」
「立ち強パンチ」
「屈み強キック」
に、順番を入れ替える必要がある

優先順位を纏めると
「三烈カンフー突き手」
「スマッシュカンフーアッパー」
「速いカンフーアッパー」
「カンフーアッパー(弱)」
「カンフー突き手(強)」
「屈み強パンチ」
「屈み弱キック」
「カンフー蹴り(弱)」
「立ち弱パンチ」
「屈み弱パンチ」
「立ち強パンチ」
「屈み強キック」
となる

そうすると、最終的に、距離に応じて技が自動的に振り分けられるようになる

 <コンボ総括>

現時点で、AIが使用するコンボ
(ただし、ランダム要素があるので、規定外のコンボが成立することもある)
また、ジャグルの関係で、最後まで繋がらないこともある

「屈み弱パンチ→屈み弱キック→屈み強パンチ→カンフーアッパー→カンフー突き手→三烈カンフー突き手→スマッシュカンフーアッパー」」
「屈み弱パンチ→屈み弱キック→屈み強パンチ→カンフー突き手→三烈カンフー突き手→スマッシュカンフーアッパー」
「屈み弱パンチ→立ち弱パンチ→立ち強パンチ→カンフー突き手→三烈カンフー突き手→スマッシュカンフーアッパー」
「屈み弱パンチ→カンフー蹴り→カンフー突き手→三烈カンフー突き手→スマッシュカンフーアッパー」
「屈み弱キック→屈み強パンチ→カンフー突き手→三烈カンフー突き手→スマッシュカンフーアッパー」
「屈み弱パンチ→屈み弱キック→屈み強キック」
「立ち弱パンチ→立ち強パンチ→カンフー突き手→三烈カンフー突き手→スマッシュカンフーアッパー」
「立ち弱パンチ→カンフー突き手→三烈カンフー突き手→スマッシュカンフーアッパー」

以上が、上記の記述により意図してるコンボとなる

また、これまでの記述では、上記以外の技は、AIは一切使用しない
それでも使用させたい場合、var(59)=0の削除して、封印を解くか、
別途に上記の要領で、その技を使うAIを組む必要がある


-----------------------------------------------------------------------------------------
 <エアリアル(空中コンボ)&ジャンプ攻撃・始点1>
空対空、空対地に使う空中技のAI設定
条件を分岐させることで、ある程度、エアリアルコンボにも対応させることができる

Before
-------------------------------
;空中弱パンチ
[State -1, Jump Light Punch]
type = ChangeState
value = 600
triggerall = command = "x"
trigger1 = statetype = A
trigger1 = ctrl
trigger2 = stateno = 600
trigger2 = statetime >= 7
-------------------------------

after
-------------------------------
;出が速い。連打可能。リーチは短い
;空中弱パンチ
[State -1, Jump Light Punch]
type = ChangeState
value = 600
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype = A && p2statetype = A
triggerall = P2BodyDist X = [0,30]
trigger1 = ctrl && p2movetype != A && random <= 400
trigger2 = stateno = 600
trigger2 = statetime >= 7
-------------------------------

概要
共通条件:AI起動中。戦闘中。自分が空中にいる時、相手も空中にいて、近くに入るとき
条件1:自分が行動可能で、相手が攻撃中以外の時に一定確率で、攻撃する
条件2:空中弱パンチ中に、一定時間経過したら、問答無用で再び攻撃する

 <注意点>
条件2は、相手の状態が含まれて無いく、乱数も使って無いので、相手の状態に関わらず空中弱パンチを繰り出す
だが、共有条件によって制限されてるため、問題は無い
また、間合いを0~15と実際の当たり判定より短くしてるのは、1発以上繋げ無いためである
(KFMの場合、弱を1発以上入れると、強パンチに繋がらなくなるためにそうしてある。
 逆に、繋がるのであれば、ギリギリまで間合いを伸ばした方が良い)

弱パンチに限らず、空中で使う技は、自然落下→着地でキャンセルされるため、条件は甘くても問題ない場合が多い

-----------------------------------------------------------------------------------------
 <ジャンプ攻撃・派生1>

Before
-------------------------------
;空中強パンチ
[State -1, Jump Strong Punch]
type = ChangeState
value = 610
triggerall = command = "y"
trigger1 = statetype = A
trigger1 = ctrl
trigger2 = stateno = 600 || stateno = 630
trigger2 = movecontact
-------------------------------

after
-------------------------------
;出が速い。判定が強い。リーチはそこそこ。空対空に向いてる
;空中強パンチ
[State -1, Jump Strong Punch]
type = ChangeState
value = 610
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype = A &&  P2BodyDist X = [10,40]
trigger1 = stateno = 600
trigger1 = movecontact
-------------------------------

概要
共通条件:AI起動中。戦闘中。自分が空中にいる時、相手も空中にいて、僅かに離れた近くに入るとき
条件1:空中弱パンチが相手に当たった場合、キャンセル・空中強パンチを繰り出す

 <注意点>
元の技から、条件1が消え、条件2を1にしてるのは、キャンセル専用にするため
ようするにAIは、単独で「空中強パンチ」出す事は無い
また、ステート番号630「空中弱キック」からのキャンセル条件を除外したのは、
後述する条件で「空中弱キック→空中強キック」のコンボを成立させるためである
空中の相手のみに限定してる理由も同じで、後述する空中弱キックと条件が重複しないようにするためである
(もちろん、空中弱パンチが、対地より対空に向いた技であるのことが前提)

-----------------------------------------------------------------------------------------
 <ジャンプ攻撃・始点2>

Before
-------------------------------
;空中弱キック
[State -1, Jump Light Kick]
type = ChangeState
value = 630
triggerall = command = "a"
trigger1 = statetype = A
trigger1 = ctrl
-------------------------------

after
-------------------------------
;出が速い。攻撃時間が眺め。リーチは短い。めくり不可。空対地に向いてる
;空中弱キック
[State -1, Jump Light Kick]
type = ChangeState
value = 630
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype = A && P2BodyDist X = [0,20]
triggerall = vel Y >= 0
trigger1 = ctrl && random <= 400 && p2movetype != A
trigger1 = p2statetype = S || p2statetype = C
-------------------------------

概要
共通条件:AI起動中。戦闘中。自分が空中にいて落下中に、地上にいる相手に近づいたとき
条件1:自分が行動可能で、相手が攻撃中以外なら、一定確率で攻撃する

 <注意点>
共通条件に「vel Y」が入ってる理由は、対地攻撃を、上昇中に出しても意味が無いため
ただし「昇り蹴り」などで中段攻撃を狙えるなら、むしろ除外した方が良い
(KFMの弱キックは、昇り蹴りには向かないので、必要となる)

-----------------------------------------------------------------------------------------
 <ジャンプ攻撃・派生2>

Before
-------------------------------
;空中強キック
[State -1, Jump Strong Kick]
type = ChangeState
value = 640
triggerall = command = "b"
trigger1 = statetype = A
trigger1 = ctrl
trigger2 = stateno = 600 || stateno = 630
trigger2 = movecontact

-------------------------------

after
-------------------------------
;出が速い。攻撃時間が眺め。リーチは短い。めくり不可。空対地に向いてる
;空中強キック
[State -1, Jump Strong Kick]
type = ChangeState
value = 640
triggerall = var(59) = 1 && RoundState = 2
triggerall = p2statetype = S || p2statetype = C
triggerall = statetype = A && P2BodyDist X = [0,60]
trigger1 = ctrl && vel Y >= 1 && random <=400 && (life >= p2life || p2movetype != A)
trigger2 = stateno = 630
trigger2 = movecontact
-------------------------------

概要
共通条件:AI起動中。戦闘中。自分が空中にいる時、地上にいる相手に近づいたとき
条件1:自分が行動可能で、ある程度落下中で、自分のライフが相手より多いか、攻撃中以外なら、一定確率で攻撃する
条件2:空中弱キックが相手に当たったら、キャンセルして「空中強キック、を繰り出す

 <注意点>
p2lifeは、相手のライフを参照するtriggerであり「life >= p2life」で、
ライフが、相手と同じか、それを超える場合となる
ようするに、有利な状況(相手よりライフが上)なら、相手が攻撃中でも攻撃するようにしてある

条件1にあるvel Y は、落下中、それも少し降りて地面に近づいた状態で技を出させるためのもの
理由は二つ
ひとつは、空中強キックの当たり判定が出てる時間が短かく、引き付けないと外れるため
もうひとつは、深く当てると、地上コンボに繋がるので、それを狙うため

また、自分の高度を計る、
--------
pos Y <= -30
--------
などを使って条件付けすることで、より正確な高さで攻撃出来るが、殆どの場合、そこまでする必要はないと思われる
(0が地上。負数が空中。正数は地面より下を指す)



 <空中コンボ総括>

現時点で、AIが使用するエアリアルコンボ
(ただし、ランダム要素があるので、規定外のコンボが成立することもある)
また、ジャグルの関係で、最後まで繋がらないこともある

「空中弱パンチ→空中強パンチ」
「空中弱キック→空中強キック」

以上である

KFMは、空中コンボに向いて無いので、これだけしかない
ただし、空中コンボから地上のコンボに繋がる事はあるので、それを期待するのも良い

-----------------------------------------------------------------------------------------
追記
-----------------------------------------------------------------------------------------
 <飛び道具>
上級者用パッチを和訳KFMに当てると、追加される

Before
-------------------------------
;板投げ(上級編用)
[State -1, Wood-Board Throw]
type = ChangeState
value = 1200
triggerall = (command = "QCB_a") || (command = "QCB_b")
triggerall = NumHelper(1200) = 0 ;IDナンバー1200のヘルパーが画面中に1個も出てない時
triggerall = NumProjID(1200) = 0 ;IDナンバー1200の飛び道具が画面中に1個も出てない時
trigger1 = statetype != A
trigger1 = ctrl = 1
trigger2 = (stateno = [200,299]) || (stateno = [400,499])
trigger2 = stateno != 440
trigger2 = movecontact
-------------------------------
after
-------------------------------
;山形弾道の飛び道具。弱だとあまり飛ばない。弾道的に先読み対空に最適。コンボには向かない
;板投げ(上級編用)
[State -1, Wood-Board Throw]
type = ChangeState
value = 1200
triggerall = var(59) = 1 && RoundState = 2
triggerall = NumHelper(1200) = 0
triggerall = NumProjID(1200) = 0
triggerall = statetype != A && ctrl
trigger1 = stateno != 100 && P2BodyDist X = [60,180]
trigger1 = p2movetype != A && random <=50
-------------------------------
 概要
共通条件:AI起動中。戦闘中。自分が地上にいる時で行動可能な時
条件1:ある程度離れていて、飛び道具の届く範囲にいる、攻撃中以外の相手に低確率で、板を投げる

キャンセル条件を削除したのは、キャンセルして使うメリットが無いからである
また、相手の状態を指定してないのは、弾道的に飛んでる相手にも当たり、ダウン中の相手でも、
起き攻めとして使えるからである

 <注意点>
飛び道具は、AI殺しと呼ばれているように、対人でも強力だが、対AIだとさらに強力になる
//だから、あまり多用しないようにしたほうが良い
また、randomの数値が極端に低いのは、他と重複する条件が少なく、条件が満たされる確率が高いためである

読み返せば分かるだろうが、60以上離れた相手を条件に含めた技は殆ど無い
そうなると、実質、板投げの条件は、randomだけとなり、この状態で200とか400とかに設定すると、
ほぼ100%、板を投げまくることになる
それでは問題ありまくるので、低く設定している

また「state!=100」が入ってる理由は、後述する「ダッシュ」の最中には使わないようにするため
なぜなら、ダッシュは、連続技を入れるのに近づくために行うので、板投げに派生すると、無意味化するからだ
(statedef 100は、通常は地上ダッシュに使われる)

それと、このままの記述では、板投げ(弱)しか行わない
板投げ(強)を行うには、ステート番号1200に手を加える必要がある
(手を加えるのが面倒なら、そのままでも良い。ただし、P2BodyDistを180から120に変更すること
 さもなくば、届かない攻撃を繰り返すことになる)

手を加える場合、
DEFファイルを開き、それに記載されている
---------------
Cns      = kfm.cns          ;基本ステータス情報ファイルの登録
St       = kfm.cns          ;動作プログラムファイルの登録(最大10個くらい増やせます(St,St0,St1,St2......))
---------------
のファイルを開き「板投げ」に当たるステート番号「statedef 1200]を検索する
見つかった「statedef 1200]を見ていくと、
---------------
[State 1200, 変数をセットする] ;設定の仕方その1
type = VarSet
triggerall = Time = 0
trigger1 = command = "a"
v = 5      ;var(5)を
value = 0  ;0にセットする
IgnoreHitPause = 1
Persistent = 1

[State 1200, 変数をセットする] ;設定の仕方その2
type = VarSet
triggerall = Time = 0
trigger1 = command = "b"
var(5) = 1 ;var(5)を1にセットする
IgnoreHitPause = 1
Persistent = 1
---------------
と、「command」を条件にしたステコン(ステートコントローラー)が見つかるのでそれを、
---------------
[State 1200, 変数をセットする] ;設定の仕方その1
type = VarSet
triggerall = var(59) = 0
triggerall = Time = 0
trigger1 = command = "a"
v = 5      ;var(5)を
value = 0  ;0にセットする
IgnoreHitPause = 1
Persistent = 1

[State 1200, 変数をセットする] ;設定の仕方その2
type = VarSet
triggerall = var(59) = 0
triggerall = Time = 0
trigger1 = command = "b"
var(5) = 1 ;var(5)を1にセットする
IgnoreHitPause = 1
Persistent = 1

[State 1200,a]
type = VarSet
triggerall = var(59) = 1 && RoundState = 2
trigger1 = Time = 0
v = 5
value = 0
IgnoreHitPause = 1
Persistent = 1

[State 1200,b]
type = VarSet
triggerall = var(59) = 1 && RoundState = 2
triggerall = Time = 0
trigger1 = P2BodyDist X >=120
var(5) = 1
IgnoreHitPause = 1
Persistent = 1
---------------
と書き換え&書き加える

 概要
近くなら、板投げ(弱)遠くなら、板投げ(強)に派生させる

 <注意点>
var(5)が0なら、板投げ(弱)、1なら板投げ(強)に、
それぞれ分岐するように記述されてるので、それに会わせるて記述する

State 1200,aがtime=0のみなのは、var(5)を0にリセットするため
優先順位と処理順番の関係で、State 1200,bの条件を満たせば「1」に上書きされるので問題は無い

-----------------------------------------------------------------------------------------
 <投げ>

Before
-------------------------------
;投げ
[State -1, Kung Fu Throw]
type = ChangeState
value = 800
triggerall = command = "y"
triggerall = statetype = S
triggerall = ctrl
triggerall = stateno != 100
trigger1 = command = "holdfwd"
trigger1 = p2bodydist X < 3
trigger1 = (p2statetype = S) || (p2statetype = C)
trigger1 = p2movetype != H
trigger2 = command = "holdback"
trigger2 = p2bodydist X < 5
trigger2 = (p2statetype = S) || (p2statetype = C)
trigger2 = p2movetype != H
-------------------------------

after
-------------------------------
;通常投げ。
;投げ
[State -1, Kung Fu Throw]
type = ChangeState
value = 800
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A
triggerall = ctrl
triggerall = stateno != 100
triggerall = random <=200
triggerall = (p2statetype = S) || (p2statetype = C)
triggerall = p2movetype != H
trigger1 = p2bodydist X < 3
-------------------------------
 概要
共通条件:AI起動中。戦闘中。自分が地上にいる時でダッシュ中以外で、行動可能な時
条件1:密着した相手が地上にいて、やられ中(ガード&ダウンも含む)でないなら、投げる

(余談だが、実際に投げれる距離は、投げ技のanimの「当たり判定」で決まる。
 mugenでの投げ技は「軸」ではなく、当たり判定で処理される、
 そのため、p2bodydistなどで距離を指定しておかないと、
 相手の攻撃などで一時的に伸びた食らい判定に命中し、
 ありえない距離から敵を掴み、投げを放つことが出来るようになる
 それを防ぐため、当たり判定の大きさだけでなく、p2bodydistなどでの距離の指定は、重要となる)


殆どの投げ技は、
-------------------------------
triggerall = (p2statetype = S) || (p2statetype = C)
triggerall = p2movetype != H
-------------------------------
の条件が必須となる
KFMの場合、最初から条件に入ってるから問題ないが、キャラによっては省略されてることが多い
その場合は、投げの特性をみて、条件を変更すること

また、stateno=20などが共通条件に入ってる場合、当たり判定がstate20のanimに付けられてる可能性が高い
その場合は、stateno=20を除外すると、投げが成立しなくなるので、
投げのstatedefの直下に、
-------
[State 512]
Type = ChangeAnim
Trigger1 = Time = 0 && var(59) != 0
Value = 20
------
などのステコンを追加する必要がある
(KFMの場合は、当然不要)

 <注意点>
一部のキャラは、投げが、食らい中でもヒットするようになってる、その場合「p2movetype != H」は不要
さらに、空中にいる相手や、ダウン中でも掴む投げ技の場合は、p2statetype=*は不要となる

stateno=20などを共通条件に入れていると、歩き中しか成立しなくなるので、発動確率が極端に低下する
だから、AI時は除外するのがセオリーとなる(これはstatetype=Cなどをstatetype!=Aに変更するのと同じ理由である)

また、条件に、
-------------------------------
trigger1 = enemynear,vel X = [-4,4]
-------------------------------
とかを入れておくと、相手のダッシュや移動技などを、超反応で投げなくなる
(KFMのダッシュも、4.6なので上記の範囲から外れる)
普通のダッシュくらいなら超反応で投げても良いと思うなら[-5,5]などに範囲を増やせば良い
さらに、入力が難しいコマンド投げはともかく、
入力が簡単な普通の投げなら、超反応しても良いと思うなら、そもそも付けなくても良い

それと、このままの記述では「レバー前入れ」の投げしか行わない
「レバー後ろ入れ」の投げを行いたい場合、ステート番号800の記述に手を加える必要がある

手を加える場合、
DEFファイルを開き、それに記載されている
---------------
Cns      = kfm.cns          ;基本ステータス情報ファイルの登録
St       = kfm.cns          ;動作プログラムファイルの登録(最大10個くらい増やせます(St,St0,St1,St2......))
---------------
のファイルを開き「板投げ」に当たるステート番号「statedef 800]を検索する
見つかった「statedef 800]を見ていくと、
---------------
[State 800, ヒット定義(投げ用)]
type = HitDef
Trigger1 = Time = 0
attr = S, NT          ;攻撃属性: これは Standing, Normal Throw(立ち通常投げ)
hitflag = M-          ;相手がやられ状態ではない地上の時でしか掴む事が出来ません
priority = 1, Miss    ;投げなので優先度を低く、かつmissかdodgeの属性でなければなりません
sparkno = -1          ;-1にすればヒットスパークが表示しなくなります
sprpriority = 1       ;攻撃が当たった時に画像表示優先度を1に出来ます
p1facing = ifelse(command = "holdfwd", -1, 1) ;攻撃が当たった時の自分の向き ★6
p2facing = 1          ;攻撃が当たった時の相手の向き
p1stateno = 810       ;自分のステート変更
p2stateno = 820       ;相手を制御するステートに行かせる
guard.dist = 0        ;相手がガード状態に移行出来る距離(現在は0なのでガード不可)
fall = 1              ;1にすれば相手がダウン状態になる
---------------
と、「command」を条件にしたステコン(ステートコントローラー)が見つかるのでそれを、
---------------
[State 800, ヒット定義(投げ用)]
type = HitDef
Trigger1 = Time = 0 && var(59) = 0
attr = S, NT          ;攻撃属性: これは Standing, Normal Throw(立ち通常投げ)
hitflag = M-          ;相手がやられ状態ではない地上の時でしか掴む事が出来ません
priority = 1, Miss    ;投げなので優先度を低く、かつmissかdodgeの属性でなければなりません
sparkno = -1          ;-1にすればヒットスパークが表示しなくなります
sprpriority = 1       ;攻撃が当たった時に画像表示優先度を1に出来ます
p1facing = ifelse(command = "holdfwd", -1, 1) ;攻撃が当たった時の自分の向き ★6
p2facing = 1          ;攻撃が当たった時の相手の向き
p1stateno = 810       ;自分のステート変更
p2stateno = 820       ;相手を制御するステートに行かせる
guard.dist = 0        ;相手がガード状態に移行出来る距離(現在は0なのでガード不可)
fall = 1              ;1にすれば相手がダウン状態になる

[State 800, ヒット定義(投げ用)]
type = HitDef
Trigger1 = Time = 0 && var(59) = 1
attr = S, NT          ;攻撃属性: これは Standing, Normal Throw(立ち通常投げ)
hitflag = M-          ;相手がやられ状態ではない地上の時でしか掴む事が出来ません
priority = 1, Miss    ;投げなので優先度を低く、かつmissかdodgeの属性でなければなりません
sparkno = -1          ;-1にすればヒットスパークが表示しなくなります
sprpriority = 1       ;攻撃が当たった時に画像表示優先度を1に出来ます
p1facing = ifelse(backEdgeBodyDist <=30, -1, 1) ;攻撃が当たった時の自分の向き ★6
p2facing = 1          ;攻撃が当たった時の相手の向き
p1stateno = 810       ;自分のステート変更
p2stateno = 820       ;相手を制御するステートに行かせる
guard.dist = 0        ;相手がガード状態に移行出来る距離(現在は0なのでガード不可)
fall = 1              ;1にすれば相手がダウン状態になる
---------------
と書き換え&書き加える

同時にそれに会わせて、statedef -1(-3)の方も、
--------
trigger2 = p2bodydist X < 5 && backEdgeBodyDist <=30
--------
を加えて、
--------
;通常投げ。
;投げ
[State -1, Kung Fu Throw]
type = ChangeState
value = 800
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A
triggerall = ctrl
triggerall = stateno != 100
triggerall = random <=200
triggerall = (p2statetype = S) || (p2statetype = C)
triggerall = p2movetype != H
trigger1 = p2bodydist X < 3
trigger2 = p2bodydist X < 5 && backEdgeBodyDist <=30
--------
とすること

 概要
相手に自分が、画面端に追い詰められてる時は、立ち位置を入れ替えるように投げ(レバー後入れ)を繰り出し、
それ以外の時は、投げ(レバー前入れ)を繰り出す

 <注意点>
投げは、相手の攻撃に対するカウンターとして有能な場合が多い
よって、後述する「ガード」の記述より上に配置して、優先順位を上げておくのも良い

いっそ、
--------
triggerall = p2movetype != H
--------
を、
--------
triggerall = p2movetype = A
--------
としてしまい、カウンター専用にすることも可能
(ただし、投げの性質にもよるが、カウンターだと、ほぼ100%決まるため、強AI以外ではお勧めしない)


-----------------------------------------------------------------------------------------
 <パワー溜め>
上級者用パッチを和訳KFMに当てると、追加される

Before
-------------------------------
;パワー溜め(上級編用)
[State -1, Power Gauge Charge]
type = ChangeState
value = 700
triggerall = command = "hold_c"
triggerall = power < 3000 ;ゲージが満タンの時は出せない
trigger1 = statetype != A
trigger1 = ctrl = 1
-------------------------------

after
-------------------------------
;パワー溜め(上級編用)
[State -1, Power Gauge Charge]
type = ChangeState
value = 700
triggerall = var(59) = 1 && RoundState = 2
triggerall = power < powermax
triggerall = random <=100
triggerall = statetype != A && ctrl
trigger1 = p2movetype != A && p2bodydist X > 160
trigger2 = p2statetype = L && power < 2000 && p2bodydist X > 60
-------------------------------

 概要
条件1:相手が攻撃中以外で、画面の半分以上離れてるときは、パワーをタメ始める
条件2:相手がダウン中で、ゲージが2本未満なら、ある程度近くにいても、パワーをタメ始める

 <注意点>
「power < 3000」から「power < powermax」に変えた理由は、3000だと「タッグモード」の時に不具合がでるため
(元の記述を変えてないのは、それは「改変」に当たる行為だと言う事と、
 人操作だと問題が問題になら無いため)

 それと、これまたこのままでは、動作や挙動がおかしくなるので、パワー貯めに該当する、
「statedef 700」に手を加える必要がある

手を加える場合、
DEFファイルを開き、それに記載されている
---------------
Cns      = kfm.cns          ;基本ステータス情報ファイルの登録
St       = kfm.cns          ;動作プログラムファイルの登録(最大10個くらい増やせます(St,St0,St1,St2......))
---------------
のファイルを開き「パワー貯め」に当たるステート番号「statedef 700]を検索する
見つかった「statedef 700]を見ていくと、
---------------
[State 700, ステート変更]
type = ChangeState
trigger1 = command != "hold_c"
trigger2 = power >= 3000
value = 11 ;しゃがみステートの方が終わった時のモーションの見栄えが良かった(爆
ctrl = 1
---------------
と、「command」を条件にしたステコン(ステートコントローラー)が見つかるのでそれを、
---------------
[State 700, ステート変更]
type = ChangeState
triggerall = var(59) = 0
trigger1 = command != "hold_c"
trigger2 = power >= 3000
value = 11 ;しゃがみステートの方が終わった時のモーションの見栄えが良かった(爆
ctrl = 1

[State 700, ステート変更]
type = ChangeState
triggerall = var(59) = 1
trigger1 = power >= powermax
trigger2 = RoundState != 2 || p2movetype = A || p2bodydist X <= 60
value = 11
ctrl = 1
---------------
と書き換え&書き加える

 概要
パワー貯め中、ゲージが最大値に達するか、相手が攻撃してくるか、相手が近づいてきたら、中断する
それ以外なら、パワー貯めを続行する

 <注意点>
RoundStateの使い方がこれまでと違うのは、これまで通りだと、パワー貯め中に戦闘終了すると、
条件が合わなくなり、延々とパワーを貯め続けてしまうためである


-----------------------------------------------------------------------------------------
 <シールド>
上級者用パッチを和訳KFMに当てると、追加される

Before
-------------------------------
;シールド(上級編用)
[State -1, Shield]
type = ChangeState
value = 701
triggerall = command = "z"
trigger1 = ctrl = 1
-------------------------------

after
-------------------------------
;投げ以外、全対応。受付時間は短く、連続シールドは不可っぽい
;シールド(上級編用)
[State -1, Shield]
type = ChangeState
value = 701
triggerall = var(59) = 1 && RoundState = 2
triggerall = ctrl && stateno != [701,702]
triggerall = EnemyNear,Facing != Facing
trigger1 = random <=20 || enemynear,HitDefAttr = SCA,NA,SA,HA
trigger1 = p2movetype = A || enemynear,movetype = A || InGuardDist
trigger2 = InGuardDist || enemynear,NumProj != 0
trigger2 = P2BodyDist X >= 90 || statetype = A
trigger2 = random <=40
-------------------------------

 概要
ようするに、相手が攻撃中、または自分がガード可能状態にあるなら、低確率でシールド
また、相手が離れてたり、自分が空中にいるなら、それなりの確率でシールドって意味

 <注意点>
シールドは投げには無効
それを判別するためのトリガーが「enemynear,HitDefAttr = SCA,NA,SA,HA」
(HitDefAttrには「!=」が適用されないので、記述する際には注意)
なのだが、これが判別されるのは、相手のhitdefが起動してる時のみである
そのため、これをallに入れると、反応が遅れ、シールドに失敗する可能性が高くなる
だから、&& ではなく||を使用している
これで、出の遅い攻撃には高確率で、出の速い攻撃や投げ技には低確率でシールドを使うようになる
(敵の行動を参照するトリガーは数少なく、不確かなものが多い
そのため、完全な対応は期待出来ないので、こうするのがベター)

「EnemyNear,Facing != Facing」は『相手と向いている方向が違う=向き合っている』かどうかを
判定するトリガー、一対一の試合であれば不要なのだが、タッグ戦の時こちらに背を向けて
仲間を攻撃している対戦相手に、延々無駄なシールドを繰り返す可能性があるので
このトリガーも入れておく方が良いだろう、当て身や避け動作、無敵移動なんかも同様

また「7:StCommonを弄った立ち回りの制御」の、ガードの項目に記載されている
ジャンプによる投げの回避と併用するならば、シールドの記述をそれより下に置くことで
先に投げを回避するためのジャンプ行動が判定されるので、より安心だろう
最終更新:2014年06月24日 16:48