この項目は書きかけです。
そのうち中身が増えるはずです。ご了承ください。
「MUGENのAIを俺も作りてえ……!」という方向けの記事です。「AIってなんだよ」という方は
これを読んでください。
取り敢えず、以下のものを揃えてください。
Winでも新でも1.1でも良いです。AIを作りたいキャラに対応した本体を用意しましょう。個人的にはWinPlus推奨。勿論、キャラが対応していないならば別ですが。
改変できるかどうかは確認してください。AIの搭載は、改変にあたるからです。大抵は許してもらえるとは思いますが、分からなければ製作者さんに訊いておくのが無難でしょう。
ADI氏のパッチ適用推奨です。硬直差(ヒット、ガードさせて有利かどうか)や発生速(攻撃が出るまでの時間)、全体動作時間やリーチなど、AIを作る上で欲しい情報を諸々確認出来ます。
WinPlus推奨している理由の七割くらいがこれを使えることにあります。変数からステートナンバー、Projectileにキャラの速度まで全部見ることが出来る、製作にも使えるデバッグツールです。本当に使いやすいですよ。
メモ帳でいいです。Sakuraエディタとか色々ありますが、メモ帳でも問題ないです。勿論、使い慣れてるならそのエディタでいいと思います。
何処で手に入るか、ということは特記しません。名前で調べれば出てきますしね。
AIを作りたいキャラのファイルをコピーしてください。好き放題弄り回す前にバックアップを取ります。コピー元はコレクションに加えるなり別のMUGENフォルダに置いておくなりしておきましょう。
コピーしたファイルをAI製作用のMUGENのcharファイルに投げ入れ、取り敢えず開きます。そして、新規ファイルを作成しましょう。「AI」とでも名前を付けてあげてください。これは、AIを適応する際に、本体ファイルを上書きしないための処置です。他のAI製作者さんのAIと被らないようにしつつ、適応ミスを減らせます。
キャラフォルダ>諸々ファイル+新しく作った「AI」フォルダ
では、ファイルを整理していきます。「.def」拡張子の付いたファイルをテキストツールで開きましょう。何か文字列が出てくると思いますが、注目するのは「[file]」の下です。
cmd=~.cmd
cns=~.cns
こんな感じの文字列があるはずです。見つけたら、「cmd=」と「cns=」の後ろに書かれたファイルをコピーし、AIフォルダに貼り付けてください。別に移動でも大丈夫です。移動させたら、先程の文字列をこんな感じに改変します。
cmd=AI/~.cmd
cns=AI/~.cns
XX/は、キャラファイルの中に更にフォルダがあるときに使うものです。こうすることで、MUGENがAI用ファイルを読み込んでくれるのです。
さて、これでAI用のファイルを用意出来ました。selectに登録し、起動してみましょう。トレーニングモードで戦闘画面に遷移出来れば成功です。駄目だった場合は、defファイルのファイル指定を見直してみてください。
登録が出来たなら、次のステップです。コマンドファイルを開きます。拡張子を.txtなど、直接テキストエディタで開けるようにしておくと、いちいち右クリック>編集とする手間が省けます。拡張子を変えたら、defファイルの指定も直しておいてください。
開いたテキスト内を「[Statedef -1]」で検索すると、下記のような記述群があるはずです。
[State -1, Ariel Strong Attack]
type = ChangeState
triggerall = command = "c"
triggerall = StateType = A
triggerall = Alive
triggerall = RoundState = 2
triggerall = !isHelper
triggerall = var(30) = 0
trigger1 = Ctrl || var(14) = 1
trigger2 = StateNo = 400 && (var(1) = [1,3])
trigger3 = StateNo = 410 && (var(1) = [1,3])
trigger4 = StateNo = 60400 && (var(1) = [1,3])
trigger5 = StateNo = 60410 && (var(1) = [1,3])
value = 420
もうちょっとシンプルだったり複雑だったりしますが、凡そこんな感じです。「type=changestate」と、「command="XXX"」が目印ですね。
これこそが、MUGENに於いてキャラクターを動かすための記述です。AIとはつまり、この記述を用いて人操作を介さずともキャラクターを動かせるようにするパッチなのです。
MUGENのCPU操作とは、cmdファイルの上の方にある「[command]」をアトランダムに入力することをさします。しかし、これではまっとうにキャラを制御出来ません。何せ、攻撃するか、ガードするか、移動するか……、全てがランダムなのですから。
そこで行うのが、「commandに頼らずキャラを行動させる」ための記述であり、AI製作なのです。
さて、まずは作業を行います。キャラクターのcnsファイル全てとcmdファイルで、「var(59)」で検索をかけてください。存在する場合は、(XX)を1ずつ減らし、存在しない番号をメモしてください。この「Var」とは変数です。簡単に言えば、スイッチとして使える素敵なものです。これを使って、AIの起動スイッチを作成していきます。
・サンプル記述
[state ];AI起動
type=varset
triggerall=!var(59)&&ctrl&&roundstate=[0,2]
trigger1=command="AI0"
trigger2=1;常時起動用
var(59)=1
[state ];2R以降時起動
type=varset
triggerall=roundstate=2
trigger1=var(59)=-1
var(59)=1
[state ];AI終了
type=varset
triggerall=var(59)>=1
trigger1=win=1
trigger2=lose=1
trigger3=drawgame=1
trigger4=roundstate=4
trigger5=roundstate=[0,1]
var(59)=-1
ignorehitpause=1
実際に使っているものを分かりやすく切り出したものです。整理してみましょう。
一番上のものは、文字通りのAI起動用変数入力記述です。MUGENのtriggerは、条件を満たすと成立します。
ここでは、"command=AI0"、が入力されると、trigger1が満たされ、var(59)に1が入力されます。
また、その下のtrigger2では、条件に1とありますが、これは、常に満たす、という意味になります。triggerは、allを満たすことを前提にして、1>2>3~と順番にチェックしていきます。つまり、この条件の場合、trigger1を満たしていなくても、trigger2が常に満たされるため、var(59)に1が入力されます。
真ん中と下のものは、簡単に言いますと、試合終了後に行動しないようにするためのAI終了記述と、終了状態時に次のラウンドになった際にすぐAIを起動させる記述となります。!var(59)と、var(59)=-1は違う扱いです。!var(59)とは、var(59)=0と同じ意味だからです。このふたつは何も考えずにコピペでも問題ありません。
このAI起動記述は、所謂「コマンド起動式」のAI起動記述です。この方式の要諦は、「プレイヤーでは入力できないコマンドを入力したら、AIを起動させる」というものです。そのため、ここで用いるコマンドの中身は、兎に角滅茶苦茶です。
[command]
name="AI0"
command=F,F,F,F,F,F,F,F,x,z
time=1
こんな感じですね。1Fの間にこれを人力で入力することは不可能ですので、これが入力されれば、現在キャラを操作しているのがCPUであることが分かるのです。これを応用すると、人操作でコマンド入力して、AIを強制起動させることが出来ます。結構デバッグに便利です。
MUGENのCPUのコマンド入力は適当かつランダムなので、このまま(trigger2を有効にしなければ)だとAIが起動する前にサンドバッグになって試合が終わる可能性があります。そのため、実際には、コマンドを幾つか用意するとよいでしょう。50個もあれば充分ではないでしょうか。但し、MUGENの仕様として、ひとつのキャラに使えるコマンドの数は126個までと決まっています。そのため、50個でエラーが出る場合、減らしましょう。
さて、AI起動記述が完成しました。次は、技や移動の暴発をさせないようにしていきましょう。
[State -1, Ariel Strong Attack]
type = ChangeState
triggerall = command = "c"
triggerall = StateType = A
triggerall = Alive
triggerall = RoundState = 2
triggerall = !isHelper
triggerall = var(30) = 0
trigger1 = Ctrl || var(14) = 1
trigger2 = StateNo = 400 && (var(1) = [1,3])
trigger3 = StateNo = 410 && (var(1) = [1,3])
trigger4 = StateNo = 60400 && (var(1) = [1,3])
trigger5 = StateNo = 60410 && (var(1) = [1,3])
value = 420
これは、先程も載せた技を出すための記述です。これに一行足して削り、AI操作中に暴発しないようにしていきます。足すのは、「triggerall=!var(59)」、削るのは、「triggerXX=command="XXXXX"」です。
[State -1, Ariel Strong Attack]
type = ChangeState
triggerall=!var(59)
triggerall = StateType = A
triggerall = Alive
triggerall = RoundState = 2
triggerall = !isHelper
triggerall = var(30) = 0
trigger1 = Ctrl || var(14) = 1
trigger2 = StateNo = 400 && (var(1) = [1,3])
trigger3 = StateNo = 410 && (var(1) = [1,3])
trigger4 = StateNo = 60400 && (var(1) = [1,3])
trigger5 = StateNo = 60410 && (var(1) = [1,3])
value = 420
つまり、var(59)が有効でないときだけ、commandによる入力を受け付けるという仕様に改変するのです。AIを起動させてもcommand入力は止まらないため、このようにして勝手な行動を行わないようにしましょう。
さて、技の制御はこれで問題ないでしょう。しかし、もうひとつ、制御するべきものがあります。-2ステートの下の方に、以下の記述を貼り付けてください。
[State ];ガード制御、AI起動時はMUUGEN側でのガードをしない
type = AssertSpecial
triggerall = !ishelper
trigger1 = var(59)
flag = nostandguard
flag2 = nocrouchguard
flag3 = NoAirGuard
IgnoreHitPause = 1
続けて、-3ステートの下の方に以下の記述を貼り付けます。
[State ];ジャンプ、歩きの暴発禁止
type=SelfState
triggerall = var(59)
trigger1 = (stateno = [10,12])||stateno = 20||stateno = 40
value=0
Ctrl=1
persistent=256
ignorehitpause=1
説明書きがされていますが、これらはMUGEN側の入力による移動やガードを防止するための記述です。コンボ中に勝手に歩いたり、ガードを解いてしまったりといった事故を防ぐ効果があります。個人的には無くてもランダム性が出て、それはそれで構わないとは思うのですが、事故防止用に入れておくのもそれはそれで悪いことでも無いとは思います。この記述を入れたAIで歩きじゃジャンプを使いたいときは、ステートをコピペし、番号を振り直してAI専用ステートを作りましょう。
これで、あらかたの部分がAI用に置き換わりました。ここからは、基礎固めをしていきます。
ガードは全ての基礎です。ガードが出来ないAIに未来はありません。何より、AIが入ったかどうかが一番分かり易いです。ガード記述を書いてみましょう。
[State -1,Guard]
type=ChangeState
value=120
triggerall=var(59)>0&&Roundstate=2&&life>0
triggerall=!(stateno=[120,159])
triggerall=ctrl
;triggerall=0;デバッグ
trigger1=inguarddist
trigger2=enemynear,movetype=A
trigger2=!enemynear,hitdefattr=SCA,NT,ST,HT
trigger2=stateno!=21||stateno=21&&p2dist y>-45||numenemy>=2
trigger2=p2bodydist x<0
trigger2=p2dist x>0||p2dist x<0
trigger3=inguarddist
trigger3=numenemy>1
trigger3=enemy(0),numhelper+enemy(1),numhelper>0||enemy(0),numproj+enemy(1),numproj>0
trigger4=inguarddist
trigger4=!enemynear,hitdefattr=SCA,NT,ST,HT
trigger5=enemynear,movetype=A
trigger5=p2bodydist x=[-40,100]
私が使用しているガード移行記述です。-1ステートに書いてください。AI記述は-1に書きましょう。理由は後述します。
要約すると、「攻撃が迫っている兆候があったらガードステートへ飛ばす」という処理です。基本的な攻撃は全て、これでガード体勢に移れます。
次です。このままでは、AIが下段ガードをしてくれません。MUGENのCPUは下段ガードを殆どしません。この切替部分も、都合がいいように直していきます。
defのcommon=~を確認してください。専用のcommonファイルがあるならば、それを用います。無い場合は、AIファイル内のcnsにcommonで必要な部分を引っ張って来て作っていきます。
・牽制技
牽制技とは、相手の動きを抑えたり、そもそも相手が動きにくいと思わせるように「置いておく」技をさします。この「置いておく」という考え方が重要で、相手が来たい場所や、ジャンプ行動の通過点など、相手のポジショニングを妨害するための行動です。
しかし、AI相手に牽制技は通じません。何故なら、そもそもAIは動きにくいとは思わないためです。また、1Fで状態を理解し、寸分の狂いなくアンチ行動を行えるAI相手には、むしろ隙を晒しているともいえるでしょう。実際、対AIを極めていくと、牽制行動は基本的にしなくなっていきます。格ゲーは、後出しが絶対有利だからです。その最たる例が、AIがお互いに攻撃を振らず睨み合う、「お見合い」と称される現象です。これはお互いに、相手が牽制攻撃を振るのを待っているが故に起こる事象なのです。
本稿では、AIに牽制技を振らせるという前提でコツのようなものを書きます。振らせたくない場合は参考にする必要は無いと思います。
①牽制に向く技
遠くで相手にガードさせられれば、反撃を貰う危険性は小さくなります。波動拳などの射撃も同様で、遠くの相手を抑えつけるための技が便利です。また、MUGENのAIは飛び道具の位置を計る行為が苦手なため、多くのAIは飛び道具がある間移動しないようになっています。まさに、相手の行動を抑えつける牽制に最適です。
幾ら相手を抑えつけても、その後の状況が悪くてはいけません。リーチが足りずとも、ガードさせて不利時間が無い技ならば、再び超反応なりで相手にダメージを与えられるでしょう。有利時間を得られれば、逃げの手や更なる連撃も容易いですしね。出来るだけ不利時間の小さい技を使うと良いでしょう。
攻撃判定が長く出ている技は、それこそ、攻撃判定を壁のように使うことが出来ます。これは、相手の無敵時間の無いアンチ行動を咎める可能性を秘めており、対AIであってもそれなりに有効であると言えるでしょう。但し、持続の長い技とは、得てして空振り時に大きな隙を晒します。
空振りしても危険度の小さい、小技のことをさします。次の行動への移行も早く出来るため、基本的に全体時間は短いほうが強いです。カンフーマンのAIが、小パンを遠距離で擦っている様を見たことのある人も居るでしょう。あれは、ゲージ溜めと相手AIの対攻撃動作を引き出すための牽制を兼ねた合理的な動作なのです。
最終更新:2024年08月06日 13:17