目次
[HOME]

Oblivion Mod ManagerのScript

はじめに

 omodとはOblivion Mod Managerで作るModパッケージファイルです。 ObMMを導入して使いこなしている方は普通にomodを作成して日々Modの出し入れに 活用されていると思います。
 さて、omodにはScript機能があります。 Scriptの出来る事はあんまり自由度が高くないのですが、しかし、ウィザードを作る程度なら 十分使えます。ウィザード機能が付いたomodファイルを利用された事がある方も多いでしょう。
 ここでは簡単なウィザード用omod用Scriptの解説をします (基本的なomodの作成方法は理解できているものとします)。

 翻訳からはちょっと離れますが、Mod製作者は時々いろんなバリエーションのesm/espを アーカイブ内に同梱して配布しています。 これはPlayerの皆さんの好みに合うものを選んでくれという親切心なのですが、 添付文書を読まない人がそれらを全部いれちゃってトラブルの質問スレにやってくる事が 良く有ります。 『同じキャラが3人も居るよ、何で?』っていう質問が良く見られたのはこれの良い例です。 『添付文書くらい読め、このおたんこなーす』と思わなくも無いですが、事前に omodの形でウィザードにしておけば(彼らがObMMを使う限りは)回避できます。 試してみる価値はあると思いますよ。

目次

簡単な例

espファイルが2つあり、どれか1つを選んでもらいたい場合

 丁度当方が作成しているJPBooksを例にします。 JPBooksはSIデータ入り(JPBooks_Vanilla+SI.esp)とSI無し(JPBooks_Vanilla.esp)の 2つのバリエーションがあります。 二つを同時に放り込んでも読込が重くなるだけでさして問題は顕在化しませんので あんまり気にしなくて良いのでは有りますが、無駄は無い方が良いでしょう。
  1. omod作成は『Add Folder』を用いる方法です。
    先ず、作業用ディレクトリを作成します(下の画像では『G:\_TMP\Data』)。 そしてそこにインストールして欲しいファイルを配置します(*.esp)。

    example

  2. 『Add Folder』で当該ディレクトリ(『G:\_TMP\Data』)を対象にします。
  3. Scriptを書く
    このままomod化すると2つのespがインストールされる無駄なものになります。 そこでインストール時にObMMにUserにどっちを入れるか訊くようにするのがScriptのお仕事です。 今回はどちらを入れるかという単純なものなのでとっても簡単に書けます。
    ; ----------------------------
    ; omodをActivateした時に速攻インストール作業に移らないようにする命令
    ; ----------------------------
    DontInstallAnyPlugins
    DontInstallAnyDataFiles
    
    ; ----------------------------
    ; Flag用変数宣言
    ; ----------------------------
    SetVar FlagJPBooks 0
    
    ; ----------------------------
    ; UserにSIの有無を問うてFlagを決定 (0,1) = (SI無, SI有)
    ; ----------------------------
    If DialogYesNo "SIを導入していますか?導入済ならはい(Yes)、未導入ならいいえ(No)を選んで下さい" "バリエーション選択"
       SetVar FlagJPBooks 1
    Else
       SetVar FlagJPBooks 0
    EndIf
    
    ; ----------------------------
    ; インストール
    ; ----------------------------
    If Equal %FlagJPBooks% 1
    	CopyPlugin "JPBooks_Vanilla+SI.esp" "JPBooks_Vanilla+SI.esp"
    Else
    	CopyPlugin "JPBooks_Vanilla.esp" "JPBooks_Vanilla.esp"
    EndIf
    
     コメント(行頭が;なものがコメント行で、Script実行時は無視される)が ちょっとウザイですが、案外簡単ですよね。
     ウィザード内で一度だけ選択ダイアログが出ますがそれは次の画像の様になります。 DialogYesNo命令のオプションがダイアログの何処と対応しているか比較してみてください。

    DialogYesNo

     CopyPlugin関数(命令)は
    CopyPlugin [omod内での名前] [コピー先の名前]
    という文法です。 よってomod内のesp名と別の名前でインストールする事も出来ます。
    CopyPlugin "JPBooks_Vanilla+SI.esp" "JPBooks.esp"
    また、omod内のespファイルをディレクトリを掘って分類して置き、インストール時に そこから取り出す事も出来ます(階層の区切り文字は\\と二つ重ねている事に注意)。
    CopyPlugin "JPBooks\\JPBooks_Vanilla+SI.esp" "JPBooks.esp"
    これら二つは、espファイルを特定の名前でインストールして欲しいときに有用です (BOSS等によるソートやBSAを読み込ませたい時等)。 また、espファイル以外のtexturesディレクトリ等をまとめてコピーしたい場合は 『CopyDataFolder』という命令があります。 使い方はほぼ同様です(最後のTrueは再帰的にする(サブフォルダも対象にする)という意味)。
    CopyDataFolder "textures" "textures" True
     後、Flag変数を使わずにIfで判定したら直ぐにコピー(CopyPlugin)をした方が コードは単純になります (ファイルコピーは実際は選択ダイアログを全て行った後に行われるので、 Script上では何処に書いても余り問題は無い)。 ですがもっと複雑なScriptになった場合はFlag変数を準備して行った方が見通しがよくなります。 それを踏まえれば、単純なコードのうちから慣れておいた方が良いと思います。
  4. omod作成 AuthorやSite情報、Description、Readme等を色々設定しておきましょう。
  5. 配布 omodファイルは圧縮済みなのでそのままサーバにアップしても転送量の問題はありません。 ですが、一部のブラウザには彼にとって未知の拡張子に出会った場合、勝手に自分で判断して 拡張子を付け替えてしまう事があります。 よってomodファイルを更に何らかの形で圧縮(zip等)しておいた方がPC初心者の方を惑わす事が 少なくなるのでお勧めしておきます(この場合、圧縮ファイルの圧縮形式を解析して実際の展開処理に反映させるアーカイバで誤動作する可能性も有りますが 可能性はそんな高くないと思うので無視できるかと)。

