MUGENメモ ( フォント環境:MS ゴシック 標準 サイズ10 )   AIの初歩  MUGENにおけるAIは2種類あります。 ・ MUGEN本体がランダムでコマンドを打ち込むもの ・ キャラが情報を入手して処理を行うもの  たまに「AIが入っていない」と言われるものは前者です。  MUGEN本体のAIは動作が完全にランダムである為、   AIと呼ばれないほど、いい加減な行動しかしないのです。  後者は制作されている全てのAIの事を指します。(多分)  ただし「プログラムの一部」である為、   できることは「条件」を与えての「処理」だけです。 ( 追記:実は動作を制御するらしき、AIファイルというものもあるのですが、   それの製作方法が無い為、現状動作ファイル内で制御が行われています。 ) ■プログラムの宿命  プログラムは、プログラム以外の考慮を行ったりはしません。  可能な限り、与えられた命令(条件と処理)を行うだけです。  その為、しっかりと条件をつけてやらないとゾンビ化したり、   死体殴りを延々と続けたりなど、際限の無い行動を行います。  なのでAIを作る際は大きく2つの分類を知っておく必要があります。 [State a] Type = *ステートコントローラー* Value = *実行数値*  処理と、 TriggerAll = *条件式* Trigger1 = *条件式* Trigger2 = *条件式*  条件です。  これ以外にも色々と細かい数値がある為、   細かいことは例のサイトを参照してください。 ( 例のサイト1://homotaro.s44.xrea.com/scr.htm (処理)   例のサイト2://homotaro.s44.xrea.com/tr.htm (条件)  ステートコントローラーとトリガー用の記述の辞書のようなものです。  ただ、どういった方がお作りになったのか分からないのは残念です。  調べたりする際にはかかせない為、私もよく使わせていただいております。 )  勝手が分かりさえすれば、そこまで苦労することは無いでしょう。  AIで使うステートコントローラー(Type=*この部分*)は、   ChangeState(ステートを変える)が基本で、   あとはAI用VarにVarSetやVarAddくらい。  よく調べるのは条件式の方になりますが。 ■AIを作る際の絶対  Cmdファイル(State,-1など通常操作用の条件式)の条件を無視しない。 ( 実際の操作で可能な行動しか行わせない、という事。   特例はあれど、まだあくまで特例 )  (Alive)(RoundState=2)などを忘れずに使う。  詳しくないのであれば無理せず、参考を探そう。 ■AIを作ること  まあ、あとは個々人でがんばる所。  私は作る前にキャラを操作して、   設計図を書いてからAI記述を作ります。  AIフラグなどの管理は、平成a氏のAI説明書にもある、   「人間には不可能なコマンドによって起動させる」が一番有名か。  「キー操作可能なHelparを出し、キー操作を監視。   本体とHelperで操作が異なる場合AIを起動。」なども。  AIによっては特定パレットでAIを起動させるモードだったり、   特定のキーを押すことによって手操作を行うようにしたり、などなど。  詳しくないのであれば無理せず、参考を探そう。 ■AIを作るときの注意点  EnemyNear,など、敵の状態を把握する為のリダイレクトは、   そのままだとタッグ時に不具合を起こす可能性があります。  基本的にVar管理ですが、大体EnemyNear(!(EnemyNear,Alive||NumEnemy=1)),と同様の条件です。  Var管理だとEnemyNear(Var(**)),です。  Enemy,というリダイレクトはそのままだと、タッグ時相手の手前側しか参照しません。  1P,3Pvs2P,4Pと図解した場合、どういう位置にいても、   1P,3P側は2Pだけを、2P,4P側は1Pだけを参照し、Enemy,だけでは3P,4Pを参照できません。  Enemy(1),と記述することで、3P,4Pを参照できます。ちなみにEnemy(0),はEnemy,と同様。  また、Helper(),やPartner,など[いない可能性]があるものを参照する場合はその前に確認をすること。   対象がいない場合、デバック表示でエラーを垂れ流したりします。EnemyNearなども同様。 ( Helper(),はNumHelper() Partner,はNumPartner NumEnemyなどで数を確認する。  )  詳しくないのであれば無理せず、参考を探そう。 ■初歩的な条件用のもの(通常操作用の条件式には従うこと。) RoundState = 2;試合中(試合開始後〜試合終了まで)である。 Random;それぞれで0から999の数値を返す。  敵の情報 P2BodyDist X ;相手と自分の、横軸の距離(自分の衝突判定から相手の衝突判定まで) P2BodyDist Y ;相手と自分の、縦軸の距離(相手が上にいる場合は、マイナス) P2MoveType;相手が「A:攻撃 H:くらい I:それ以外」 P2StateType;相手が「A:空中 S:立ち C:屈み L:倒れ」  自分の情報 Ctrl;通常に動作を行えるかどうか。 Alive;生きている(KOされていない)かどうか。 InGuardDist;相手の設定したGuardDist(ガード反応距離)の中かどうか。 Power;パワーゲージの量 BackEdgeBodyDist;自分の後ろの当たり判定から画面内の端までの距離 StateType;自分が「A:空中 S:立ち C:屈み L:倒れ」 ・コンボ用 MoveContact;攻撃がヒット・ガード問わず当たったかどうか。 MoveGuarded;攻撃がガードされたかどうか。 MoveHit;攻撃がヒットしたかどうか。 StateNo;現在のステート番号 MoveType;自分が「A:攻撃 H:くらい I:それ以外」  だとかなんだとか。私はこういうのを使ってる。 ;実記例 TriggerAll = RoundState = 2 && Alive ;&&は「〜かつ〜」の条件 Trigger1 = Ctrl || MoveHit && StateNo = 200 ;||は「〜または〜」の条件 ;   ;この場合(Ctrl)または(MoveHit&&StateNo=200)  凄い初歩的なものだけなので、もっと例のサイトを調べるといいかも。  詳しくないのであれば無理せず、参考を探そう。 ■コマンド制御のAI化  例えばダッシュさせようとしてガクガクしたり、   しゃがませようと思ってガクガクしたりだとか。  その辺りは、「コマンドを条件にした制御」を行っている為、   コマンドはAIが起動していないときの条件、   AIが起動している場合にはコマンドで無く別の条件、   と言うような記述に変更する必要があります。  ガードの中下段の制御は待機Stateへ飛ばしても構わないが、  細かいことは他の人のAI講座だとかなんだとかを参照してくださいな。  あくまで、初歩ですので。  詳しくないのであれば無理せず、参考を探そう。 ■細かい事 >状況による動作の調整が細かい場合  Varで動作系統を管理。 ■初歩的なミスの例(私がよくやるミス) ×Trogger1 = ○Trigger1 = 「Tro」→「Tri」 エラーを出してもくれない為、とても分かりにくい。 ×Trigger1 = P2BodyDist Y =[-10,-80] ○Trigger1 = P2BodyDist Y =[-80,-10] [,]で数値を範囲指定できるが、左側が小さく右側は大きい数でなければならない。 ×Trigger1 = P2BodyDist Y =[-80,-10] && P2MoveType = A ○Trigger1 =(P2BodyDist Y =[-80,-10])&& P2MoveType = A [,]を使った場合その直後&&や||と言った記号を使うと、エラーを出す。 ()で[,]を使う条件を囲ってやることで、対処可能。あるいは後ろにもっていくのでも可