【カスタムNPCMOD】季節・マップ・イベントごとに別のポートレイトを表示する方法【Stardew Valley】

【カスタムNPC】季節・マップ・イベントごとに別のポートレイトを表示する方法【Stardew Valley】

カスタムNPCのポートレイト・スプライト画像を季節・マップ・お祭りイベントごとに変更する方法を紹介します。
ついでに、NPCの洋服を毎日ランダムで変更する記述も紹介します。

そんなに複雑ではないので、やってみようかな~という人はぜひぜひ!
ポートレイト・スプライト画像が変わるようになるだけで、NPCが生きてる感が増してうれしくなる、はずです。

なお、ポートレイト・スプライト画像自体の設定については下記で解説しています。

スプライト用に書き換えをする場合

説明の前に、ちょっと前置き。

これから紹介していく記述は、ポートレイト用の記述になります。
ですがスプライトでも全く同じ記述が使えるのでご安心。

スプライト用に記述を書く場合は、以下のように書き換えて使ってください。

ポートレイト用の記述例

{
“Action”: “Load”,
“Target”: “Portraits/あなたのNPCの名前”,
“FromFile”: “assets/Portraits/あなたのNPCの名前_{{season}}.png”
},
{
“Action”: “EditImage”,
“Target”: “Portraits/あなたのNPCの名前”,
“FromFile”: “assets/Portraits/あなたのNPCの名前_bikini.png”,
“Update”: “OnLocationChange”,
“When”:
{
“LocationName”: “Beach”,
“Season”: “Summer”,
“Weather”: “Sun”,
}
},

スプライト用の記述例

{
“Action”: “Load”,
“Target”: “Characters/あなたのNPCの名前”,
“FromFile”: “assets/Sprites/あなたのNPCの名前_{{season}}.png”
},
{
“Action”: “EditImage”,
“Target”: “Characters/あなたのNPCの名前”,
“FromFile”: “assets/Sprites/あなたのNPCの名前_bikini.png”,
“Update”: “OnLocationChange”,
“When”:
{
“LocationName”: “Beach”,
“Season”: “Summer”,
“Weather”: “Sun”,
}
},

「スプライト用の記述例」の赤い文字部分が書き換えるべき場所です。
赤い文字部分以外の記述は、ポートレイト用の記述と全部同じなので、コピペしてきたそのままの状態で使ってOKです。

記述をする前に、下準備

記述をしていく前に、まずは下準備です。

やってほしい準備は、以下の通りです。

  • assetsフォルダ内に「Portraits」「Sprites」という名前のフォルダを作成する
  • それぞれのフォルダ内に「Portraits.png」「Sprites.png」という名前の画像ファイルが入っている
  • content.jsonにポートレイト・スプライトに関する基本的な記述がもう書いてある

上記のことがもうできているよ!という場合は、下準備の説明は読み飛ばしてくださいませ。

ポートレイト・スプライト画像の設定は、どちらもcontent.json内に書かれています。
なので、content.jsonをご用意ください。

また、今回はある程度content.jsonに必要な記述を書き終えていること前提で説明を進めます。
まだcontent.jsonが空っぽの場合や、そもそもcontent.jsonがない!という人は先にcontent.jsonを埋めちゃいましょう。
こちらにcontent.jsonの基本的な書き方がのっています。

https://mfmfdg.com/sv-make-npc-mod-basic/

また、今回はassetsフォルダ内に「Portraits」「Sprites」という名前のフォルダを作成し、その中に画像ファイルを入れていく形で”FromFile”以下のパスを書いています。
パスの書き方が自分でもわかる方は、ここらへんは自分のお好みな構成にしてもらって問題ありません。
ですが、なんのことだか分からぬ!パスってなにさ!な方はとりあえず、以下の1~3をしておいてください。

  1. assetsフォルダ内に「Portraits」「Sprites」という名前のフォルダを新しく作成する
  2. 「Portraits」フォルダ内に「Portraits.png」を入れる
  3. 「Sprites」フォルダ内に「Sprites.png」を入れる

こうしておけば、記述をまるっとコピペして使えるようになります。
(つまり、”FromFile”以下のパスを書き換えなくてよくなります)

下準備は以上になります!

季節ごとにポートレイトを変える方法

季節ごとにポートレイトの画像を変える記述の紹介です。
季節ごとに変える記述は、2通り紹介したいものがあるので、お好きなほうを選んでください。
使う時は、どちらか片方だけを使ってくださいね。

紹介する記述は、以下の2つ。

  • 元画像は別に用意して、それを上書きする方法
  • 画像を季節ごとに読み込ませる方法

季節ごとのポートレイトをPortraitsフォルダに入れる

記述をする前に、各季節ごとに表示させたいポートレイト画像を、assets/Portraitsのフォルダの中に入れておきましょう。

各季節ごとのポートレイト画像の名前は、以下のようにしておいてください。

  • あなたのNPCの名前_spring.png
  • あなたのNPCの名前_summer.png
  • あなたのNPCの名前_fall.png
  • あなたのNPCの名前_winter.png

「あなたのNPCの名前」の部分は半角英数字がおすすめです。
もしNPCの名前が村人くんなら「murabitokunn_spring.png」みたいな感じです。

スプライトの場合も、上記と同じようにします。
スプライトの場合はassets/Spritesのフォルダに入れてくださいね。

元画像は別に用意して、それを上書きする方法

まず、デフォルトとなる画像を用意して、それを上書きすることで季節ごとのポートレイトを表示させる方法を紹介します。

