人生エクソダス

なんてことのない日々のこもごもをつらつらと書き連ねたり連ねなかったりする。

おつかい氏のマミさん 2 特殊動作のレビュー

2020-01-12 19:16:38 | MUGEN

 おつかい氏のマミさんについてもうちょっと語っていこうと思う。

 今回は特殊動作について。

  前回の所感は https://blog.goo.ne.jp/jinsei-exodus/e/68b3e3a1c89884f1dd01eafcd3149d20


◎マギアブート [900,901]

 いわゆるロマンキャンセル。「通常技がmovehitした時」と「必殺技中」に入力することで1ゲージ使って動作をキャンセルできる。ニュートラルだとその場でキャンセル900、前入力だとダッシュして追いかける901になる。無制限ではなく、1コンボにつき1回という制限の他、AIには禁止時間がある。

 この901ダッシュがマミさんの移動の中で最速(ダッシュが5、空中ダッシュが6、901が9)なので立ち大P(220)の先端が空中の相手に当たった場合や、ヴォレー(1000、1100)やメテオリーテ(3100)などの牽制に相手が引っかかったが遠くて追撃できない時にミラッジオ(1300、1350)をわざと出して901で走った方が普通にダッシュするより早い。空中ダッシュでの追撃は永久禁止のvar(13)がかませてあるので大して追撃できないことから、立ち弱Kで拾って地上→JC→空中コンボのルーチンに入りたいなら1ゲージ使ってコンボを獲った方がいい。

 ただ走って追いかける為に1ゲージ使うのは抵抗があるかもしれない。

 が、マミさんは受けに回ると厳しいのでゲージを抱えて大技狙うより、1ゲージガンガン使ってラウンド奪取を優先すべきというのが私の考えだ。ただし例外もある。

 <例外1 相手の防御力が高い/自分のティロフィナーレLV3>

 相手の防御力が高いときは普通にコンボをつないでもダメージの見込みがないので、800ヒットするTFlv3「ティロフィナーレ・ガラッシア」(3500)(TFG)で刈り取った方が良い。普通のキャラクターなら1はダメージが発生するので。なおTFGはダメージのある400ヒットとダメージのない400ヒットの合計800ヒットなのでATKを高く設定しているならゲージ過剰となる場合もある。

 <例外2 相手のlifeaddが普通に殴るダメージより早い>

 相手にlifeadd(体力回復)が設定している場合、マミさんのコンボ補正も相まって「最初はダメージが通っていたのにだんだんイコールまたは逆に回復される」こともある。そういう時は1ゲージでこつこつやってもしょうがないので、3ゲージ溜めて簡素に地上コンボ→JC→レガーレ→ティロフィナーレ(3200)で500ちょいダメージを獲った方がいい。TFスイッチ1以上なら2ゲージ技「ティロフィナーレ・ソル・レヴァンテ」(3300)が撃てるのでこちらの方が手軽かもしれない。

 一応発生1F目に無敵時間が1Fあるが打撃のみ(sca,aa)なので、飛び道具(ap)投げ(at)はそのまま喰らう。ただ9/毎F走って移動する性能なので、たとえばミラッジオ中に後ろから投げられそうな時に走って逃げればぎりぎり行けるかもしれない。攻めにも使えるが、前述のミラッジオしくじった時やヴォレー準備したらジャンプ攻撃されそうになったときに逃げる為に、その場900でモーション解除してHJで飛んで逃げるとかも選択に入る。そのくらい近距離でがちゃつかれるのがマミさんの受け性能からして致命的で、1ゲージ払うかラウンド獲られるかという状況にまでなりかねない。


◎通常投げ [500-501,550-551]

 地上投げ「びんた(ティロフィナーレ(笑))」が500、空中投げ「グランディーネ」が550。

 500は頬をはたいた時に501になり、これがブーキャンできるので901で追いかけていつもの230からのコンボに移行できる。相手が画面端密着ならギリギリ屈小K(330)が入るかもしれないがかなりの曲芸になるので普通に1ゲージ払った方がいい。

 550は空中の相手を摑んで蹴り落とし、同時に呼び出した銃で地面に叩きつけられた相手を撃つ。摑んだ位置が高すぎる時は追撃ができないが、ある程度低い場合、銃が当たっている間に自分が動けているのでそのまま走って230からのコンボをつなげることもできる。しかし蹴り落とした瞬間にctrlが可能になっているので、エルクゥのようにのけぞり時間の短いキャラクターには銃の追撃が入らないこともある。普段のAIは有情なので自分の体力が半分切らなければ550を振らない。

 共通することは、ニュートラル状態の相手(movetype=i)の相手にしか当たらない/すかりモーションがある ことで、投げミスがそのまま隙になることや、相手は固めないといけないがガードモーション中は投げられないというジレンマがある。 投げ判定は若干広く、伸ばした手の先端からキャラ0.5人くらいまで届く。といっても、キャラによってはinguarddistでなくてもとりあえずガードステートに引きこもって様子を見る記述になってることもあるので、ほいほい振れない。


