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と13bitのみ)、未使用であったPadding(0x02)を利用しています。
XPFではPF及びObject ID、Padding(->Reference)は次のように再定義されています。

Presence Flag

ビット 説明(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のときの場合です。

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

BIT,OR,ANDを有効にした場合は、GOBJのフォーマットが次のようになります。

オフセット サイズ 説明
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

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

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

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

モード

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

BIT

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

OR

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

AND

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

※モードのNOTがTrueの場合、ビットがすべて反転された値が表示パラメータとして出力されます。モードがORの場合は演算がNORで、ANDであればNANDで処理され、Referenceの否定とのORで表示パラメータとして出力されます。

Reference

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