MUGENの怪現象 ※追記あり
[state ]
type=varset
trigger1=AnimTime<0
fvar(39)=floor(AnimElemNo(0))
こちらの記述、私が響の中で使っている記述で、
その時点のAnimElem番号を保存するためのものなのですが・・・。
これ、
[state ]
type=varset
trigger1=1
fvar(39)=floor(AnimElemNo(0))
こうでも良いような気がしません?
でもダメなんすよ。
AnimTime=0 という記述は、
「そのアニメーションの最後の1Fが終わった」
という意味なんですけども、じゃあAnimTime=0になった後は何が表示されるのかというと、
そのAnimを再び最初から表示しなおすことになります。
んで、どうやらAnimTime=0が成立した瞬間というのは
すでにAnimElemNo(0)=1、つまり一枚目の絵に戻っているということらしく、
たとえばAnimElem=1を条件としたステコンなんかは暴発する可能性を持っている臭いんすよ。
上記のVarSetの場合、べつにStateDef 0にVarをリセットする記述など無いにも関わらず、
StateDef 0 に戻ったときにはfloor(fvar(39))の中身が1になってしまっています。
またこれだけでなく、いまいちハッキリとはしていないんですが、
どうやらChangeStateが行われたそのフレームの間(直後の1フレーム含む?)は、
直前のStateDefでtrigger1=1で常時実行していたステコンや、
一度実行するとステート移動が行われるまで発動し続けるタイプのステコンが、
ステート移動しているにも関わらずまだ実行されつづけている可能性があるっぽい?
とくにHitOverRide、こいつは確実にそういう挙動をしている。
HitOverRideを実行したステートから移動した直後のステートのTime=0、
この間はまだHitOverRideの効果が残存している。
HitOverRideによる怪現象のうちのいくつかはこれが原因のような気がする。
超必殺技用の個別ステートのTime=0でゲージ消費やエフェクト表示をすると、
ときどき超必殺技のエフェクトが表示されてゲージも消費されているにも関わらずガードしている・・・
なんてことも起こるようですが、
これはおそらく後者の怪現象・・・
つまり、ステート移動をした直後は直前のステートで実行されていた処理が
残存している可能性があるってやつが原因なような気がしますねえ・・・。
AnimTime=0の瞬間はAnimElem=1になっている説、
これ非常によくわからん挙動なんですよねえ。
正しいとも正しくないとも言いづらい。
なぜなら変数に格納したAnimElemNo(0)は1に戻っているのに、
そのVarSetの一個上に置いたtrigger1=AnimElem=1のLifeSetは反応しないから。
でも以前、持続の一番最後のフレームでPauseTime付きのHitDefを命中させたとき、
AnimElemNo(0)に合わせて表示するはずのExplodがずれることがある話をしたと思うんですけど、
あの話のついでに、そのずれたExplodが
StateDef 0に戻った瞬間の1Fに表示されることがあるって言ったはずなんですが、
それの原因がたぶんこの件だと思うんですよねえ。
よくわからんのでこれ以上はなんとも言えませんね。
ちなみに、わざわざ変数にAnimElemNo(0)を格納するようにしたのは、
AnimElemNo(0)=5
とかをトリガーにしていると前述の持続当てのときにずれて表示される場合があるのに対し、
AnimElemNo(0)を変数に格納した状態でVar(XX)=5などとした場合には、
少なくとも同じようなズレは起きなくなるからです。
type=varset
trigger1=AnimTime<0
fvar(39)=floor(AnimElemNo(0))
こちらの記述、私が響の中で使っている記述で、
その時点のAnimElem番号を保存するためのものなのですが・・・。
これ、
[state ]
type=varset
trigger1=1
fvar(39)=floor(AnimElemNo(0))
こうでも良いような気がしません?
でもダメなんすよ。
AnimTime=0 という記述は、
「そのアニメーションの最後の1Fが終わった」
という意味なんですけども、じゃあAnimTime=0になった後は何が表示されるのかというと、
そのAnimを再び最初から表示しなおすことになります。
んで、どうやらAnimTime=0が成立した瞬間というのは
すでにAnimElemNo(0)=1、つまり一枚目の絵に戻っているということらしく、
たとえばAnimElem=1を条件としたステコンなんかは暴発する可能性を持っている臭いんすよ。
上記のVarSetの場合、べつにStateDef 0にVarをリセットする記述など無いにも関わらず、
StateDef 0 に戻ったときにはfloor(fvar(39))の中身が1になってしまっています。
またこれだけでなく、いまいちハッキリとはしていないんですが、
どうやらChangeStateが行われたそのフレームの間(直後の1フレーム含む?)は、
直前のStateDefでtrigger1=1で常時実行していたステコンや、
一度実行するとステート移動が行われるまで発動し続けるタイプのステコンが、
ステート移動しているにも関わらずまだ実行されつづけている可能性があるっぽい?
とくにHitOverRide、こいつは確実にそういう挙動をしている。
HitOverRideを実行したステートから移動した直後のステートのTime=0、
この間はまだHitOverRideの効果が残存している。
HitOverRideによる怪現象のうちのいくつかはこれが原因のような気がする。
超必殺技用の個別ステートのTime=0でゲージ消費やエフェクト表示をすると、
ときどき超必殺技のエフェクトが表示されてゲージも消費されているにも関わらずガードしている・・・
なんてことも起こるようですが、
これはおそらく後者の怪現象・・・
つまり、ステート移動をした直後は直前のステートで実行されていた処理が
残存している可能性があるってやつが原因なような気がしますねえ・・・。
AnimTime=0の瞬間はAnimElem=1になっている説、
これ非常によくわからん挙動なんですよねえ。
正しいとも正しくないとも言いづらい。
なぜなら変数に格納したAnimElemNo(0)は1に戻っているのに、
そのVarSetの一個上に置いたtrigger1=AnimElem=1のLifeSetは反応しないから。
でも以前、持続の一番最後のフレームでPauseTime付きのHitDefを命中させたとき、
AnimElemNo(0)に合わせて表示するはずのExplodがずれることがある話をしたと思うんですけど、
あの話のついでに、そのずれたExplodが
StateDef 0に戻った瞬間の1Fに表示されることがあるって言ったはずなんですが、
それの原因がたぶんこの件だと思うんですよねえ。
よくわからんのでこれ以上はなんとも言えませんね。
ちなみに、わざわざ変数にAnimElemNo(0)を格納するようにしたのは、
AnimElemNo(0)=5
とかをトリガーにしていると前述の持続当てのときにずれて表示される場合があるのに対し、
AnimElemNo(0)を変数に格納した状態でVar(XX)=5などとした場合には、
少なくとも同じようなズレは起きなくなるからです。