MUGEN ( フォント環境:MS ゴシック 標準 サイズ10 )   超簡易AIの手引き byADI  AIが入っていないキャラに   とりあえず動くAIがほしい、といった方や、   簡単なAIでいいから作りたい、という方のための話。  用語は極力省こうとしますが、分からない場合は各自調べてください。  MUGEN本体云々に関する話とかも。  本当に簡単なAIですので、「〜がしたい」「〜をさせたい」だとかは   AIの手引きを見るか、別の方のAI講座を見たり、   トリガー情報を見て自分で考えたりして  別に覚えてください。  あと複雑なキャラクターは制御しきれませんし、   強さもAIの入っていないものに毛が生えた程度です。  Watchモードなど、MUGENのAIを起動した状態でしか上手く動きません。 ■AI専用キャラファイルを作る。  まず、AIを作りたいキャラのファイルをコピーしそのコピーをAI専用キャラにします。  AI専用にするコピー側に「 AI- 」とファイル名の前につけておきましょう。   「 AI-*フォルダ名* 」という感じです。  次にselect.defへ、AI専用にするファイルを登録します。 ( .Defファイル名まで指定する形での登録です。 )  何度も確認するので、先頭に置くといいかもしれません。  これで、AI専用キャラの登録が完了しました。 ■Cmdファイルを開く  大抵.Cmdの拡張子ですが、見当たらない場合は.Defファイルを開き   [Files]の設定で指定されている cmd = **.xx ←のファイルをテキストソフトで開きます。  ファイルを開いたら[Statedef -1]を検索(Ctrl+F)し、どこにあるか調べてください。  そこから下に記されている記述が「コマンド入力がされた時技を出させる記述」です。  分かりやすく言うと、ここでパンチやキックを始動させて、攻撃をおこなっています。  そして Trigger〜 で始まる行の中にある、コマンド入力の条件である   「 Command = "****" 」の記述を一つ一つ変えていくことで簡単なAIを作ります。 ■動作の確認  Command = "****"を変えていくわけですが、どの技のコマンドなのかを確認するため   1つだけ Command = "****" の部分を( 1 )に差し替えて、   トレーニングモードでキャラを読み込んでください。  既に試合画面ならShift+F4で読み込みなおせます。  レバーやボタンに触れずキャラが何かの動作をした場合、   その動作が差し替えたCommand = "****"の動作です。  どんな技なのか確認しておきましょう。  何もしない場合は、差し替えたCommandの前後にCommandが無いか確かめて、   あるならそれも差し替えて、再度確認してください。(並んでいるTriggerの行など)  近くにCommandが無かったり、差し替えても何もしない場合は、   レバーで屈んだりジャンプしたりダッシュしたり、適当に動かしてみて、   技を出してくれないかを確認しましょう。  それでも何にも変化が無い場合それは「特殊な技」です。  奇妙な動作を行う場合は、残念ですが封印しましょう。( 1 )を( 0 )に変えてください。  技を確認したら↓にある条件から一つ選んで、確認の為の( 1 )と差し替え確認します。   二つ以上のCommandを( 1 )にしていても、差し替えるのは1つだけで構いません。  条件が決まったら次のCommandを( 1 )にして確認し、   また条件を確認して差し替えていくの繰り返しです。  既に差し替えている技が気になる場合は TriggerAll = 0+0  という行を差し替えた行の手前に置くと使わなくなります。  全て差し替え終えたら「TriggerAll = 0+0」を検索して削除する形です。 ■条件の設定  条件は()をコピー&ペーストで差し替えましょう ;地対地上用 ( RoundState = 2 && Random < 100 && P2Dist Y > -10 && P2BodyDist X = [-20,10] );地対地 密着 ( RoundState = 2 && Random < 100 && P2Dist Y > -10 && P2BodyDist X = [-10,30] );地対地 近距離 ( RoundState = 2 && Random < 100 && P2Dist Y > -10 && P2BodyDist X = [-10,60] );地対地 近距離〜中距離 ( RoundState = 2 && Random < 100 && P2Dist Y > -10 && P2BodyDist X = [ 30,90] );地対地 中距離 ( RoundState = 2 && Random < 100 && P2Dist Y > -10 && P2BodyDist X = [60,120] );地対地 中距離〜遠距離 ( RoundState = 2 && Random < 100 && P2Dist Y > -10 && P2BodyDist X > 120 );地対地 遠距離 ;地対空中用 ( RoundState = 2 && Random < 100 && P2Dist Y < -10 && P2Dist Y > -100 && P2BodyDist X = [-20,10] );地対空 密着 ( RoundState = 2 && Random < 100 && P2Dist Y < -10 && P2Dist Y > -100 && P2BodyDist X = [-10,30] );地対空 近距離 ( RoundState = 2 && Random < 100 && P2Dist Y < -10 && P2Dist Y > -100 && P2BodyDist X = [-10,60] );地対空 近距離〜中距離 ( RoundState = 2 && Random < 100 && P2Dist Y < -10 && P2Dist Y > -100 && P2BodyDist X = [ 30,90] );地対空 中距離 ( RoundState = 2 && Random < 100 && P2Dist Y < -10 && P2Dist Y > -100 && P2BodyDist X = [60,120] );地対空 中距離〜遠距離 ( RoundState = 2 && Random < 100 && P2Dist Y < -10 && P2Dist Y > -100 && P2BodyDist X > 120 );地対空 遠距離 ;空対地用 ( RoundState = 2 && Random < 100 && P2Dist Y > 20 && P2Dist Y < 50 && P2BodyDist X = [-20,10] );空対地 密着 ( RoundState = 2 && Random < 100 && P2Dist Y > 20 && P2Dist Y < 50 && P2BodyDist X = [-10,30] );空対地 近距離 ( RoundState = 2 && Random < 100 && P2Dist Y > 20 && P2Dist Y < 50 && P2BodyDist X = [-10,60] );空対地 近距離〜中距離 ( RoundState = 2 && Random < 100 && P2Dist Y > 20 && P2Dist Y < 50 && P2BodyDist X = [ 30,90] );空対地 中距離 ( RoundState = 2 && Random < 100 && P2Dist Y > 20 && P2Dist Y < 50 && P2BodyDist X = [60,120] );空対地 中距離〜遠距離 ( RoundState = 2 && Random < 100 && P2Dist Y > 20 && P2Dist Y < 50 && P2BodyDist X > 120 );空対地 遠距離 ;空対空用 ( RoundState = 2 && Random < 100 && P2Dist Y > -50 && P2Dist Y < 20 && P2BodyDist X = [-20,10] );空対空 密着 ( RoundState = 2 && Random < 100 && P2Dist Y > -50 && P2Dist Y < 20 && P2BodyDist X = [-10,30] );空対空 近距離 ( RoundState = 2 && Random < 100 && P2Dist Y > -50 && P2Dist Y < 20 && P2BodyDist X = [-10,60] );空対空 近距離〜中距離 ( RoundState = 2 && Random < 100 && P2Dist Y > -50 && P2Dist Y < 20 && P2BodyDist X = [ 30,90] );空対空 中距離 ( RoundState = 2 && Random < 100 && P2Dist Y > -50 && P2Dist Y < 20 && P2BodyDist X = [60,120] );空対空 中距離〜遠距離 ( RoundState = 2 && Random < 100 && P2Dist Y > -50 && P2Dist Y < 20 && P2BodyDist X > 120 );空対空 遠距離 ;回避動作用 ( RoundState = 2 && Random < 100 && P2MoveType = A );相手攻撃動作中 ( RoundState = 2 && Random < 100 && InGuardDist );ガード可能時 ;特殊な技や上に当てはまらない場合。 ( RoundState = 2 && Random < 100 );確率のみ ■条件をより限定する  〜の時にしか使って欲しくない、〜の時には使わないで欲しい場合の条件設定です。  条件は1行ずつをコピーして、新しく行を追加します。 ( Commandを差し替えた行の前辺りがいいと思います。 ) ;確率調整 TriggerAll = Random < 100 ;低確率にする TriggerAll = Random < 10 ;超低確率 TriggerAll = Random < 1 ;滅多につかわない。 ;攻撃命中関係 TriggerAll = MoveContact ;攻撃が相手に当たったときのみ TriggerAll = !MoveContact ;攻撃が当たっていない TriggerAll = MoveHit ;攻撃がヒットしたときのみ(ガードされなかった) TriggerAll = MoveGuarded ;攻撃がガードされたときのみ ;相手の動作関係 TriggerAll = P2StateType = L ;相手倒れ中 TriggerAll = P2StateType != L ;相手倒れ中でない。 TriggerAll = P2MoveType = H ;相手くらい中 TriggerAll = P2MoveType != H ;相手くらい中でない。 ;パワーゲージ関係 TriggerAll = Power >= 1000 ;ゲージ1本以上 TriggerAll = Power >= 2000 ;ゲージ2本以上 TriggerAll = Power >= 3000 ;ゲージ3本以上 TriggerAll = Power >= PowerMax ;ゲージ満タン ;バックステップ用 TriggerAll = BackEdgeBodyDist > 30 ;後ろが壁でない  〜〜の技から〜といった限定コンボの条件はちょっと難しいので割愛。  こうした条件を全て決め終わりましたら、超簡易AIの完成です。 ■ガードを固くする。  実際に戦わせてみてガードが甘いと感じた場合は、  以下の記述を、[StateDef -1]のすぐ下(他の記述より上)におきましょう。 [State -1, Guard];ガード Type = ChangeState Value = 120 TriggerAll = Ctrl && MoveType != A TriggerAll = InGuardDist Trigger1 = Random < 500 ;;;;; (1); ;追記 ; どの技が出るのか大体分かるのなら ; Command=""を消さずに↓を入れる、という方法も可。↑でも構いませんが。 || Random < 50 || !Ctrl && Random < 200 ;Commandの横に追加する感じ || Random <800 ;二つ以上Commandがある場合の二つ目移行 &&0 ;技を封印したい場合 ;&&などでCommand以外の条件と一緒になっている場合は、「(Command="****" || Random < 50〜)」という感じで()で囲いましょう。 ;地対地上用 TriggerAll = ( RoundState = 2 && P2Dist Y > -10 && P2BodyDist X = [-20,10] );地対地 密着 TriggerAll = ( RoundState = 2 && P2Dist Y > -10 && P2BodyDist X = [-10,30] );地対地 近距離 TriggerAll = ( RoundState = 2 && P2Dist Y > -10 && P2BodyDist X = [-10,60] );地対地 近距離〜中距離 TriggerAll = ( RoundState = 2 && P2Dist Y > -10 && P2BodyDist X = [ 30,90] );地対地 中距離 TriggerAll = ( RoundState = 2 && P2Dist Y > -10 && P2BodyDist X = [60,120] );地対地 中距離〜遠距離 TriggerAll = ( RoundState = 2 && P2Dist Y > -10 && P2BodyDist X > 120 );地対地 遠距離 ;地対空中用 TriggerAll = ( RoundState = 2 && P2Dist Y < -10 && P2Dist Y > -100 && P2BodyDist X = [-20,10] );地対空 密着 TriggerAll = ( RoundState = 2 && P2Dist Y < -10 && P2Dist Y > -100 && P2BodyDist X = [-10,30] );地対空 近距離 TriggerAll = ( RoundState = 2 && P2Dist Y < -10 && P2Dist Y > -100 && P2BodyDist X = [-10,60] );地対空 近距離〜中距離 TriggerAll = ( RoundState = 2 && P2Dist Y < -10 && P2Dist Y > -100 && P2BodyDist X = [ 30,90] );地対空 中距離 TriggerAll = ( RoundState = 2 && P2Dist Y < -10 && P2Dist Y > -100 && P2BodyDist X = [60,120] );地対空 中距離〜遠距離 TriggerAll = ( RoundState = 2 && P2Dist Y < -10 && P2Dist Y > -100 && P2BodyDist X > 120 );地対空 遠距離 ;空対地用 TriggerAll = ( RoundState = 2 && P2Dist Y > 20 && P2Dist Y < 50 && P2BodyDist X = [-20,10] );空対地 密着 TriggerAll = ( RoundState = 2 && P2Dist Y > 20 && P2Dist Y < 50 && P2BodyDist X = [-10,30] );空対地 近距離 TriggerAll = ( RoundState = 2 && P2Dist Y > 20 && P2Dist Y < 50 && P2BodyDist X = [-10,60] );空対地 近距離〜中距離 TriggerAll = ( RoundState = 2 && P2Dist Y > 20 && P2Dist Y < 50 && P2BodyDist X = [ 30,90] );空対地 中距離 TriggerAll = ( RoundState = 2 && P2Dist Y > 20 && P2Dist Y < 50 && P2BodyDist X = [60,120] );空対地 中距離〜遠距離 TriggerAll = ( RoundState = 2 && P2Dist Y > 20 && P2Dist Y < 50 && P2BodyDist X > 120 );空対地 遠距離 ;空対空用 TriggerAll = ( RoundState = 2 && P2Dist Y > -50 && P2Dist Y < 20 && P2BodyDist X = [-20,10] );空対空 密着 TriggerAll = ( RoundState = 2 && P2Dist Y > -50 && P2Dist Y < 20 && P2BodyDist X = [-10,30] );空対空 近距離 TriggerAll = ( RoundState = 2 && P2Dist Y > -50 && P2Dist Y < 20 && P2BodyDist X = [-10,60] );空対空 近距離〜中距離 TriggerAll = ( RoundState = 2 && P2Dist Y > -50 && P2Dist Y < 20 && P2BodyDist X = [ 30,90] );空対空 中距離 TriggerAll = ( RoundState = 2 && P2Dist Y > -50 && P2Dist Y < 20 && P2BodyDist X = [60,120] );空対空 中距離〜遠距離 TriggerAll = ( RoundState = 2 && P2Dist Y > -50 && P2Dist Y < 20 && P2BodyDist X > 120 );空対空 遠距離 ;回避動作用 TriggerAll = ( RoundState = 2 && Random < 100 && P2MoveType = A );相手攻撃動作中 TriggerAll = ( RoundState = 2 && Random < 100 && InGuardDist );ガード可能時