歩き、ダッシュ、バックステップ、ジャンプ、ガード これらはを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番が、それに当たるが微妙に挙動が怪しいので、保留とする) ---- [[<<前の前へ>5:良く使われるトリガー]] [[<前へ>6:AIのサンプル]] 7:StCommonを弄った立ち回りの制御(ガード&エアリアルも含む)