5:良く使われるトリガー

「5:良く使われるトリガー」の編集履歴(バックアップ)一覧に戻る

5:良く使われるトリガー - (2008/02/22 (金) 23:20:03) のソース

その他のtriggerや、より詳しくは、ググるか、和訳KFMを参照すること

-----------
ctrl
-----------
キー・コントロール可能状態
正確には「ctrl=1」と記述するが、省略可能なので省略
「ctrl=0」、または「!ctrl」だと、コントロール不能状態の場合、になる

正確には「command」の入力を受け付ける状態の可否を判断してる
だが、AIの場合は、自由行動可否のフラグでしかない

<注意点>
triggerallに記述するときは、キャンセルの有無を確認する
キャンセルを行う状態では、普通、ctrl=0(行動不能=操作不能)となってるため

-----------
p2bodydist X = **
p2bodydist X <= **
p2bodydist X = [**,**]
-----------
自分から見て、相手とのX軸(横)の距離を測る
「X」を「Y」に変えれば、Y軸(縦)の距離も計れる
 Y軸の方はAIが細かくなっていくとX軸より重要になってくる。
 負数は裏回りを判別するのに使う
(めくり、や、緊急回避などで背後に回られた状態を指す)

大まかだが、投げや小足などのリーチの短い技なら10~20
普通の打撃技なら20~40
リーチの長い技なら40~80
超リーチの長い技なら90~160

mugenの表示画面はx=320 Y= 240なので、画面半分なら160となる(単位はpixel)
だが、正確に数値を計る必要は無く、
見た目でもある程度判断出来るので、大まかに決定して、動作チェックを繰り返して微調整するのが望ましい
なぜなら、実際に当たるかどうかは、相手側の当たり判定にも左右されるからだ

どうしても正確に計りたいなら、該当する技のstatedefを調べ、使われてるanim番号をチェック
(デバッグモードで、実際に技を出して確かめたり、mcm2,0などでSFFとAIRを読み込んで調べても良い)
DEFファイルを開き、そこにAnimに指定されているairファイルを開き、該当するナンバーの
-----
Clsn1: 3
 Clsn1[0] =  24,-24,  8,-13  (始点X軸,始点Y軸,終点X軸,終点Y軸)
 Clsn1[1] =  23,-19, 45,-10
 Clsn1[2] =  45,-11, 63,  0
-----
 Clsn1を確かめ、始点X、または終点Xの最も大きい数字
 上記の場合は、63がその攻撃の届く最大距離となる
 (ただし、該当するstatedefのhitdefのtrigger表記によっては無意味化するので、良く分からない内は、お勧めはしない)
 
  <注意点>
XやYは半角大文字にすること。じゃないとエラーが出る
同様に、XやYを付け忘れてもエラーとなる
「<=」の場合、負数も含めるので、相手や技によっては豪快な空振りが発生する
ただし、それが「~っぽい」と判断するなら「=[*,*]」にする必要は無い

-----------
vel X >= **
vel X = 0
vel Y <= **
-----------
移動速度を計るためのもの
X:正数だと前方に移動中。負数だと後方に移動中
Y:負数だと上昇中。正数だと落下中。

相手の移動速度を計る場合は、
-----------
enemynear,vel X > 0
enemynear,vel X =0
enemynear,vel Y < 0
-----------
などとすれば良い

対空技や降下技、昇り蹴りの中段狙いなどの判定に使われることが多い

 <注意点>
相手や自分の移動速度は、設定や技などによって大幅に変わる
よって「= [**,**]」を条件にするのお勧め出来ない(無論、しても問題はない)

-----------
p2statetype = *
-----------
相手の状態を計る
「statetype」だと自分の状態となる
また「enemynear,statetype = *」でも同様の効果がある
(微妙に違うが、詳細は割愛)

A:空中にいる状態。やられ中だろうと、地面から少しでも浮いてるとこの状態と見なされる
S:地上で、立ってる状態
C:地上で、座ってる状態
L:fall属性(ダウンする)の攻撃を受け、倒れてる状態。落下やバウンド中、起き上がり直前も含まれてる

-----------
p2movetype = *
-----------
相手の行動を計る
「movetype」だと自分の状態となる(まず使わない)
また「enemynear,movetype = *」でも同様の効果がある
(微妙に違うが、詳細は割愛)

A:攻撃中。攻撃後の硬直なども含む(相手が含まないように設定してる場合は除く)
H:食らい中。攻撃を受けてる状態。ガードやダウンも状態も含む
I:その他。何もして無い。またはパワー貯めや挑発など(具体的な内容を計るのは、かなり難しいので割愛)

-----------
random <= **
random < **
random = [**,**]
-----------
0~999の乱数を計る
数値を指定する事で、その数値が出た時にtriggerを発動させれる
乱数は1フレーム毎に変動(FPS60なら、1フレームは60分の1秒)
(正確な事は分からないが、同じフレームでも、記述毎にばらつく模様)

