common1.cns

Last-modified: 2014-08-02 (土) 16:25:51

AI作成の前準備のときに作成した、AI用フォルダ「simple-ai」内のcommon1.cnsの中身を記述する
歩き・ジャンプ・ダッシュなど、移動に関する記述が多いので、近づいて戦うAIを作るなら編集は必須だ

 

<注意点・1>
このwikiでは、分身の消去・歩き・ジャンプ・ダッシュの、4箇所の記述のみを記載する
他の部分も書き換えられなくはないのだが、このコモンステートと呼ばれる動作は、MUGENキャラクターの
ベースとも言える部分ゆえ、特殊で複雑な処理が施されているため、編集は慎重に行うことを奨める
<注意点・1>
<注意点・2>
基本的に「StCommon」で指定されたファイルが、歩きやジャンプ、ダッシュなどを制御しているのだが
キャラクターによっては、「Cns」や「St」で指定されている先のファイルに、それらが記述されている
場合がある。その場合だとMUGENの仕様上、そちらの方を優先して処理してしまうので
AIとして編集したい場合は、そちらの方を書き換えなければならない
<注意点・2>


 

分身化したヘルパーの消去

編集前

; Stand
[Statedef 0]
type = S
physics = S
sprpriority = 0

 
編集後

; Stand
[Statedef 0]
type = S
physics = S
sprpriority = 0

 

;分身に化けたヘルパーを消す
[State 0, 0]
type = DestroySelf
trigger1 = Ishelper


ニコニコ動画でMUGEN動画を見ていると、そういう技ではないはずなのに、時々キャラクターが分身して
増えているのを見たことはないだろうか? MUGENにはヘルパーという機能があり、これを呼び出して
飛び道具やストライカーほか、様々な機能を持たせることが出来る。ただ色々なことをさせられるぶん
ちょっとした事でエラーを起こしやすく、ヘルパーを使う技を出そうとした瞬間それを潰されたり
また、投げや当て身でヘルパーを掴まれたりすると、ヘルパーが分身化してしまうキャラもいるのだ

 

分身になってしまったヘルパーは障害物となって、試合の進行を妨げたり
姿は変わってもヘルパーには違いないため「画面内に一つしか出せない飛び道具(ヘルパー使用)」だと
分身が存在する限り、その飛び道具が使えないことになってしまったりもするので困りもの

 

なので[Statedef 0]の下に、この記述を追加しておこう、これで分身してしまってもすぐ消えてくれる
「Ishelper」は自分がヘルパーのとき、「DestroySelf」は自己消滅するということ

 

歩き

編集前

[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)

 
編集後

;前に向かって歩く、和訳KFMの前進速度は並程度
[State 20, 1]
type = VelSet
triggerall = roundstate = 2
trigger1 = p2statetype != L && P2BodyDist X >= 0
trigger2 = p2statetype = L && P2BodyDist X > 75
x = const(velocity.walk.fwd.x)

 

;後ろに向かって歩く、和訳KFMの後退速度は並程度
[State 20, 2]
type = VelSet
triggerall = roundstate = 2
trigger1 = p2statetype = L && P2BodyDist X < 65
x = const(velocity.walk.back.x)

 

;AI用の追加記述、一旦足を止めたなら、そのまま立ち状態に戻る
[State 20, 5]
type = ChangeState
trigger1 = vel X = 0
value = 0
ctrl = 1


相手がダウン中でないならば前進して近づき、ダウン中の場合は75より離れていたら前進
65より近づいていたら後退して、適度な位置をウロウロするという記述。読み合い拒否のリバサ○○警戒
などと言えば、通じる人もいるのではないだろうか? ただし移動速度が極端に早いキャラの場合
65~75では移動距離が狭すぎて、小刻みに振動しているようにしか見えなくなるかもしれないので
その場合は60~80くらいに移動範囲を広げたほうが、見た目的にも良くなるだろう

 

またこれだけだと歩きモーションに不具合が出るので、「AI用の追加記述」を入れておいた方が良い
何らかの理由で足を止めることになったら、いったん立ち状態に戻ってからまた歩き出すということ
「vel X」は横方向の移動速度を表す。プラスは前進、マイナスは後退、ゼロは静止状態
ちなみにctrl = 1を入れてあるのは、「ダッシュ」の項目と同じ理由である

 

