特殊行動

Last-modified: 2015-06-07 (日) 18:51:48

今までに書いてきたどれにも当てはまらない行動を記載する、中にはとても重要な技も……


 

変数の使い方の例

編集前

[State -1, 変数の例1];必殺技の発生条件リセット
type = VarSet
trigger1 = 1
var(1) = 0 ;変数用パラメータの記述方法その1(その2は「板投げ」のステートにて)

 

[State -1, 変数の例2];必殺技の発生条件をチェック
type = VarSet
trigger1 = statetype != A
trigger1 = ctrl
trigger2 = (stateno = [200,299]) || (stateno = [400,499])
trigger2 = stateno != 440 ;[Statedef 440](足払いのステート)ではない時
trigger2 = movecontact
var(1) = 1

 
編集後

;2と3以外の状態のときは、挑発のステート番号にリセットしておく
[State -1, 変数の例1]
type = VarSet
trigger1 = 1
var(1) = 195

 

;距離が60より開いていたら、パワー溜めのステート番号をセット
[State -1, 変数の例2]
type = VarSet
trigger1 = P2BodyDist X > 60
var(1) = 700

 

;距離が60より近く後方に余裕があれば、バックステップのステート番号をセット
[State -1, 変数の例3]
type = VarSet
trigger1 = P2BodyDist X < 60 && BackEdgeBodyDist > 20
var(1) = 105

 

;スマッシュカンフーアッパーがヒット後の、目押し行動を変数で分岐させる
[State -1, 変数の例4]
type = ChangeState
value = var(1)
triggerall = roundstate = 2
trigger1 = statetype != A
trigger1 = ctrl
trigger1 = p2movetype = H
trigger1 = p2stateno = [5000,5999]
trigger1 = prevstateno = [3050,3051]


必殺技の記述の際に、さんざん苦労させてくれた部分、使わずにコメントアウトしてもよいのだが
それでは芸がないので変数を利用して、少々面白いことをやってみる。見ての通り状況に応じて変数をセットし
スマッシュカンフーアッパーヒット後の目押し行動のChangeStateで「value = var(1)」とすることで
その変数のステート番号に飛ばしてしまう、というやり方で行動を分岐させる事ができる一例だ

 

まあこれは、ほとんどお遊び(挑発・パワー溜め・バックステップのそれぞれで、目押し行動を記述すれば
同じことができるし、手間もそこまで大差無い)だが、色々なことに使えるのは分かってもらえると思う

 

ちなみにスマッシュカンフーアッパーは、ヒット後にステートナンバーが「3050」から「3051」に変わるので
「prevstateno = [3050,3051]」という形で記述してある。目押しがつながらない時は、まず直前の技の
ステートナンバーが変化していないか、もう一度確認してみると良いかもしれない

 

なお目押しについての詳しい説明は、立ち弱パンチ(+目押し)の方を参照すると良いだろう

 

板投げ

編集前

[State -1, 板投げ];ちょっとこ丸が追加した技
type = ChangeState
value = 1300
triggerall = command = "board"
triggerall = NumHelper(1300) = 0 ;IDナンバー「1300」のヘルパーが画面中に1個も出てない時
triggerall = NumProjID(1302) = 0 ;IDナンバー「1302」の飛び道具が画面中に1個も出てない時
trigger1 = var(1)

 
編集中

[State -1, 板投げ];ちょっとこ丸が追加した技
type = ChangeState
value = 1300
triggerall = command = "board"
triggerall = NumHelper(1300) = 0 ;IDナンバー「1300」のヘルパーが画面中に1個も出てない時
triggerall = NumProjID(1302) = 0 ;IDナンバー「1302」の飛び道具が画面中に1個も出てない時
trigger1 = statetype != A
trigger1 = ctrl
trigger2 = (stateno = [200,299]) || (stateno = [400,499])
trigger2 = stateno != 440 ;[Statedef 440](足払いのステート)ではない時
trigger2 = movecontact

 
編集後

;山なりな軌道の飛び道具を放つ、弱と強で飛ぶ距離が変わる
[State -1, 板投げ];ちょっとこ丸が追加した技
type = ChangeState
value = 1300
triggerall = roundstate = 2
triggerall = NumHelper(1300) = 0 ;IDナンバー「1300」のヘルパーが画面中に1個も出てない時
triggerall = NumProjID(1302) = 0 ;IDナンバー「1302」の飛び道具が画面中に1個も出てない時
trigger1 = statetype != A
trigger1 = ctrl
trigger1 = stateno != 100
trigger1 = p2bodydist X > 80
trigger1 = p2movetype != A || p2bodydist X > 160 || EnemyNear,Facing = Facing
trigger1 = random <= 50
trigger2 = (stateno = [200,299]) || (stateno = [400,499])
trigger2 = stateno != 440 ;[Statedef 440](足払いのステート)ではない時
trigger2 = movecontact
trigger2 = p2statetype != C
trigger2 = random <= 500


