Fomodでのファイル名リネームコピー方法についての質問を某所で見つけたので調べてみました。
「そんなんdestinationに新しい名前つけたらええだけやん」と思って試したところ、色々と問題点を見つけたのでまとめておきます。
問題の概要ですが、MOのバージョンによって次のような問題が発生します。
- 同じファイル(フォルダ)を複数回コピーしても、1ファイルしかコピーされない
- パス区切り文字によってはエラーとなる
以下、検証結果の詳細について説明します。
検証プログラム
Modファイル構成
FOModTutorRename.zip FOModTutorRename\ 10 RENAME\ org-readme.txt meshes\ unp-mesh.txt FOMod\ info.xml ModuleConfig.xml
Xml定義
<?xml version="1.0" encoding="UTF-16"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://qconsulting.ca/fo3/ModConfig5.0.xsd"> <moduleName>FOMod Tutorial 01</moduleName> <installSteps order="Explicit"> <installStep name=""> <optionalFileGroups order="Explicit"> <group name="フォルダとファイルのリネームコピー" type="SelectExactlyOne"> <plugins order="Explicit"> <plugin name="SLASH"> <description> パス区切りスラッシュ
 フォルダコピー:
 ・MO 1.2.18、MO 1.3.5では1フォルダしかコピーされない(コピーされるファイルはprioryty依存。この場合はmeshes2のみ)
 ・MO 1.3.11、NMM 0.56.1では全部コピーされる。
 ファイルコピー:
 ・MO 1.2.18、MO 1.3.11では「10 RENAME/org-readme.txt not found!」エラーとなり全くコピーされない
 ・MO 1.3.5では1ファイルしかコピーされない(コピーされるファイルはprioryty依存。この場合はreadme2.txtのみ)
 ・MO 1.2.18/1.3.5/1.3.11 (prefer=true)、NMM 0.56.1では全部コピーされる。
 </description> <image path=""/> <files> <folder source="10 RENAME/meshes" destination="meshes" priority="0"/> <folder source="10 RENAME/meshes" destination="meshes2" priority="0"/> <folder source="10 RENAME/meshes" destination="meshes/hoge" priority="0"/> <file source="10 RENAME/org-readme.txt" destination="readmeroot.txt" priority="0"/> <file source="10 RENAME/org-readme.txt" destination="readme/readme1.txt" priority="0"/> <file source="10 RENAME/org-readme.txt" destination="readme/readme2.txt" priority="0"/> </files> <typeDescriptor> <type name="Optional"/> </typeDescriptor> </plugin> <plugin name="BACKSLASH"> <description> パス区切り円記号(バックスラッシュ)
 フォルダコピー:
 ・MO 1.2.18、MO 1.3.5では1フォルダしかコピーされない(コピーされるファイルはprioryty依存。この場合はmeshes2のみ)
 ・MO 1.3.11、NMM 0.56.1では全部コピーされる。
 ファイルコピー:
 ・MO 1.2.18、MO 1.3.5では1ファイルしかコピーされない(コピーされるファイルはprioryty依存。この場合はreadme2.txtのみ)
 ・MO 1.3.11、MO 1.2.18/1.3.5/1.3.11 (prefer=true)、NMM 0.56.1では全部コピーされる。
 </description> <image path=""/> <files> <folder source="10 RENAME\meshes" destination="meshes" priority="0"/> <folder source="10 RENAME\meshes" destination="meshes2" priority="0"/> <folder source="10 RENAME\meshes" destination="meshes\hoge" priority="0"/> <file source="10 RENAME\org-readme.txt" destination="readmeroot.txt" priority="0"/> <file source="10 RENAME\org-readme.txt" destination="readme\readme1.txt" priority="0"/> <file source="10 RENAME\org-readme.txt" destination="readme\readme2.txt" priority="0"/> </files> <typeDescriptor> <type name="Optional"/> </typeDescriptor> </plugin> </plugins> </group> </optionalFileGroups> </installStep> </installSteps> </config>
