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整数
0x06 | 32bit単精度浮動小数点数
0x07 | 64bit倍精度浮動小数点数
0x08 | NULL終端文字列
0x09 | リスト
PADDING n | 1バイトのパディングです。常に0となります。
INDEX OF LISTINFO n | list 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終端です。

- はじめに
- Message Studioの基礎
  - ゲーム製作のフロー
  - プロジェクトファイルについて
  - プロジェクトエクスプローラの操作
  - ウインドウ操作
  - 言語設定
  - カラーの設定
  - 属性の設定
- メッセージ編集
  - 基本操作
  - テキストの種類
  - クリップボードを利用した操作
  - 言語セルステータス
  - 表示のカスタマイズ
  - メッセージ一覧画面のTips
- タグ
  - 概要
  - タグを用いた編集
  - タグのソース文字列
  - タグ比較について
- 検索機能
  - 概要
  - 簡易検索
  - 詳細検索
  - 正規表現
- スペルチェック
  - スペルチェックについて
  - スペルチェックの利用方法
- ロールとパーミッション
  - 概要
  - ロールの追加とパーミッションの設定
  - ロールの選択
- メッセージの統計情報
  - 統計情報について
  - 統計情報の利用方法
- スタイル機能と幅計算
  - スタイルと幅計算について
  - テキスト幅の全体チェック
  - レンダリング方式について
  - スタイルの設定方法
- フォント
  - フォント機能の概要
  - フォントに関するワークフローについて
  - フォントの設定
- チーム管理機能
  - 概要
  - ファイル管理のされ方
  - チーム管理機能を利用する
  - 基本操作
  - コミットログを表示する
  - 差分(diff)を表示する
  - 競合とマージ
  - プロキシサーバの設定
  - サーバーの設定
- メタ情報の設定
  - メタ情報の設定について
  - 設定可能なメタ情報一覧
- リソースファイル関連
  - リソースについての概要
  - リソースファイルを出力する
  - 出力設定を行う
  - ビルドイベントについて
  - 共通のバイナリフォーマット
  - メッセージバイナリフォーマット
  - フローチャートバイナリフォーマット
  - プロジェクトバイナリフォーマット
    - プロジェクトバイナリフォーマット
    - カラー情報
    - コンテンツ情報
    - 属性情報
    - タグ情報
    - スタイル情報
  - タグについて
- マクロ文字列展開機能
  - マクロ文字列とは
  - 利用可能なマクロ一覧
- コマンドライン関連
  - コマンドライン制御について
  - /convertスイッチについて
- プラグインについて
  - プラグインの概要
  - プラグインの種類について
- プラグインの作成方法
  - 単純なプラグイン作成チュートリアル
  - 開発環境を利用しない作成方法
  - サンプルについて
- Message Studioのアセンブリ設定
  - Caspol：アセンブリセキュリティ設定
  - Ngen：ネイティブイメージ生成
- XML仕様
  - 概要
  - プロジェクトファイル（.msproj）のXML仕様
  - メッセージファイル（.mstxt）のXML仕様
- libmsについて
  - 概要
  - コンパイルの仕方
- 共通の関数
  - LMS_SetMemFuncs
- メッセージに関する関数
  - LMS_InitMessage
  - LMS_CloseMessage
  - LMS_SearchMessageBlockByName
  - LMS_GetMessageBlockInfoByName
  - LMS_GetTextNum
  - LMS_GetTextIndexByLabel
  - LMS_GetText
  - LMS_GetTextSize
  - LMS_GetTextByLabel
  - LMS_GetLabelByTextIndex
  - LMS_GetTextStyle
  - LMS_GetTextStyleByLabel
  - LMS_GetAttributeSize
  - LMS_GetAttribute
  - LMS_GetAttributeText
- フローチャートに関する関数
  - LMS_InitFlowchart
  - LMS_CloseFlowchart
  - LMS_GetNodeNum
  - LMS_GetEntryNodeIndex
  - LMS_GetNodeDataPtr
  - LMS_GetFlowNodeIndex
  - LMS_GetCaseIndexesFromBranchNode
  - LMS_GetFlowParamText
- プロジェクトに関する関数
  - LMS_InitProject
  - LMS_CloseProject
  - LMS_SearchProjectBlockByName
  - カラー情報に関する関数
    - LMS_GetColorIndexByName
    - LMS_GetColor
    - LMS_GetColorByName
    - LMS_GetColorNum
  - コンテンツ情報に関する関数
    - LMS_GetContentsNum
    - LMS_GetContentPath
  - 属性情報に関する関数
    - LMS_GetAttrInfoIndexByName
    - LMS_GetAttrType
    - LMS_GetAttrTypeByName
    - LMS_GetAttrOffset
    - LMS_GetAttrOffsetByName
    - LMS_GetAttrListItemName
    - LMS_GetAttrListItemNameByName
    - LMS_GetAttrNum
    - LMS_GetAttrListItemNum
  - タグ情報に関する関数
    - LMS_GetTagGroupName
    - LMS_GetTagName
    - LMS_GetTagParamName
    - LMS_GetTagParamType
    - LMS_GetTagListItemName
    - LMS_GetTagGroupNum
    - LMS_GetTagNum
    - LMS_GetTagParamNum
    - LMS_GetTagListItemNum
  - スタイル情報に関する関数
    - LMS_GetStyleIndexByName
    - LMS_GetRegionWidth
    - LMS_GetRegionWidthByName
    - LMS_GetLineNum
    - LMS_GetLineNumByName
    - LMS_GetFontIndex
    - LMS_GetFontIndexByName
    - LMS_GetStyleNum
- 扱うファイルの拡張子一覧
- よくある質問