◎ガードキャンセル攻撃 [2000]

 貴重なマミさんの切り返し。しかし1ゲージ使う。これ以外はただガードするしかないので削り倒されたり判定負けの可能性を考えれば1ゲージ払ってでも生き延びなければならない。そして地上でしか撃てないので、空中でガード固めさせられたら試合終了ですよ。場合によっては。そのくらいガードするという状況が致命的。

 すくっと立って銃を使って射撃する。この姿勢が問題で、密着状態や屈んだ姿勢が低いキャラクターには当たらない可能性もあるので全幅の信頼とはいかない。反面300くらいの射程があるので中距離で飛び道具などをガードした時にガーキャンを当てることも出来る。といっても”できる”というだけで、その後何もないので本当に切り抜けるだけとなる。


◎ジャンプキャンセル・空中ジャンプキャンセル [40,45]

 ある意味マミさんの最重要項目。立ち大K(250)/屈大K(350)/ジャンプ大P(420)/ジャンプ大K(450)を除いた通常技をジャンプモーションでキャンセルする。movehitを返したことが条件。つまりガードされた通常技はジャンプキャンセルできない。また永久ループ禁止のvar(13)の条件の一つともなっている。

 var(13)は、地上通常技を当てる&相手のけぞり→1 ジャンプキャンセル→2 となり、var(13)=2のときジャンプ大K(450)以外の全ての通常技がのけぞり1Fとなり、実質当てたら最後になる。そのため、AI設定のジャンプコンボなどは〆がレガーレ(1400)になっている。逆に450は普通に当たるわけだが、450は強制ダウンの上、普通にJCすれば加速度の関係で昇りになるので硬直のまま空中を飛ぶことになり、やはり隙だらけになる。どうしても当てるなら696でJC→空中ダッシュして450を当てるのが隙は少ない。そこまでする意味があまりないが。

 また空中でもJCできるので、これがマミさんの空中コンボの生命線となる。デフォルトだと空中コンボは、

 [J小P→J小K→J中P]→JC→[J小K→J中P→J中K→J大K] を主に振っている。J大Pは空中の相手にダウンを誘発するものの判定が下に強いので、コンボを当てるたびにマミさんは下に慣性がかかる一方で相手は上に慣性がかかるので、J大Kでなければ相手に引っかからない。空中通常技が何か当たったものの次が届かない場合なども、JCを真上・後ろにして仕切り直しが出来る。

 またmovehitを返した時にJCできるという性質上、相手が通常技をブロッキング・チャンスメイクしたときにもJCは可能。なので処理的には、自分は攻撃を当てたけど相手が自分ののけぞりを特殊動作でなかったことにしている という感じなので、通常技をミラッジオでキャンセルするより474でJC空中バックダッシュして逃げた方が安全な場合もある。(ブロッキング→超必とかされたら逃げる暇はないかもしれないが)


◎ハイジャンプ [60,61]

 通常ジャンプ、ジャンプキャンセル、2段ジャンプ、空中ダッシュ、空中バックダッシュと空中での機動力はとにかく高性能マミさん。そして地上で出せないとはいえ300くらい余裕で移動するハイジャンプもあるので、攻撃されそうで困った時にはとりあえずハイジャンプ→空中ダッシュとかで逃げることで対応できる。

 そしてマミさんの基本性能であるジャンプ加速性能がY軸-9.7X軸前3.8/後-3.6で、この性能を強化する形でのハイジャンプになる。具体的にはX軸1.8倍Y軸1.4倍(直上は1.5倍)なので、前ハイジャンプはX6.84Y-13.58移動し、直上だとY-14.55移動ということになる。これらはYaccelで減衰されるのでずっと-13.58/F進むわけではないが、それでもelqueを追いかけて飛び回れるくらいには高速長距離移動ができる。

 これによって、マミさんには対空技はないが上に判定の強いジャンプ中K(8F)やジャンプ大K(11F)をのぼりで出すことで対空処理できる。ジャンプ中Kは前面の判定強めだが喰らい判定も近い一方、強制ダウンがないので当たればジャンプキャンセルしてエリアルコンボに移行できる。ジャンプ大Kは攻撃判定と喰らい判定の距離が前面25上部60離れているので攻撃判定を比較的安全に押しつけることができるが、強制ダウンするので追撃が何もない。

 どちらも無敵時間なんてない通常技なので、攻撃モーション中の相手に突っ込んだり釣られて必殺技とか出されたら大人しくやられるしかないけども。


