7:StCommonを弄った立ち回りの制御(ガード&エアリアルも含む)

歩き、ダッシュ、バックステップ、ジャンプ、ガード
これらはをAIにさせるには、commonファイルに手を加える必要がある

まず、DFEファイルを開き、

Cns = kfm.cns ;基本ステータス情報ファイルの登録
St = kfm.cns ;動作プログラムファイルの登録(最大10個くらい増やせます(St,St0,St1,St2......))
StCommon = common1.cns ;コモン動作プログラムファイルの登録

のファイル名をチェック
該当するファイルをエディッタで開き、下記のステート番号を検索する

「ステート番号100」=「stateno = 100」= 「stetadef 100」

ステート番号20 :歩き
ステート番号40 :ジャンプ
ステート番号100:ダッシュ
ステート番号105:バックステップ
ステート番号120:ガード

基本的に、common1.cnsにのみに記述があるが、キャラによっては、Stの方にも存在することがる
(stとcnsは、stの方が優先順位が高いので、ステート番号が重複した場合、stの方が優先される)

優先順位の高いほうのステートを書き換えることになる

 <注意点>
common1.cnsに書かれた、コモンステートとも呼ばれるステートは、特殊な処理がされている
特に歩きやガード関係は複雑で、筆者も正確には把握していない
よって、下記の記述全て、間違ってる可能性があるので独自に動作&挙動テストして「検証」すること

また「common1.cns」がキャラのフォルダに存在しない場合、mugen本体のdataフォルダにある、同名のファイルを、
キャラのフォルダにコピペして、それを開いて書き換えること
間違っても、mugen本体にあるのを直接、書き換えないように


<歩きの制御>

ステート番号20を検索して、

[State 20, 1]
type = VelSet
trigger1 = command = "holdfwd"
x = const(velocity.walk.fwd.x)

[State 20, 2]
type = VelSet
trigger1 = command = "holdback"
x = const(velocity.walk.back.x)

と「command」をtriggerとした部分を見つける
それを、

[State 20, 1]
type = VelSet
triggerall = var(59) = 0
trigger1 = command = "holdfwd"
x = const(velocity.walk.fwd.x)

[State 20, 2]
type = VelSet
triggerall = var(59) = 0
trigger1 = command = "holdback"
x = const(velocity.walk.back.x)

と書き換える
(完全制御しないなら、これはそのままでも良い)

続いて、該当箇所をコピペして、それをこれまでで学んだ手順でAI用に書き換える
(学んでない部分は後述)


Before

[State 20, 1]
type = VelSet
trigger1 = command = "holdfwd"
x = const(velocity.walk.fwd.x)

[State 20, 2]
type = VelSet
trigger1 = command = "holdback"
x = const(velocity.walk.back.x)


after

[State 20, 1]
type = VelSet
triggerall = var(59) = 0
trigger1 = command = "holdfwd"
x = const(velocity.walk.fwd.x)

[State 20, 2]
type = VelSet
triggerall = var(59) = 0
trigger1 = command = "holdback"
x = const(velocity.walk.back.x)

[State 20, 1]
type = VelSet
triggerall = var(59) = 1 && RoundState = 2
trigger1 = p2statetype != L && P2BodyDist X >= 0
trigger2 = p2statetype = L && P2BodyDist X > 75
x = const(velocity.walk.fwd.x)

[State 20, 2]
type = VelSet
triggerall = var(59) = 1 && RoundState = 2
trigger1 = p2statetype = L && P2BodyDist X < 65
x = const(velocity.walk.back.x)

type = velsetのステートコントローラーは「速度」を変更するためのもの
(詳細はググって、見つかったステート一覧の、説明文を参照すること。他も同様)


概要1 state 20,1
相手がダウン中以外で、密着状態以外の場合「前進」する
また、相手がダウン中でも、一定距離より遠いなら「前進」する

概要2 state 20,2
相手がダウン中で、一定間合いより近いなら「後退」する

総合すると、優先順位と処理順の関係で、距離が65~75の範囲より遠いと近づき、近いと遠ざかるようになる
(移動速度が極端に速いキャラなら、60~80などと、範囲を広げる必要がある)

ただし、これだけだとモーションに不具合が出るので、

[State 20, 5]
type = ChangeState
trigger1 = vel X = 0
value = 0
ctrl = 1

のステートコントローラーを「velset」より下方に追加。最終的に、

[State 20, 1]
type = VelSet
triggerall = var(59) = 0
trigger1 = command = "holdfwd"
x = const(velocity.walk.fwd.x)

