やっと項目を作るところまで来ました。ここからスクリプトの記述も増えてMCMらしくなります。
今回の説明では1つだけトグル項目を作り、何らかの機能をオンオフすることを想定して GlobalVariable の数値と連動させてみます。
1. 項目の作成
1-1. 項目(Option)の種類を確認する
MCMでは項目を Option と呼んでいます。Option の種類は9つあり、GitHub の MCM Option Types に使い方とともに載っています。このページはとても役に立ちますので参考になさってください。
- Empty Option … 1行スペースを空ける。
- Header Option … グループ分けをするときなどのタイトル行に使う。
- Text Option … 項目名とテキストを表示する。
- Toggle Option … 項目名とトグルボタンを表示する。
- Slider Option … 項目名と数値を表示する。選択すると数値スライダーが開く。
- Menu Option … 項目名とテキストを表示する。選択するとリストボックスが開く。
- Color Option … 項目名と色を表示する。選択するとカラー指定ダイアログが開く。
- Keymap Option … 項目名とキーを表示する。選択するとキーの入力を促す。
- Input Option … 項目名とテキストを表示する。選択するとテキスト入力ボックスが開く。
1-2. Toggle Option を配置する
例として Toggle Option を配置してみます。OnPageReset イベントの中に記述し、プレイヤーがページを選択したタイミングで配置することになります。
コードは前回のものを引き継ぎ、必要なところだけ示します。コードの全体像は最後に載せておきました。
GlobalVariable Property gloEnabled Auto ; 機能有効のときは1、無効のときは0に設定
Int oidEnabled ; Toggle Option の Option ID(OID)を格納する変数
;--------------------------------------------------
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" ; ページ名で分岐する。
Bool booEnabled = False ; トグルの初期値をセットする際に使う変数。
If gloEnabled.GetValue() > 0 ; 機能が有効なとき
booEnabled = True ; トグル表示をONにするために True にする。
EndIf
oidEnabled = AddToggleOption("$Enabled", booEnabled) ; Toggle Option 項目を配置する。
EndIf
EndEvent
配置する Option には自動的に固有の Option ID が割り振られ、これはOIDと呼ばれます。項目を配置すると同時に oidEnabled という Int 型の変数にOIDを格納しています。後でこのOIDによってどの項目を処理するのかを判断するため、Option の数だけOID用の変数も用意し、配置と同時に格納しておきます。
トグルボタンを配置する AddToggleOption の引数は、1つ目が項目名、2つ目が表示状態です。上記のコードでは、初期の表示状態をセットするときに gloEnabled という GlobalVariable プロパティの値を参照して連動させています。
この gloEnabled は何らかの機能のフラグとして使うことを想定しています。MagicEffect や Package の Conditions に条件として設定してもいいですし、単純に他のスクリプトから参照して条件分岐に使うこともできます。
フラグ用の GlobalVariable を用意するには、CKの Miscellaneous > Global で新規作成し、Value に0または1を入れておきます。これをMCMスクリプトの gloEnabled プロパティに設定すればOKです。
この時点で翻訳ファイルも作成したときのMCMは下図のようになります。
同じ要領で他の Option も追加していくことになります。SetCursorFillMode に TOP_TO_BOTTOM を指定している場合には、左の段の上から順に埋められます。途中で右の段に移りたいときは、下記のコードを入れればOKです。
SetCursorPosition(1)
2. アクティベートされたときの挙動の設定
2-1. OIDで分岐して処理を書く
配置した Toggle Option がアクティベートされたときの挙動を設定します。表示状態および gloEnabled の数値を入れ替えることになります。
GlobalVariable Property gloEnabled Auto ; 機能有効のときは1、無効のときは0に設定
Int oidEnabled ; Toggle Option の Option ID(OID)を格納する変数
;--------------------------------------------------
Event OnOptionSelect(Int a_option) ; アクティベートしたとき
If a_option == oidEnabled
Bool booEnabled = True ; トグルをセットする際に使う変数。
Int intEnabled = 1 ; 値をセットする際に使う変数。
If gloEnabled.GetValue() > 0 ; 機能が有効なとき
booEnabled = False ; 表示をOFFにするために False にする。
intEnabled = 0 ; 機能を無効にするために0にする。
EndIf
SetToggleOptionValue(a_option, booEnabled) ; トグル表示を入れ替える。
gloEnabled.SetValue(intEnabled) ; 機能を有効にするかどうかを GlobalVariable にセットする。
EndIf
EndEvent
アクティベートしたときのイベントは OnOptionSelect です。こういった情報は、最初にお示しした MCM Option Types のページを見ると Option ごとに詳しく書かれています。引数の Int a_option にOIDが入っていますので、配置した Toggle Option のOIDである oidEnabled と同一かどうか比較して分岐を行います。
トグルの表示状態は、SetToggleOptionValue にOIDと True / False を渡すことで入れ替えることができます。gloEnabled の数値は、intEnabled という変数を介して入れ替えています。
2-2. 表示の変更を先に行い、時間のかかる処理を後から行う
MCMでは、表示の変更も処理内容も、どちらもスクリプトの記述によってコントロールします。各種 Option をアクティベートしたときに自動で表示が変わることはありません。Toggle Option のトグル入れ替えにもスクリプトの記述が必要で、それを書かなければ表示上は何も変わりません。
一般には、処理を行ってから表示を切り替える、というのが正しい順番です。予定した処理の中でエラーが起きたら表示は変えず、処理が正しく完了したら表示も切り替えるのが妥当な記述でしょう。
ただ、Papyrus の処理速度の影響か、このような順番にするともっさりとした感じのMCMになりやすいです。項目をアクティベートしたときに、表示が変わるまでのタイムラグを感じるパターンです。これはプレイヤーにとってのプチストレスになる可能性がありますから、先に表示を切り替えてしまうことをお勧めします。
処理が複雑で時間がかかりそうな場合は、連打を防ぐために SetOptionFlags という関数で Option を一時的に無効化するのも良いと思います。
SetOptionFlags(a_option, OPTION_FLAG_DISABLED) ; Option を無効化する。
; ここで時間のかかる処理を行う。
SetOptionFlags(a_option, OPTION_FLAG_NONE) ; Option を有効化する。
3. デフォルトキーが押されたときの挙動の設定
デフォルトキーが押されたときの挙動は、OnOptionDefault イベントで管理します。スクリプトとしてはデフォルト値を設定するための関数があるわけではなく、SetToggleOptionValue を使ってアクティベートのときと同じやり方で変更します。
今回の例では、デフォルトで機能が有効となるようにしてみます。
Int oidEnabled ; Toggle Option の Option ID(OID)を格納する変数
;--------------------------------------------------
Event OnOptionDefault(Int a_option) ; デフォルトキーを押したとき
If a_option == oidEnabled
SetToggleOptionValue(a_option, True) ; トグル表示をONにする。
gloEnabled.SetValue(1) ; 機能を有効にする。
EndIf
EndEvent
4. フォーカスされたときに表示する説明書きの設定
4-1. スクリプトにイベントを書く
項目にフォーカスしたとき、下部に説明書きを出すことができます。
これは OnOptionHighlight イベントで管理します。SetInfoText で説明書き欄の文字列を変更できます。
Int oidEnabled ; Toggle Option の Option ID(OID)を格納する変数
;--------------------------------------------------
Event OnOptionHighlight(Int a_option) ; フォーカスしたとき
If a_option == oidEnabled
SetInfoText("$Enabled_info") ; 説明書きを表示する。内容は翻訳ファイル内に記載する。
EndIf
EndEvent
4-2. 翻訳ファイルに説明書きを記載する
翻訳ファイルは “Data/Interface/Translations” フォルダに置かれます。その翻訳ファイルの中に詳しい説明書きを書いておきます。
説明書きは複数行にすることもできます。翻訳テキストの改行を入れたい箇所に「\n」を入れればOKです。
$Enabled_info Toggles between enabling and disabling the function.\nDefault: Enabled.
5. ここまでのMCMスクリプトコード
MCMの作成についてはここで一旦区切りとなります。基本は網羅しているので、同じ要領で他の Option も追加できると思います。MCM Option Types のページにわかりやすいサンプルコードが出ていますから、それを見て1項目ずつ作り上げていきましょう。
Scriptname EKA_scrMCM extends SKI_ConfigBase
GlobalVariable Property gloEnabled Auto ; 機能有効のときは1、無効のときは0に設定
Int oidEnabled ; Toggle Option の Option ID(OID)を格納する変数
;--------------------------------------------------
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
;--------------------------------------------------
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" ; ページ名で分岐する。
Bool booEnabled = False ; トグルの初期値をセットする際に使う変数。
If gloEnabled.GetValue() > 0 ; 機能が有効なとき
booEnabled = True ; トグル表示をONにするために True にする。
EndIf
oidEnabled = AddToggleOption("$Enabled", booEnabled) ; Toggle Option 項目を配置する。
EndIf
EndEvent
;--------------------------------------------------
Event OnOptionSelect(Int a_option) ; アクティベートしたとき
If a_option == oidEnabled
Bool booEnabled = True ; トグルをセットする際に使う変数。
Int intEnabled = 1 ; 値をセットする際に使う変数。
If gloEnabled.GetValue() > 0 ; 機能が有効なとき
booEnabled = False ; 表示をOFFにするために False にする。
intEnabled = 0 ; 機能を無効にするために0にする。
EndIf
SetToggleOptionValue(a_option, booEnabled) ; トグル表示を入れ替える。
gloEnabled.SetValue(intEnabled) ; 機能を有効にするかどうかを GlobalVariable にセットする。
EndIf
EndEvent
;--------------------------------------------------
Event OnOptionDefault(Int a_option) ; デフォルトキーを押したとき
If a_option == oidEnabled
SetToggleOptionValue(a_option, True) ; トグル表示をONにする。
gloEnabled.SetValue(1) ; 機能を有効にする。
EndIf
EndEvent
;--------------------------------------------------
Event OnOptionHighlight(Int a_option) ; フォーカスしたとき
If a_option == oidEnabled
SetInfoText("$Enabled_info") ; 説明書きを表示する。内容は翻訳ファイル内に記載する。
EndIf
EndEvent
【MCM実装 シリーズ】
1. Creation Kit で Papyrus を扱えるようにする
2. MCMに登録するための基本構造を作る
3. 初期画面とページの枠組みを作る
4. ページ内の項目を作る
5. スクリプトMODを配布形式にまとめる
6. MCM設定を自動で保存する