Seaside Laboratory

Posts

KFX におけるキャラクターの識別

キャラクターに一意性が求められるとき、例えば特殊イントロを行うには相手キャラクターを一意に識別する必要がある。ただ、KFX にはキャラクターを識別する仕組みが無く、拡張エンジンが作られる際も深く議論されることがなかったため、統一されたキャラクター識別方法は存在しない。

各エンジンの仕様や問題点などキャラクター識別に関する話を書いていく。

KFA でのキャラクター識別

KFA にはキャラクターを識別する機能は用意されていない。となると特殊イントロはどうやって実装されているのか、という話になるが、これについては KnuckleFighter@Wiki に詳しく書かれている。

イントロ開始時、画面外に極小のくらい判定を用意しておき、対戦相手がその判定に対し極小の強制ヒット攻撃 (H) を当てる事で分岐させる手法が一般的である。

食らい判定で区別しているということは、2 次元空間上にマップされた矩形 (または点) の座標を一意の ID として使っている。ただ、単なる座標である X と Y に意味を持たせるのは難しく、うっかり同じ座標を割り当ててしまえば区別がつかなくなってしまう。この問題についても Wiki に対策方法が書かれている。

問題点は判定が他のキャラの判別用判定と重なると誤動作を起こす事。これをなるべく避けるため、前述のとおり判定は極小に設定する必要がある。

判定を設定する際、"000ark000ark" 等のように判定部分にキャラクターの名前の一部を記述することで、唯一性を持たせつつ画面外に判定を設定できるのでお勧め。

矩形は 16 進数で構成されているので、本来であれば Hexspeak で書かなければいけないが、KFX のリスト読み込み処理がザルなおかげで比較的自由に書くことができる。衝突を回避するのに十分な文字数があるとは思えないが、実際に衝突する確率は低く実用上問題がない、ということなのだろう。

XPlus でのキャラクター識別

XPlus は後発かつ高機能なエンジンだけあり、キャラクター識別に必要な情報を extdef.lst に定義できるようになっている。

CharName

キャラの名前を書く。他のキャラがスクリプトでキャラ判別の判断材料になるのでこの項目は必ず書くこと。匿名なら匿名なりに、改造キャラなら改造キャラなりに何か書くこと。改造キャラで元のキャラとこの項目が同じになっていたり、わざと全然関係ないキャラ名を書いたりするとキャラ判別が破綻してしまいます。

CharName 以外にも Auther や Version といった補助的な情報が存在するが、Wiki によるとエンジンのバグで機能していないとのことなので、実質的に CharName が一意の ID となる。

ここまで書いたところで Auther がスペルミスであることに気付いたが、XPlus の実行ファイルを解析ツールで調べたところ "auther" という文字列が見つかったので、エンジン側の定義も間違っている模様。

内部では小文字で定義されていた。

一意性の保証

KFA、XPlus 両エンジンともに「キャラクターを識別する手段はあるが完全な一意性は保証されていない」という部分は同じで、この問題の根本には識別に使う ID をキャラ制作者が好き勝手に割り当てていることにある。参考までに完全な一意性を保証する方法について書いておく。

一元管理

全ての識別 ID を中央サーバー等で一元管理する、という方法。

具体的にどういうことかというと、KFA であれば制作したキャラクターの名前と座標のペア、XPlus であればキャラクターの名前と CharName のペアをリスト化し、特殊イントロを作る際には必ずリストを確認するよう呼びかけを行う。ただ、人力での運用には限界があり、面倒なやり方は支持されないというのがこの業界の常である。

衝突させない

必ず一意になる ID を機械的に生成する、という方法。

例えば、UUID は好き勝手に生成しても衝突しないアルゴリズムとなっているので、これをキャラクターデータの中に埋め込んでおけば理論上は正確に識別することができる。問題は、各拡張エンジンの更新が停止しているので対応の見込みがないこと。

他の識別情報

他の識別に使えそうな情報となるとキャラクターフォルダーのパスくらいしか残っていないが、

  • 一意になるのはローカル環境だけで相互運用できない。
  • キャラクター分別でのフォルダー移動など些細な切っ掛けで変化してしまう。

という理由により識別 ID として使うのは難しい。

KFM における識別 ID

ワールドモードの追加に伴い、フォルダー名にキャラクター情報を設定できるようになったが、これも一種の識別 ID であり、これまで挙げた問題点を加味した簡素な仕様となっている。

  • 相互運用は潔く諦めローカル環境内で完結。
  • 命名規則などはなく各ユーザーが責任を持って管理する。
  • フォルダーの移動に耐えられるよう情報は末端のフォルダーに持つ
  • キャラクター名とワールド名の組み合わせで一意になることを想定。

特殊イントロのような用途に使うことはできないが、将来的にはキャラクター毎の情報 (戦績など) を管理する際の ID として使うことを考えている。