[State 20, 2]
type = VelSet
triggerall = var(59) = 0
trigger1 = command = "holdback"
x = const(velocity.walk.back.x)

[State 20, 1]
type = VelSet
triggerall = var(59) = 1 && RoundState = 2
trigger1 = p2statetype != L && P2BodyDist X >= 0
trigger2 = p2statetype = L && P2BodyDist X > 75
x = const(velocity.walk.fwd.x)

[State 20, 2]
type = VelSet
triggerall = var(59) = 1 && RoundState = 2
trigger1 = p2statetype = L && P2BodyDist X < 65
x = const(velocity.walk.back.x)

[State 20, 5]
type = ChangeState
trigger1 = vel X = 0
value = 0
ctrl = 1

となる

 <注意点>
これらは、ステート番号20にいる時のみ作用する
COM(AIでは無い)がステート20番に移動する条件は不明
AIで、制御する場合、statedef -1や-3にAI用コマンドを追加する必要がある



;立ち回り用・歩き
[State -1, Walk]
type = ChangeState
value = 20
triggerall = var(59) = 1 && RoundState = 2
trigger1 = statetype != A
trigger1 = ctrl && stateno != 20
trigger1 = random <= 100
ctrl = 1

など

概要
stateno != 20は、ステート20がctrl=1のために入れてある。これが無いとループする
この記述の追加位置は「statedef-1(-3)」の圏内なら、何処でも良いが、優先順位を考慮して決定する事
(圏内は、statedefとstatedefの間を示す)

また、タメ技の多いキャラの場合、タメてるっぽく見せるために、優先順位を低くするか、いっそ記述しないことをお勧めする
さらに、タメ技の条件に「stateno!=20」を入れておくとなお良い
(歩きサマーなどが出なくなる。また同様の理由で「steteno!=100」も入れておくと良い)
ただし、その場合、歩きに移行する条件に、
 p2movetype !=Aを入れて置かないと、サマー自体を殆ど出さなくなる可能性がある
(上記した条件だと、高確率で、歩き状態=ステート20番にいることになるため)

 <注意点>

type = ChangeState

は、valueで指定したステート番号にジャンプ(移動)するためのステコン
上記の場合は、ステート0(棒立ち状態)に戻るようにしてる
var(59)などが無いのは「vel X=0」の状況は、AI起動時にしかありえないため

最後の行の「ctr=1」は保険。statedef 20,40,100,105は、デフォルトでctrlが1になる仕様のはずだが、念のため



<ジャンプの制御>

statedef -1(-3)の影響圏内の、任意の場所に、

;立ち回り用・ジャンプ
[State -1, jump]
type = ChangeState
value = 40
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && ctrl
trigger1 = p2statetype = A && p2movetype = H
trigger1 = P2BodyDist X = [0,90]
trigger1 = enemynear,vel Y = [-1,1]
ctrl = 1

を追加

概要
エアリアル派生用
相手がやられ状態で一定の高度以上に上昇中、至近距離で浮いてるときに、ジャンプする

ステート番号40に移動した時点で。ジャンプは確定する
たんにジャンプさせたいだけなら、これで十分。

だが、垂直ジャンプ、前方ジャンプ、後方ジャンプと使い分けるなら、
[statedef 40]に手を加える必要がある

 <注意点>

enemynear,vel Y = [-1,1]

にカンフーアッパーで浮かした場合、自分が動けるようになるころ、相手の状態がこれに該当する
結果的に「カンフーアッパー→ジャンプ」が成立する
また、スマッシュカンフーアッパーも該当するように思えるが、自分が動けるようになる頃は、相手は落下中になるため、
結果的に「スマッシュカンフーアッパー→ジャンプ」は成立しないことになる

そして、前の章で組んでいたエアリアルの条件とも重なるので、、
「カンフーアッパー→ジャンプ→空中弱パンチ→空中強パンチ」のエアリアルが成立することになる

ステート40番を書き換える場合「歩き」の時と同様に「[statedef 40]」を検索して、
優先順位の高い方の「command」を含むステコン(ステートコントローラー)を検出する

[State 40, 2]
type = VarSet
trigger1 = command = "holdfwd"
sysvar(1) = 1

[State 40, 3]
type = VarSet
trigger1 = command = "holdback"
sysvar(1) = -1

検出したら、それを例のごとく、

[State 40, 2]
type = VarSet
triggerall = var(59) = 0
trigger1 = command = "holdfwd"
sysvar(1) = 1