espファイルが2つあり、好きな物を入れてもらいたい場合

 これは上と異なり『どっちか一方だけ』ではなく、夫々のespについて 判断してもらうものです。 場合によっては全部入ってしまう事もあるということです。 以前のJPBooksはVanillaのみ収録のもの(JPBooksVanilla.esp)と SIのみ収録のもの(JPBooksSI.esp)の2つがありました。 これを例にします。  他の部分は共通なのでScriptだけ書きます
; ----------------------------
; omodをActivateした時に速攻インストール作業に移らないようにする命令
; ----------------------------
DontInstallAnyPlugins
DontInstallAnyDataFiles

; ----------------------------
; Flag用変数宣言:夫々で判定をする必要があるのでFlag変数が増える
; ----------------------------
SetVar FlagJPBooksVanilla
SetVar FlagJPBooksSI

; ----------------------------
; JPBooksVanillaの導入 (0,1) = (導入しない, 導入する)
; ----------------------------
If DialogYesNo "JPBooksVanillaを導入しますか?導入するならはい(Yes)、不要ならいいえ(No)を選んで下さい" "JPBooksVanilla選択"
   SetVar FlagJPBooksVanilla 1
Else
   SetVar FlagJPBooksVanilla 0
EndIf

; ----------------------------
; JPBooksSIの導入 (0,1) = (導入しない, 導入する)
; ----------------------------
If DialogYesNo "JPBooksSIを導入しますか?導入するならはい(Yes)、不要ならいいえ(No)を選んで下さい" "JPBooksSI選択"
   SetVar FlagJPBooksSI 1
Else
   SetVar FlagJPBooksSI 0
EndIf

; ----------------------------
; インストール
; ----------------------------
; JPBooksVanilla
If Equal %FlagJPBooksVanilla% 1
	CopyPlugin "JPBooksVanilla.esp" "JPBooksVanilla.esp"
EndIf

; JPBooksSI
If Equal %FlagJPBooksSI% 1
	CopyPlugin "JPBooksSI.esp" "JPBooksSI.esp"
EndIf
 この様にespファイルごとにFlag変数を準備して処理すればOKです。 この方法を使えば3つ以上のespファイルの場合も処理出来ちゃいます。

