Seaside Laboratory

Post

KFX のリスト仕様と拡張

KFX の各種リストファイルはキャラ作成に必要な最低限の決まりしかなく、厳密な仕様は定められていない。後に登場する拡張エンジンがこれらをどう解釈することになったのか、プログラムの作りから導き出される仕様やフィールド (パラメーターを格納している列) の拡張性について書いておく。

KFX の仕様

まずは原点となる KFX のリスト仕様。

リストの読み込み

KFX のリスト読み込みには fscanf という C 言語の関数が使われていて、Linux の Man page では以下のような説明になっている。

名前
fscanf - 書式付き入力変換

書式
int fscanf(FILE *stream, const char *format, ...);

例えば、motion.lst の行番号 (Num) を読む際には、

fscanf(fp, "%d", &nNum);

という呼び出しが行われる。

fscanf に空白を読み飛ばす機能が付いていることもあり、ファイルを開いたらひたすら fscanf を呼び出すという単純な作りになっていて、処理の大半を fscanf に依存しているため KFX のリストはこの関数の影響を色濃く受けている。

例えば、先程の行番号読み込みで指定している "%d" という引数。これは「変換指定子」と呼ばれるもので、d であれば以下のような定義になっている。

符号つきの 10 進の整数に対応する。次のポインターは int へのポインターでなければならない。

各フィールドには fscanf 由来の暗黙的な書式や型があり、それと一致しない値を読み込むことは想定されていない。

結合表記

基本的にパラメーターは空白区切りで書かなければならないが、くっつけて書いても読み込めてしまうことがある。これは fscanf の、

最大値に達するか、一致しない文字が見つかるか、のどちらかになると、文字の読み込みを停止する。

という仕様によるもので、例えば "123" と "-456" という 2 つのパラメーターを "123-456" と書いた場合、1 つめのパラメーターの読み込みはハイフンが出現した位置で終了し、2 つめのパラメーターの読み込みは前回終了した位置から再開されるので、結果的にうまく読み込むことができる。

ハイフンを「一致しない文字」として検出させるには 1 つめのパラメーターは数値である必要があり、先頭に数値以外の文字を安定して出現させるには 2 つめのパラメーターも数値でなければならない。つまり「連続した数値フィールドの 2 つ目以降から結合可能」という条件下でのみ動作する危うい書き方となっている。

改行の扱い

行で区切られたデータを読むときは改行記号を終端の目印にして読み進めていくのが一般的だが、KFX は改行の検出を行っていない。では、どうやって行を認識しているのかというと「各リストで定義されたフィールドと同じ数だけ読み込みを行う」という考え方。例えば、command.lst はコメント含め 7 つのフィールドで構成されているので、fscanf を 7 回呼び出せば 1 行読んだことにできる。

この方式の難点はパラメーターに過不足があるとエラーが行内に留まらず、リスト全体に波及してしまうことで、パラメーターのずれによってフィールドの型と一致しない値が来ると、

変換指定と一致しない場合は、変換は失敗する。ある命令の処理が失敗すると、入力はそれ以上読み込まれず、scanf() は返る。

という仕様により読み込みは中断され、さらに雪崩のようなパラメーターずれが発生する。最終的にリストは滅茶苦茶な状態になり、チェックが緩いフィールドに異常な値が入ってしまうと最悪プログラムはクラッシュする。

リストの拡張方法

KFA の機能を少しだけ使った「KFX/KFA 両対応キャラ」を実現するには、KFX と KFA 間でリストの相互運用を可能にする必要があり、KFX に読み込ませてもエラーにならない書式でのフィールド拡張が求められた。

範囲を広げる

使用可能な値の範囲を広げて情報量を増やす方法。例えば、KFX では motion.lst の C (キャンセル) に指定可能な値は 0 ~ 2 になるが、KFA では未使用の 3 と 4 に加え、負数も使えるようになっている。このフィールドと連動している command.lst の Cancel も桁が拡張された。

基数を増やす

より大きな基数を使うことで 1 桁あたりの情報量を増やす方法。例えば、KFX における motion.lst の Flag は言葉通り 2 進数のフラグだが、KFA では 10 進数相当に拡張することでパラメーター種別の増加に対応している。さらなる増加に対応するため、最終的には 16 進数相当にまで拡張された。

符号を使う

符号に数値とは別の情報を持たせる方法。ほとんどの数値は正の数なので負の数を使うことになるが、負の領域にまで範囲を広げるという意味ではなく、符号をフラグのような設定値として使うという意味。例えば KFA の Pic は頭にマイナス記号を付けることで絵の垂直反転ができるようになっている。

