今回は中級編ということで「config.json」を使用してのMODを作成してみたいと思います。
「config.json」を使用すると、ユーザー自身が値を変更することにより、キャラクターごとにMODをオンオフ/MODの選択等が出来るようになります。
また「content.json」で条件指定も行ってみたいと思います。
初級編で使わせてもらった「Velverette's Anime Portrait and Sprite Mod」を再び使用して複数のキャラクターのPortraitsとCharactersを変更してみようと思います。
これが分かれば過去にxnbで出回っていたMODを自分自身でCP用に作り変えられると思います。
使うものは初級編と同じです
初級編で行った操作は理解しているという前提でいきますので、よくわからなくなったら初級編も見てみて下さい。
ではCP用完全版を目指して作成してみましょう。以下が流れです
- xnbをrepackしてpngにする
- フォルダとファイルの構成を決める
- manifest.jsonを作成する
- content.jsonとconfig.jsonを作成する
- 1つのキャラクターに複数のファイルがある場合を考える
- まとめ
1.xnbをrepackしてpngにする
XNB-Mod-Toolkitv2を使います。
初級編と同じファイルを使用するので、まず
Velverette's Anime Portrait and Sprite ModのページのFILESにあるVillagers- Vanilla Colors-の方「Villagers- Vanilla Colors--645-.zip」をダウンロードして解凍します。
解凍して出てきた「Villagers_Vanilla」フォルダをそのままXNB-Mod-Toolkitv2の「Packed」フォルダに入れます。その後、XNB-Mod-Toolkitv2の「UNPACK FILES.bat」をダブルクリックして実行します。(UNPACKする時は初級編ではファイル1つでやりましたが、フォルダごと入れれば丸ごと全部UNPACKすることができます)
「Villagers- Vanilla Colors--645-.zip」を解凍して出来た「Villagers_Vanilla」フォルダをXNB-Mod-Toolkitv2の「Packed」フォルダに入れる。
「Packed」フォルダに「Villagers_Vanilla」フォルダを入れたら、XNB-Mod-Toolkitv2の「UNPACK FILES.bat」をダブルクリックして実行します。
そうすると一瞬コマンドプロンプトが表示されてXNB-Mod-Toolkitv2の「Unpacked」フォルダの中に「Villagers_Vanilla」フォルダができます。
出来上がった「Villagers_Vanilla」フォルダの中に「Characters」フォルダと「Portraits」フォルダがあります。さらにその中に「png」ファイルと「yaml」ファイルが出来ていますが、使わないので「yaml」ファイルを全て消します。全てのフォルダの最下層まで見て「yaml」ファイルを全部消します。(入れておいてもいいですが混乱しそうなので自分は消しています ※必要な時がきたらまたUNPACKすればいつでも復元出来ます)
これでpngファイルのunpack(取り出し)に成功しました。
2.フォルダとファイルの構成を決める
先にフォルダとファイルの構成を決めてしまいます。(先にこの作業をやった方が後の作業がわかりやすいと思います)
「[CP] Villagers_Vanilla」フォルダを作成し、中に「assets」フォルダを作成します。
「assets」フォルダの中に1で作成した「Characters」フォルダと「Portraits」フォルダを入れてください。
「[CP] Villagers_Vanilla」フォルダに「config.json」「content.json」「manifest.json」を空のファイルで作成します。
これでフォルダとファイルの構成が決まりました。
3.manifest.jsonを作成する
初級編と大差ないです。完全版なのでMODの名前を「Villagers_Vanilla」としました。
{
"Name": "Villagers_Vanilla",
"Author": "cronosylph",
"Version": "1.0.0",
"Description": "Reconstruct old xnb",
"UniqueID": "cronosylph.Villagers_Vanilla",
"MinimumApiVersion": "2.9.0",
"UpdateKeys": [],
"ContentPackFor": {
"UniqueID": "Pathoschild.ContentPatcher",
"MinimumVersion": "1.6.0"
}
}
4.content.jsonとconfig.jsonを作成する
content.jsonとconfig.jsonを下記のように書きますが、まずは分かりやすいようにAbigailのCharactersとPortraitsを変更するMODを考えます。
content.jsonでやっている事を簡単に言うと、
"ConfigSchema"の部分で"EnableMod"、"Abigail_Characters"、"Abigail_Portraits"という変数を定義しています。
"Changes"の部分で"EnableMod"の値が"true"で、"Abigail_Characters"の値が"enabled"だった時に"assets/Characters/Abigail.png"ファイルを"Characters/Abigail"へ置き換える。という実際のアクションを書いてます。
"Abigail_Portraits"に関しても同様という感じですね。
content.json
{
"Format": "1.6",
"ConfigSchema": {
"EnableMod": {
"AllowValues": "true, false",
"Default": "true"
},
"Abigail_Characters": {
"AllowValues": "enabled, disabled",
"Default": "enabled"
},
"Abigail_Portraits": {
"AllowValues": "enabled, disabled",
"Default": "enabled"
},
},
"Changes": [
{
"Action": "EditImage",
"Target": "Characters/Abigail",
"FromFile": "assets/Characters/Abigail.png",
"When": {
"EnableMod": "true",
"Abigail_Characters": "enabled",
}
},
{
"Action": "EditImage",
"Target": "Portraits/Abigail",
"FromFile": "assets/Portraits/Abigail.png",
"When": {
"EnableMod": "true",
"Abigail_Portraits": "enabled",
}
},
]
}
行数 |
コード |
説明 |
3~16行目 |
"ConfigSchema": {
} |
"ConfigSchema"にあるものはconfig.jsonでユーザに指定させることができる |
4、8行目 |
"EnableMod"や"Abigail_Characters" |
自分で定義した設定フィールド |
5行目 |
"AllowValues": "true, false", |
必須。カンマ区切りの文字列としてプレーヤが指定できる値。ブール値のフラグには"true、false"を使用する。 |
6行目 |
"Default": "true" |
(オプション)フィールドの設定値がない場合のデフォルト値 |
19行目 |
"Action": "EditImage", |
ファイルを全て置き換える場合は"Load"でいいが、各ファイルは1回しか置き換えることができないため、一部を置き換える場合は"EditImage"がいい |
20行目 |
"Target": "Characters/Abigail", |
変更先ファイル、拡張子まで指定しなくてOK |
21行目 |
"FromFile": "assets/Characters/Abigail.png", |
変更元ファイル(assets=資産) |
22~25行目 |
"When": {
} |
条件指定 |
23、24行目 |
"EnableMod": "true","Abigail_Characters": "enabled", |
"EnableMod": "true"かつ"Abigail_Characters": "enabled"の場合「,」で区切ると(AND演算子) |
ユーザーが設定出来る変数:値(初期値)をconfig.jsonに書く。
config.json
{
"EnableMod": "true",
"Abigail_Characters": "enabled",
"Abigail_Portraits": "enabled",
}
行数 |
コード |
説明 |
2行目 |
"EnableMod": "true", |
「true、false」全てのmodを使うかどうかの設定 |
3行目 |
"Abigail_Characters": "enabled", |
「enabled, disabled」キャラクターごとにmodを使うかどうかの設定 |
初期値は全て"true"、"enabled"にしています。
ユーザー(プレイヤー)がconfig.jsonの値だけ書き換えればいいようにして上げられればベストな感じですね。そもそもCPのメリットはMODを丸ごと入れたり削除できたりして簡単というのがありますが、config.jsonを設定するだけでMODの中の一部だけ有効にするというような使い方ができます。
そういえばjsonファイルの中に//で区切ってコメントアウトなども出来ましたが、エラーにはなってないだけで本当はダメな可能性もあるので入れない方がいいかもしれないです。使っていいのかわからなかったのでコメントアウトは入れていません。
ちゃんと出来ているか一旦表示させてみます。(AbigailのCharacters・Portraitsを設定している他のMODがないか要注意)
ここまで作成した「[CP] Villagers_Vanilla」フォルダをStardew ValleyのMODフォルダへ入れる。
ゲームを起動。
MOD導入前 |
MOD導入後 |
|
|
しっかりと変更されました。
ということでここまで出来ればあとは簡単です(手間ではありますが)。残りのMODのあるキャラクター分を同様に記述します。
5.1つのキャラクターに複数のファイルがある場合を考える
PortraitsのHarvey、Maru、Maru_Hospitalにはメガネ無しバージョンのpngもあるのでその部分を考えます。
(3人とも修正の仕方は同じなので以下Harveyについてだけ書きます。)
「"default, no_glasses, disabled"」という3つの値を取れるようにします。
まずフォルダ/ファイルの構成とファイル名をこのようにします。
「content.json」を修正します。
"ConfigSchema"内で定義した値を"Changes"内で{{Harvey_Portraits}}のように{{~}}で括ると使用することができます。
【例】ユーザーがconfig.jsonの"Harvey_Portraits"に"no_glasses"を設定したらその値を使って「{{Harvey_Portraits}}.png」の部分は「no_glasses.png」に変換されて処理されるという感じです。
注意点としてはグローバルトークンとして決まっている"Season"のような値を"ConfigSchema"内で定義しないように。
詳しくは
Global tokens(Content Patcher)
"FromFile"部分の実際のファイルまでのパスが「Harvey」フォルダというのを作って1階層深くなっていることにも注意です。
content.json
"ConfigSchema": {
"Harvey_Portraits": {
"AllowValues": "default, no_glasses, disabled",
"Default": "default"
},
"Changes": [
{
"Action": "EditImage",
"Target": "Portraits/Harvey",
"FromFile": "assets/Portraits/Harvey/{{Harvey_Portraits}}.png",
"When": {
"EnableMod": "true",
"Harvey_Portraits": "default, no_glasses",
}
},
config.jsonも修正します。
config.json
{
"EnableMod": "true",
"Harvey_Portraits": "default",
}
これでHarveyのメガネ無しバージョンの設定は終わりです。
残りのMaru、Maru_Hospitalも同様に設定します。
これで全ての作業が完了しました。
そして以下が作成した完全版MODです。
[CP] Villagers_Vanilla
config.jsonの"Harvey_Portraits"を"no_glasses"にすると、Harveyのメガネ無しバージョンもしっかりと表示されましたね。
6.まとめ
初級編、中級編とxnbからCP用MODへ作り変えてみましたが、いかがだったでしょうか。これでxnb/pngファイルがあれば簡単なものならCP用に出来ると思います。
当初
ここにあったMODをCP用にしたくてついでにメモ代わりにブログに作成方法を書いておこうと思ったのですが、なんか色々書いているうちに多くなってしまいました
(ちなみにその時作成したものは
これ)
正直英語はそこまで得意じゃないので
CPについて書かれている詳細な仕様がよくわからないところも結構あったりしますが、今後もさらに使える実践的なものがあったらまた追記したいと思います。
ちなみに上級編は自分がそこまで上級ではないので作らないかもしれません。
以上、Content Patcher用MODの作成方法(中級編)でした。
おつかれさまでした。