人生エクソダス

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

MUGEN小話 1 のけぞり時間計算とenemy(var(--))の使い方とブロッキングされた時の対応

2019-10-19 00:40:13 | MUGEN

 他人の記述をぱくったことを利用して書き残す。

 なお神キャラとかつくれる人みたいに当たり前にビット演算とかできないので、そこまで専門的なものを要求されても困るし、helperに監視とか高度なテクニックもないのでそこを期待されても困る。


 「movetype=h」は”喰らい状態ならなんでも”なのでガード状態も含まれる。普通は「stateno=xxxx && movehit」とかと組み合わせて使う(movecontact は当たってればガードでも1なのでコンボ繋げたい記述に入れるもんじゃない)が、それ以外にも「enemy(var(xx)),stateno!=[120,155]」を入れておけばガード状態の相手に振らない。

 「movetype=i」は普通”ニュートラル状態”のことを指すが、当て身の始動モーションもmovetype=iになってたりするので、「movetype=i && enemy(var(xx)),stateno<120」とかにしておけば一応純粋なニュートラル状態になる。だからといって技を出せばいいわけでもない(後出しすればいいから)。

 movetype=hはのけぞってれば対象になるので相手が投げられているときもmovetype=hである。タッグ戦で相方が敵を投げてるとかだと投げ中になんか事故ったら(投げてる最中に敵が殴られて外れたら次に正常に移行しないのでそこで止まってしまう)処理が大変なので、普通は自分と敵を無敵にする。なので敵がのけぞり状態だと思って技を振るものの無敵なので当たらない、というゲージの無駄遣いをすることが結構ある。

 そういうわけで打撃・飛び道具でのけぞってるという普通ののけぞり状態は、     enemy(var(xx)),gethitvar(hittime)+enemy(var(xx)),gethitvar(hitshaketime)+2>0

を入れておけば判断してくれる。これはのけぞり時間をそのまま出すので、0の部分を技の〇〇フレームのフレーム数として、たとえば14Fの技を振る際にこれが>14なら振っていい、というトリガーにしておけばいい。ただ絶対正しいわけではないらしい。とはいえ他に判断のしようがないのでこれを指標にすればかなり正確になる。タッグ戦とかで範囲の広い飛び道具とか当たってても黙ってみてるだけだったりしなくていい。黙ってみてる方が(乱入してコンボ切ってしまうことがあるので)良い時もあるが。

 上のenemy(var(xx))は、enemynearではKOしてるのも近くだからと反応したりするらしいので、numenemyを使ってvarsetすることで対応する。普通はp2statenoとかp2bodydistとかがenemyとかenemynearより生死判定含めて便利なものの、タッグだったりplayer判定のhelperとか居るとその辺わちゃるので、どっちも理解して使えた方が良い。

;■敵のインデックスを取得 enemy(var(20))
[State -1, Get Enemy Idx]
type = null
; 敵の数が2未満→enemy(0)
trigger1 = numenemy<2
trigger1 = var(20):=0 || 1
; 敵の数が2以上 近くの敵≠敵一人目→enemy(1)
trigger2 = numenemy>=2
trigger2 = enemynear(var(20)),ID !=enemy(var(20)),ID
trigger2 = var(20):=1
; 敵の数が2以上 敵KO→0なら1 / 1なら0
trigger3 = numenemy>=2
trigger3 = !enemy(var(20)),alive
trigger3 = var(20):=!Var(20)
ignorehitpause = 1


 本場のブロッキングやチャンスメイクがどういうからくりかは分からないが、mugenでこれを再現した場合hitoverrideを使って敵の攻撃movehitだけどのけぞりじゃないモーションに変えて対応しているので、当てた側はmovehit=1になる。つまり当たったと思って普通にコンボをつないだら実は相手はブロっててのけぞってません、反確。…ということになる。

 なのでstateno=xxx && movehitで終わりにしないで、たとえばブロッキングとか特殊動作はコモンステートじゃないからstatenoが200より大きいだろうということでenemy(var(xx)),stateno>200とかを書き加えたり、のけぞってないのでmovetype=hとか入れてのけぞってたら今の技を振る、とか思いつく限り記述を加えた方が正確に動いてくれる。↑で書いたgethitvar(hittime)と(hitshaketime)返したかもあれば便利。検証は大変だけども。


 ↑のを踏まえて技のステートを書くなら、例えば