経験則的に、randomのみをtriggerとした場合、50くらいでも、結構なの確率で使用する
たまに程度でいいなら10とか20。場合によっては5とかで十分である
ただし、他の条件と合わせた場合は、400~700が頃合である

注意点
randomの乱数は、数値が低い方が出やすいため「<99」と「>=900」だと、範囲は同じでも前者が出やすい
また、カンフーアッパーに、random<=700 カンフー突き手にもrandom<=700とか、記述しても問題なく
むしろ「優先順位」の方が重要である

優先順位は、mugen全体の仕様で、同条件の場合、先に(上方、上位位置)に記述したものが優先されることを意味する
ステート番号(statedef)が重複したりした場合も、先に記述した方が適用され、後に記述した分は無視される
(またcommon1.cnsなどcommonの優先順位は最低となる)

各種技(主にtriggerall)に、必ずいれることが推奨される(ただし、強AIなら必ずじゃなくても良い)

-----------
MoveContact
MoveReversed
MoveHit
time >= **
-----------
キャンセル条件に使用
ctrl=0。ようするに「ctrl」と併用すると機能しないので注意

相手に攻撃が当たってる状態
必ず、afterやstatenoと併用すること
(そうしないと認識されない)

MoveContact :攻撃が当たった場合(ヒット&ガード問わず)
MoveReversed:攻撃がガードされた場合
MoveHit   :攻撃がヒットした場合
time     :現在のステートに入ってからの経過時間(空キャン用。元の技の記述をそのまま使用すること)

正確には、MoveContact >= 1 となるが、省略できるので書略

-------
trigger1 = !MoveContact
-------
だと、攻撃が当たらなかった場合。となる

 <注意点>
MoveHitを多用すると、確定状況しか技をキャンセルしない事になるので、自重すること

-----------
hitdefattr = ***,**,**,**,**,**,**,**,**
-----------
自分の現在のステートの「hitdef」の「attr」で定義された技の種類を判別する
相手(敵)の攻撃の種類を判別する場合は
-----------
enemynear,hitdefattr = ***,**,**,**,**,**,**,**,**
-----------
となる

S:立ち状態
C:屈み状態
A:空中状態

N:ノーマル。通常技。
S;スペシャル。必殺技。
H:ハイパー。超必殺技。

A:アタック。打撃などの格闘攻撃
T:スロー。掴み技や投げ技

-----------
hitdefattr = SC,NT,ST
-----------
や
-----------
hitdefattr = A,HA,HT
-----------
などと記述
最初にSCA、残りがNSHとATの組み合わせとなる
前者は、立ち、または屈み状態で、通常投げ、または必殺投げを使ってる場合、となり
後者は、空中で、超必殺技の打撃、または投げを使ってる場合、となる

また、
-----------
hitdefattr = SC, NA, SA, HA
-----------
だと、立ち、または屈み状態で、通常、必殺、超必殺を問わず、打撃技を出してる場合、となる

 <注意点>
hitdefattrもstatenoも、キャンセルを前提としているトリガーであるから、迂闊な削除はしないこと
そうじゃないと、ありえないキャンセルが可能になる

-----------
BackEdgeBodyDist <= **
BackEdgeBodyDist = [**,**]
-----------
自分から、背後の壁までの距離を計る
逆に、正面の壁までの距離なら「FrontEdgeBodyDist」を使う
画面端に追い詰められたときや、逆に追い詰めた時の判断に使用される


経験則的に、20前後で画面端と認識される場合が多い
30だと、スクロールが優先される場合が多い
これは「ステージ」や「mugen」の設定により左右されるので、適当でも良い

<注意点>
ここで言う、壁は、画面端のことで、ステージの終点(始点)のことではない
と言うより、ステージの終点や始点を判別するトリガーは存在しない

-----------
RoundState = *
-----------
ラウンドの状態
0だと、戦闘前のフィードイン中。1だと、イントロ中、2だと戦闘中、3だと戦闘終了直後、4だと勝利ポーズ中
と、なる

 <注意点>
triggerallに、これの2を定義して置かないと、戦闘開始前に動き出す「フライング」したり
戦闘終了後に、倒れた相手に攻撃し続けたり、逆に倒されてるのに、起き上がってきたりすることがある

-----------
InGuardDist
-----------
ガード可能状態
相手のCNSで定義された、攻撃に対してガードモーションを取る間合い、に入ってる事を判別する
(「InGuardDist>=1」と同じ意味)

主にガードやブロッキング、シールドや緊急回避などに使われる

-------
trigger1 = !InGuardDist
-------
だと、間合いに入ってない場合となる
(「InGuardDist=0」と同じ意味)

----
[[<前へ>4:AI製作開始]] 5:良く使われるトリガー [[次へ>>6:AIのサンプル]] [[さらに次へ>>>7:StCommonを弄った立ち回りの制御(ガード&エアリアルも含む)]]