強弱の使い分けは、kfm.cnsの「板投げ(必殺技)」の項目で記述していく

 

飛び道具を近距離で使う意味は少ないので、「p2bodydist X > 80」とある程度の距離があるときに使用する
「stateno != 100」はダッシュ中に使わないという意味、ダッシュは「相手が食らい中なら一気に接近する」
ときに使用する(例えばこの飛び道具がヒットしたら)ので、そこでまた飛び道具を使わないようにするため

 

ちなみに山なりな軌道なので、空中の相手にも若干使えるから対空にも使えるし
それを利用してダウン中の相手に起き攻めを仕掛けることもできるため、「p2statetype != L」も
「p2statetype != A」も入れていないが、もっと積極的にそれらを狙うのも良いかも知れない
また「p2bodydist X > 160」を入れているのは、十分に離れた距離なら、相手との飛び道具の撃ち合いにも
応じるようにするため(とは言え和訳KFMの「板投げ」は連射力がイマイチなので、あまり応じたくはないが)

 

「Facing」はキャラが向いているのは右か左かを判定するトリガー、それだけではほとんど役立たずだが
「EnemyNear,Facing = Facing」と記述すると、「相手と自分が同じ方を向いているか」となり
『タッグ戦において、相手がこちらに背を向けているか』が判定できるようになる、こうしておけば
相方が端でフルボッコ中に、自分は反対の端でガードを続けるだけ、という状況を多少は防げるはず

 

コンボに使用する際の役割は、主に相手にガードされた際の押し出し、およびコンボの穴をふさぐため
和訳KFMには無いが、通常攻撃の先端の方に当たって相手を押し出した場合、繋ぎたい必殺技の範囲から出て
しまい繋がらないキャラもいる。そんなときに出しておけば、少しでもダメージが伸ばせたりするという使い方
コンボに組み込めない飛び道具も多いが、組み込めるならこういう使い方も考えておくと良い

 

ただし板投げは、その山なりな軌道ゆえコンボ時には、しゃがんでいる相手に当たりづらい
なので「p2statetype != C」を入れて、立ちか空中の相手にのみ使うようにしている

 

なお単発の使用確率がかなり低いのは、昔は飛び道具が強すぎるからという説明だったのだが
最近だと「板投げ程度の性能では無敵移動からフルコンボの餌食」だから、というのが主流である
インフレとは恐ろしいものだ……

 

走る

編集前

[State -1, 走る]
type = ChangeState
value = 100
trigger1 = command = "FF"
trigger1 = statetype = S
trigger1 = ctrl

 
編集後

;ランタイプのダッシュ、使い勝手は悪くない
[State -1, 走る]
type = ChangeState
value = 100
triggerall = roundstate = 2
triggerall = statetype != A
triggerall = ctrl
triggerall = P2BodyDist X >= 80
triggerall = stateno != 100
triggerall = enemynear,NumProj = 0
trigger1 = p2movetype = I && random <= 50
trigger2 = p2movetype = H


ダッシュを止める記述は、common1.cnsの「ダッシュ」の項目で説明している

 

「stateno != 100」は入れておかないと、ダッシュ中にダッシュするという妙なことになってしまう
それ以外は、そこそこ離れていて相手が棒立ちなら低確率で、(飛び道具などで)食らい中なら確実に
ダッシュで近づき接近戦に持ち込むという単純な記述、気をつけるべきは「stateno != 100」の
入れ忘れと、あとは止まる方の記述だと思われる、無造作に近づくので反撃の危険は高い

 

なお「enemynear,NumProj = 0」は、飛び道具が出ていないときという意味
でないとダッシュを開始してすぐに立ち止まることになってしまう

 

バックステップ

編集前

[State -1, バックステップ]
type = ChangeState
value = 105
trigger1 = command = "BB"
trigger1 = statetype = S
trigger1 = ctrl

 
編集後

