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問わず)
え?よくわかんない?うーん、順番を付けると、
- Projectile (ID=200) を出す
- Projectile (ID=200) が相手に当たる
- ProjHitTimeは1とする
- Projectile (ID=200) が消滅
- 〜なんか戦闘中〜
- 240F後にProjectile (ID=200) を出す
- 前に出したのと同じ技を使ったということですね
- 以前相手に当たっているので、当たる前からProjHitTimeが有効
- この時点でProjHitTimeは241を返す
- cns的には「当たる前から当たった」という条件が成立する恐れ有り
ということです。
ヽ(´д`ヽ)(ノ´д`)ノイヤァ〜
あ、ちなみに最初に発見したのはM.U.G.E.N 1.0で、その後WinMugenも同様であることを確認しました