Nintendo MessageStudio ヘルプ

# Message Studioを用いたゲーム制作

## ゲームにおけるテキストの位置づけ

画面上にテキストを表示するために、まず必要になるのは、「何を表示するのか」「どう表示するのか」です。 もちろんこれらの内容はすべてプログラムに組み入れていく必要があります。 プログラムを組むには技術が必要なので、プログラマに作業を依頼しなければなりません。

「何を表示するのか」というのはもっとも重要な内容です。 これをプログラムに組み入れる場合、もっとも簡単な組み入れ方は、直接プログラムに埋め込んでしまう方法です。

    const wchar_t* message = L"こんにちは、Message Studio！";
    pTextPane->SetString( message );

上記のような内容をプログラムに入れれば、入力されたテキストを表示することができます。 これはとても単純な方法ですので実装してから動かすのに一番 時間がかかりません。 ところが、この手法で開発を進めてしまうと後々に重大な問題を引き起こしていきます。 たとえば、マーケティング部門の要望があり、このゲームの米国仕様を作成することになったとします。 プログラムは以下のように変更されます。

    #if defined ( MYGAME_REGION_JP )
    const wchar_t* message = L"こんにちは、Message Studio！";
    #elif defined ( MYGAME_REGION_US )
    const wchar_t* message = L"Hello, Message Studio!";
    #endif

    pTextPane->SetString( message );

さらに欧州版を作成することになったとします。 欧州はたくさんの国があるので言葉もたくさんあります！

    #if defined ( MYGAME_REGION_JP )
    const wchar_t* message = L"こんにちは、Message Studio！";
    #elif defined ( MYGAME_REGION_US )
    const wchar_t* message = L"Hello, Message Studio!";
    #elif defined ( MYGAME_REGION_EU )
    const wchar_t* message = NULL;
    switch( g_langMode )
    {
    case SC_LANG_ENGLISH:
    	message = L"Hello, Message Studio!";
    	break;
    case SC_LANG_GERMAN:
    	message = L"Guten tag, Message Studio!";
    	break;
    case SC_LANG_FRENCH:
    	message = L"Bonjour, Message Studio!";
    	break;
    case SC_LANG_SPANISH:
    	message = L"Buenas tardes, Message Studio!";
    	break;
    case SC_LANG_ITALIAN:
    	message = L"Ciao, Message Studio!";
    	break;
    case SC_LANG_DUTCH:
    	message = L"Goedemiddag, Message Studio!";
    	break;
    default:
    	MYGAME_FAIL( "UNKNOWN LANGUAGE!" );
    	break;
    }
    #endif

    pTextPane->SetString( message );

おっと、実は北米仕様では、さらにスペイン語とフランス語も必要です。 日本の開発者はよくこの点を忘れがちです。 …と、このようにただ単に挨拶を表示するだけでもローカライズを行おうと思うと こんなに長い記述が必要になってしまいます。 最初 楽をしようと思って直接テキストを書き込んだプログラマの思惑は一瞬にして崩壊してしまいます。 少なくともこんなプログラムは誰も読みたいとは思いません。

また、このままでは翻訳してもらうのも一苦労です。 翻訳してもらった結果を手動でプログラムに反映させなければなりません。 当然ミスも発生しますし、デバッグコストも増大します。

## プログラムとデータを分離する

直接ゲームに文字列を埋め込むと、上記のように大変なことになってしまうことが分かりました。 そこで次に、テキストを外部リソースファイルとして管理してみることにします。 「リソースファイル」とは、ゲームで利用されるデータファイルのことです。 絵や音楽、3Dモデル情報などはすべて「リソースファイル」です。 テキスト情報もこれらの情報と同じようにファイルとしてゲームに読み込ませることが出来れば、開発コストを下げることが出来ます。

ゲームに組み込まれるリソースファイルは、なるべくゲームが効率よく動く形式であるべきです。 つまり速い速度でアクセスでき、なるべく小さなメモリで利用できることが望まれます。 一方で、編集中はなるべく効率よく編集できるほうがよいでしょう。

ここで、Message Studioを導入してみます。 Message Studioを導入すると上記のようなプログラマ中心のワークフローが以下のように変化します。

Message Studioがゲーム用に出力ファイルについてはリソースについてのページをご覧ください。

## まとめ

Message Studioによって少しワークフローは複雑になってしまいましたが、 テキストを集中的に管理する人が人間からソフトウエアに変わったことに注目してください。 コンピュータなら何度でも同じ作業繰り返しやっても文句も言いませんし、病気になることもありません。 それに高速に動作します。

Message Studioでは、テキストの編集と各言語への翻訳作業を複数の開発者で同時に行うための機能を持っています (詳細は、チーム管理機能の概要ページをご覧ください)。 これにより、電子メールにファイルを添付してやりとりする必要もありません。 また、編集内容が競合してしまってもスムーズに解決することが出来ます。

プログラマは、テキスト管理の重圧から開放されましたが、 代わりに外部リソース化されたファイルを読み込む部分を実装する必要が出てきました。 この部分は、libmsという、マルチプラットフォーム対応のライブラリがあるため、リソースの解析作業はすべてこちらに一任できます。 つまり、他のリソースファイルと同じようにカートリッジやDVDからファイルを読み込んで、libmsに丸投げするだけでテキストを得ることが出来ます。

- はじめに
- 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
- 扱うファイルの拡張子一覧
- よくある質問