;後方に飛び退る、無敵は無いので注意
[State -1, バックステップ]
type = ChangeState
value = 105
triggerall = roundstate = 2
triggerall = statetype != A
triggerall = ctrl
triggerall = P2BodyDist X < 60 && BackEdgeBodyDist > 20
trigger1 = p2statetype = L && life <= lifemax / 2
trigger2 = p2statetype != A && EnemyNear,HitDefAttr = SC, NT,ST,HT
trigger2 = random <= 500


初見のトリガーも多いと思うが、それは「よく使われるトリガー」で確認して欲しい

 

基本的に相手がある程度近くにいて、「BackEdgeBodyDist > 20」つまり後方に余裕があるとき
ならば使用する(和訳KFMのバックステップに無敵は無いので)。もし無敵があるなら使い道はもっと増える

 

相手がダウン中でも、「life <= lifemax / 2」つまり「ライフが最大値の半分を切った」ときは
リスクの高いダウン追い打ちや起き攻めを諦めて距離を取る、というのが一つ目の使い方

 

もう一つは「EnemyNear,HitDefAttr = SC, NT,ST,HT」つまり相手の出した攻撃属性が「投げ技」だったら
超反応でバックステップして避けるというもの、ただし「random <= 500」でも成功率は高くない
後述するが投げは非常に強い技で、こちらの攻撃に対しカウンターで出して投げ飛ばすことも容易い
そういうカウンター専用に設定された投げ技に対しては無力、なのであくまで気休めである

 

カンフースルー

編集前

[State -1, カンフースルー];投げ技
type = ChangeState
value = 800
triggerall = command = "y"
triggerall = statetype = S
triggerall = ctrl
triggerall = stateno != 100
trigger1 = command = "holdfwd"
trigger1 = p2bodydist X < 3
trigger1 = (p2statetype = S) || (p2statetype = C)
trigger1 = p2movetype != H
trigger2 = command = "holdback"
trigger2 = p2bodydist X < 5
trigger2 = (p2statetype = S) || (p2statetype = C)
trigger2 = p2movetype != H

 
編集後

;投げ技、発生は速く、外した時の隙も小さいが、届く距離は極めて短い
[State -1, カンフースルー];投げ技
type = ChangeState
value = 800
triggerall = roundstate = 2
triggerall = p2statetype != L
triggerall = statetype != A
triggerall = ctrl
triggerall = stateno != 100
triggerall = (p2statetype = S) || (p2statetype = C)
triggerall = p2movetype != H
triggerall = random <= 300 ||(p2movetype = A && random <= 500)
triggerall = p2bodydist X >= -10
trigger1 = p2bodydist X < 3
trigger2 = p2bodydist X < 5
trigger2 = BackEdgeBodydist <= 30


投げは総じてガード不能で発生が早く、多くの特殊ガードで防げないため、MUGENでは非常に強力な技
なので使用条件も厳しく設定されていることが多く、それらはちゃんと守って記述する必要がある
trigger1とtrigger2で被っていた記述をtriggerallに纏めているが、改変していないのは分かるはず

 

「ダッシュ投げ」が出来ないようダッシュ中は禁止、「当て投げ」できないよう食らい中は投げられない
そして他の技とは違い、投げはそのトリガー自体に「p2bodydist X」が設定されていることが多い
しかもその距離は極めて短くされている。とは言えそれでもかなり強いのは間違いない

 

特にその発生の早さは強力で、カウンターとしての使用も可能、もちろんガード不能なのだから
ぶっ放して使っても問題ない。とはいえガードは出来なくても回避はできる、「バックステップ」の項目で
記述したように、超反応での回避は可能だ。なので通常時は低確率、相手が攻撃中には中確率で投げを
仕掛けるようにしてある。これならばバランスよく、投げ技を使ってくれるだろう

 

とは言え中には、投げ技なのにやたら発生が遅く、カウンターで使えないようなものや
外したときに甚大な隙を晒すため、カウンター以外では使えないようなものもある
そういった投げ技を使うときは多少考えて記述する必要があるかもしれない

 

ちなみに「BackEdgeBodydist <= 30」は、前投げと後ろ投げの分岐条件、カンフースルーはキーの前後で
投げる方向が変わるタイプの投げ技、その詳しい記述内容はkfm.cnsの「カンフースルー」の項目で説明

 

なおここまで強い強いと言ってきたが、投げ無効のハイパーアーマーには無力である
まあ和訳KFMが常時ハイパーアーマみたいな、強力なキャラと対戦することは無いと思うが

 

パワー溜め

編集前