[State 40, 3]
type = VarSet
triggerall = var(59) = 0
trigger1 = command = "holdback"
sysvar(1) = -1

[State 40, 2]
type = VarSet
triggerall = var(59) = 1 && RoundState = 2
trigger1 = BackEdgeBodyDist <= 20 && (p2statetype = L || (p2statetype !=A && p2movetype != A))
trigger2 = p2statetype != A && p2movetype != H
trigger3 = p2statetype = A && p2movetype = H
sysvar(1) = 1

[State 40, 3]
type = VarSet
triggerall = var(59) = 1 && RoundState = 2
trigger1 = p2statetype = L && BackEdgeBodyDist > 20 && enemynear,NumProj = 0
sysvar(1) = -1

と書き換え&書き加える

 概要1 State 40, 2
前方にジャンプする
攻撃を飛び超えたり、追いかけてエアリアルを仕掛ける状況を想定した条件
または、画面端に追い詰められた時の脱出用

 概要2 State 40, 3
相手が近くで転倒していて、後方に空きがあるなら、後方にジャンプする
起き上がりカウンターを避けるために間合いをとる状況を想定した条件

それ以外の場合は、垂直にジャンプする

 <注意点>
enemynear,NumProj = 0は、相手が飛び道具を撃ってない時を意味する
(飛び道具に対して、バックジャンプすると、高確率で当たりにいくことになるので、それを防ぐため)

条件的に、相手がダウンしていても、相手の近くにいる状態だと、前方ジャンプが優先される
だが、varsetで同じvarを使用しているため、優先順位が低くとも、
後から適用された方が、varを上書きするため、結果的に、後方ジャンプが優先され、問題なしとなっている

これらは、statedef40にいる状態にのみ適用される
そのため、上記した「立ち回り用・ジャンプ」の条件だと、概要1のエアリアルしか成立しない
(ただし、COMがアトランダムで飛ぶ時に成立する可能性はある)

よって「立ち回り用・ジャンプ」の条件を、

triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && ctrl
trigger1 = p2statetype = A && p2movetype = H
trigger1 = P2BodyDist X = [0,90]
trigger1 = enemynear,vel Y = [-1,1]

から

triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && ctrl
triggerall = P2BodyDist X = [0,90]
trigger1 = p2statetype = A && p2movetype = H
trigger1 = enemynear,vel Y = [-1,1]
trigger2 = BackEdgeBodyDist <= 20 && p2statetype = L && random <=100

に、変更する

これで、画面端に追い詰められたときに、相手をダウンさせたら、ジャンプで飛び越えるようになる

 <注意点>
概要2の条件を無視してるのは、後述の「バックステップ」を優先させるため

「立ち回り用・ジャンプ」の条件と、ステート40番に記した条件が違うのは、
現状では、COMがたまに、勝手にジャンプするので、それに対応するためである

また、2段ジャンプやエアダッシュなどは、キャラにより千差万別なので割愛する
(要領は同じようなもの)
それに、設定しなくても、ランダムに繰り出すことで、それが予想外の効果を上げることもある
なんでも制御すれば良いとは限らない
あえて未設定にして「運」に任せるのも良いと思う

ジャンプを完全に制御する場合、ステート40番に、changestateのステコンを追加して、
意図した条件以外なら、自動的にstateno=0に移動するようにすれば良い

そこまですると、意外性が無くなるので、お勧めはしないが、一応方法を記述しておく
まず、ステート40番を参照して、

; Jump Start
[Statedef 40]
type = S
physics = S
anim = 40
ctrl = 0
sprpriority = 1

[State 40, 1]
type = VarSet
trigger1 = Time = 0
sysvar(1) = 0

のanimeを消して、

; Jump Start
[Statedef 40]
type = S
physics = S
ctrl = 0
sprpriority = 1

[State 40, 0]
type = ChangeState
triggerall = var(59) = 1 && RoundState = 2
triggerall = time = 0
triggerall = sysvar(1) != 0
trigger1 = P2BodyDist X >= 50 || enemynear,NumProj != 0
trigger2 = p2statetype != A && p2movetype != H
trigger3 = p2statetype = A && p2movetype = H
value = 0
ctrl = 1

[State 20, 4]
type = ChangeAnim
trigger1 = time = 0
value = 40

の「ChangeState」と「ChangeAnim」の二つを追加する
ただし、追加する場所は、直下ではなく、

; Jump Start
[Statedef 40]
type = S
physics = S
ctrl = 0
sprpriority = 1

