【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名_言語名.txt” という名前で保存します。このときに3つ注意点があります。

  • MOD名の部分は esp の名前と一致させる。大文字でも小文字でも構わない。
  • 言語名の部分は、英語なら「ENGLISH」、日本語なら「JAPANESE」とする。大文字でも小文字でも構わない。
  • 保存する際の文字コードを「UTF-16 BOM付き」にする。

例えばMODの esp が “EkaMod.esp” だとすると、英語の翻訳ファイルは “EkaMod_ENGLISH.txt” となります。Nexus Mods に公開するなら英語の翻訳ファイルは必須ですので、まずは中身が英語の翻訳ファイルを作りましょう。

続いて、日本語の翻訳ファイルを “EkaMod_JAPANESE.txt” という名前で作ります。これらのファイルをフォルダに入れておくことで、言語設定に応じた翻訳ファイルが自動的に使われるようになります。

$General	一般

最後に、日本語化に関する注意点を書いておきます。

現在、スカイリムの日本語化は2通りのやり方が混在している状況です。従来は、言語設定を英語にして、音声と字幕を日本語版からコピーする手法が取られてきました。これは、SKSEが英語版の SkyrimSE.exe にしか対応していなかったからです。一方 SE 1.6 以降になってからは、SkyrimSE.exe が言語に関わらず共通化されたため、言語設定を日本語にしたままでSKSEを動作させることが可能になりました。

SE 1.5.97 では従来の方法しかありませんが、SE 1.6 以降はどちらの方法でも日本語でプレイすることができます。従来の方法で日本語化している場合、MCMの翻訳ファイルは必ず “EkaMod_ENGLISH.txt” が使われますので、「_JAPANESE」の方をリネームするか、内容を「_ENGLISH」に上書きするかしてもらう必要があります。

もしあらかじめ日本語化したバージョンも配布する場合は、従来の方法で日本語化しているユーザーのために、”EkaMod_ENGLISH.txt” の中身を日本語にしておいた方が良いでしょう。このとき、言語設定が日本語のユーザーを考慮し、”EkaMod_JAPANESE.txt” も取り除かずに入れておきましょう。


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

Leave a comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

five × 4 =