Seaside Laboratory

Posts

KfUnit による Knuckle Fighter 系エンジンのテスト

ソフトウェア開発ではプログラムに誤りがないか検証するために「テスト」が行われる。テストがソフトウェアの品質を向上させる上で有用なのは言うまでもないが、この退屈で面倒なテストをどうやって行うのか、という問題がある。

解決策のひとつとしてユニットテストフレームワークというものがあり、特定の項目をテストするプログラムを書いておけば自動的かつ継続的にテストを行う仕組みを作ることができる。ちなみにフレームワークの名前は言語名に "Unit" を付け加えたものが多く、例えば C++ だと CppUnit という名前になっている。

KFM におけるテスト

KFM のテストを自動化したいのであれば適切なユニットテストフレームワークを使えばいいだけの話だが、Knuckle Fighter 系エンジンが複数あるという特殊環境下においては、プログラムの誤りよりも他のエンジンとの差を検出する方が優先度が高い。

各エンジンのソースコードがない以上、挙動を調査するにはエンジン上でキャラを動かすしか方法はなく、command.lst や motion.lst を書き変えては動作を確認するという地味な作業を何度も繰り返すことになり、検証するパラメーターの数が増えてくるとマンパワーで対応するのが難しくなってくる。

そんなことを繰り返していくうちに「テストコードならぬテストキャラを作れば省力化ができるのでは?」というアイディアが浮かび、テストを自動化するためのキャラを作ることになった。

テストキャラの例

KFM で画面外判定式を書く際に各エンジンの画面境界を調査したことがあった。

画面境界付近に発射した飛び道具が消える位置を調べている。

黙々とテストキャラが動いていても何が起きているのか把握できないので、何らかの方法でテスト結果を画面に表示する必要がある。画面境界の調査には KAZU さん考案の飛び道具反射テクニックを応用したものが使われていて、予め飛び道具を 4 つ発射した後に境界判定用飛び道具を発射し、それが消えたかどうかで「結果」表示を切り替えている。

このケースでは方向、精度、エンジンの組み合わせは 160 通りになり、手動で motion.lst を書き変えながらテストするのは現実的でないことがわかる。

motion.lst の行遷移テスト

KFM リファクタリング時にごちゃごちゃしていた motion.lst の行遷移処理を書き直したので、念のため KFX の逆アセソースを見て仕様を確認したところ、想定していたものとは違う処理になっていたので全エンジンの挙動を調べることにした。

KFA でモーション分岐機能が拡張されたこともあって行の遷移はやや複雑で、遷移先は To で初期化された後、ランダム分岐やヒット分岐が発生したら上書きされ、コマンド発動による割り込みがかからなければフレーム満了か着地時に行遷移する、という仕組みになっている。

今回問題になったのは空中でヒット分岐が発生した後に着地したときの挙動で、KFX は着地時に To しか参照しないのでヒット分岐の有無にかかわらず To へ遷移する仕様になっている。

前置きが長くなったが、KFA の挙動を正としたテストキャラを作成し、全エンジンでテストを行った。

わざわざ「モーション着地」と書いてあるのは KFX には 2 種類の着地があるからで、モーション着地は次の行へ遷移するのに対し、コマンド着地は着地コマンドが実行されるという違いがある。

KFX との互換性を重視している (と思われる) XPlus も NG になるかと予想していたが、結果は KFX とそれ以外で綺麗に割れた。今までこの非互換な部分が問題にならなかったのはこの挙動を期待するような作りのキャラが居なかったせいだろう。

これを逆手にとれば実行されているエンジンが KFX かどうかを判別することはできるが、判別に至るまでのステップが長く、副作用もあるので使いどころはなさそう。