フォルダ・ファイルのコピー内容
タグ | source(コピー元) | destination(コピー先) |
---|---|---|
<folder> | 10 RENAME/meshes | meshes |
<folder> | 10 RENAME/meshes | meshes2 |
<folder> | 10 RENAME/meshes | meshes/hoge |
<file> | 10 RENAME/org-readme.txt | readmeroot.txt |
<file> | 10 RENAME/org-readme.txt | readme/readme1.txt |
<file> | 10 RENAME/org-readme.txt | readme/readme2.txt |
検証結果
「パス区切りスラッシュ」を選択してインストールした場合
NMM/MO | フォルダのコピー結果 | ファイルのコピー結果 |
---|---|---|
NMM 0.56.1 | すべてコピー(下記結果1) | すべてコピー(下記結果1) |
MO 1.2.18 | 1フォルダのみ(下記結果2) | エラー発生(下記結果3) |
MO 1.3.5 | 1フォルダのみ(下記結果2) | 1ファイルのみ(下記結果2) |
MO 1.3.11 | すべてコピー(下記結果1) | エラー発生(下記結果3) |
「パス区切り円記号(バックスラッシュ)」を選択してインストールした場合
NMM/MO | フォルダのコピー結果 | ファイルのコピー結果 |
---|---|---|
NMM 0.56.1 | すべてコピー(下記結果1) | すべてコピー(下記結果1) |
MO 1.2.18 | 1フォルダのみ(下記結果2) | 1ファイルのみ(下記結果2) |
MO 1.3.5 | 1フォルダのみ(下記結果2) | 1ファイルのみ(下記結果2) |
MO 1.3.11 | すべてコピー(下記結果1) | すべてコピー(下記結果1) |
コピー結果詳細
結果1:すべてコピーされるケース
Data\ readmeroot.txt meshes\ unp-mesh.txt hoge\ unp-mesh.txt meshes2\ unp-mesh.txt readme\ readme1.txt readme2.txt
結果2:1ファイルしかコピーされないケース
コピー元ファイル・フォルダが同一の場合、priority指定に従い1ファイル・フォルダが選択されている模様。
Data\ meshes2\ unp-mesh.txt readme\ readme2.txt
結果2:フォルダはすべてコピーされるが、エラーによりファイルがコピーされないケース
MOのログに「10 RENAME/org-readme.txt not found!」が表示される。
Data\ meshes\ unp-mesh.txt hoge\ unp-mesh.txt meshes2\ unp-mesh.txt
その他気付いたこと
NMMで検証したところ、<file>タグのdestinationには次の制限(仕様)があるようです。
- 省略("")すると「パス~へのアクセスが拒否されました」エラーとなる。
- すでに存在するフォルダ名を指定すると「パス~へのアクセスが拒否されました」エラーとなる。
- 要はフォルダ名を指定できないということ。
まとめ
今回検証対象となったNMM 0.56.1、MO 1.2.18/1.3.5/1.3.11において、問題なくリネームコピーするために、どう定義すればいいのか整理してみます。
フォルダのコピー
- soruce/destionationに指定するパスをスラッシュではなく円記号(バックスラッシュ)にする
ファイルのコピー
- soruce/destionationに指定するパスをスラッシュではなく円記号(バックスラッシュ)にする
- destinationにはフォルダ名でなくファイル名を書く
- ただし、MO 1.2.18/1.3.5ではどうがんばっても元ファイル1つにつき1ファイルしかコピーできない
これまでMOのfomod機能をウォッチしてきましたが、どうにも品質が不安定ですね。リビジョン変更で動作がコロコロ変わりますし。
さすがにXmlの書き方を工夫してNMM/MO間の仕様差異をカバーするのも無理があると思えてきました。
MOとNMMの仕様差異を回避する方法
MOのFomodインストーラには、MO独自版と、NMM添付のものが両方ついています。
Fomod Installerプラグイン設定画面でpreferプロパティをfalseにすることで、NMM添付のfomodインストーラを使うことができます。
動作検証はNMMおよびNMM互換インストーラーで行い、エンドユーザーにこの設定をしてもらうようお願いするのが精神的にも体力的にも楽だと思います。(実際、nexusmodsにもこの指示をしているmodがちらほらあるようです)
パス区切り文字問題について
パス区切り文字についての問題はMO 1.3.4でも発生しており、そのときはスラッシュのほうが安全と判断したのですが、もう一度整理しなおす必要がありそうですね。時間を見つけて既存の記事を訂正しておきます。(1.3.4はもはや過去のバージョンとなったので無視してよさそうですし)
以上