[State 40, 1]
type = VarSet
trigger1 = Time = 0
sysvar(1) = 0

[State 40, 2]
type = VarSet
triggerall = var(59) = 0
trigger1 = command = "holdfwd"
sysvar(1) = 1

[State 40, 3]
type = VarSet
triggerall = var(59) = 0
trigger1 = command = "holdback"
sysvar(1) = -1

[State 40, 2]
type = VarSet
triggerall = var(59) = 1 && RoundState = 2
triggerall = P2BodyDist X >= 15
trigger1 = BackEdgeBodyDist <= 20 && (p2statetype = L || (p2statetype !=A && p2movetype != A))
trigger2 = p2statetype != A && p2movetype != H
trigger3 = p2statetype = A && p2movetype = H
sysvar(1) = 1

[State 40, 3]
type = VarSet
triggerall = var(59) = 1 && RoundState = 2
trigger1 = p2statetype = L && BackEdgeBodyDist > 20 && enemynear,NumProj = 0
sysvar(1) = -1

[State 40, 0]
type = ChangeState
triggerall = var(59) = 1 && RoundState = 2
triggerall = time = 0 && vel Y = 0
triggerall = sysvar(1) != 0
trigger1 = P2BodyDist X >= 80 || enemynear,NumProj != 0
value = 0
ctrl = 1

[State 20, 4]
type = ChangeAnim
trigger1 = time = 0
value = 40

[State 40, 4]
type = VelSet
trigger1 = AnimTime = 0
x = ifelse(sysvar(1)=0, const(velocity.jump.neu.x), ifelse(sysvar(1)=1, const(velocity.jump.fwd.x), const(velocity.jump.back.x)))
y = const(velocity.jump.y)

[State 40, 5]
type = VelSet
trigger1 = AnimTime = 0
trigger1 = prevstateno = 100 ;RUN_FWD
trigger1 = sysvar(1) = 1
x = const(velocity.runjump.fwd.x)

[State 40, 6]
type = ChangeState
trigger1 = AnimTime = 0
value = 50
ctrl = 1

とする
(優先順位の調整のため)

概要

triggerall = sysvar(1) != 0

の時点で、上記の条件は満たされて無い
で、エアリアルを行うのに、間合いが離れすぎてたら意味が無いので、

trigger1 = P2BodyDist X >= 80

が条件に入る

これで、エアリアル。相手の飛び越超え、ダウン対策以外の状態では、ジャンプしなくなる

 <注意点>
ステート0番に飛ばすためのchangestateを、velsetより下には置かないこと
なぜなら、それをやると、空中に立つことになるため
(vel Y =0で保険をかけているが、それでも、下に記述すると条件的に、機能しなくなるため)

またchangeanimをchangestateより下にしているのは、ジャンプキャンセル時に、
モーションがおかしくなるのを防ぐため

enemynear,NumProj != 0は、後述する、ジャンプで飛び道具を避ける場合のもの

 <警告>
繰り返すが、ジャンプの完全制御はお勧めしない
理由は2点
ひとつは、意外性が無くなること。
もうひとつは、予期せぬ不具合が出る可能性があるため。
特に後者は重要で、筆者も「仕様」を正確には把握していない。だから、お勧めしていないのだ
また、2段ジャンプは考慮していない
あくまでも「参考」程度に考えて欲しい


<ダッシュの制御>

Before

;ダッシュ
[State -1, Dash]
type = ChangeState
value = 100
trigger1 = command = "FF"
trigger1 = statetype = S
trigger1 = ctrl

after

;立ち回り用・ダッシュ
[State -1, Dash]
type = ChangeState
value = 100
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && ctrl
triggerall = P2BodyDist X >= 80 && stateno != 100
trigger1 = p2movetype = I && random <=50
trigger2 = p2movetype = H
ctrl = 1


概要
ある程度離れた位置にいる相手が、何もしてないなら低確率でダッシュして近づく
同様に、相手が食らい中であるなら、ダッシュで近づく

 <注意点>
ダッシュのステートは、ジャンプや歩き同様に、ctrl=1が基本なので、

stateno != 100

を入れておかないと、ループする

 <注意点>
ダッシュの性質によって、使い方が異なるので、それに応じて条件を変更すること
(KFMの場合は、このままで良い)

また、このままでは挙動がおかしくなるので、ステート100番に手を加える必要がある
ただし、ダッシュではなく、フロントステップ(前小ジャンプ)の場合は、書き換える必要はない