複数のespを導入するが、選択のチェックも行いたい場合

 さて、上の様に複数のespに関して選択ダイアログを出す事は出来ます。 ところが、何も考えずYes連打されると選択ダイアログは無駄になります。 それを防ぐ事をここでは考えます。 原理は簡単で、他の選択肢のYes/No状況を見てUserが選んだ選択肢が 良いかどうか判定すればいいのです。 これが出来るようになればespの入れ過ぎとかは起こらなくなるでしょう。 例は現行のJPBooksを使用します。
; ----------------------------
; お約束
; ----------------------------
DontInstallAnyPlugins
DontInstallAnyDataFiles

; ----------------------------
; Flag用変数宣言
; ----------------------------
SetVar FlagJPBooksVanilla
SetVar FlagJPBooksVanillaSI

; ----------------------------
; JPBooks_Vanilla+SIの導入 (0,1) = (導入しない, 導入する)
; ----------------------------
If DialogYesNo "JPBooks_Vanilla+SIを導入しますか?導入するならはい(Yes)、不要ならいいえ(No)を選んで下さい" "JPBooks_Vanilla+SI選択"
   SetVar FlagJPBooksVanillaSI 1
Else
   SetVar FlagJPBooksVanillaSI 0
EndIf

; ----------------------------
; JPBooks_Vanillaの導入 (0,1) = (導入しない, 導入する)
; ----------------------------
If DialogYesNo "JPBooks_Vanillaを導入しますか?導入するならはい(Yes)、不要ならいいえ(No)を選んで下さい" "JPBooks_Vanilla選択"
   SetVar FlagJPBooksVanilla 1
Else
   SetVar FlagJPBooksVanilla 0
EndIf

; ----------------------------
; 検閲!
; ----------------------------
If Equal %FlagJPBooksVanillaSI% 1
	If Equal %FlagJPBooksVanilla% 1
		Message "FlagJPBooksVanillaSIとFlagJPBooksVanillaを同時に入れるのは無駄です。やり直してください"
		; インストール処理の強制終了命令
		FatalError
	EndIf
EndIf

; ----------------------------
; インストール
; ----------------------------
; JPBooks_Vanilla+SI
If Equal %FlagJPBooksVanillaSI% 1
	CopyPlugin "JPBooks_Vanilla+SI.esp" "JPBooks_Vanilla+SI.esp"
EndIf

; JPBooks_Vanilla
If Equal %FlagJPBooksVanilla% 1
	CopyPlugin "JPBooks_Vanilla.esp" "JPBooks_Vanilla.esp"
EndIf
 ObMM組み込みのScriptエンジンは 論理積 (A且つB)が無いのでIf階層が深くなるのが難点。

Yes/Noだけでは味気ないっす

 こうすると選択が出来るようになります(変数宣言等は省略)。
Select "JPBooksのインストール", "JPBooks_Vanilla+SI", "JPBooks_Vanilla"

	Case JPBooks_Vanilla+SI
		SetVar FlagJPBooks 1
		Break
	Case JPBooks_Vanilla
		SetVar FlagJPBooks 2
		Break
	Default
		Message "入力値が不正です" "Error"
		FatalError
EndSelect
これで出せるダイアログは以下の画像の様になります。 どちらか一方しか選択出来ないように強制できるのが利点です。 但し、DialogYesNoと異なり、タイトルバーの内容しか弄れません (画像内の"Select one option"とある部分は弄れない)。

select

『Select』を『SelectMany』にすると複数を選択できるようになります。 選択肢にDescriptionを付けているomodを見た事が有るかもしれません。 それは『SelectWithDescriptions』で行います。
; ----------------------------
; この命令で長い行を改行する事が出来るようになる。改行部分には\を加える必要有
; ----------------------------
AllowRunOnLines

SelectManyWithDescriptions "JPBooksのインストール", \
		"JPBooksVanilla", \
		"Vanilla環境に存在する書籍の内容を日本語に置換します。名詞は英語のままです", \
		"JPBooksSI", \
		"SI環境に存在する書籍の内容を日本語に置換します(Vanillaの物は含みません)。名詞は英語のままです。"

	Case JPBooksVanilla
		SetVar FlagJPBooksVanilla 1
		Break
	Case JPBooksSI
		SetVar FlagJPBooksSI 1
		Break
	Default
		Message "入力値が不正です(若しくは何も選択されていません)" "Error"
		FatalError
