chikuchikugonzalezの雑記帳

趣味とか日記とかメモとか(∩゚д゚)

Proj*Time系トリガーの怪

もうProjContactTimeが信じられなくなったよ*1

何が起きたか

Helperで見た目作って、判定をProjectileにするごくごく普通の飛び道具を作っておりました。
で、Helperを消滅アニメにするためのNumProjIDとProjContactTimeを併用してProjectileが消滅or相手接触時、という条件にしていたわけです。
が、どういうわけかいきなりHelperが消滅アニメに移行するという謎現象にぶち当たり、とりあえずProjContactTimeの方を消したら正常動作したわけで、
(・3・)アルェー となってたわけです。

どうにも挙動が怪しかったのでProjContactTimeをDisplayToClipboardを使って表示したら、そこには驚愕の事実が…!
というのが今回の件。ぶっちゃけProjContactTime・ProjHitTime・ProjGuardedTime・ProjCancelTime全部同じでした。

Proj*Time系トリガーの初期値

コメントでlunatic氏に指摘されたとおり、初期値は-1でした
まずびっくりしたのがこれ。なにがびっくりって

ProjContactTime / ProjHitTime / ProjGuardedTime / ProjCancelTime の初期値は常に1常に-1

ということ。
相手に当たる前から「1-1」が返されるとかどうなってんだ。
(追記)
0じゃないのかー、とか思ってたけど-1って未定義扱いなんだろうか…

はい次。

Projectileが相手接触時以降のProj*Timeの値

えー、さらにびっくりがこれである。まず、

ProjHitTimeの値はProjectileが相手に当たってからの時間 (F)
ProjGuardedTimeの値はProjectileがガードされてからの時間 (F)
ProjContactTimeの値はProjHitTimeまたはProjGuardedTimeのどちらかと一致する
ProjCancelTimeは相殺してからの時間

というのが前提。というかそういうトリガーだし。
で、どうもこれ継続するみたいです

継続ってどーゆーこと?

継続するっぽいっていうのは、Projectileが消滅後もProj*Time系がカウントされているっぽいこと。*2
なので、例えばProjectileを相手にHitさせた場合、次に同じIDのProjectileを出すと前に出したProjectileのProjHitTimeが取れる (Hit / Guard / Cancel問わず)

え?よくわかんない?うーん、順番を付けると、

  1. Projectile (ID=200) を出す
  2. Projectile (ID=200) が相手に当たる
    1. ProjHitTimeは1とする
  3. Projectile (ID=200) が消滅
  4. 〜なんか戦闘中〜
  5. 240F後にProjectile (ID=200) を出す
    1. 前に出したのと同じ技を使ったということですね
  6. 以前相手に当たっているので、当たる前からProjHitTimeが有効
    1. この時点でProjHitTimeは241を返す
  7. cns的には「当たる前から当たった」という条件が成立する恐れ有り

ということです。

ヽ(´д`ヽ)(ノ´д`)ノイヤァ〜

あ、ちなみに最初に発見したのはM.U.G.E.N 1.0で、その後WinMugenも同様であることを確認しました

*1:だれか追加テストお願い

*2:projremove=1がついてるから接触時には消滅するProjectileを使ってたからたぶんそう