FC2ブログ

あつとブログ

WEB漫画サイト「ゆめいろGペン」のサポートが本来の目的。色々な(偏った)ジャンルで調べたこと等をまとめる奇妙なブログです。コメントは受け付けてないのでご連絡は「mituiatto☆gmail.com」まで

オリジナル漫画「魔心」公開中。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MUGEN ガードのみ可能記述ver2

■前置き
格ゲーには「行動不能だがガードのみ可能」という場合がたまにある。
技を出したりジャンプをすることはできないが攻撃をされた場合ガードに移行するもので、
私の知っている範囲だとブレイブルーの後転起き上がりなんかは後半がその状態らしい。
他にはワープ系の技はそういうの結構あるんじゃないだろうか。
(ワープ直後攻撃がすぐ出せると世紀末になるが、簡単にワープ後の隙を狩られるのも嫌というようなバランス)
急降下技の着地硬直とかもそういうのがありそう。
私は主にジャンプ移行中に立ちガードのみ可能にするために使っている。
(中段立とうとして飛んじゃったところに中段刺さるの理不尽じゃないですか?)


■仮定
以降は簡単のため、攻撃技の後、後硬直の間行動はできないがガードはできる、というようなものを作りたいとする。
StateNo=200で攻撃し、その後隙であるStateNo=201の間は「ガードのみ可能ステート」としよう。


■ガード成功の条件
まずMUGENのガードの流れについて確認しておこう。
「ガードポーズをとる(St130)」というのと「ガードが成功する(St150)」というのは別であることに注意したい。

「ctrl=1 && 相手のAttackDist内 && 後ろ入力がある」=「手動ガード条件」が成立している場合、
自分の処理の最初でSt120(ガード開始)に移動する。

これはMUGEN本体の処理であり、歩き・しゃがみ移行・ジャンプ移行などと似たようなものである。
(正確には「上記の移行→自動振り向き→ガード移行」の順だという話もある)

St120にはSt130(ガードポーズ)、St140(ガード解き)へのChangeStateがあるが、
今回の話とはあまり関係が無いので気にしなくてよい。

ここからが重要である。
全キャラの処理が終わった後にヒット処理があるが、この時にSt120~St155にいる場合、ガードが成功してSt150(ガード)に移動する。
この時レバーの前後は関係無い。立屈はStateTypeで判断される。
連ガで後ろ入力が無くてもガードできるのは、既にSt150やSt151(ガード硬直)にいるからである。
手動ガードの場合はそのフレームの最初にSt120やSt130に来ているからガードできるのである。

前述の通り、MUGENでは手動ガードに「ctrl=1」が必要である。
しかし、ガードのみ可能ステートではctrl=0のままガードだけしたい。
どうすればいいか。
これは結構簡単で、ガードのみ可能ステートに120や130あたりへのChangeStateを仕込めばよい
ガードポーズへの移動をMUGEN本体に任せず、自分でやろうということである
(空中ジャンプを似たように設計しているキャラは少なくないだろう)。
具体的にはこんな感じに書けばよい。
[State , Hi to Lo]
Type = StateTypeSet
trigger1 = command = "holddown"
StateType = C
[State , Lo to Hi]
Type = StateTypeSet
trigger1 = command != "holddown"
StateType = S
[State , ガード可能]
type = ChangeState
trigger1 = command="holdback" && InGuardDist
value = 130 + 1*(StateType=C) + 2*(StateType=A)


■ガードポーズをとってすぐ解除対策
おそらくここまでで満足するキャラは少ない。
例えば30Fの間ガードのみ可能な後隙があるとする。
ここに対して相手はどうするか?
(投げを除けば)中段が選択肢に入るだろう。
が、先ほどまでの記述だと…
後ろ入力で中段の1F目に反応してSt130へ移動→
すぐに後ろ入力をやめてSt140へ移動、ctrlを得る→
そして中段10F目あたりに対し小パンで割り込む
…このように、ガードのみ可能とは名ばかりなのがお分かりだろう。
ガードするためにはガードポーズに移動しなければならないが。
ガードポーズをやめるなら元のガードのみ可能ステートに戻って後隙の続きをしてもらわないと困る。


これらの対策として変数を一つ使う。
ガードのみ可能ステートでフラグを立てる。
-2か-3で監視し、フラグが立っているのに130にいたらガードのみ可能ステートに強制送還するのだ。
これによって自キャラの処理の最後をSt130で終えてガードを可能にした上で、自キャラの処理の最初で元のステートに戻せる。
元のステートに戻っているので、ガードしたいなら番号ステート処理で再びガードポーズに移動してもらうことも可能だ。
具体的にはガードのみ可能ステートに以下を記述。
[State ,戻り予約タイマー]
type = varadd
trigger1 = var(17)>0
var(17) = 1
[State ,戻り予約開始]
type = varset
trigger1 = time=0 && var(17)=0
var(17) = 200
[State , 戻り予約解除]
type = varset
trigger1 = var(17) = 210
var(17) = 0


