【MCM実装-3】初期画面とページの枠組みを作る

MCMを開いたときに最初に表示される画面や、各ページの枠組みを作っていきます。どんなMCMにも共通するような事柄が主です。

多言語に対応するための方法についてもここで併せてやっていきます。


1. バージョン情報と初期設定

1-1. 初期設定を行う

MCMクエストにつけたスクリプトを開いて、下記のように編集します。

Scriptname EKA_scrMCM extends SKI_ConfigBase

;--------------------------------------------------
Int Function GetVersion()  ; バージョン番号の設定
    Return 1  ; 最初は1。このスクリプトをバージョンアップするごとに数値を上げる。
EndFunction

;--------------------------------------------------
Event OnVersionUpdate(Int aVersion)  ; バージョンアップを検出
    If aVersion > 1  ; バージョンが2以上のとき
        OnConfigInit()  ; 初期設定をやり直す。
    EndIf
EndEvent

;--------------------------------------------------
Event OnConfigInit()  ; 初期設定
    Pages = new String[1]  ; ページを1つ作成する。Pages プロパティは SKI_ConfigBase によって定義済み。
    Pages[0] = "$General"  ; ページ番号は0から始まる。$ は多言語対応のための文字。
EndEvent

最初にバージョン番号とバージョンアップの記述をします。これはリリース時には特に意味がありませんが、スクリプトをバージョンアップさせるときに必要になるので、初めから書いておきます。

OnConfigInit が初期設定を行うイベントで、初回導入およびバージョンアップの際に実行されます。通常はここでページの枠組みを作成します。

Pages というプロパティが SKI_ConfigBase によってあらかじめ定義されているので、そこにページ名を設定します。このプロパティは配列というものになっていて、new String[1] のところでページ数を指定しています。

1ページ目は Pages[0] となります。2つ以上のページを作る場合は、続けて Pages[1]、Pages[2] というようにページ名を指定していきます。ページ名をつける際に $ の文字が出てきていますが、これは多言語対応のためのもので後述します。

1-2. 初期設定を変更したら GetVersion() 内の数値を上げる

GetVersion() 内の数値を2にすると、バージョンアップしたことをMCMに知らせることができます。そうすると OnVersionUpdate イベントが起こり、OnConfigInit の初期設定をやり直します。

これは後からページ数を増やしたいときなどに使います。同じバージョンである限り初期設定は初めの1回しか行われず、そのページ情報はセーブデータに記録されています。途中でページ数や名前を変更したくなったときには、OnConfigInit 内の記述を変更した上で GetVersion() の数値を上げます。


2. 初期画面の作成

2-1. 画像を用意する

MCMでMOD名を選択した際にまず表示されるのが初期画面で、ここには画像を表示することができます。対応形式はSWF(動画)とDDS(静止画)で、最大サイズは 770×446 ピクセルです。それに収まる汎用サイズは 640×360 ピクセルになるかと思います。

DDSは paint.net で作成できます。使いたいPNG等の画像がすでにあるなら、それをDDSに変換することもできます。

用意した画像は “Data/Interface/MOD名/画像名.dds” に配置してください。MOD名/画像名 の部分は任意ですが、下記のスクリプトコードと合わせる必要があります。

2-2. スクリプトで初期画面を表示する

初期画面や各ページの表示は、OnPageReset イベントで管理します。初期画面を表示するために、下記のようなコードを上述のMCMスクリプトの後に追記します。

;--------------------------------------------------
Event OnPageReset(String a_page)
    If a_page == ""  ; 初期画面
        LoadCustomContent("EkaMod/Image.dds", 56.0, 43.0)  ; 640×360ピクセル画像の場合
        Return  ; 後で各ページを追記していくため、初期画面の表示処理はここで終わらせておく。
    EndIf
EndEvent

表示しようとしているページ名が引数(ひきすう)の String a_page に入っており、それが空の文字列の場合は初期画面を指します。

LoadCustomContent で画像を表示できます。この行を書かないか画像が存在しない場合には何も表示されません。

画像を中央に表示するため 56.0 と 43.0 というオフセット値を指定しています。これは画像が 640×360 ピクセルの場合です。もし最大サイズの画像を用いる場合は LoadCustomContent(“EkaMod/Image.dds”) のように数値部分を省略してください。

2-3. 時間のかかる処理を初期画面でやっておく

初期画面は、各ページの表示に使うデータをバックグラウンドで取得するのに最適な場所です。例えばステータスを表示するようなページを作る場合、ページが選択されてからステータスを取得していたのでは表示するまでに若干のタイムラグが出てしまいます。それをこの初期画面で事前にやっておくことで、ページの表示を早くすることができます。

初期画面はもともと数秒の表示時間がありますから、もし時間のかかる処理がある場合は LoadCustomContent の後に記述しましょう。


3. 各ページの作成

3-1. ページごとにスクリプトを追記する

各ページは、OnPageReset イベントの中に追記していきます。初期画面と1ページ目の表示を合わせたコードは以下のようになります。