メリットとしては、もし何かしらの記述ミスや、画像のファイルパス名を間違ってしまった時にも、「デフォルト画像」が読み込まれるだけなのでエラーが出にくい点です。
また、もし万が一なにかエラーが出てしまっても、追加した記述をいったん削除してしまえばいいだけですので、「試しにやってみる」にはぴったりな記述方法になります。
デメリットは、記述が長くなることだけです。

では、content.jsonを開いてください。
中にポートレイトに関する記述があるはずですので、どこに書いてあるか探しましょう。

大体、以下のような記述です。
自分のファイルの構成によって部分部分が異なってはくるはずなので、以下の記述と完全一致するものを探す必要はありません。
文字列検索などの機能を使って「”Target”: “Portraits/」と検索をかけると見つけやすいと思われます。

{
“Action”: “Load”,
“Target”: “Portraits/あなたのNPCの名前”,
“FromFile”: “assets/portraits.png”,
},

上記の記述が見つかったら、その下あたりに以下の記述をぺたっと貼り付けます。

//ポートレイトを季節ごとに変える
{
“Action”: “EditImage”,
“Target”: “Portraits/あなたのNPCの名前”,
“FromFile”: “assets/Portraits/あなたのNPCの名前_{{season}}.png”,
},

これだけ!
終わりです。

ゲームを起動して、確認してみましょう。

CJB Cheats Menu」というMODを入れると、メニューからいつでも季節を変更できます。確認しやすいのでおすすめです。
※上記MODを使って季節を変更した場合、ポートレイト・スプライト画像は一度ベッドで眠らないと変更されません。ご注意!

画像を季節ごとに読み込ませる方法

次に、元画像の方を季節ごとに別の画像を読み込ませる、という記述を紹介します。
こっちの記述では、「大元となる画像を、季節ごとに別の画像にする」という方法です。
上記で紹介した記述とこちらの記述で、ゲーム内で表示されるポートレイト自体に違いは一切ありません。
どちらも結果的には同じことをやっているのですが、内部的な処理が違ってるだけです。

こちらの記述をするメリットは、記述が短くて済むので管理がしやすくなる、後で見た時に記述が分かりやすい、という点です。
デメリットとしては、大元の画像自体に変更をかけるので、もし記述が間違っていたらエラーが出る可能性があるというところでしょうか。
Content Patcherの記述方式に見慣れるまでは、こちらではなく先ほど紹介した「元画像を編集する方」の記述で全然良いと思います。

では、記述の紹介です。

content.jsonを開いて、ポートレイトに関する記述を探しましょう。
大体以下のような記述です。(文字列が完全一致していなくても大丈夫です)
文字列検索などの機能を使って「”Target”: “Portraits/」と検索をかけると見つけやすいと思われます。

{
“Action”: “Load”,
“Target”: “Portraits/あなたのNPCの名前”,
“FromFile”: “assets/portraits.png”,
},

上記のような記述をみつけたら、その記述をまるっと削除してください。
削除したら、以下の記述を貼り付けます。

{
“Action”: “Load”,
“Target”: “Portraits/あなたのNPCの名前”,
“FromFile”: “assets/Portraits/あなたのNPCの名前_{{season}}.png”
},

これだけです。
ゲームを起動して確認してみてくださいね。

上記の記述、何が違うの?

これは完全に補足です。
上記の2通りの記述で、何がどう違うのか知りたい方だけ読んでください。
それ以外の方は、お次の項目「」へどうぞ!

まず、上記の記述を並べてみます。

1個目の記述:元画像を上書きする方

{
“Action”: “EditImage”,
“Target”: “Portraits/あなたのNPCの名前”,
“FromFile”: “assets/Portraits/あなたのNPCの名前_{{season}}.png”,
},

2個目の記述:元画像自体を読み込ませる方

{
“Action”: “Load”,
“Target”: “Portraits/あなたのNPCの名前”,
“FromFile”: “assets/Portraits/あなたのNPCの名前_{{season}}.png”
},

この2つの記述で違うところは「”Action”:」以下の記述だけです。

“Action”: “EditImage”,

「”Action”: “EditImage”,」という記述は、「すでにある画像を、こっちで置き換えてね!」といった指示を出す時に使われるActionの値です。

つまり「”Action”: “EditImage”,」と書かれているものは、それがなんであれ必ずどこかに「元となるデータ」があります。
「元となるデータ」の場所とは、この記述でいうなら「”Target”: “Portraits/あなたのNPCの名前”,」の部分です。
なので「Portraits/あなたのNPCの名前」というデータがゲーム内のどこにも見当たらなかった時、エラーが出ます。

“Action”: “Load”,

「”Action”: “Load”,」という記述は、「こういうデータを新しく読み込みなさいよ!」といった指示を出す時に使われるActionの値です。
つまり、EditImageと違って「大元になるデータ」を必要としません。
Loadは、自分自身が「大元となるデータ」という存在になるからです。

「こういうデータを新しく読み込みなさいよ!」の「こういうデータ」というのは、上記の記述でいうと「”Target”: “Portraits/あなたのNPCの名前”,」の部分です。
つまり、「”Action”: “Load”,」という記述によって、ゲーム内に新しく「Portraits/あなたのNPCの名前」というデータを追加しているのです。

簡単にまとめると、

  • EditImageは「変更」
  • Loadは「新規追加」

ということです。
これが、この2つの記述の違いです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です