Seaside Laboratory

Articles

KFX のコマンドバッファを利用した連続入力

リバーサルフラグとガードキャンセルフラグを使った連続入力を理解している人を対象とした、新たな連続入力テクニックの紹介。

概要

KFX でフェイロンの烈火拳や庵の葵花のような連続入力技を再現するには、入力ステップ毎に異なるキャンセルフラグを割り当てる必要があり、貴重なフラグを大量に消費してしまう。

他に良い方法はないか、あれこれ考えていたところ、連続入力技は以下のような「コマンド技」としても解釈できることに気が付いた。

コマンド
烈火拳 1 段目 26p
烈火拳 2 段目 26p26p
烈火拳 3 段目 26p26p26p

この性質を利用して連続入力技の実装を行う。

実装例

まず、motion.lst に以下のような必殺技モーションを作成する。

Num キャンセル設定
1000 烈火拳 1 段目 終わり際をリバーサル可にする。
1010 烈火拳 2 段目 終わり際をリバーサル可にする。
1020 烈火拳 3 段目 キャンセル不可にする。

そして command.lst に先程のモーションを割り当てる。

CmdNum--Command--Cancel--Std-AmnNum--Vx--Comment
   100      26p   00100  011   1000  -1  ;烈火拳1
   101    2626p   00001  011   1010  -1  ;烈火拳2
   102  262626p   00001  011   1020  -1  ;烈火拳3

この状態で連続入力を行うと以下のような動作になる。

  1. 26p と入力すると「烈火拳 1」が発動する。
  2. 追加入力を行うと入力内容は以前の入力と合わせた 26p26p になり「烈火拳 2」が発動する。
  3. さらに追加入力を行うと入力内容は 26p26p26p になり「烈火拳 3」が発動する。

連続入力時はコマンドバッファに前回のコマンドが残っているので、これを利用して何段目の入力なのかを判別している。

直接発動の防止

先程の command.lst には「262626p と入力するといきなり 3 段目が出てしまう」という欠陥がある。この問題に対処するため、2 段目以降のコマンド全てに優先順位の高いダミーコマンドを追加する。

CmdNum--Command--Cancel--Std-AmnNum--Vx--Comment
   100      26p   00100  011   1000  -1  ;烈火拳1
   101    2626p   00001  011   1010  -1  ;烈火拳2
   102  262626p   00001  011   1020  -1  ;烈火拳3
   103    2626p   00000  011   1000  -1  ;烈火拳1(烈火拳2直接発動防止)
   104  262626p   00000  011   1000  -1  ;烈火拳1(烈火拳3直接発動防止)

262626p 入力は 2626p コマンドで捕捉可能なので省略することができる。

CmdNum--Command--Cancel--Std-AmnNum--Vx--Comment
   100      26p   00100  011   1000  -1  ;烈火拳1
   101    2626p   00001  011   1010  -1  ;烈火拳2
   102  262626p   00001  011   1020  -1  ;烈火拳3
   103    2626p   00000  011   1000  -1  ;烈火拳1(烈火拳2&3直接発動防止)

直接発動を防止した結果が 1 段目になるのであれば、1 段目のコマンドをそのまま使った方が手っ取り早い。

CmdNum--Command--Cancel--Std-AmnNum--Vx--Comment
   101    2626p   00001  011   1010  -1  ;烈火拳2
   102  262626p   00001  011   1020  -1  ;烈火拳3
   103      26p   00100  011   1000  -1  ;烈火拳1(烈火拳2&3直接発動防止)

1 段目の後に 262626p と入力すると 3 段目が出てしまうが、これは仕様なので諦めるしかない。

連続入力の限界

先程の例では通常技キャンセルフラグとリバーサルフラグの 2 種が使われていて、あまりフラグの節約効果が無いように見えるが、このテクニックは何段目であろうと同じフラグを使うので、段数を増やしても消費されるフラグが増えないというメリットがある。

ただ、段数を無限に増やせるかといったらそうではなく、コマンドやコマンドバッファの制約を受けるため、上限が存在する。

コマンドサイズ

command.lst の Command は、方向ボタンと攻撃ボタン合わせて計 9 文字までしか指定できないので、連続入力コマンドが 26p の場合、4 段 (26262626p) が限界となる。長いタメ技を作るテクニックを組み合わせることで段数を増やすことは可能と思われるが、正攻法で作る場合はここらが限界となる。

コマンドバッファサイズ

コマンドバッファにも最大サイズがあり、入力内容は時間とともに流れて行ってしまう。例えば、コマンドバッファのサイズが 10 で 26p を繰り返し入力した場合、以下のような状態になる。

状態 9 8 7 6 5 4 3 2 1 0
初期状態 - - - - - - - - - -
1 段目入力 - - - - - - - 2 6 p
2 段目入力 - - - - 2 6 p 2 6 p
3 段目入力 - 2 6 p 2 6 p 2 6 p
4 段目入力 p 2 6 p 2 6 p 2 6 p

0 ~ 9 はコマンドバッファのインデックスで、0 に最新の入力が保存されている。4 段目を入力した時点で 1 段目の入力は破棄されてしまい、3 段目の入力と区別がつかなくなる。その結果、3 段目を 3 段目でキャンセルするというおかしな状態になってしまう。

コマンドが長いとコマンドバッファを圧迫しやすく、技のモーション (≒追加入力の間隔) が長いとコマンドバッファが流れてしまうので、コマンドバッファを考慮した設計が必要になる。

最後に

このテクニックは実験的なもので実用面にやや難があり、KFX を使わなければいけないという状況でなければ、拡張エンジンで追加されたキャンセルフラグを使うことをお勧めします。