Nintendo MessageStudio ヘルプ

プロジェクトバイナリ - 属性情報

メッセージバイナリには属性ブロック(ATR1)として属性データを出力することが可能ですが、これだけではどのようなサイズの属性がどのような順序で配置されているかはわかりません。通常、このような情報を構造体としてヘッダファイル(*.h)に出力し、この構造体を用いて属性データにアクセスしますが、この場合は属性設定が変更されるたびにプログラムをコンパイルし直す必要があります。

プロジェクトバイナリに出力可能な属性情報は、属性のサイズと配置を格納しており、この情報を経由することでプログラムをコンパイルすることなく属性設定の変化に対応することが可能となります。

また、属性がリスト型であった場合は、その属性に含まれる項目のインデックス番号と項目名を関連付けることも可能です。

属性名ブロック(ALB1)

メッセージバイナリのLBLブロックと同じ構造となっています。

属性名ブロック(AfLB1)は、属性名と、それに対応したインデックス番号の関連付けが可能なブロックです。 インデックス番号とは、後述する属性情報ブロック(ATI2)における、属性情報の格納順序を表す連続した番号のことです。 インデックス番号は0から開始されます。

属性名は、ASCIIコード範囲において255文字以内でつけることが可能で、Message Studio上で設定することが可能です。 詳しくは属性設定をご覧ください。 このブロックは、属性名文字列のハッシュ値によってルックアップするため、属性の数が増えても検索効率がそれほどに変わりません。

スタイル名ブロックは、ブロックヘッダの後に以下のようなデータ構造を持ちます。

※このイメージ内の値は基本的にでたらめです。

HASH TABLE SIZEハッシュテーブルのサイズを記述します。 ハッシュテーブルのサイズはMessage Studio上で設定可能で、サイズによって速度とメモリ使用量の調整が可能です。 デフォルト値は29ですが、なるべく素数を設定してください。4バイトの情報です。

ハッシュテーブルの数値で設定した数だけ、以下の8バイトの情報が繰り返されます。 ハッシュテーブルサイズが29の場合、この部分が合計232バイトになります。
STYLE NUM IN HASH nハッシュ値nに何個の属性名が含まれているかという情報を記述します。4バイトになります。
OFFSET OF HASH nハッシュ値nの属性名情報へのオフセット値が4バイトで記述されます。 オフセットは、ブロックの先頭から数えられます。 上述した、ハッシュ値nに含まれる属性名の数が0である場合、このオフセット値は不定です。

上述の部分が終わった直後から、属性名とインデックス番号の対応表のリストが記述されます。 プログラムは、ハッシュ値からブロック上のオフセットを求めた上で、この領域へアクセスします。

LEN属性名の長さを1バイトで記述します。
STYLE NAME属性名が記述されます。 属性名は、出力設定によらず必ずASCII文字列になり、前述のラベル長さの量だけ続きます。
STYLE INDEX属性のインデックス番号(ATI2ブロックにおける出現位置)が4バイトで記述されます。

上記の属性名属性インデックスの組み合わせは、順番に属性の数だけ出現します。 求めたオフセット位置の直下に違う属性名情報が存在している場合があります。 これは、特定のハッシュ値に対して複数の属性名が登録されているからです。 その場合は読み飛ばして次の属性名と一致するかを確認します。

属性情報ブロック(ATI2)

属性情報ブロックには、メッセージバイナリのATRブロックから適切にデータを取得するために必要な情報が記述されます。また、list entry data(ALI)ブロックを参照するのに必要な情報も記述されます。

属性情報ブロックは、ブロックヘッダの後に以下のようなデータ構造を持ちます。

※このイメージ内の値は基本的にでたらめです。

ATTRIBUTE NUM属性情報の数が4バイトで記述されます。

ATTR NUMの値の数だけ、以下の8バイトの情報が繰り返されます。
TYPE n 属性の型が1バイトで記述されます。数値と型の対応は以下のようになります。
0x00符号なし8bit整数
0x01符号なし16bit整数
0x02符号なし32bit整数
0x03符号あり8bit整数
0x04符号あり16bit整数
0x05符号あり32bit整数
0x0632bit単精度浮動小数点数
0x0764bit倍精度浮動小数点数
0x08NULL終端文字列
0x09リスト
PADDING n1バイトのパディングです。常に0となります。
INDEX OF LISTINFO nlist entry dataのインデックス番号(後述のALI2ブロックにおける出現位置)が4バイトで記述されます。ただし、この値はTYPEが0x09(つまりリスト型)の場合のみ有効で、それ以外の場合は常に0となります。属性がリスト型であった場合、このインデックス番号を利用しALI1ブロックを参照することで、更に項目名が引けるようになります。
OFFSET OF ATTR IN STRUCTURE n属性データの、ATR1ブロックにおける構造体上での開始位置を4バイトで記述します。

メッセージバイナリのATR1ブロックから適切にデータを取得するための1つの方法が、このATI2ブロックを利用する方法です。プログラムでは OFFSET OF ATTR IN ATR STRUCTURE から、構造体上での属性のオフセット位置を取得し、TYPEからその型およびデータサイズを判別することでATR1ブロックから適切にデータを取得することができます。ATI2ブロックは基本的にALB1ブロックと併用します。そうすることで文字列での属性データへのアクセスが可能になります。

開発中に頻繁に属性データの順序が変更されるようなゲームプロジェクトでは、ATI2ブロックを利用して属性データを参照することで、メッセージリソースの差し替えによる再ビルドが不要になるという利点があります。ただし、データへのアクセスは単純に属性定義ヘッダに記述される構造体定義を用いた場合と比べて格段に悪くなります。要はケースバイケースですが、属性データへのアクセスにマクロ(C/C++の)を用いて、デバッグビルド時は文字列に展開、リリースビルド時は構造体のメンバ変数定義として利用するなどすれば最大限のメリットを得られるかもしれません。

リスト項目情報ブロック(ALI2)

リスト項目情報ブロックには、リスト型属性が持つ項目の名前が格納されます。この情報は、例えば項目名をそのままファイル名として扱ったりするのに利用できます。

リスト項目情報ブロックは、ブロックヘッダの後に以下のようなデータ構造を持ちます。

※このイメージ内の値は基本的にでたらめです。

ITEMINFO NUMリスト項目情報の数が4バイトで記述されます。これはリスト型属性の数と等しくなります。
OFFSET OF ITEMINFO nこのブロックの先頭位置から数えて、リスト項目情報が開始されるオフセット値を4バイトで記述します。この情報は ITEMINFO NUM 個だけ繰り返されます。

さらに1つ1つのリスト項目情報は以下のようなデータ構造を持ちます。

ITEM NUMこのリストに含まれる項目の数が4バイトで記述されます。
OFFSET OF ITEM NAME mこのリスト情報部の先頭位置から数えて、項目名が開始されるオフセット値を4バイトで記述します。
ITEM NAME m実際の項目名が入ります。エンコーディング形式はASCII形式となります。NULL終端です。