[State -1, パワー溜め];ちょっとこ丸が追加した技
type = ChangeState
value = 700
triggerall = command = "hold_c"
triggerall = power < 3000 ;ゲージが満タンの時は出せない
trigger1 = statetype != A && ctrl

 
編集後

;パワーゲージを回復させる、回復速度は並程度
[State -1, パワー溜め];ちょっとこ丸が追加した技
type = ChangeState
value = 700
triggerall = roundstate = 2
triggerall = power < powermax
triggerall = statetype != A && ctrl
triggerall = enemynear,NumProj = 0
triggerall = random <= 100
trigger1 = p2movetype != A && p2bodydist X > 160
trigger2 = p2statetype = L && power < 2000 && p2bodydist X > 60


ごく普通のゲージ溜め、「enemynear,NumProj = 0」つまり相手の飛び道具が出ていないときに
相手が大きく離れている時か、ゲージ量が少ない時は危険を犯してでも相手がダウン中に(比較的近距離でも)
ゲージ溜めを行う、と言った感じの記述。power < 3000を「power < powermax」に書き換えた理由は
kfm.cnsの「パワー溜め」で解説しているので、詳しく知りたいならば読んでみると良い

 

シールド

編集前

[State -1, シールド];ちょっとこ丸が追加した技
type = ChangeState
value = 701
triggerall = command = "z"
trigger1 = ctrl

 
編集後

;敵の攻撃を完全に防御、連続で使えないし、投げも防げないので過信は禁物
[State -1, シールド];ちょっとこ丸が追加した技
type = ChangeState
value = 701
triggerall = roundstate = 2
triggerall = ctrl
triggerall = stateno != [701,702]
triggerall = EnemyNear,Facing != Facing
trigger1 = random <= 30 || enemynear,HitDefAttr = SCA, NA,SA,HA
trigger1 = p2movetype = A || InGuardDist
trigger2 = InGuardDist || enemynear,NumProj > 0
trigger2 = p2bodydist X >= 90 || statetype = A
trigger2 = random <= 50


「EnemyNear,Facing != Facing」は「板投げ」のときの否定、要するにお互いが向き合っているときの意味
タッグ戦などで、こちらに背を向けて攻撃している相手に向かって、延々シールドするのを避けるのに使える
当て身や無敵移動などでも同じような使い方ができるので、入れておくと暴発防止に役立つと思う

 

シールドは投げには無効なので、「enemynear,HitDefAttr = SCA, NA,SA,HA」で打撃にのみ反応するように
「バックステップ」に投げの超反応回避を記述しているなら、その下に置いておけば更に安心だろう

 

ちなみに発生の早い技に対しては、HitDefAttrが出た後にシールドしても、間に合わないことがある
だから「random <= 30」と低確率で先読みシールドするようにしている、このwikiで解説するのは簡易AIなので
正確に発生フレームなどを学習して防ぐわけではない、なのでこうしておくのが良いだろう

 

それ以外は、相手が攻撃中か、ガード可能範囲ならシールド。もしくはガード可能範囲か
相手が飛び道具を出していて、人操作でも十分に反応できるそこそこ離れた距離か、シールド仕込みで
飛び込んだと想定できる空中であれば、低確率でシールドするといった感じ

 

「stateno != [701,702]」はシールド中にさらにシールドしないため、これを入れておかないと
たとえシールド成功して相手の攻撃判定が消えていても、攻撃態勢が残っていたらまたシールドしてしまう
反撃のチャンスが消えてしまうということなので、これは絶対に入れておくべきだろう

 

挑発

編集前

[State -1, 挑発]
type = ChangeState
value = 195
triggerall = command = "start"
trigger1 = statetype != A
trigger1 = ctrl

 
編集後

;挑発、システムによっては挑発でゲージが多少増えたり
;次の攻撃の威力が増したりするが、そういうことはない普通の挑発
[State -1, 挑発]
type = ChangeState
value = 195
triggerall = command = "start"
trigger1 = statetype != A
trigger1 = ctrl


MUGENにも実はデフォルトでAIが入っている、ウォッチモードでAIなしカンフーマンを見ていると
適当に動くあれがそうだ。あれはAIと言えるほど立派なものではなく、commandとしてcmdファイルの
command定義パートに登録されたものを、ランダムで実行していくものだが、それに任せてしまうという
COOLなやり方。状況を問わず挑発するので、まさに挑発らしい挑発といえる

 

有利なときに安全なところで挑発するやり方もあるが、このwikiではあえてCOOLな方で行くことに