歩き、ダッシュ、バックステップ、ジャンプ、ガード
これらはを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を弄った立ち回りの制御(ガード&エアリアルも含む)
最終更新:2014年06月21日 17:07