Thinking Skeever

Skyrim/The Witcher 3 Modについてのあれこれ。FoModの作り方、Mod導入時のトラブル事例などのニッチな話を書いていきます。a.k.a. BowmoreLover@nexusmods

Fomod作成:フォルダ名・ファイル名を変更してコピーする場合の注意点

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>
                                パス区切りスラッシュ&#xD;
フォルダコピー:&#xD;
・MO 1.2.18、MO 1.3.5では1フォルダしかコピーされない(コピーされるファイルはprioryty依存。この場合はmeshes2のみ)&#xD;
・MO 1.3.11、NMM 0.56.1では全部コピーされる。&#xD;
ファイルコピー:&#xD;
・MO 1.2.18、MO 1.3.11では「10 RENAME/org-readme.txt not found!」エラーとなり全くコピーされない&#xD;
・MO 1.3.5では1ファイルしかコピーされない(コピーされるファイルはprioryty依存。この場合はreadme2.txtのみ)&#xD;
・MO 1.2.18/1.3.5/1.3.11 (prefer=true)、NMM 0.56.1では全部コピーされる。&#xD;
                            </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>
                                パス区切り円記号(バックスラッシュ)&#xD;
フォルダコピー:&#xD;
・MO 1.2.18、MO 1.3.5では1フォルダしかコピーされない(コピーされるファイルはprioryty依存。この場合はmeshes2のみ)&#xD;
・MO 1.3.11、NMM 0.56.1では全部コピーされる。&#xD;
ファイルコピー:&#xD;
・MO 1.2.18、MO 1.3.5では1ファイルしかコピーされない(コピーされるファイルはprioryty依存。この場合はreadme2.txtのみ)&#xD;
・MO 1.3.11、MO 1.2.18/1.3.5/1.3.11 (prefer=true)、NMM 0.56.1では全部コピーされる。&#xD;
                            </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インストーラを使うことができます。

  f:id:thinkingskeever:20160114172041p:plain

動作検証はNMMおよびNMM互換インストーラーで行い、エンドユーザーにこの設定をしてもらうようお願いするのが精神的にも体力的にも楽だと思います。(実際、nexusmodsにもこの指示をしているmodがちらほらあるようです)

パス区切り文字問題について

パス区切り文字についての問題はMO 1.3.4でも発生しており、そのときはスラッシュのほうが安全と判断したのですが、もう一度整理しなおす必要がありそうですね。時間を見つけて既存の記事を訂正しておきます。(1.3.4はもはや過去のバージョンとなったので無視してよさそうですし)



以上

Copyright (C) 2015-2020 ThinkingSkeever, All Rights Reserved.
ブログの記事内に記載されているメーカー名、製品名称等は、日本及びその他の国における各企業の商標または登録商標です。
リンクはご自由に。記事の転載はご遠慮ください。記事を引用する場合はトラックバックするか元のURLを明記してください。