小数を使う

小数点以下の領域に整数部とは別の情報を持たせる方法。例えば KFA の Pic は小数点以下に透明度を指定できるようになっている。整数が指定されたとしても小数点以下が 0 の小数として解釈できるので、意味的にもプログラム的にも綺麗な拡張と言える。

KFA 固有の仕様

Java で作られたことが影響しているのか、KFA では C 言語の基本的な型では表現できない特殊なフィールド値が使われている。KFX は単純なフィールドしか扱えないので、この値が含まれたリストを読み込ませることはできない。

Null 値

何もないことを表す "-" という値があり、motion.lst の Pic や command.lst の Vx など、いくつかのフィールドでサポートされている。

KFX では未設定を表す値として -1 や 0 がよく使われているが、Pic に -1 や 0 を指定したところで普通に絵が出てしまうことから、数値では表現できない特別な値であることが分かる。

フィールドのネスト

複数のパラメーターをコロン区切りで指定できる書式があり、motion.lst の maxShotNum や command.lst の Vx でサポートされている。

本来であればフィールドを増やして対応するところだが、フィールドの数を変えてしまうと KFX との互換性が失われてしまうので、空白で区切られた通常のフィールドの中に非空白区切りのサブフィールドを内包することで対処している。ただ、どちらにしろ KFX では読み込むことができない書式なので慣習的な意味合いの方が強い。

XPlus 固有の仕様

XPlus 開発時は KFA のバージョンアップがまだ行われていたので、勝手にフィールドを拡張すると KFA の拡張と競合してしまう可能性があり、互換性を維持しながら KFX のリストを拡張していくのも難しかったため、拡張部分を別ファイルとして分離する方式がとられている。

専用リスト

ファイル名の頭に "p" が付いたリストは XPlus 専用のリストとして扱われ、例えば、motion.lst であれば pmotion.lst が専用リストとなる。

基本的には従来のリストを踏襲するフォーマットとなっているが、例えば、KFA がゲージ消費量と飛び道具番号をコロンで結合して Vx に詰め込んだのに対し、XPlus は飛び道具番号を Sh、ゲージ消費量を Sp という別のフィールドに自然な形で分離している。これは互換性を気にする必要がない XPlus ならではのやり方と言える。

PScript

エンジンの自由度を極限まで高めていくと、最終的には四則演算や条件分岐といったプログラミング言語と同等の表現力が必要になり、XPlus では PScript という KFX に特化したスクリプト言語を用意することでが使えるようになっている。

PScript はプログラムのコードそのもので、従来のパラメーターを羅列しただけのリストとは書式が大きく異なる。単純に混ぜることができない両者を橋渡しするために「グループタイトル」という指定があり、":Mxxx;" には motion.lst の行番号、":Cxxx;" には command.lst の行番号を指定することで、PScript とリストのバインディングを行っている。

リストの複雑化と弊害

拡張によってリストが複雑化したとしても「リストを読み込むのはエンジンなのでキャラ製作者にはあまり関係がない」と思ってしまうが、そう単純な話ではない。もちろん、ゲーム内の処理はエンジン内部に隠蔽されているのでキャラ製作者が手出しできる領域ではないが、キャラ作成のような「ゲーム外」の作業となると話は別で、各種データを作成する際に必要となるツール類はエンジンの仕様が反映されたリストを読み込まなければならないので、リストの複雑化はツール製作者に大きく影響する。

例えば PScript の構文チェッカーを作ろうと思ったら、ちょっとしたコンパイラを作るくらいの技術力と労力が必要になる。それに対し、KFX の仕様に限定した motion.lst のパラメーターチェッカーだったら、最低限のファイル入出力が理解できていれば制作条件の半分は満たしたも同然で、あとは「チェックをどうやって行うのか」といった部分さえクリアできればツールを作ることが出来る。

KFA が機能拡張を行う度に飛龍さんがサクっとツールを作り上げてしまったので、ナックラーは常に高機能で使い易いツールが提供されるという異常な状態に慣れきってしまったが、KFA 公式の作成ツールといったらステージエディターくらいしかなく、非公式の外部ツールへの依存度が高いため、ツール製作者がほぼ居ない状態というのは健全とは言い難い。実際、飛龍さんが XPlus に注力するようになったことで KLE (Knuckle List Editor) での KFA サポートは終了したため、その後に追加された KFA 拡張機能は KLE 上で正常に認識されない。警告色で真っ赤に染まったリストを見ているとキャラ作成におけるツールの重要性を再認識する。