さらに-2に以下を記述。
[State -2,後隙フラグのリセット(時間切れ以外)]
type = varset
trigger1 = MoveType = H ;やられた場合もリセット
trigger2 = StateNo=[150,155] ;ガードした場合もリセット。
trigger3 = (var(17)=[200,210]) && (hogehoge) ;ほげほげでもリセット
var(17) = 0
ignorehitpause = 1
[State -2,ガードのみ可能ステートに戻す]
type = changestate
triggerall = StateNo=[130,140] ;実際は-2処理時に140であることはあり得ない
trigger1 = var(17)=[200,210] ;実際は-2処理時に210であることはあり得ない
value = 201
ignorehitpause = 1

ここで注意したいのは-2でChangeStateを行うと、即時に-2の読み込みがそのステコンで終了すること。
-2によるChangeStateは-2の最後に書こう。
他の用途で-2によるChabgeStateを使っている場合、競合する可能性が高い。



■ガードのみ可能ステート内の記述
お察しとは思うが前述のガードのみ可能強制送還フラグは、タイマーを兼ねている。
ガードのみ可能ステートは何度もガードポーズから戻ってきてTimeが0に戻る。
そのため、Timeやアニメを基準にした処理が安定しない。
よってガードのみ可能ステート内の処理は全てフラグ変数の値を参照して行う
具体的には以下のように。
[State ,] ;摩擦力
type = VelAdd
trigger1 = var(17)=[200,204] ;前半5F間
x = -0.7
[State , ステート変更]
type = ChangeState
trigger1 = var(17) = 0
value = 0
ctrl = 1

アニメは1Fごと1枚になっているAirを作ると簡単。
[State ,アニメ]
Type = ChangeAnim
Trigger1 = var(17)>0
Value = 102
Elem = var(17)-199
;var(17)は200~209。


■その他細かい部分
・普通のステートの記述との一貫性
kfmは攻撃ステートの最後にAnimTime=0でSt0にChangeStateし、ctrlを得て次のフレームからガード可能になる。
ここでSt0ではなく本記事のようなガードのみ可能ステートに移動した場合、移動したそのフレームからガードが可能になる。
つまりctrl=1のステートに普通に返すより1F早くガード可能になるので留意して設計するとよい。

・ガードのみ可能ステートを終えた直後
ガードのみ可能ステートを時間が終える時は、St0などに戻してctrl=1を得て立ち回りに戻るかと思う。
ガードのみ可能ステートはあくまでctrl=0のステートである。
kfmのような記述をしていれば、ctrl=0の攻撃ステートからSt0に戻った場合、戻ったばかりのフレームではガードができないのは有名である。
キャラ処理の最後にSt0に移動して終了しているから立ちアニメが表示されるが、そのフレームの開始時点ではctrl=0だったからキャラ処理の最初でガードステートに移動することができないという話だ。
これと同様に、ガードのみ可能ステートからSt0に戻った瞬間のフレームがガードできなくなる(たぶん)。
適当に対策するとよい。案としては
「ガードのみ可能ステートからのChangeStateは強制送還フラグの値に関わらずガードポーズへを最優先する」
「時間切れによるフラグリセットも-2で行う」か
「St0にもPrevStateNoをトリガーにしてガード可能記述を置く」
などだろうか。私は最初のものを採用している(ctrlsetのタイミングに注意)。

・St130のアニメ
St130でキャラ処理を終えると、通常であればガードポーズのアニメが表示される。
ガードのみ可能フラグが立っている場合はアニメ変更を行わないようにするといい。
内部的にはSt130なので攻撃を食らった場合はガードができ、見た目上のアニメは元のガードのみ可能ステートのものが表示される。

・空中でガードのみ可能ステート
着地するとステートが移動するため色々ややこしそう。
私自身がまだこれを必要としてないため、考えていない。

・レバーの方向
余談。
kfmは「自分の向き」だけによってガード方向が決まる。
「自分と相手の位置関係」に修正することをオススメする。

・その他の応用
ガードポイント技にも応用できると思った。
そう思ってガードポイントで調べたら似たような記述が出てきた。
そちらは一瞬ガードポイント技ステートを通った後にすぐSt130に飛び、St130のまま一連の処理を行った後、所定の時間経過後にガードポイント技の攻撃ステートに戻るようである。
その間はガードステート内の本来の処理は全く行わないようにするようである。


■没案(余談)
ctrl=1でないとガードできないと思っていた頃はこんな記事を書いていた。
特にメリットは無いと思うが、何かのヒントがあるかもしれない。

また、St140の最初でctrl=1を得てしまうのを消さなければいけないと思っていた時期もあった。
St130に移動してもフラグ中は毎F最初に元のステートに戻すため、フラグ中St140に辿り着くことはあり得ない。
ガード周りでctrlが変化するタイミングは以下の3つのみ。
「St151からTime = GetHitVar(ctrltime)で130に戻る時」
「St151からHitOverで130に戻る時」
「St140の最初」
St140のctrlsetを消しても問題はないと思われる。
St140のctrlsetを消した場合、
[State 132, 6]、[State 132, 7]、[State 155, 6]、[State 155, 7]の
ChangeStateにctrl=1を追記すると問題が起きない気がする。
必要の無い箇所や足りない箇所があるかもしれない。
参考までに。


■最後に
2017年にMUGENを触り始めた新参なので間違ってるかもしれません
スポンサーサイト

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。