;--------------------------------------------------
Event OnPageReset(String a_page)
    If a_page == ""  ; 初期画面
        LoadCustomContent("EkaMod/Image.dds", 56.0, 43.0)  ; 640×360ピクセル画像の場合
        Return  ; 後で各ページを追記していくため、初期画面の表示処理はここで終わらせておく。
    EndIf

    ;--------------------------------------------------
    UnloadCustomContent()  ; 各ページを表示する前に画像を非表示にする。
    SetCursorFillMode(TOP_TO_BOTTOM)  ; ページ内の項目の配置順。TOP_TO_BOTTOM または LEFT_TO_RIGHT。

    ;--------------------------------------------------
    If a_page == "$General"  ; ページ名で分岐する。
        ; ここに項目を羅列していく。
    EndIf
EndEvent

3-2. 各ページを表示する前に共通の処理を行う

UnloadCustomContent で、各ページを表示する前に初期画面の画像を非表示にします。これは明示的に指定する必要があります。

そして SetCursorFillMode で項目の配置順を指定します。MCMの画面は2列の段組みです。TOP_TO_BOTTOM を指定すると、上から下にまず左の段が埋まり、それから右の段に移ります。LEFT_TO_RIGHT を指定すると、左の段の1行目の次に右の段の1行目が埋まり、左の段の2行目に移るという順序になります。

3-3. 選択されたページを判定する

選択されたページ名は引数の String a_page に入っています。それと初期設定で書いたページ名とを比較して、ページ内項目の配置処理を分岐します。項目の作り方については次回に持ち越します。

多言語対応のために $ をつけた文字列を使っていますので、今回はこれについて説明しておきます。


4. 多言語対応ファイルの作成

4-1. 多言語対応に翻訳ファイルを使う

MCMを多言語に対応させる方法には、翻訳ファイルを使う方法とスクリプトそのものを翻訳してもらう方法とがあります。

翻訳ファイルはMCMが公式にサポートしている方法で、”Data/Interface/Translations” フォルダに適切なファイルを配置するだけで翻訳できます。アップデートの際にテキスト部分の変更がなければユーザー側の作業が不要で、エラーも起こりにくいためお勧めです。

一方、スクリプトそのものを翻訳するには xTranslator を使います。かなり精度は高いようですが、スクリプトの改変であることには変わりがなく、できれば避けたい方法です。スクリプトをアップデートするたびに毎回翻訳作業が必要になる点もデメリットになります。

4-2. スクリプト内の翻訳テキストに $ をつける

MCMスクリプトを翻訳ファイルに対応させるには、対象の文字列の先頭に $ をつけます。上述の例ではページ名を “$General” という形式で書いています。

$ の後に続く文字列は識別子として使われ、特に決まった書き方はありません。翻訳ファイル内で分かりやすいものをつけておけば良いでしょう。文字列の部分には “$General A” のように半角空白も入れられますが、混乱のもとになるので使わないことをお勧めします。

もしユーザーの使用言語に対応した翻訳ファイルが存在しない場合には、$ のついた文字列がそのままMCMに表示されます。

4-3. 翻訳ファイルを用意する

翻訳ファイルの書式は単純で、$ 文字列の後にタブを挟み、翻訳後のテキストを書くだけです。1行ごとに1つの $ 文字列を書いていきます。

$General	General

テキストエディタでこれを書いたら、”Data/Interface/Translations” フォルダ内に “MOD名_ENGLISH.txt” という名前で保存します。このときに3つ注意点があります。

  • MOD名の部分は esp の名前と一致させる。
  • 翻訳内容が英語でも日本語でも、実際に使用する際には “_ENGLISH.txt” とする。
  • 保存する際の文字コードを「UTF-16 BOM付き」にする。

例としてMODの esp が “EkaMod.esp” だとすると、翻訳ファイルは “EkaMod_ENGLISH.txt” となります。

Nexus Mods に公開するなら英語の翻訳ファイルは必須ですので、まずは中身が英語の翻訳ファイルを作りましょう。さらに、追加ファイルとして日本語の翻訳ファイルも作ります。

$General	一般

日本語のファイルは通常 “MOD名_JAPANESE.txt” として配布しますが、実際に使用する際には “_ENGLISH.txt” にリネームしてもらわないといけません。というのも、MCMを使う以上SKSEの導入は前提条件であり、それゆえAE/SEにおいてスカイリムの言語設定は英語にしているはずだからです。

最後の注意点として挙げた文字コードは忘れないよう特に気をつけてください。スカイリムで標準となっているUTF-8では表示されません。主だったテキストエディタなら文字コードを指定して保存できるはずです。


【MCM実装 シリーズ】
1. Creation Kit で Papyrus を扱えるようにする
2. MCMに登録するための基本構造を作る
3. 初期画面とページの枠組みを作る
4. ページ内の項目を作る
5. スクリプトMODを配布形式にまとめる
6. MCM設定を自動で保存する

Leave a comment

メールアドレスが公開されることはありません。

16 − 8 =