人生エクソダス

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

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制作は大変だ。


楽しかったやる夫スレを思い出す 14 やる夫の魔王の道

2020-01-01 00:31:57 | やる夫スレ

 苺飴を売り歩く行商人のやる夫はあるとき翠星石とやらない夫に決闘沙汰から助けられる。やる夫は定住できない環境から二人の道中について行き露天売りをしようとする。だがこの二人は「魔王軍」の所属だった…。

 というところから始まる。魔王軍として統率するようになり治安は収まりつつあったものの、その構成員の魔物達の中にはいまだに人食いが隠れ住むこともあり、人間であるやる夫の身の安全のためにコックとして召し抱えられることになる。魔王軍の食糧事情は、でっていうによる作物供給によって優秀なものの調理という概念が存在しない壊滅的な調理技術だったために、食事というものを好意的に捉える存在は皆無だった。そこでやる夫は行商をしながら培ったあちこちでの郷土料理からアレンジや再現によって魔王軍の料理というものを革新していく。それは農作物を好奇心から改良を続けるでっていうとの二人三脚なところもあった。

 そこで迎え入れられた魔王・L(デスノート)※Lと呼ばれることはほとんどなく魔王ともっぱら呼ばれる、竜の生き残り・新城直衛、剣の達人・阿部高和、熟練の魔導師・ジェイルスカリエッティ、絶大な力を持つ水銀燈などの面々と、人間の新入りという扱いながら温かく迎え入れられた。やる夫はそこでかつて存在し今は失ったと思っていた家族の温もりを思い出す。その関係性の変化は、これまで頑なだった者達の心境も変化させていくことになる。

 こういうところに面白さがあった。連載が2011年というやる夫スレとしてはちょうど全盛で、ヒロインにローゼンメイデンの翠星石、兄貴分のやらない夫、そして包容力のある大人の女性として水銀燈が配置されるキャスティングはTHE鉄板。そして職業軍人として使いやすい新城直衛、大人の男としての姿を見せる阿部高和というのもまた鉄板。煽り倒すような口調ながら実は思慮深い存在としてでっていうを使うというのも非常に手堅く安心して見ていられる。かなり珍しくリリカルなのはからジェイル・スカリエッティと彼が生み出したナンバーズ(12人の"姉妹")が登場する。これは非常に非常に珍しく、他の作品で出ましたっけ?「やる夫達は王道を突き進むようです」の他に?…のレベル。

 だがそれらのキャラクターの人格描写・背景設定がしっかり描写されているので、自分の知らないキャラクターだからといって投げるべきではない。読んでいくうちに腑に落ちていくからだ。そうした描写の深さがあるから、ギャグに笑うことができるし、シリアス展開にのめりこめるし、感極まった場面で目頭を熱くすることができる。

 料理人なのに「やる夫の魔王の道」とは、はて…というところが作品のネタバレだったりする。場面をひっくり返すとかではないが、色々察しながら読むことになるだろう。