MUGEN小話 3 playsndでもっと大きい音にしたいときのあれこれ

2020-01-12 19:00:13 | MUGEN

 本当はmugen@wiki chaosで見て網羅できれば一番良いが、1.0以降の記述についての解説が少ないので、stageのBGM音量調整が昔はbgvolumeで良かったけど今はbgmvolumeじゃないと機能しない、とか、キャラクターの音調整もvolumeじゃなくてvolumescaleだとか、どっかのbbsに書いてあるのを検証して正誤判断しないといけないのがしんどい。

 ちなみにキャラクターの声とか、技しゃべってるときに殴られたら音を止めるようにchannel=0をつけたりするが、これを書くと音が埋もれて普通の時にも音量が小さくなってしまう。手っ取り早いのはchannel=0を消して同じステートをコピペするもの。ただ、これにすると叩かれたりKOされた時も技名を叫んでたりして(要は音が止まらないので)滑稽なので、movetype=hのときにstopsndになるよう記述すれば喰らい状態の時とそうでない時で音声をコントロールできる。ただ貴重なvarを1枠使ってしまうので、そこはそういうものと断念するか、helperは別枠でvarを保存できるのでishelperをtriggerに入れて判断させてもいい。ただ私はそのやり方を知らない。

;殴られたら音止めます
[state -3, ototomemas]
type=stopsnd
trigger1=movetype=h
channel=2
ignorehitpause=1
[state -3, ototomemas]
type=stopsnd
trigger1=movetype=h
channel=3
ignorehitpause=1
[state -3, ototomemas]
type=stopsnd
trigger1=movetype=h
channel=4
ignorehitpause=1

;パゼストバイフェニックス
;降下
[state -3, voice pb-phoenix raid]
type=playsnd
triggerall=time=1
trigger1=stateno=2110
value=s12101,var(0)
channel=2
[state -3, voice pb-phoenix raid]
type=playsnd
triggerall=time=1
trigger1=stateno=2110
value=s12101,var(0)
channel=3
[state -3, voice pb-phoenix raid]
type=playsnd
triggerall=time=1
trigger1=stateno=2110
value=s12101,var(0)
volume=44
volumescale=44
channel=4

 ↑みたいにすれば、喰らったらchannel=2~4の音を止めるようにできる。

 playsndを重ね掛けしているのは、所詮一個のplaysndで音量最大にしても効果音で埋もれるから。全く同じフレームで同じ音を出せば音が大きくなるので、記述が苦にならないならこのやり方が一番確実。ただvalueのs0000,floor(random/250)みたいにランダム要素を入れると各ステコンごとに計算するのでわやになってしまう。ステコンvarrandomとか、nullでvar(--):=floor(random/250) || 1みたいにランダムしたvarを代入するとかで同じvalueになるようにする必要がある。

 めんどくさいやり方として、sndファイルの音量を直接上げるという方法もあるが、これは本当に音を上げるだけなので音割れのケアなんかしてくれない。またモノラル*2でステレオにすれば音量も上がるが、これはsndを直接いじってできることではないので、「wavで出力」したものを編集し再取り込みしナンバリングしてようやく、というところになる。このやり方でコンプレッサーで中音域をつり上げて圧縮することで音量アップできるので、音量アップ+モノラルのステレオ化をやるならwavで出力したほうがいい。

 でも面倒でしょ。playsnd重ね掛けした方が楽だよ。


MUGEN小話 2 自分と相手の高さと攻撃判定の相関

2020-01-12 18:58:43 | MUGEN

 p2bodydist yがp2dist yと変わらないとかpos yとはじゃあどう違うのか、とか、空中にいる相手と攻撃判定の相関のはかり方がわからない。これがまた自分が空中に居る時と自分が地上にいる時でいろいろ変わってよくわからない。かと言ってすごい拾うの上手なAIの記述を見ても変数代入・ヘルパーとんでもなくててんで理解できない。
 これで合ってれば良いなあという期待を込めた記述として記述のひな形を書き残す。

 まず大前提として、p2bodydist y=p2dist y。bodydist xの場合キャラ幅を含めているのでdist xと内容が変わるがdist yに関しては一緒。
 さらに、敵がのけぞり中かそうでないかで変わるvel x、vel y、yaccel。
 enemy(var(xx)),movetype!=h(敵のけぞり中じゃない)のときは、enemy(var(xx)),vel x、enemy(var(xx)),vel y、enemy(var(xx)),const(movement.yaccel)
 enemy(var(xx)),movetype=h(敵のけぞり中)のときは、enemy(var(xx)),gethitvar(xvel)、enemy(var(xx)),gethitvar(yvel)、enemy(var(xx)),gethitvar(yaccel)
 これをtriggerで記入する時に注意しないといけない。それか変数にして別に記入しておくか。