ステート100番を内包するファイルをエディッタで開き、、

; RUN_FWD
[Statedef 100]
type = S
physics = S
anim = 100
sprpriority = 1

を検索
続いて「command」を内包するステコンを検出する

[State 100, 4]
type = ChangeState
trigger1 = command != "holdfwd"
value = 0

それを、

[State 100, 4]
type = ChangeState
triggerall = var(59) = 0
trigger1 = command != "holdfwd"
value = 0

[State 100, 4]
type = ChangeState
triggerall = var(59) = 1
trigger1 = P2BodyDist X < 0
trigger2 = p2movetype = A
trigger3 = RoundState != 2
value = 0

と、書き換え&書き足しする

ダッシュは、そのステートに飛んだ時点で走り出し、キーから手を離すと止まるようになってる場合が多い
そこで、特定の条件以外では止まらないようにしたのが上記の記述となる

概要
相手に密着、または通り抜けたらダッシュを中断する
それか、相手が攻撃してきたらダッシュを中断する

 <注意点>
RoundStateの扱いが、これまでと異なるのは、用途が違うため
ようするに、戦闘中以外=戦闘終了時には、強制的にダッシュを中断させるためである
(いつものように記述してると、ダッシュ中に戦闘終了すると、条件が満たされなくなるので、
 延々と走り続ける事になる)


<バックステップの制御>

Before

;バックステップ
[State -1, Back Step]
type = ChangeState
value = 105
trigger1 = command = "BB"
trigger1 = statetype = S
trigger1 = ctrl

after

;立ち回り用・;バックステップ
[State -1, Back Step]
type = ChangeState
value = 105
triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && ctrl
triggerall = P2BodyDist X < 50 && BackEdgeBodyDist > 50
trigger1 = p2statetype = L && life >= lifemax / 2
ctrl = 1


 概要
敵が近くでダウン中で、背後に退けるだけの空間があるなら、バックステップする
ただし、ライフに余裕があるなら起き攻めのために、バックステップしない

 <注意点>
BackEdgeBodyDistが無いと、余裕も無いのにバックステップして、逆に隙だらけとなる
ただし、バックステップに無敵時間があるなら、余裕の有無を確かめなくても良い
(とうぜん、KFMのバックステップに、無敵時間など無いので、余裕は必須)


 <ガード>
ガードは、mugenの仕様のため、特殊な処理が行われている
そのため、下記の記述でも、予期せぬ不具合が起きる可能性があるので、それを予め留意しておくこと
また、AI用にわざわざ記述しなくても、mugenの仕様により、ある程度はガードしてくれるので、
記述しないでおくのも悪くは無い
(その場合、mugen本体の「コンフィグ」で設定したLVによってガード率が決まる)


;ガード
[State -1, guard]
type = ChangeState
value = 120
triggerall = var(59) = 1 && RoundState = 2
triggerall = ctrl && stateno != [120,155]
trigger1 = random <=700
trigger1 = p2movetype = A || enemynear,movetype = A || InGuardDist
trigger2 = p2movetype = A || enemynear,movetype = A || InGuardDist || enemynear,NumProj != 0
trigger2 = P2BodyDist X >= 90 || statetype = A


 概要

共通条件:AI起動中。戦闘中。操作可能なとき
条件1:相手が攻撃中か、攻撃をガードできる範囲にいる場合に、高確率でガードする
条件2;相手が攻撃中か、攻撃をガードできる範囲にいる場合か、相手が飛び道具を出してる場合で、
ある程度距離が離れてるか、空中にいるならガードする

 <注意点>
mugenではデフォルトで、空中ガードが存在するが、キャラによっては、存在しないのもいる
その場合、triggerallにstatetype != Aを追記すること
(また、そういう場合、ガードステート自体、オリジナルの場合が多い。
 なので、理解しないまま下手に弄ると不具合が起きる可能性が高いので、理解出来るまでは、
 手を付けないこと)

p2movetype = Aとenemynear,movetype = Aは、同じ様な意味だが、念のために両方を記述
「NumProj」は飛び道具の数を算出出来るが、helperは含まない
(ようするに、判別出来ない種類の飛び道具があるということ)

条件2に、randomを入れて無いのは、空中にいる&離れている状態は、人間でもガードはたやすい為
また、対全画面攻撃に対抗するためでもある
(全画面多段攻撃にrandomが入ってると、ガードしても、途中で食らうことがある)

