Posts
KFM でのみ動作するモーションの書き方
キャラを複数のエンジンに対応させる場合、各エンジンでサポートされている機能の有無や不具合といった差異をキャラ側で吸収しなければならないが、エンジン毎に処理を変える方法は提供されていない。そこで各エンジンに差があることを逆手に取り、実行されているエンジンの判別を行う。
分岐方法
基本的にはリソースの上限や拡張機能の有無で処理を分岐させる。例えば KFX の CmdNum は 0 ~ 129 の 130 行が上限となっているので、CmdNum が 130 の行を定義すれば拡張エンジンでのみ有効なコマンドとなる。ただ、リソースの上限を超える方法は KFX の動作を不安定にさせるので、可能な限り拡張機能の有無で処理を分岐させる方法が望ましい。
KFM の判別
拡張機能の有無で処理を分岐させる方法は「機能が拡張されると判別ができなくなる」という潜在的な問題を抱えている。実際、ガード方向パラメーターの T を使ったヒット分岐や、未使用の飛び道具番号を使ったコマンド切り替えで KFM を判別しているキャラが存在したが、両方とも現バージョンの KFM では正しく動作しない。安定した分岐を行うには、拡張されなさそうな機能を使うことが重要となる。
KFM で拡張予定のない機能のひとつがキャンセルフラグで、今のところ 32 個を超えるフラグに対応するつもりはない。つまり、範囲外のキャンセルフラグを使った分岐であれば安定して動作させることができる。具体的には command.lst の Command に ?、Cancel に -28 以降のフラグを設定し、モーションに割り込む形でキャンセルをかけて分岐を行う。
KFM の機能をどこまで拡張するのか自分でも分からなかったのと、対応方法を書いてしまうと該当パラメーターの拡張が制限されてしまうので明言を避けてきたが、KFM がバージョンアップする度にキャラ制作者が振り回されてしまう状況も良くないので、一定の方向性を示すことにした。仮に前述の分岐方法が使えなくなったとしても、どう対策すべきかは見えてくるはず。
おまけ
大量のキャンセルフラグが定義された command.lst を KFX に読み込ませたらどうなってしまうのか。正直、KFX のことまで面倒は見切れないが、興味はあったので一応調査してみた。
command.lst の読み込みにおけるローカル変数の配置とメモリの状態は以下のようになる。
int idx; // ebp+ffffff74 char Cancel[32]; // ebp+ffffff54
Cancel は必要最低限の 6 ではなく、32 も確保されているのでバッファーオーバーフロー耐性が高い。当然、極端に長ければ境界を越えてしまうが、幸い idx は使用前に初期化が行われるので、Cancel から少々はみ出す程度なら問題はない模様。