EndSelect
 これで出せるダイアログは以下の画像の様になります (Descriptionボタン位置をクリックするとその例が表示されます)。 SelectMany*なので複数が選択でき、また、*WithDescriptionsなので 夫々についての説明文を出す事が出来ます。 選択肢と説明文の対応は比較しておくと良いでしょう。

 SelectとDialogYesNoのどちらを利用した方が良いかという点ですが、 これは作成者の好みになります。 DialogYesNoは二者択一選択肢を説明文付きで出すのに便利です。 ただし、(一つのDialogYesNo命令だけで)選択肢を増やす事は出来ません。 Selectは複数の選択肢を提供でき、択一にも出来るし複数選択も 行えるように出来ます。 状況に応じて使い分けるのが良いでしょう。

実践

 それでは実際にちょっと複雑なModのインストールScriptを書いてみましょう。

JPBooks

 先ずは、JPBooksを例にとってみます。 これはメインのJPBooksが2パターン(VanillaのみとVanilla+SIの択一)、 オプションとしてmorrowindJPbooks(ノーマルとライトの択一) が選べます。 更に選んだespをばらばらで入れるかマージしたものを入れるかも選択できます。 ObMMでのインストール時にespをマージ出来れば良いのですが不可能なので omod内にバラバラのespとマージしたespの全てを準備しておかないといけないのが 作成者側の手間になります(Script書くよりこっちの方が面倒)。 omod作成時のディレクトリ構造は以下の画像のようになっています。処理上分かり易くする為に同じグループのespごとにディレクトリを分けてあります。

JPBooks

 以上の構造を踏まえて作成したScriptが次のものです。 こちらの注目部分はバージョンチェック(及びSI有無の確認)・LoadEarly命令・ インストールespを案内する仕組み・インストールキャンセルの仕組み (途中でキャンセルできるというのは結構便利)等です。
 LoadEarlyはObMMのHelpには明確に記述されていませんが利用できるものです。 これを指定すると対象のespはロードオーダーの頭に移動されます(*.esmよりは後)。
ObMM Script for JPBooks 11.1.20

 その後、Scriptをかなり書き換えました。 環境チェックを多少強化し、提案する選択肢にそれを反映させています。 ただし、ObMMのOblivionバージョンチェックが多少怪しいことが分かったので回避処理を盛り込んでいます。
ObMM Script for JPBooks 11.9.22

From2ch Lives v1.3.1

 次に利用者の多いFrom2ch Lives v1.3.1(Ta22さん作)を例にします(勝手に例にして済みません!)。 アーカイブを展開すると以下の画像の様になります。

From2ch Lives

実際のコードはこちら。

ObMM Script for From2ch Lives v1.3.1

こちらの注目部分は、バージョンチェックや前段階での選択で後の選択を切り替える方法 (From2ch Livesメインespを入れないとAddonが入れられない仕組み)や 選択したespに応じて新たにSelectダイアログを作成する部分です(不死属性版を選ぶ部分)。
 Scriptのコマンドの制約により、『おまけ』と『旧ファイルテキスト』ディレクトリは 処理対象外にしています(理由はScript内にコメントで記述)。 それらはomod内に含めないで配布アーカイブ内にじかに格納する形が良いかもしれません。

補足:Scriptに関して

 ポイントをメモしておきます

補足:Script等の文字化け

 ScriptやReadme、Descriptionには日本語が使えます。 少なくとも、ObMMで編集する範囲では。 作成済みのomodからExtract to folderを行ってもきちんと出力されます(UTF-8)。 ところが、このExtract to folderで出力した『omod conversion data』を利用してomodを作成しようとすると文字化けを起こします(UTF-8がShift_JISと解釈された化け方)。 ただし、Descriptionには文字化けは発生しません。 これは恐らくObMMか.NET側の問題と思います。 ただ、回避方法も有り、文字化けするデータ(Readme:/*.rtf、Script:omod conversion data/script.txt)をShift_JISに変換してから読み込ませると正常に表示されます。
この問題のため、海外のModでよく見られるアーカイブの中にomod conversion dataを入れておいて『omod作成は自分でやってねー』なことがしにくいです。 日本語を使ったScriptやreadmeを使用したい場合は製作者側でomodまで作成しておいた方が良いでしょう。