「5:良く使われるトリガー」の編集履歴(バックアップ)一覧はこちら
「5:良く使われるトリガー」(2008/02/22 (金) 23:32:46) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
その他の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を弄った立ち回りの制御(ガード&エアリアルも含む)]]
その他の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
MoveGuarded
MoveHit
time >= **
-----------
キャンセル条件に使用
ctrl=0。ようするに「ctrl」と併用すると機能しないので注意
相手に攻撃が当たってる状態
必ず、afterやstatenoと併用すること
(そうしないと認識されない)
MoveContact :攻撃が当たった場合(ヒット&ガード問わず)
MoveGuarded:攻撃がガードされた場合
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を弄った立ち回りの制御(ガード&エアリアルも含む)]]