[地対空] 攻撃発生10F・判定Y座標上限-89の場合
   p2dist y+enemy(var(xx)),vel y*5 >= -89*const(size.yscale)

 -89というのは攻撃判定のy座標の上限。相手の浮いてる時間を厳密にenemy,const(movement.Yaccel)使うのを面倒くさがって10F目に攻撃判定が出るので、さすがに等速で浮かないでしょということでvel y*5(5F分)くらいにしてみる。

 蜂百合氏のAIでは、↑のenemy(var(xx),vel y*5にあたる部分をfvar(11)として、ステコンの中で代入させている。
Triggerall =1 || fvar(11) := Ifelse( enemy(var(20)),MoveType!=H ,enemy(var(20)),const(Movement.Yaccel) ,playerid(var(8)),GetHitVar(Yaccel) )
Triggerall =1 || fvar(11) := Floor(( enemy(var(20)),Vel Y * fvar(10) ) + ( Fvar(11)*( (fvar(10)*(fvar(10)-1))/2) ))
Triggerall =1 || fvar(11) := fvar(11) * (enemy(var(20)),StateType = A)
 がトリガーに入っていて直に代入されている。
 このfvar(10)というのは攻撃発生フレームで、↑の例を使えば10ということになる。で、この記述のすごいところは、相手が空中(statetype=a)のときは1が代入されるのでそのままfvar(11)としてこの行より上の部分で計算された値が代入されるが、相手が空中でなかったら0、つまりfvar(11)自体を計算しない。
 fvar(10)を代入してfvar(11)を出しているので、たぶん落下加速度を勘案した正確なy座標を出せるのだろうと思う。
 1||としているのは、うっかり計算結果が0になってしまったらステコン自体読み込んでくれないので、とりま進めていく為にnull代入では必要な工程。


[空対地] 攻撃発生10F・判定Y座標上限-89の場合
  p2dist y+ifelse(enemy(var(xx)),statetype=S ,enemy(var(xx)),Const(Size.head.pos.Y) ,enemy(var(xx)),Const(Size.Mid.Pos.Y)
)>= -82*const(size.yscale)+vel y*5

 -82というのは攻撃判定のy座標の上限。ifelseを使って、相手が立ちならhead.posしゃがみならmid.posを参照するようにY座標割り出す記述を蜂百合氏のAIからぱくる。適当に、10F目に攻撃判定が出るのでvel y*5(5F分)―さすがに等速で浮かないでしょということで*10ではなく*5にしてみる。
 立ち屈みの判別がめんどくさい・相手を飛び越える高さでざっくり決めるということなら+enemy(var(xx)),const(size.head.pos.y)などを-enemy(var(XX)),const(height)にすればいいかもしれない。いずれにしても相手の座標を引いた結果攻撃判定の座標になるように設定。


[空対空] p2dist y+0.5*const(movement.yaccel)*16+(vel y+0.5*enemy(var(20)),vel y)*4 >= (-61-8)*const(size.yscale)+const(size.height)

 OG子 OGヲ氏のジャンプふっとばしの記述を丸パクして、helperで動作全管理してるキャラからのなのでroot,とついてる部分を全部削除。4F目に攻撃判定が出るので4*4の*16をmovement.yaccelに掛けて、自分の空中での移動速度vel yと相手の空中での移動速度enemy,vel yを4F分掛ける。丸パクなので0.5をどうして掛けているか分からなかったが、要は1+2+3+4=(4*(4+1))/2であり、いちいちmovement.yaccelのシグマを足して長い式にしなくても2乗÷2で同じ値を求められるのだ。攻撃判定はY軸から見れば最大も最小もマイナスなのでキャラ高さのsize.heightを足して調節。
 (-61-8)の-8は、このステート攻撃判定前にanimelemno(xx)=zzでvelsetが入っていてそこから先はY座標が動かないから。攻撃判定が出るまでvelsetがなければ別に引く必要はない。velsetが有る場合は、掛けるフレーム数をanimelemno(xx)=zzまでのものにして、「それ以降から攻撃判定前までのフレーム数*velsetで指定された移動速度」を別途に引いている。-8はこの場合velset y=4で判定まで2Fだったため。

 これで想定どおり動くかはわからない。だからAI制作は大変だ。