User:Caron/CTTutorial Japanese/Presence flag

From Custom Mario Kart
Jump to navigation Jump to search

Presence flag(存在フラグ、以下PF)とは、配置したオブジェクトの表示設定を決めるパラメータのことです。KMP/GOBJの0x3A(サイズ:0x02)のことです。
パラメータはBool型で、標準では次の通りです。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
未定義 3人以上のマルチ(オンライン) 2人マルチ(オンライン) シングル(オンライン) 3人以上のマルチ(オフライン) 2人マルチ(オフライン) シングル(オフライン)

各パラメータがTrue(=1)であればその状況でオブジェクトを表示、False(=0)であれば非表示となるといった構造です。デフォルトでは0x3F(=0000 0000 0011 1111, いかなるモードでも表示)が最も多く、ワリオ鉱山のワゴンなどではスローダウン対策のために9(=0000 0000 0000 1001, マルチプレイでは非表示)が使用されたりしています。

…というのがcourse.0に記載されていた内容なのですが、実は上の3~5bitの間は意味がありません。どうやら開発途中でオフラインとオンラインの表示設定が統合されたため、実際に効果のある範囲が0~2bitまでになったと思われます。そのため、正しくは次の通りです。

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
未定義 3人以上のマルチ 2人マルチ シングル

このことから、標準で使われている3Fは07に、09は01に置き換えても問題はないことになります。実際に、Lorenzi's KMP Editorではオブジェクトを追加する際にデフォルトで07になるようになっています。

Extended Presence Flag (XPF)

Extended presence flags(以下、XPF)とはPFの拡張として、単なるプレイヤー数だけで表示設定を変える以外にも、タイムトライアル限定やバトルでのシングルとマルチ、アイテムレイン、レース中のプレイヤー人数などの場合でもオブジェクトの表示設定を変えれるようになります(LE-CODE限定、CT-CODEでは未実装)。PFは元から6~15bitが未定義であったため、XPFはこの部分に加えて、GOBJのObjectID(0x00、12bit以降)、未使用であったPadding(Reference, 0x02)を利用しています。
XPFではPF及びObject ID、Referenceは次のように再定義されています。

Presence Flag

ビット(LSB) 説明(LE-CODE) 説明(それ以外)
0 未定義(モードが1以上のときは無視) シングルでの表示(1=on, o=off)
1 2人マルチプレイでの表示(1=on, o=off)
2 3人以上のマルチプレイでの表示(1=on, 0=off)
3-5 未定義
6-11 モード依存のパラメータ
12-15 XPFのモード。1(=0001)でXPFを有効、0で無効(=通常のPFと同じ)になります。それ以上は未定義です。

Object ID

モードが1のときの場合です。

ビット(LSB) 説明(LE-CODE) 説明(それ以外)
1-9 オブジェクトID(ただし、定義されているのは0x2F3まで)
10-11 未定義
12-15
値(bit表示) 説明
0(0000) オブジェクトを非表示にします。
1(0001) オブジェクトを表示します。
2(0010) 存在定義にBITモードを利用します。詳細は後述します。
4(0100) 存在定義にORモードを利用します。詳細は後述します。
6(0110) 存在定義にANDモードを利用します。詳細は後述します。
未定義(値が与えられるとnullオブジェクトとして処理されます)

K2X ConverterではオブジェクトのON/OFF(Enable(LE))とモード(Type(LE))を分けているため、BIT=1, OR=2, AND=3で定義しています。

BIT,OR,ANDを有効にしたGOBJ IDは、それ自体がオブジェクトの座標情報ではなく、そのオブジェクトID全体に対する定義になります。この場合、そのGOBJ IDのフォーマットが次のように再定義されます。

オフセット サイズ 説明
0x00 Uint16 オブジェクトID(上記)
0x02 Uint16 Reference(下記参照)
0x04 Float[9] 未使用。すべて0にしてください。
0x28 Uint16 未使用。値はFFFFにしてください。
0x2A Uint16[8] 定義パラメータ。存在定義の演算に使われるパラメータはこの部分を利用します。
オフセット 説明
0x00 バルーンバトル
0x02 コインバトル
0x04 VS、GP、タイムトライアル
0x06 アイテムレイン
0x08以降 未使用。今後追加されるモード用(ミッションなど?)のために使われます。
0x3A Uint16 Presence flag. モードは1にしてください。

各定義パラメータ(サイズ0x02,16bit)は次のような定義になっています。値がTrueであれば処理に応じてその条件においてオブジェクトが表示されます。

ビット(LSB) 条件 ネットワーク
0 シングル オフライン
1 2人マルチ
2 3人マルチ
3 4人マルチ
4 シングル+部屋人数トータル6人以下 オンライン
5 2人マルチ+部屋人数トータル6人以下
6 シングル+部屋人数トータル7~9人
7 2人マルチ+部屋人数トータル7~9人
8 シングル+部屋人数トータル10~12人
9 2人マルチ+部屋人数トータル10~12人
10 シングル+部屋人数トータル13~18人
11 2人マルチ+部屋人数トータル13~18人
12 シングル+部屋人数トータル19人以上
13 2人マルチ++部屋人数トータル19人以上
14 タイムトライアル(状態パラメータの0x04のみ) オフライン
15 未定義

※14bit以降を除き、全てレースおよびバトルを含みます

モード

Object IDの12-15bitでのモード(BIT,OR,AND)は、オブジェクトIDで指定したオブジェクトの定義に関する設定になります。このモードが有効な場合、そのオブジェクトIDの表示設定などがこのモードの設定に依存します。最終的な表示パラメータの出力はReferenceとのANDになります。

BIT

BITモードは各状態パラメータを個別で処理します。

OR

ORモードはすべての状態パラメータを論理式のORで処理します。定義パラメータのbitのいずれかがTrueであればオブジェクトはその状態において表示されるようになります。

AND

ANDモードではすべての状態パラメータを論理式のANDで処理します。全ての定義パラメータのいずれかのbitがTrueでないと、その定義においてオブジェクトは表示されません。

※Referenceの12bit目が1の場合は、演算結果をNOTとした値が表示パラメータとして出力されます。モードがORの場合は演算がNORで、ANDであればNANDで処理されます。

Reference

オブジェクトの細かな表示条件を指定します。
LE-CODE以外ではこの部分は基本的に無視されます。またKMPCloudやLorenzi's KMP Editorなどはこの部分は表示されずに、値を変えても0で保存されます。このページの更新時点では、KMP3DK2X ConverterWiimms SZS Toolsでのみ操作が可能な状態です。
詳細はこちらを参照してください。