「stateno != [120,155]」は、ガード中以外んぼ意味で、不具合避けの保険である、
ctrlがあるから、除外しても良いが、念のため記述しておいた方が良いと思う

 ステート120番は、ガードのスタートを意味し、その時の状態に応じて、
立ちガード、屈みガード、空中ガードと分岐する
立ち状態なら、立ちガード
屈み状態なら、屈みガード
空中状態なら、空中ガード
となる

そのため、ガード状態を任意で変更するには、キャラの体勢を変更させる必要がある
もしくは、ステート120番の記述に直接手を加える必要がある

だが、それらはかなり繊細な問題なので、この講座では省略する

個人的にいうなら、上記程度の記述でも、記述する位置を考えて、優先順位を旨く使えば十分な性能を発揮する
立ち下段や、中段などの特殊な攻撃は防げ無いが、それはある意味人間も同じなので、
完全に防ぐ必要は無いはずだ。
それに、前述した「シールド」などの、ガードに変わる手段があることも多く、
ガチガチに対策する必要など無い、と思う

また、飛び道具や投げに対しても、ジャンプのトリガーに、

trigger3 = p2statetype != A && p2BodyDist >= 80 && enemynear,NumProj != 0
trigger3 = random <= 100
trigger4 = p2statetype != A && enemynear,HitDefAttr = SC,NT,ST,HT
trigger4 = random <= 700 && P2BodyDist X = [-20,80]

を加えて、

triggerall = var(59) = 1 && RoundState = 2
triggerall = statetype != A && ctrl
trigger1 = P2BodyDist X = [0,90]
trigger1 = p2statetype = A && p2movetype = H
trigger1 = enemynear,vel Y = [-1,1]
trigger2 = BackEdgeBodyDist <= 20 && p2statetype = L && P2BodyDist X = [0,90]
trigger3 = p2statetype != A && p2BodyDist >= 80 && enemynear,NumProj != 0
trigger3 = random <= 100
trigger4 = p2statetype != A && enemynear,HitDefAttr = SC,NT,ST,HT
trigger4 = random <= 700 && P2BodyDist X = [-20,80]

とすることで、ジャンプして飛び道具や投げ技を回避することも可能となる
(飛び道具は、直線的な飛び道具を想定してるので、状況しだいでは裏目にでることもある
 そのため、確率を低く設定してある)

 <注意点>
相手が地上限定で、あるていど距離が離れてることを条件にしてるのは、
近いと跳び越す前に命中する可能性が高いため
逆に、投げに対して確率を上げてあるのは、投げ技の回避は成功率が元々低いためである
(mugenの仕様上、どうしても低くなる)

また、ジャンプ、シールド、ガードの三つは、条件が重なりやすいので、優先順位を考慮して、配置すること


 <優先順位の纏め>

これまでの記述を、(筆者が)理想とする優先順位順に並べると、

「三烈カンフー突き手」
「スマッシュカンフーアッパー」
「速いカンフーアッパー」
「投げ」
「ジャンプ」
「ダッシュ」
「カンフーアッパー(弱)」
「歩き」
「ガード」
「カンフー突き手(強)」
「シールド」
「屈み強パンチ」
「バックステップ」
「パワー貯め」
「屈み弱キック」
「カンフー蹴り(弱)」
「立ち弱パンチ」
「立ち強パンチ」
「屈み弱パンチ」
「屈み強キック」
「板投げ(弱&強)」
「空中弱パンチ」
「空中強パンチ」
「空中弱キック」
「空中強キック」

となる

位置を下げれば、当然確率は落ちる
逆に、上げれば確率は上がる

後は、実際に戦わせて、挙動を確認して、微調整していけば良い

 <注意点>
アッパーなどのカウンター系は、ガードとかより上に記述すること
飛び道具の優先順位は最低でも良い
ただし、キャンセルして飛び道具に繋げる場合は、キャンセル元より上に記述する必要がある
キャンセルの条件が重複する場合、キャンセル元を下に記述すれば、
優先順位の関係上旨く機能することが多い

立ちキック(弱&強)が無いのは、AIに使わせる必要なしと判断したため
ヴァリエーションのために、増やしたいなら、これまでの講座を参考に、自力で組んでみること

また「受け身」に関しては、相手の状況によって異なるの場合が多く、
ガード以上に、記述しなくても、自動にで受身をとる確率が高いので不要と判断する
(ステート5200番が、それに当たるが微妙に挙動が怪しいので、保留とする)


<<前の前へ <前へ 7:StCommonを弄った立ち回りの制御(ガード&エアリアルも含む)