Seaside Laboratory

Posts

KFX の enemy.lst とヒットストップ

ヒットストップと密接に関係する enemy.lst からのコマンド入力についてまとめてみることにした。

詳細な仕様がわからなかった KFA については触れていない。

はじめに

説明の題材には KFX の標準キャラである RYOU を使用。

enemy.lst に書かれたコマンドが実際どのように実行されるかを見ることで、各エンジンのヒットストップとコマンド処理の挙動を調べていく。

まず、ヒットストップを発生させなければいけないので、何らかの攻撃が発生するコマンドが必要になる。それに加え、ヒットストップの影響を確認するためのコマンドが必要になる。これらを踏まえ「弱パンチ後にジャンプ」という行動をとらせることにした。

KFX は 1 フレーム内に複数回コマンド処理が行われる関係で発動タイミングに揺らぎがあることと、先行入力が機能すると入力と発動にズレが生じてしまうため、これらの影響を受けない「ジャンプ」コマンドを採用した。

弱パンチが終わるのを待ってからジャンプさせる必要があるので、motion.lst の Sp から総フレーム数を算出する。

-Num---To-Sp-Pic-De-Ci-V---VxRx--VyRy-C-CL-G-Da--Hit-H-Flag-COMMENT
 250   -1  2  25  1 40 9    0 1   0 0 9 -1 0  0    0 0 0000 ;STA-S-P
 251   -1  2  26  1 40 9    0 1   0 0 2  0 U  4    0 1 0000 ;
 252   -1  2  26  1 40 9    0 1   0 0 9 -1 0  0    0 9 0000 ;
 253    0  1   1  1 40 9    0 1   0 0 9 -1 0  0    0 0 0001 ;
 ※当たり判定は省略。

モーションのタイムチャートとコマンドを図式化すると、

このようになるので enemy.lst には、

Distance--100--Command--COMMENT
    320   100  p5555558 ;弱パンチ後にジャンプ

と記述すればいいことが分かる。

KFX

攻撃がヒットすると、そのフレームからヒットストップが始まり、KFX では 2 フレームの間、全キャラクターの動作が停止する。

タイムチャートの区切りが斜めになっているのは、実際のプログラムの動きを模したもので、ヒットストップはフレームの途中から始まり、フレームの途中で終了する。

最初に書いた enemy.lst はヒットストップが発生すると入力がズレてしまうので、正常に動作させるには延びたフレーム数の分だけニュートラルなどのコマンドを間に挟む必要がある。

先程の図はヒットストップの分だけ 2 フレームのニュートラルコマンドを追加している。

XPlus

XPlus は標準のヒットストップが 4 フレーム に変更されている。

KFX より 2 フレーム多いので、enemy.lst からの入力を単純にコマンドバッファへ流すと正常に動作しなくなってしまう。そこで XPlus は KFX との差分である後半 2 フレーム (拡張ヒットストップ) の間に行われる、コマンド入力やコマンドバッファの更新といったコマンド全般の処理を停止させることで互換性を維持している。

ただ、この方式はコマンド処理が停止している間の入力を全て取りこぼすことになるので、コマンドの受付は相当悪くなってしまう。

KFM 1.92

KFM はヒットストップが可変なので、XPlus と同じヒットストップが発生した時の説明をする。

XPlus と同様に KFX とヒットストップのフレーム数に差はあるが、KFM は拡張ヒットストップ中であっても入力を受け付けている。ヒットストップによる入力時間延長効果もあり KFX と比べてコマンドはかなり入力し易い。

その代償として enemy.lst の互換性は低下している。

KFM 1.96

KFM 1.96 は XPlus と KFM 1.92 のハイブリット仕様で、コンピューター (enemy.lst) からの入力は XPlus 方式、人間 (コントローラー) からの入力は KFM 1.92 方式で処理している。

コンピューターは言葉通り機械的に入力することができるので取りこぼしは発生せず、人間からの入力は互換性もくそもないのでコマンド処理を行っても問題がない。