Posts
KFX におけるガード不能攻撃の怪
GUI の motion.lst には設定ミスがあり、拡張エンジンではガード不能攻撃として処理される。このガード不能攻撃が成立するまでの過程を追ってみた。
GUI のガード不能攻撃
設定ミスが見つかった経緯については KnuckleFighter@Wiki に詳しく書かれている。
立ち強 P にダメージを設定していない攻撃判定が存在するが、拡張エンジンでは投げ入力空振り時、ダメージ無しのガード不能攻撃としてそれがヒットしてしまうバグが存在する。Knuckle Fighter Alpha を舞台として行われた物としては初のエネミー大会である第一回 KOE (2004/07/04) にてそれが判明。元々完成度の高かった魔人氏の GUI エネミーがこのバグも味方に付け、鬼のような強さを発揮した。
拡張エンジンのバグによって引き起こされたかのような表現になっているが、問題となった立ち強パンチには攻撃に必要なパラメーターが一通り設定されている。
-Num---To-Sp-Pic-De-Ci-V---VxRx--VyRy-C-CL-G-Da--Hit-H-Flag-COMMENT 260 -1 2 26 1 40 9 0 1 0 0 9 0 0 0 0 0 0000 ;STA-B-P 261 -1 6 26 1 40 9 0 1 0 0 2 1 U 5 0 1 0000 ; 262 0 7 0 1 40 9 0 1 0 0 9 -1 0 0 0 9 0000 ;
ヒットフラグが有効でないためヒットに至ることはないが、投げを空振りすることでヒットフラグを有効にできてしまう。
-Num---To-Sp-Pic-De-Ci-V---VxRx--VyRy-C-CL-G-Da--Hit-H-Flag-COMMENT 1100 260 1 0 0 0 9 0 1 0 0 9 0 X 0 1101 1 0100 ;NAGE-BP 1101 -1 1 25 2 40 9 0 1 0 0 9 0 0 0 0 9 0000 ;(STA-S-P) 1102 -1 2 25 2 40 9 0 1 0 0 9 0 U 3 0 1 0000 ;(STA-B-P) 1103 -1 2 26 2 40 9 0 1 0 0 9 1 U 5 0 1 0000 ; 1104 -1 2 36 2 41 9 0 1 0 0 9 -1 0 0 0 9 0000 ;(SIT-B-P) 1105 -1 4 37 2 41 9 0 1 0 0 9 2 U 9 0 1 0000 ; 1106 -1 5 36 2 41 9 0 1 0 0 9 -1 0 0 0 9 0000 ; 1107 0 3 10 2 41 9 0 1 0 0 9 -1 0 0 0 0 0000 ;
これだけ条件が揃っていれば KFX でもヒットしそうなものだが、何故かヒットしない…。
原因調査
原因を探るべく KFX の逆アセソースを確認したところ、ヒット処理の手前に以下のような条件文が定義されていた。
if ( 飛び道具が存在しない and (ヒットフラグが無効 or ガード方向が無効) ) { ヒット処理を行わない; }
条件式は「ヒットの見込みがない」という意味で、ヒットしないと分かったら早々に処理を中断することで負荷を軽減していると思われる。この少々読みづらい条件式を整理すると以下のようになる。
攻撃側 | ヒット条件 | 補足 |
---|---|---|
プレイヤー | ヒットフラグとガード方向が有効 | |
飛び道具 | 飛び道具が存在している | 飛び道具にはヒットフラグがない |
GUI のガード不能攻撃は、このチェックによって無効化されていた。興味深いのは飛び道具だけガード方向のチェックが行われないという点で、別の言い方とするとガード不能攻撃を行えるのは飛び道具だけ、ということになる。KAZU さんの「キャラ作成 Tips」にも、
・ガード不能攻撃
一般的にヒット属性、M と D を 1 フレームであてればほぼガード不可。飛び道具のヒット属性を 0 に設定してもガード不可。
と書かれていたが、飛び道具だけ特別な理由が分かっていなかった。
疑問は一通り解決したので調査はここで終了、となるはずだったのだが…。
コードの不吉な臭い
先程の条件式は飛び道具が主体となっているので、飛び道具が存在するときは後半の条件式が評価されなくなる。つまり、飛び道具を発射した後にガード不能攻撃を仕掛けてやればヒットさせることが可能になる。本当にそんなことが起きるのか、早速検証してみることにした。
「1 HIT COMBO」という表示は、ガード不能攻撃でコンボ数がリセットされた後に通常攻撃がヒットした結果なので、条件さえ揃えば KFX も拡張エンジンと同様の動作になることが分かった。
ヒットフラグもガード方向と同様にチェックをすり抜けることは可能だが、処理の後半で再度チェックが行われるため、ヒットフラグが無効な攻撃をヒットさせることはできない。