ジャンプ

編集前

[State 40, 2]
type = VarSet
trigger1 = command = "holdfwd"
sysvar(1) = 1

 

[State 40, 3]
type = VarSet
trigger1 = command = "holdback"
sysvar(1) = -1

 
編集後

;前方へのジャンプ、和訳KFMのジャンプ速度・高度は並程度
[State 40, 2]
type = VarSet
triggerall = roundstate = 2
trigger1 = BackEdgeBodyDist <= 20 &&(p2statetype = L ||(p2statetype != A && p2movetype != A))
trigger2 = p2statetype != A && p2movetype != H
trigger3 = p2statetype = A && p2movetype = H
sysvar(1) = 1

 

;後方へのジャンプ、和訳KFMのジャンプ速度・高度は並程度
[State 40, 3]
type = VarSet
triggerall = roundstate = 2
trigger1 = p2statetype = L && BackEdgeBodyDist > 20 && enemynear,NumProj = 0
sysvar(1) = -1


「&&」「||」「()」などの記述に関しては、よく使われるトリガーを参照すること

 

画面端に追い詰められていて、なおかつ相手がダウン中、もしくは地上で攻撃態勢ではないときに
前ジャンプで画面端からの脱出を図る。また相手が地上にいて、食らい中でないときも前ジャンプする
要するに飛び道具をジャンプで飛び越えたり、ジャンプ攻撃で飛び込んだりするための記述
そして相手が空中で食らい中の時も前ジャンプで近づく、こちらは「強カンフーアッパー」などで
打ち上げた相手に対し、追いかけて空中コンボに移行するための記述。多少難しいがそんな感じ

 

後方ジャンプは相手がダウン中で、後方にまだ余裕があり、「enemynear,NumProj = 0」
つまり『相手の出した飛び道具が、もう画面内に残っていない』安全なときに、距離を取るために行い
和訳KFMにはパワー溜め行動があるので、パワーを溜めて仕切りなおすことを目的とした記述となる

 

「NumProj」は画面内の飛び道具の数を取得するトリガーだが、p2NumProjという記述は存在しない
 相手の出した飛び道具の数を取得したい場合は、「enemynear,NumProj」と表記する必要がある
 同じような表記を必要とするトリガーはいくつかあるので、気をつけて記述して欲しい

 

ダッシュ

編集前

[State 100, 4]
type = ChangeState
trigger1 = command != "holdfwd"
value = 0

 
編集後

;和訳KFMのダッシュ速度は並程度、使い勝手は悪くない
[State 100, 4]
type = ChangeState
trigger1 = p2movetype = A || InGuardDist
trigger2 = RoundState != 2
trigger3 = p2movetype != H
trigger3 = P2BodyDist X < 80
trigger3 = P2BodyDist Y > -120
trigger4 = P2BodyDist X < 3
value = 0
ctrl = 1


記述するのはダッシュを止める条件、ちなみにダッシュではなくステップするキャラだと必要無い

 

「相手が攻撃態勢、もしくはガード可能範囲に入ったら危ないので止める」
「試合中でなくなったら止める」という辺りは分かりやすいと思う。trigger3の記述は
相手が食らい中でない、つまり自由に動けるときは、適度なところでダッシュをやめて歩きにしよう
という判断。「P2BodyDist Y > -120」は「相手が自分よりも120未満の高さにいるなら止める」という意味
和訳KFMの背の高さが大体90くらいなので、120よりも高い位置にいるのならば、たとえ相手が攻撃を出しても
こちらにはまず届かない、と判断してそのままダッシュを継続し、落ちてくるのを待つようにする

 

trigger4の「P2BodyDist X < 3」は「カンフースルー(投げ技)」の範囲と同じ、「カンフースルー」は
ダッシュから直接出せないので、出せる範囲に入ったらダッシュをやめて、投げを試みる記述となる

 

なおAI用の記述の場合は、「value = 0」に戻すとき「ctrl = 1」は必ず入れること
でないとコントロール不能=動けなくなってしまう、AIをテスト試合すればまず気づくだろうが……