;■しゃがみ中パンチ 4F
[state -1, crouching strong]
type = selfstate changeでいい
value = 310
triggerall = var(53) = 0 var(53)→AIレベル
triggerall = fvar(12):=4 変数にenemy(var(20)),gethitvar(hittime)...を代入
triggerall = var(50) && !var(59) && roundstate = 2 && alive && numenemy
triggerall = numenemy=1 || (numenemy>1 && (!enemynear(1),numproj || enemynear(1),hitdefattr!=sca,ha,hp)) 
triggerall = statetype=s || statetype=c
triggerall = ctrl || stateno=11 || stateno=21 || stateno=101
triggerall = p2statetype!=l 「敵ダウンじゃない」をtriggerallにしておく
triggerall = p2statetype!=a || enemy(var(20)),pos y-fvar(11)<0
triggerall = fvar(7)+fvar(8)*4 = [15*const(size.xscale)-enemy(var(20)),const(size.ground.front) ,92*const(size.xscale)]
; レガーレ90Fまでアトワズカ…
trigger1 = p2stateno=1490 && enemy(var(20)),time=[80,88]
trigger1 = random <= 50*var(50) ;150
; 立ち/空中攻撃にさしこみ
trigger2 = p2statetype!=c || random>765
trigger2 = fvar(7)+fvar(8)*4 > 54*const(size.xscale)
trigger2 = p2statetype!=a || p2dist y+fvar(11) = [-46*const(size.yscale) ,-32*const(size.yscale)]
trigger2 = p2movetype=a
trigger2 = enemy(var(20)),hitdefattr=s,na,np || (enemy(var(20)),hitdefattr=s,sa,sp && facing=enemy(var(20)),facing) || enemy(var(20)),animtime=[-5,-3]
trigger2 = random/var(50) < 34+life*.034
; 敵ニュートラル 超反応反撃とかあったら嫌なんですけど
trigger3 = p2statetype!=a || p2dist y+fvar(11)=[-46*const(size.yscale),-32*const(size.yscale)]
trigger3 = p2movetype=i
trigger3 = (p2stateno<120 && random>500) || ((p2stateno>199 || !enemy(var(20)),ctrl) && enemy(var(20)),animtime=[-5,-3])
trigger3 = random <= 83*var(50) ;150
; 発生4F 走って立ち小K>のけぞり時間
trigger4 = p2statetype!=a || p2dist y+fvar(11)=[-46*const(size.yscale),-32*const(size.yscale)]
trigger4 = p2movetype=h && p2stateno!=[120,155]
trigger4 = enemy(var(20)),gethitvar(hittime)+enemy(var(20)),gethitvar(hitshaketime)+2>3
trigger4 = (fvar(7)-66)/const(velocity.run.fwd.x)+4 > enemy(var(20)),gethitvar(hittime)+enemy(var(20)),gethitvar(hitshaketime)+2
trigger4 = (var(28)>1 && power>4000) || random<400+floor( (lifemax-life)*.34+(enemy(var(20)),const(data.life)-p2life)*.34 )
trigger4 = random<150*var(50)
; PUNISHMENT 立ち小K撃てない距離
trigger5 = fvar(7)+fvar(8)*4 >= 66*const(size.xscale)
trigger5 = p2statetype!=a || p2dist y+fvar(11)=[-46*const(size.yscale),-32*const(size.yscale)]
trigger5 = !enemy(var(20)),ctrl
trigger5 = p2movetype=a && !enemy(var(20)),hitdefattr
trigger5 = enemy(var(20)),animtime<-3
trigger5 = random <= 91*var(50)



最新の画像もっと見る

コメントを投稿