カスタムNPC MODの作り方 ~基礎編~【Stardew Valley】

カスタムNPC MODの作り方 ~基礎編~【Stardew Valley】

Stardew Valley内に、自分で作ったオリジナルのキャラ(NPC)を追加しよう!
ということで、カスタムNPCのMODの作り方講座、その1です。

今回は基礎編なので、とりあえずStardew Valleyのゲーム内に、自作したオリジナルのNPCを存在させるところまで!

できるようになること

今回、これから説明するのは、こんな内容です。

  • Stardew Valleyのゲーム内のマップ上に、自作したNPCが立っている!
  • 自作したNPCに話しかけると、セリフが表示される
  • プレゼントの好みの設定や、結婚できるかできないか…などの、基本的な設定

などなど。

作成をはじめる前の準備

Stardew ValleyでカスタムNPCのMODを作る上で、必須になるのは、以下の2つのMODです。

SAMPIは、Stardew ValleyでMODを使う上で、入れていることが前提となるMODですね。
今回は、このSAMPIはすでに導入されていることを前提で進めます。
なので、「SMAPIってなに?まだMOD使ったことないよ!」という人は、まずは「Stardew Valley SMAPI 使い方」などで調べてみてくださいね!

Content Patcherは、カスタムNPCのMODを作る上で、必須になるMODです。
カスタムNPCは、このContent Patcherが提供している記述の方法で作っていきます。

Content Patcherをまだ持ってないよ!という人は、こちらからContent Patcherをダウンロードしましょう!
もしくは、ご自分で「Content Patcher」と検索しても、上のほうにダウンロードのページがひっかかるはずです。

また、上記の必須MODの他に「Custom NPC Fixes」というMODの導入もしておいた方が良いです。
Custom NPC Fixesが導入されていなくても、自分で作ったNPCは動きます。
ですが、カスタムNPCのスケジュール周りに何かしらのバグがあるらしく、たまに次の移動場所へ移動してくれなかったり…ということがあるので、Custom NPC Fixesを入れておくと安心というだけです。
カスタムNPCのスケジュールってなんぞや、に関しては後述します。

Content PatcherのDLのしかたが分からない!

Content Patcherのダウンロードページに行っても、どこからダウンロードすればいいのかわからない!
そんな方向けの説明です。

Content Patcherをもう持っている方や、DLできるよ!という人は、ここは読み飛ばしてくださいませ。

下記の説明を読むのが面倒な方は、こちらのページに行って、一番上にあるContent Patcherのファイルの「Manual Download」ボタンを押して、DLしてください。
DLしたものは、解凍して、解凍したファイルをStardew ValleyのModsのフォルダー内に入れてください。これで導入完了です!

なぜ一番上のファイルなのかとか、なぜ「Manual Download」ボタンを押すのか…?を知りたい方は、これから説明します!

Content Patcherのダウンロードの方法

まず、Content PatcherのDLページに行きましょう。

Content Patcherに関する説明などが書かれているページはこちらです。
でも、上記にはダウンロードするためのボタンがありません。
なので、上記のページ内の「FILES」というタブを開く必要があります。

上記サイトはNEXUS MODSという、大型MOD配布サイトなのですが、すべて英語なのではじめて使う人は最初は戸惑うかもしれません…。(私はそうでした)

なので、「FILES」というタブがなんのことなのか分からない人は、こちらのリンクをクリックして、飛んでください。
Content Patcherをダウンロードするためのボタンがあるページが開きます。

正式版とベータ版

Content Patcherのダウンロードボタンがあるページにいくと、2つのファイルが並んでいる時があるかもしれません。
このように。

Content Patcherのダウンロード方法

上記の画像でいうと、

  • Content Patcher 1.26.6と書かれているものは「正式版」
  • Content Patcher 1.27.0 beta 2022-05-27と書かれているものは「ベータ版」

です。

正式版とは、大きなバグなども取り除かれて、安定してゲーム内で使うことができるバージョンのものです。
ベータ版は、大体の場合「正式版にはない機能が追加されてたりするけど、まだ開発段階で様子見してるものだよ!バグあるかもなんで、あったら報告してね!」といったバージョンのものにベータ版と名前をつけて配布したりします。

今回は、上にある「正式版」のContent Patcherをダウンロードしましょう。

ちなみに、上記の画像内で「Optional files」と書かれている項目の下にある「Content Patcher 1.19.0」というファイルは、アンドロイド用のContent Patcherです。
太字で書かれている英語をざっくりと訳すと、「アンドロイドのためのContent Patcherです。でも古いバージョンだよ。アンドロイド以外の人は、最新版を使うべきだよ」と書かれています。

今回は、PC版のStardew ValleyでカスタムNPCのMODを入れる予定なので、「Optional files」の方は気にしなくて大丈夫です。

「Manual Download」ボタンを押してダウンロード

さて、いざダウンロードしたくても、ダウンロードボタンがふたつあります。

  • MOD MANAGER DOWNLOAD
  • MANUAL DOWNLOAD

このふたつですね。

つい、先頭にある「MOD MANAGER DOWNLOAD」を押したくなってしまうかもしれませんが、基本的には「MANUAL DOWNLOAD」ボタンを押してダウンロードします。

「MOD MANAGER DOWNLOAD」は、MOD MANAGERというツールを使ってMODを入れている人のためのボタンです。
MOD MANAGERを使っている人は、こちらのボタンを押してDLしてください、なのですが、今はMODのダウンロードのしかたが分からない人向けの説明なので、「MANUAL DOWNLOAD」ボタンでのダウンロードで問題ないです。

「MANUAL DOWNLOAD」ボタンを押すと、zipファイルがDLされます。

これを右クリック > 解凍しましょう。
解凍したファイルを、Stardew Valleyの「Mods」フォルダ内に入れたら、Content Patcherの導入完了です!

これで、カスタムNPCを作る環境が整いました。

Custom NPC Fixesのすすめ

先ほども書きましたが、ついでにCustom NPC Fixesも入れておくと安心です。
ダウンロードボタンのあるページはこちらです。

カスタムNPCは、Content Patcherさえ(あとSMAPI)さえ入っていれば動きます。
ですが、「この時間に、あそこに移動してください」といったスケジュール周りに何かのバグがあるらしく、たまにカスタムNPCさんが移動してくれないこともあるので、それを修正するために入れるのがこのCustom NPC FixesというMODなのです。

スケジュールにはああやって書いてあるのに、なんで動かないんや…?と頭を悩ませることがひとつ減るかもしれないので、このMODの導入はオススメしておきます。

カスタムNPCの作り方

さて、カスタムNPCを作るのに必須なMODなどを入れたら、いよいよカスタムNPCを作っていきましょう!

今回これからするのは、ゲーム内で自分が作ったNPCと会えるようになる、を実現するための最低限の説明です。

最低限とはいっても、話しかければセリフもあるし、プレゼントを渡せばそれ用のセリフも表示されます。
時間になったら、マップ上を歩いて移動してくれます。
上記のことは、カスタムNPCを作る上で記述したい最低限、というか、基本的なデータなのです。

ちなみに、応用編ではこんなことができるようにもなります。

  • 誕生日にプレゼントした時の専用のセリフ(誕生日ではない日にプレゼントを渡したときにでるいつものセリフとは別のものにする)
  • プレゼントしたアイテムによって、セリフを変える(例:サンゴをプレゼントしたら、サンゴを渡された時専用のセリフをしゃべる)
  • 現在の好感度によって、プレゼントした時のセリフを変える
  • ごみを漁ってるところを見られた時のセリフの設定
  • 雪や風の強い日、嵐の日のセリフを追加
  • 手紙が送られてくる
  • 季節やお祭りごとに、別の服を着るようになる
  • 着る服を、毎日ランダムで変える
  • マップごとに服を変える(例:雨の日に、外ではレインコートを着て、室内では普段着になる)

などなど…。

上記であげたことは、ほんの一例です。
やろうと思えば、できることはほとんど無限大です。
全部Content Patcherのおかげです。

(念のため注釈:応用編の内容はここでは説明してないです。また次回!)

まずはフォルダを作成

まずはカスタムNPCのデータを入れていくためのフォルダ内を作成しましょう。

Stardew Valleyの「Mods」フォルダを開いてください。
Content Patcherが入っているフォルダです。

Modsフォルダを開いたら、新しいフォルダを作成してください。
フォルダ名はなんでもいいです。

今回は、あとでMODが増えても管理がしやすいように

  • [CP] あなたのNPCの名前

にでもしておきましょう。

[CP]というのは「これはContent Patcher前提のMODですよ」という意味を表す頭文字です。
Stardew ValleyのMODは、この頭文字によって、「どのMODを前提として作られたか?」を表す文化?というか、風潮があります。
他にも[JA](Json Assets用のMOD)とか[CM](Custom Music用のMOD)といった頭文字もあります。

たとえば、NPCの名前を「村人くん」にするなら「[CP] Murabito Kun」とかですかね。
好きに名前をつけてください。

フォルダ名は、日本語は使わない方がいいです。
半角英数字にしておきましょう。
半角スペース「 」や、アンダーバー「_」や、棒線「-」も使えます。

ちなみに、カスタムNPCのMDOのフォルダには「[NPC] あなたのNPCの名前」といったフォルダ名をつけている人もいます。
これは、カスタムNPCに、そのNPC用のお家があったり、カスタムNPCと一緒に新しいレシピや作物も追加する!という場合に使われがちな頭文字です。
[NPC]フォルダの中に、「[CP] あなたのNPCの名前」が入っていたりします。

今回はできるだけ簡潔に…ってことで、フォルダ名は「[CP] あなたのNPCの名前」にしておきましょう。

必要ファイルとフォルダの作成

「[CP] あなたのNPCの名前」フォルダを作れたら、そのフォルダの中に必要なファイルやフォルダを作っていきます。

まず、必須となるファイルを2つほど作成します。
「[CP] あなたのNPCの名前」のフォルダを開いてください。
開いたら、右クリックして、「新規作成 > テキストドキュメント」とクリック。

テキストドキュメントの名前は以下のようにして下さい。

  • content.json
  • manifest.json

テキストドキュメントの拡張子「.txt」も削除してくださいね。

お次に、新しくフォルダを作ります。
フォルダには、以下のように名前を付けてください。

  • assets

assetsは、セリフやNPCの画像などなど、カスタムNPCに必要な全てのデータを入れていくためのフォルダです。
必須のフォルダとなります。

もうひとつフォルダを作りたいのですが、これはお好みです。
今回は、i18nフォルダがある前提で説明をしたいので、フォルダを作ってください。(私がi18nにセリフをまとめるのがすきなので)
新しくフォルダを作り、以下のように名前を付けます。

  • i18n

i18nは、翻訳用のファイルを入れるためのフォルダです。
こちらは、必須ではありません。なくても動きます。

さらに、このi18nフォルダの中に以下の2つのファイルを作成してください。
これまでやってきたのと同じ手順です。「新規作成 > テキストドキュメント からの.txtごと名前変更」ですね。

  • default.json
  • ja.json

このファイルを用意するかどうかも、お好みの問題です。

そして、default.jsonを開いて、中に以下のように書いてください。

{
"NPCD.Name.あなたのNPCの名前(英語)": "あなたのNPCの名前",
}

「あなたのNPCの名前(英語)」と書かれた部分は、NPCの英語表記の名前に置き換えておいてください。

そのあとに続く「あなたのNPCの名前」は、英語でも日本語でもどちらでも大丈夫です。
この部分は、ゲーム内で実際に表示される部分になります。なので、もし「むらびと くん」と書いたら、このまま名前としてゲーム内で表示されることになるのです。
詳しくは後述しますが、もし英語言語でも遊ぶ時がある人のみ、念のためにここも英語で書いておいてください。

ja.jsonの中には、書いても書かなくてもどちらでもいいです。
というのも、後々default.jsonから中身を丸ごとコピペしてくる可能性が大きいので。

これでi18nの準備は完了です。

もしi18nを使うことになるのなら、default.jsonだけは必要になってきます。
ja.jsonは、「i18nを使う+スタデューバレーを日本語でも英語でも遊ぶ時があるよ!」という人が作らないといけなくなるファイルです。
詳しくは、i18nフォルダを使うタイミングがでてきた時に後述します。

今回NPCを作成していく上で、i18nフォルダを使うことはなかったよ!という場合には、i18nフォルダまるごと削除しちゃって大丈夫です。

assetsフォルダ内の準備

お次に、先ほど作成したassetsフォルダを開いてください。中はまだ空っぽです。
.json系のファイルを作った時と同じように、以下のファイルを作成してください。
右クリックして、「新規作成 > テキストドキュメント」ですね。

  • marriageDialogue.json
  • dialogue.json
  • schedule.json

テキストドキュメントの拡張子「.txt」ごと名前を変えて下さい。

お次に、カスタムNPCの画像ファイルを用意しないといけません。

もう準備できている人は問題ないですが、まだの方は、下記のリンク先からアビゲイルの画像を保存して、それを使っちゃいましょう。
ポートレイトだけは用意できてるよ、という人は、下記からスプライトだけ保存してきて使ってください。

アビゲイルさんのポートレイト

アビゲイルさんのスプライト

上記のサイトは、スタデューバレーの英語版wikiのページです。
スタデューバレーのMODを作るための情報が満載ですが、全部英語です。
英語ができる方は、こんなとこにいるよりも、スタデューバレーwikiのMODの作り方ガイドを見た方がいいです。
基本的なことは全部書かれてます。

また、上記の画像はどちらも、スタデューバレーのゲーム内に元から入っている画像です。
でも.xnbというファイルなので、見られるように変換をかけないと表示させることはできなくなってます。

さて、アビゲイルさんの画像2種類を保存してきたら、それぞれ名前を変えます。

まず、ポートレイト(顔グラ)の方には「portraits」と名前を付けてください。拡張子は.pngのままでOK。
お次に、スプライト(歩行グラ)の方には「sprites」と名前を付けてください。

名前をつけたら、両方とも「assets」フォルダにぶちこみましょう。

これで準備完了!

ちなみに、アビゲイルの画像を使う場合、ゲーム内でアビゲイルが2人いるかのようになっちゃいますが、片方は自分が今作成しているNPCなので安心してください。バグとかではないです。
見分けられなくて心配な方はお持ちのイラストソフトなどで、色彩なんかを変えておくといいかもしれません。
アビゲイルさんは髪染めたいとか言ってたので、ピンクとかいいんじゃないでしょうか。

さて、これで必要なものは全て揃いました。
あとは、NPCの肝となるデータを記入していけば完成です。

i18nって結局なんなの?

これは、i18nとは何なのかを知りたい人のための説明です。
別に知らなくてもいい、はやいとこカスタムNPCを作りたい!という人は読み飛ばしてください。
読まなくてもカスタムNPCは作れます。全然問題ないです。むしろ読まなくていいです。

カスタムNPCを作っていて、i18nって結局なんなのか、疑問に思ってご飯がすすまなくなったら読む、程度で大丈夫です。

上でも書きましたが、i18nフォルダは、Content Patcherによって機能する、翻訳のためのファイルです。
i18nの中に英語版や日本語版のセリフファイルを置いておけば、Content Patcherが勝手にゲームの言語設定に合わせて、用意された翻訳ファイルを使ってくれるという便利なものです。

なのですが、i18nの役割を簡単にいうと「別のファイルから読み込まれることになる、テキスト(セリフ)データを置いておける場所」みたいなものです。
逆に言えば、テキスト情報以外は書かれていません。
「テキスト情報以外」とは、例えば、「好感度の分岐をつける」などのシステム面的な指示をする記述のことです。

i18nは、それ単体では意味がありませんし、何もしません。
他のファイルから呼び出しをくらって、はじめて出番がやってきます。
つまり、他のファイル、たとえばcontent.jsonや、dialogue.jsonの中で「ここはi18nのあのテキストを表示してね!」と呼ばれてはじめて、i18nの中のテキストが読み込まれる、ってことです。

なので、決してdialogue.jsonとi18nを混同させていはいけません。(私は一時期、両方同じセリフ系のファイルじゃんなんでまとめられないんすか?などと思ってた)

dialogue.jsonはセリフを記述するためのファイルですが、それと同時に「土曜日に話す台詞だよ」「1年目の3日に話す台詞だよ」などといった、システム面てきな指示も同時に書くのです。
つまり、dialogue.jsonはシステム面の指示を出す面も担っている、重要なファイル、ということです。

他から呼び出しをくらわない限り永遠に出番のないi18nと、「この条件の時にこのセリフを表示して」という指示の書かれたdialogue.jsonは、全くの別物です。

dialogue.jsonはシステム面の指示を出してるファイルなので、i18n内の台詞をdialogue.jsonに書くことはできません。
ですが、逆に、dialogue.json内の台詞はi18nに書くことができます。
dialogue.json内に「このセリフはi18n内のテキストを表示させてね~^^」と指示を書けばいいだけなので。

カスタムNPCをいろいろいじって作っていると、もしかしたら「セリフはひとつのファイルにひとまとめにしたい」と思う日が来るかもしれません。
そんな時には、セリフを表示させるあらゆる部分に「ここはi18nから持ってこい!」と書けば、そのNPCの全セリフをi18n内で書けるようになります。

今回説明する手順ではそんなことはせず、とりあえずゲーム内に自分のオリジナルのNPCを存在させることが大優先なので、安心?してください。

manifest.jsonに「このMODの基本情報」を書く

さて、一通り必要なファイルはそろったので、いよいよファイル内に必要なことを記述していきます。

まず「このNPC MODの基本情報」を書いていきましょう。
MODの基本情報の記入が終わったら、あとはNPCのデータを書いて終わりです。

では、「[CP] あなたのNPCの名前」のフォルダを開いてください。
assetsフォルダとかi18nフォルダとか、manifest.jsonなどなどが入っているフォルダです。

その中の「manifest.json」をテキストエディタで開いてください。

開いたら、下記の記述をそのまままるっとコピペして、とりあえず保存しちゃいましょう。

{
 "Name": "NPC NAME HERE",  // MODの名前
 "Author": "YOUR NAME",  // 作った人の名前
 "Version": "1.0.0",  // このMODのバージョン
 "Description": "Add a new NPC.",  // このMODの説明
 "UniqueID": "YOURNAME.NPCNAMEHERE",  // MODの識別名
 "UpdateKeys": [],  // MODを配布するなら書く
 "ContentPackFor": {
 "UniqueID": "Pathoschild.ContentPatcher" // 前提となる他のMODのUniqueIDを記入
           }
}

//の記号より後ろの文字は、ただのコメントです。
邪魔なら消しちゃってください。

上記の各項目を説明します。

項目説明
NameこのMODの名称です。
なんでもいいですが、分かりやすいように「NPC 〇〇〇」みたいなのがオススメ。
SMAPIのログにもここに書いたものが表示されるので、半角英数字での記入がいいです。
AuthorこのMODを作った人の名前。つまり作者名です。なんでもいいです。
ここも半角英数字がおすすめ。
VersionこのMODのバージョンをここに書きます。
MODを公開する予定がないのなら、気にしなくていい場所です。
MODを公開するなら、なにか変更やバグの修正をするたびに1.0.1などと書き換えてアップロードします。じゃないと、どれが最新版でどれが古いバージョンのものかが分からなくなって、ダウンロードしたい人が混乱してしまうので…。
DescriptionこのMODの説明を書く部分です。
日本語でもいい気がします。
MODを公開する予定がれば、英語でも書いておくと親切かもしれません。
ちなみに「Add a new NPC.」は「新しいNPCを1人追加します」という意味なので、この一文さえ書いておけばとりあえず大丈夫かと。
UniqueIDこのMODを識別するためのIDです。
ここに書く文字列は、他のMODと被ってはいけません。なので、大体は「作者名.このMODの名称」っていう組み合わせにするのがお決まりな感じです。
日本語ではなく半角英数字で記入しましょう。
UpdateKeysここはMODを公開した時に記入することになる項目です。
とりあえず今回はゲーム内で自分のNPCと会うことが目的なので、空欄のままでいきましょう。
ContentPackForこのMODをゲーム内で使う上で、大前提となる他のMODの存在をここでします。
今回なら、Content Patcherのことです。カスタムNPCを作る時は、いつもContent Patcherをここに指定します。
UniqueIDここは「ContentPackFor」の中にある「UniqueID」です。
「大前提となる他のMOD」のUniqueID(識別名)をここに指定します。
今回はContent Patcherを指定したいので、Content PatcherのユニークIDである「Pathoschild.ContentPatcher」が書かれています。

こんな感じです。

ちなみに、Content PatcherのユニークIDを自分で確認したい場合は、Content Patcherのフォルダを開いて、その中にあるmanifest.jsonを開いてみてください。
そこに書いてあります。

これで「このNPC MODの基本情報」の記述は終わりです!

manifest.jsonはもう使わないので、保存したら閉じちゃって大丈夫です。

content.jsonに基本のデータを書く

さて、ここから先は、NPC本人に関わるデータを書いていきます。

「[CP] あなたのNPCの名前」フォルダ内にあるcontent.jsonというファイルを開いてください。

開いたら、下記の記述をまるっとコピーして、ペタっと貼り付けしてください。

{
"Format": "1.25.0",
"Changes": [
{
"Action": "Load",
"Target": "Characters/MurabitoKun",
"FromFile": "assets/sprites.png",
},
{
"Action": "Load",
"Target": "Portraits/MurabitoKun",
"FromFile": "assets/portraits.png",
},
{
"Action": "Load",
"Target": "Characters/Dialogue/MurabitoKun",
"FromFile": "assets/dialogue.json",
},
{
"Action": "Load",
"Target": "Characters/Dialogue/MarriageDialogueMurabitoKun",
"FromFile": "assets/marriageDialogue.json",
},
{
"Action": "Load",
"Target": "Characters/schedules/MurabitoKun",
"FromFile": "assets/schedule.json",
},
{
"Action": "EditData",
"Target": "Data/NPCDispositions",
"Entries": {
"MurabitoKun": "adult/rude/neutral/positive/male/datable//Town/summer 7//BusStop 19 4/MurabitoKun"
},
},
{
"Action": "EditData",
"Target": "Data/NPCGiftTastes",
"Entries": {
"MurabitoKun": "You're giving this to me? This is amazing!/207 232 233 400/Thank you! This is a very interesting specimen./-5 -79 422/...What is this?/80 330/This is disgusting./2/That was very thoughtful of you./-4/ ",
},
},
{
"Action": "EditData",
"Target": "Data/EngagementDialogue",
"Entries": {
"MurabitoKun0": "I can't believe I am about to be married!$h",
"MurabitoKun1": "I hope I don't get cold feet",
},
},
]
}

上記の記述は、スタデューバレーwikiのmod作成ガイドから持ってきたものです。

ところで、NPCの名前はもう決まっていますか?
このファイル内では、NPCの名前を記述する必要があります。
ここから先はNPCの名前を記述する箇所がたくさん出てくるので、早いうちに決めてしまうとあとで書き換える手間がなくなっていいかもしれないです。

上記の記述内で「MurabitoKun」と書かれている部分は、全てあなたのNPCの英語名に書き換えてください。
お使いのテキストエディタに文字列置き換えの機能がついていれば、それを使うとボタンワンクリックで全部文字を置き換えてくれます。
もしそんな機能はついてない!って場合は、このサイトさんを使いましょう。
めちゃくちゃ便利なサイトさんなのでブックマークしとくのがおすすめです。

では、上記の記述をひとつひとつ説明していきます。

冒頭の記述

{
“Format”: “1.25.0”,
“Changes”: [

この部分ですね。

これは、content.jsonの大部分を囲っている記述です。

「”Format”: “1.25.0”,」は正直よくわかってないので説明は省略です。
これは、content.jsonの全体を囲っています。

「”Changes”: [」は、content.jsonの全ての基本的な記述を囲う必要のあるものです。
[]のカッコで囲っています。

上記の記述には出てきていませんが、カスタムNPCを作っていく上で、そのうち「”DynamicTokens”: [」という記述を書く時がくるかもしれません。
この「”DynamicTokens”: [」が出てくる場所までを、「”Changes”: [」が囲っているわけです。

今回はDynamicTokensは書かないので、なんのことやらサッパリでも全然問題ありません。

画像ファイルの読み込み

ここから先は、全て「”Changes”: [」に囲われた記述です。

まずは画像ファイルの読み込み。

{
“Action”: “Load”,
“Target”: “Characters/MurabitoKun”,
“FromFile”: “assets/sprites.png”,
},
{
“Action”: “Load”,
“Target”: “Portraits/MurabitoKun”,
“FromFile”: “assets/portraits.png”,
},

この部分ですね。

この2つの記述によって、このNPCの顔と歩行の画像を読み込んでいます。
先ほど、用意のない人はアビゲイルさんの画像を使ってください、って言った部分です。

「”Target”:」以下の部分は、NPC名(MurabitoKun)だけを書き換えてください。
基本的にいじる必要はありません。

「”FromFile”: “assets/portraits.png”,」では、読み込む画像ファイルの指定を行っています。
なので、もしportraits.pngではなくNPCportraits3.pngという名前のファイルを読み込みたい場合は「assets/NPCportraits3.png」って書けばOKです。
さらに、もしassetsフォルダ内のimageというフォルダの中に入れたNPCportraits3.pngという画像を読み込みたい!なんて時は「assets/image/NPCportraits3.png」って書けばOK。

台詞とスケジュールの読み込み

お次に、台詞とスケジュールファイルの読み込みをしています。

この部分ですね。

{
“Action”: “Load”,
“Target”: “Characters/Dialogue/MurabitoKun”,
“FromFile”: “assets/dialogue.json”,
},
{
“Action”: “Load”,
“Target”: “Characters/Dialogue/MarriageDialogueMurabitoKun”,
“FromFile”: “assets/marriageDialogue.json”,
},
{
“Action”: “Load”,
“Target”: “Characters/schedules/MurabitoKun”,
“FromFile”: “assets/schedule.json”,
},

画像の読み込みのとこでも少し書きましたが、基本的に「”Target”」以下の文字列はいじる必要はありません。
NPCの名前だけ書き換えたら、あとはノータッチです。
というのも、ここは「書き換える・書き加える場所の指定」をしてる部分だからです。
分からないままここをいじると、「このファイルを書き換えろって指示があったけど、そんな場所はないよ!」っていうエラーが出たりします。

「”FromFile”」が何をしているかも、画像の読み込みのところで説明したことと同じです。
どのファイルを読み込めばいいかの、パスが書いてあります。

上記のそれぞれのTarget部分が指すファイルが何なのかの説明しておきます。

“Target”に書かれている記述それが指すファイル
Characters/Dialogue/MurabitoKunNPCの台詞ファイル
Characters/Dialogue/MarriageDialogueMurabitoKunNPCの結婚後の台詞ファイル
Characters/schedules/MurabitoKunNPCの1日のスケジュール(移動ルート)を指定するファイル
結婚後のスケジュールも、まとめてここに書く

NPCの基本情報

次に、NPCの基本となる情報を書いていきます。

以下の部分ですね。

{
"Action": "EditData",
"Target": "Data/NPCDispositions",
"Entries": {
"MurabitoKun": "adult/rude/neutral/positive/male/datable//Town/summer 7//BusStop 19 4/MurabitoKun"
},
},

書き換える必要があるのは、NPC名(MurabitoKunとなっている部分)と、「”MurabitoKun”:」以下の文字列です。
この「”MurabitoKun”:」部分も「”あなたのNPCの名前”:」に書き換えてくださいね。

英語を読む気力のある人は、スタデューバレーwikiのMOD作成ガイドの「Basic_info」の項目にも詳しめな説明が書いてあります。

「”MurabitoKun”:」以下の文字列の項目を説明していきます。

項目書ける値説明
agechild, teen, adultNPCの年齢を定義する部分。
子供(child)か、若者(teen)か、大人(adult)かの3つから選んでください。
「全NPCが共通でしゃべるように設定されている台詞」が選ばれる際に、ここの値が影響してきます。詳しくは後述。
mannerspolite, rude, neutralNPCの態度。
礼儀正しい(polite)、無礼(rude)、どっちでもない(neutral)から選んでください。
「全NPCが共通でしゃべるように設定されている台詞」が選ばれる際に、ここの値が影響してきます。詳しくは後述。
social anxietyoutgoing, shy, neutralこのNPCは、外交的(outgoing)、内気(shy)、どっちでもない(neutral)のどれなのかを選んでください。
「全NPCが共通でしゃべるように設定されている台詞」が選ばれる際に、ここの値が影響してきます。詳しくは後述。
optimismpositive, negative, neutralこのNPCは、楽観的(positive)、悲観的(negative)、どっちでもない(neutral)のどれなのかを選んでください。
ここの値はwikiによると、ゲーム内で使われることのない項目だそうなので、そんなに深く考えなくていいです。
gendermale, female, undefinedNPCの性別。
男性ならmale、女性ならfemale、性別不明ならundefinedと書いてください。
databledatable, not-datable, secretこのNPCと結婚できるかどうか?を定義する場所。
結婚できる場合はdatable、結婚できない場合はnot-datable、結婚はできないが、ルームメイトになれるならsecretと書きます。
secretは、ゲーム内ではクロバスというキャラに使われている値です。
通常、結婚できるキャラには、キャラの好感度一覧のリストで(独身)と表示されるのですが、ここにsecretと書いた場合は(独身)と表示されません。
つまりsecretと書いた場合は、「結婚できないと思いきや、実はルームメイトって形で一緒に住むことができるキャラでした!」という隠し要素的な存在のキャラになります。
love interest他のNPC名(例:Sebastian)片思いしているNPCの名前を書く場所。
なのですが、wikiによると現在ゲーム内では使われていないようです。何も書かなくてOK。
home regionDesert, Town, OtherNPCが住んでいる場所。
砂漠ならDesert、町(ペリカンタウン)ならTown、それ以外の場所ならOtherと書きます。
Town以外を書いた場合、お祭りイベント「ルアウ」による好感度の変化の対象外になるらしいです。また、ゲームを開始した直後の「町の人たちに挨拶をして回ろう」のクエストの対象外にもなる模様です。
birthday季節+日付(例:fall 13)NPCの誕生日を記入します。
季節は「spring, summer, fall, winter」から選んでください。
日付は1~28です。
お祭りの日と被ってしまっても問題はありませんが、お祭りと被るとマップ制限で誕生日プレゼントを渡しに行けない!みたいなことになりかねないので、そこらへんも気にするのがオススメ。
スタデューバレーwikiのお祭り一覧のリンクを貼っておきます。参考まで…。
relationships家族のNPC名(例:Caroline ‘mom’ Pierre ‘dad’)家族のプレゼントの好みをプレイヤーに教えたり、「inlaw_<NPC>」という結婚後の台詞に影響したりするらしいです。
何も書かなくてOK。
default map & positionマップ名+X座標 Y座標(例SeedShop 1 9)NPCが1日をスタートする場所の指定です。
wikiによると、1日を終える場所でもあるみたいですが、私のNPCはいつもバラバラな場所で1日を終えてるっぽいのでよくわかりません。
display nameこのNPCの名前(例:Abigail)プレイヤーに表示されるNPCの名前です。

上記の各項目を、書き換えていきましょう。

ところでマップ名とX Y座標ってどうやって調べるのさ?と思うかもしれません。
これを調べるには「Debug Mode」というMODを入れ、ゲームを起動して実際にマップを移動しながら調べる必要があります。

今はとりあえず「BusStop 19 4」にしておきましょう。
こう書いておけば、自分の牧場からバス停のあるマップへ移動すると、すぐそこにNPCがいるはずです。

プレゼントの好き嫌いと、台詞の設定

次に、NPCの好きなアイテム、嫌いなアイテムの設定をしていきます。
NPCにプレゼントを渡した時の台詞も、ここで設定できます。

以下の部分ですね。

{
“Action”: “EditData”,
“Target”: “Data/NPCGiftTastes”,
“Entries”: {
“MurabitoKun”: “You’re giving this to me? This is amazing!/207 232 233 400/Thank you! This is a very interesting specimen./-5 -79 422/…What is this?/80 330/This is disgusting./2/That was very thoughtful of you./-4/ “,
},
},

「”MurabitoKun”: 」以下の文字列を見てもらうと、スラッシュ記号「/」で区切られているのがなんとなくわかると思います。
このスラッシュで区切られた部分が、それぞれ「大好き、好き、嫌い、大嫌い、普通」の好みを定義してます。

上記のままだと1行にまとめられていてわかりづらいと思うので、改行を挟んで分かりやすく分解してみます:

“Entries”: {
“MurabitoKun”:
“You’re giving this to me? This is amazing!/207 232 233 400
/Thank you! This is a very interesting specimen./-5 -79 422
/…What is this?/80 330
/This is disgusting./2
/That was very thoughtful of you./-4/ “,
},

ちょっと見やすいのではないでしょうか!
上から「大好き、好き、嫌い、大嫌い、普通」の順の設定になっています。
この順番は固定です。変えることはできないです。

例えば1行目には「”You’re giving this to me? This is amazing!/207 232 233 400/」とあります。
この「You’re giving this to me? This is amazing!」部分が台詞です。
後に続く数字群「207 232 233 400」は、アイテムIDを指定しています。
1行目の記述は「そのNPCが大好きなアイテム」の定義です。
なので、この場合、アイテムID「207 232 233 400」のものを渡した時、「You’re giving this to me? This is amazing!」という台詞を返してくる、ということになります。

このセリフ部分には日本語を書くこともできます。
こんな感じで:

“Entries”: {
“MurabitoKun”:
“これは大好きなんだ!ありがとう!/207 232 233 400
/これは好きなものだ!ありがとう!/-5 -79 422
/これは嫌いなんだ!/80 330
/これは大嫌いなんだ!!/2
/これは好きでも嫌いでもないよ。ありがとう!/-4/ “,
},

しかし日本語で書く場合、ひとつ注意したいのが、もしゲーム設定の言語を英語で起動した時、台詞が表示されなくなるという点です。
どうやら、英語言語でゲームを起動した場合、日本語のフォントは読み込まれていないようです。
フォントがないので文字も表示されない、という現象が起きているのだと思います。
なので、他のMODとの兼ね合いなどでゲームは英語で起動したい、という人は、自作NPCの台詞部分に英語バージョンのものも用意する必要があります。

日本語言語でしか遊ぶ予定はないよ!という場合は問題ありません!

i18nに書いてみる

これはお好みの問題なので、早いところNPCを作りたいという方は読み飛ばしてください。
それと、英語言語でゲームを遊ぶ時があるよ!という人にもちょっと関係がある話です。

以下のように、セリフと好みの設定が1行でまとめられてしまうと、分かりづらいなぁと思うことはありませんか?

“MurabitoKun”: “You’re giving this to me? This is amazing!/207 232 233 400/Thank you! This is a very interesting specimen./-5 -79 422/…What is this?/80 330/This is disgusting./2/That was very thoughtful of you./-4/ “,

その場合は、i18nというフォルダを活用することで、台詞と好き嫌いの設定を別々の場所で管理することができるようになります。

i18nを使用する場合は、「Entries」内の記述を以下のように書きます。

"Entries": {
"MurabitoKun": 
"{{i18n:gift_love}}/207 232 233 400/{{i18n:gift_like}}/-5 -79 422/{{i18n:gift_dislike}}/80 330/{{i18n:gift_hate}}/2/{{i18n:gift_natural}}/-4/ ",
},

{{i18n:gift_love}}この部分は「i18n内の「gift_love」に書かれた台詞を読み込んでね!」という指示を出すための記述です。
{{i18n:〇〇〇}}この〇〇〇部分は、自分のお好きな文字列を書くことができます。
でも日本語ではなく半角英数字での入力がいいです。

さて、上記のように書けたら、さらにi18n側でも記述を行う必要があります。

i18nフォルダを開いて、中にあるdefault.jsonファイルを開いてください。
「”NPCD.Name.あなたのNPCの名前(英語)”: “あなたのNPCの名前”,」みたいな1文が書かれているはずです。

これの下に、以下のように書きます。

"gift_love": "これは大好きだ!プレゼントありがとう!",
"gift_like": "これは好きだ!プレゼントありがとう!",
"gift_dislike": "これは嫌いだ!",
"gift_hate": "これは大嫌いだ!",
"gift_natural": "これは普通かな!プレゼントありがとう!",

「”gift_love”:」の部分は、先ほど書いた「{{i18n:gift_love}}」の「i18n:」以下の文字列と全く同じである必要があります。
そうでないと、「読み込む先が見つからないよ!」となってしまうので。

もし{{i18n:〇〇〇}}の〇〇〇部分を書き換える場合は、こちらの「”〇〇〇”:」 部分も同じようにそろえて書く必要があります。

ちなみに、もしも{{i18n:〇〇〇}}と「”〇〇〇”:」を揃えなかった場合、エラーで落ちる、みたいなことにはなりません。
単純に台詞が表示されず、そのかわりに「(no translationなんたらかんたら…)」といった文章が表示されて終わりです。

i18nを使う場合は、どこでも上記と同じように記述をしていきます。
i18nに書きたい台詞部分に{{i18n:〇〇〇}}と書き、i18nフォルダ内のdefault.jsonに「”〇〇〇”: “しゃべらせたいこと~”,」と追加していくだけです。

英語と日本語の両方で遊ぶ場合

ここもまだi18nに関する説明なので、早いところNPCを作りたい方は読み飛ばしてください。
これからする説明は、スタデューバレーを英語でも日本語でも遊ぶ時がある、という人に向けたものです。
日本語でしか遊ばぬ!という人も読み飛ばしちゃってください。

上記ではi18nのdefault.jsonに、日本語で台詞を書いたと思います。
なのですが、もしゲームを英語でも日本語でも遊ぶことがある場合は、default.jsonには英語の台詞を書いてください。
そして、ja.json内に日本語の台詞を書きます。

つまり、それぞれのファイルの中身はこんな感じになります:

default.json

{
"NPCD.Name.MurabitoKun": "Murabito Kun",

"gift_love": "I love this! Thanks!",
"gift_like": "I like this! Thanks!",
"gift_dislike": "I don't like it!",
"gift_hate": "I hate it!",
"gift_natural": "It's ok. Thanks!",
}

ja.json

{
"NPCD.Name.MurabitoKun": "村人くん",

"gift_love": "これは大好きだ!プレゼントありがとう!",
"gift_like": "これは好きだ!プレゼントありがとう!",
"gift_dislike": "これは嫌いだ!",
"gift_hate": "これは大嫌いだ!",
"gift_natural": "これは普通かな!プレゼントありがとう!",
}

このように、それぞれのファイルに書くことで、日本語で起動した時にはja.jsonの台詞が表示され、英語で起動した時にはdefault.json内の台詞が表示される、というわけです。

default.jsonは、対応した翻訳ファイルが存在しない時に読み込まれるファイルでもあります。
なので、例えば中国語で起動した場合、i18nに中国語用の翻訳ファイルがないのでdefault.json内の台詞が表示されるよ、ということです。

上記で説明したi18nの使い方は、これから行うどこのファイルであっても同じです。
i18nに書きたい、という台詞が出てきたら、上の説明を参考にして記述してみてください。

※ただし、今回紹介したcontent.jsonの書き方では、dialogue.jsonやmarriageDialogue.json内の台詞はi18nに書けません
dialogue.jsonやmarriageDialogue.json内でi18nを使うと、エラーが出ます。
これをやるためには、新しくblank.jsonを用意したり、”Action”: “Load”,の部分をIncludeに書き換える必要があったりと、いろいろやる必要があるのです。
またいずれ、別の記事でやり方を説明します。

婚約した時の台詞

最後に、プレイヤーからプロポーズされた時に言われる台詞を書きましょう。
つまり、プレイヤーから人魚のペンダントを渡されて、婚約をOKする時の台詞です。

この部分ですね。

{
“Action”: “EditData”,
“Target”: “Data/EngagementDialogue”,
“Entries”: {
“MurabitoKun0”: “I can’t believe I am about to be married!$h”,
“MurabitoKun1”: “I hope I don’t get cold feet”,
},
},

「MurabitoKun0」「MurabitoKun1」というのは、ランダムでどちらかの台詞が表示されるよ、という意味です。
2通りのセリフを考えるのが面倒な場合や、絶対こう言ってほしい!という台詞がある場合は、どちらにも同じセリフを書いておいてください。

日本語で書くなら、こんな感じ:

{
“Action”: “EditData”,
“Target”: “Data/EngagementDialogue”,
“Entries”: {
“MurabitoKun0”: “私が結婚しようとしてるなんて、夢みたい!$h”,
“MurabitoKun1”: “もちろん!結婚しましょう!”,
},
},

「$h」ってなによ、というと、これは「表情の指定」です。
表情の指定は必ずセリフの一番うしろに書く必要があります。
(つまり、このようには書けない:”$h私が結婚しようとしてるなんて、夢みたい!”)

表情を指定する方法

表情の指定をするコマンドは、いくつかあります。
これは、キャラクターのポートレイト(顔グラ)画像の並びで、どのコマンドがどの顔を読み込むのかが決められているのです。
英語を読む気力のある人は、スタデューバレーwikiのMOD作成ガイドのポートレイトの項目を読んでください。

表情を指定するコマンドは、以下のものがあります。

数字で書く場合英語で書く場合説明
$0$kキャラクターのデフォルトとなる表情。
表情を指定しなかった場合、常にこの顔が表示されます。
$1$h笑顔。happyのhです。
$2$s悲しみの顔。sadのsです。
$3$uそのキャラ独特の、ユニークな顔。ここはNPCによって、どんな顔がくるか変わってきます。
例えば、アレックスならラグビーボールを持ってる画像ですし、キャロラインなら怒ってる顔がここに描かれてます。
$4$l愛の顔。つまり、プレイヤーにデレる時の顔です。照れてる顔みたいな解釈でいいかと思われます。loveのlです。
$5$a怒ってる顔。angryのaです。
$ <id>
(例:$6 など)
6番目以降の顔は、「$数字」で指定していきます。
上記の表情以外の顔も表示させたい場合は、ポートレイト画像を下方向にどんどん伸ばしていくことで、追加できるというわけです。

とりあえず、assetsフォルダ内のportraits.pngの画像を開いて見てください。
一番上の左側の顔が0番($0, $k)、そしてその右隣が1番($1, $h)、そして2列目の左側の顔が3番($3, $s)……といった風に並んでいます。

$0と$kなど、2通りの書き方がある場合は、そのどちらを書いても構わないです。お好みです。
例えば、以下の記述は、どちらも同じ「笑顔の表情」が表示されることになります。

“MurabitoKun0”: “私が結婚しようとしてるなんて、夢みたい!$1”,
“MurabitoKun0”: “私が結婚しようとしてるなんて、夢みたい!$h”,

ちなみに、ポートレイト画像を描く時、1~5番までの全ての顔を用意する必要はないです。
実際に、キャロラインというNPCはポートレイト画像が4種類しか用意されていません。

NPCの台詞や行動スケジュールを設定する

さて、ここからはassetsフォルダ内にあるjsonファイルをいじっていきます。
今まで開いていたcontent.jsonは、保存をしたら閉じちゃって大丈夫です。もう使いません。

dialogue.jsonで台詞の設定

いよいよNPCの台詞を書いていきます。

assetsフォルダ内にある「dialogue.json」というファイルを開いてください。
中にはまだ何も書かれていないはずです。

「dialogue.json」内に、下の記述をまるっと貼り付けちゃいます。

{
"Introduction": "はじめまして!僕は村人くんだよ!よろしくね!これは、このNPCとはじめて会った時に表示される、自己紹介の台詞だよ!",
"danceRejection": "フラワーダンスで踊りに誘われたけど、断る時の台詞だよ!",
"divorced": "これは離婚した後に話しかけたときに表示される台詞だよ!",
"dumped_Girls": "「結婚可能な女性NPC全員と付き合ってたのがバレるイベント」が発生したあとに表示される台詞だよ!",
"dumped_Guys": "「結婚可能な男性NPC全員と付き合ってたのがバレるイベント」が発生したあとに表示される台詞だよ!",
"secondChance_Girls": "「結婚可能な男性NPC全員と付き合ってたのがバレるイベント」が発生して数日後に表示される「いつまでも怒ってられないし、もういいよ、許すよ……」的な台詞だよ!あなたが今作ってるNPCが女性である場合、こっちを使ってね",
"secondChance_Guys": "同上だよ!あなたが今作ってるNPCが男性なら、こっちを使ってね",
"breakUp": "恋人関係を解消する時の台詞だよ!(枯れた花束を渡した時に言われる台詞)",
"give_flowersA": "告白されて、恋人になる時の台詞その1だよ!どっちが表示されるかはランダム!(花束を渡して、OKする時に言われる台詞)",
"give_flowersB": "告白されて、恋人になる時の台詞その2だよ!どっちが表示されるかはランダム!(花束を渡して、OKする時に言われる台詞)",

"Mon": "今日は月曜日だよ!",
"Mon2": "好感度(ハート)が2個以上ある時の、月曜日用の台詞だよ!どの季節でも表示されるよ!",
"Mon4": "好感度(ハート)が4個以上ある時の、月曜日用の台詞だよ!どの季節でも表示されるよ!",
"Mon8": "好感度(ハート)が8個以上ある時の、月曜日用の台詞だよ!どの季節でも表示されるよ!",
"Tue": "今日は火曜日だよ!",
"Wed": "今日は水曜日だよ!",
"Thu": "今日は木曜日だよ!",
"Fri": "今日は金曜日だよ!",
"Sat": "今日は土曜日だよ!",
"Sun": "今日は日曜日だよ!"

"spring_Mon": "これは春の月曜日に表示される台詞!",
"spring_Mon4": "これは、今日が春の月曜日で、なおかつ好感度(ハート)が4つ以上ある時に表示されるセリフだよ!",
"summer_Mon": "これは夏の月曜日に表示される台詞!",
"fall_Mon": "これは秋の月曜日に表示される台詞!",
"winter_Mon": "これは冬の月曜日に表示される台詞!",

"summer_1_1": "夏の1日目の、「1年目にのみ」表示されるセリフだよ!",
"summer_1": "夏の1日目の、「2年目以降」表示されるセリフだよ!",
"summer_3_1": "これは「温泉・電車が走ってるマップへ行ける道を塞いでいる大岩」が壊された日の台詞だよ!",

}

上記以外にも、いろいろな条件で台詞を書くことができます。
が、あんまり多くなっても大変なので、とりあえず今はこんなところで。

ちなみに、上記の項目は絶対書かないといけない!ってものではないので、お好みで追加したり削除したりしてくださいね。
dialogue.jsonに何が書けるかはスタデューバレーwikiのMOD作成ガイドのDialogueのページ(英語)に全部書いてあります。

marriageDialogue.jsonで結婚後の台詞を設定

お次に、プレイヤーと結婚したあとに表示されるようになるセリフを書いていきます。
assetsフォルダ内にある「marriageDialogue.json」を開いてください。

中身はまだ空っぽのはずなので、以下をまるっと貼り付けます。

{
"Rainy_Day_0": "雨が降ってる時の台詞。0~2ランダムでどれかが表示される。",
"Rainy_Day_1": "雨が降ってる時の台詞。0~2ランダムでどれかが表示される。",
"Rainy_Day_2": "雨が降ってる時の台詞。0~2ランダムでどれかが表示される。",
"Rainy_Night_0": "雨が降っている日の、夜(午後6時以降)に表示される台詞。",
"Indoor_Day_0": "雨ではない日の、一日の始まりに言ってくれる台詞。",
"Indoor_Night_0": "雨の降っていない日の、18時以降にプレイヤーの家の中で言われる台詞。",
"Outdoor_0": "80%の確率で農場にいるときに言われる台詞。",
"OneKid_0": "子供が一人いて、NPCが台所に立っている時に言われる台詞。",
"TwoKids_0": "子供が二人いて、NPCが台所に立っている時に言われる台詞。",
"patio_あなたのNPCの名前": "NPCがパティオ(プレイヤーの家のななめ右上あたりにある場所)にいる時の台詞",
"spouseRoom_あなたのNPCの名前": "NPCが自分の部屋にいる時に言われる台詞",
"Good_0": "ハートが10個以上の場合、50%の確率で表示される台詞",
"Neutral_0": "ハートが9個以下の時、もしくは、「ハートが9個以下・ハートが10個以上・ハートが11個以上」このどれにも当てはまらない時に表示される台詞",
"Bad_0": "ハートが9個以下の場合に表示される台詞",
}

上記の項目は、どれも絶対書かないといけない!ってものではないので、好きにいじってください。

「あなたのNPCの名前」は、NPCの名前に書き換えてください。半角英数字がいいです。

「”Outdoor_0″」のように、アンダーバー「_」のうしろに数字がついているものは、数字をいじることで複数のセリフをランダムで表示させることができるようになります。
この数字は、いくつまで増やせるかが決まっていて、大体は0~4です。
「Good, Neutral, Bad」の台詞は、0~9まで増やすことができます。

ここの台詞は、このNPCと結婚するまでは表示されない台詞なので、すぐには結婚する予定はないなぁという場合は、台詞を書き換える必要はないです。

schedule.jsonで1日の行動スケジュールの設定

さて、最後に、NPCの1日の行動スケジュールを設定していきましょう。
これは絶対必要な設定ではないですし、XY座標やマップ名を書く必要があるので、ちょっと大変です。
なので、気力のある人はやってみてください。

今からいじる「schedule.json」は、このファイルが存在さえしていれば問題ないはず、です。
もしエラーが出たら、「schedule.json」の中に{}と入力して保存してみてください。

では、「schedule.json」を設定していきます。

assetsフォルダ内にある「schedule.json」を開いてください。
中はまだ空っぽなので、以下をぺたっと貼り付けましょう。

{
//雨の日のスケジュール。どっちかがランダムで選ばれる。
"rain": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,
"rain2":"900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,

//春夏秋冬のスケジュール。
"spring": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,
"summer": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,
"fall": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,
"winter": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,

//月曜日のスケジュール
"Mon": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,
//5日のスケジュール(どの季節でも!)
"5": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,

//春の15日のスケジュール
"spring_15": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,
//夏の日曜日のスケジュール
"summer_Sun": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,

//結婚後のスケジュール
"marriage_Mon": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,
"marriage_Fri": "900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,
}

上記の項目は、どれも絶対書かないといけない!ってものではないので、好きにいじってください。
英語ですが、スタデューバレーwikiのMOD作成ガイドのSchedule dataのページに詳しい書き方がのっています。

「900 SeedShop 39 5 0/1030 SeedShop 2 20 3/…」の部分が、その日のスケジュールを設定している部分です。
上記では全部同じになってます。
ちなみに、これはアビゲイルさんの「春夏秋冬の6日」の1日のスケジュールです。

「//」という記号は、コメントアウトを表しています。
この記号のうしろにある文字列は、ゲーム側が無視してくれるのです。
なので、自分用にメモや覚えがきを書いたり、いらなくなった記述を消さずにコメントアウトで残しておく、などできます。

書き方は、こんな感じの構造になってます:

“spring”: “900 SeedShop 39 5 0/1030 SeedShop 2 20 3/1500 Mountain 46 23 2/2000 SeedShop 1 9 3”,

“spring”: “移動開始の時間 マップ名 X座標 Y座標 到着後の向き/次のスケジュール/次のスケジュール/次のスケジュール”,

それぞれの項目を説明すると、こんな感じです。

項目説明
それがいつのスケジュールか“spring”:これがいつ実行されるスケジュールなのかを、ここで指定しています。
例えばspringなら、季節が春で、他に指定されたスケジュール(月曜日とか、5日とか)がない場合は、いっつも実行されるスケジュールになります。
移動開始時間900NPCが現在いる場所から、移動を開始する時刻をここで設定します。
「到着時刻」ではないのでご注意!
次のスケジュールとあんまり近い時刻にしてしまうと、間に合わなかったスケジュールが無視されてしまいます。余裕をもって時間を決めるのがおすすめ。
24時間表記なので、午前9時なら「900」と書き、午後3時なら「1500」と書きます。
マップ名SeedShopマップ名です。これは、ゲーム内で使われているマップの名前と完全に一致させて書く必要があります。大文字小文字も揃えたほうがいいです。
例えば、町ならTown、森ならForestです。SeedShopは、ピエールのお店内のマップ名です。
X座標39X座標を最初に書きます。上記のマップの、このX座標に行ってね、という指示です。
Y座標5次に、Y座標を書きます。上記のマップの、このY座標に行ってね、という指示です。
向き0最後に、NPCがそのXY座標の位置に到着した時に、向く方向を設定します。
設定できる数字は0~3の数字です。
それぞれ、0は上方向(背中を向ける)、1は右向き、2は下方向(正面。こちらに顔を向ける)、3は左向きになります。

XY座標とか、マップ名とか、どうやって調べるのさ!なのですが…。
これを調べるには「Debug Mode」というMODを入れて、ゲームを起動して実際にマップを移動しながら調べる必要があります。

あと、実は「Chests Anywhere」というMODでもマップ名とXY座標を調べることができます。
でもこっちだと、その場所(マップ名や座標を調べたい地点)にチェストを置く必要があるので、ちょっと手間がかかります。

さて、これにてNPCの作成は終了です!お疲れさまでした!

ゲームを起動させて確認!

いよいよ、ゲームを起動させて、NPCがいるかどうか確認してみましょう。
もし、なにか記述が間違っていたり、コンマ「,」が付いていなかったりすると、SMAPIのログに赤字や黄色文字のエラーがどばっと流れます。

もしもどこかしらのマップにNPCがいたら、大成功です!
ちゃんとゲーム内にNPCが読み込まれているかどうかは、住人一覧のリストからも確認することができます。
メニューを開いて、ハートマークの描かれたタブのところです。

NPCがいない時はコンソールコマンド

住人一覧のリストにはのってるのに、マップのどこ探しても自分のNPCがいないんですけど!っていう時には、SMAPIのコンソールコマンドを使いましょう。

SMAPIを起動させると、いつも背景の黒い小さなウィンドウが開くかと思います。
そして、白や黄色や紫や赤の文字がどばーっと流れていくかと思います。
それがSMAPIのコンソールです。

そのコンソールに、コマンドを入力してNPCを呼び出しましょう。
まずは以下をコピーしてください。

debug warpcharactertome あなたのNPCの名前

コピーしたら、メモ帳など適当な場所に貼りつけて、「あなたのNPCの名前」をNPCの名前に書き換えてください。
例えば、NPCがMurabitoKunという名前だったら、こんな感じになります:「debug warpcharactertome MurabitoKun」

書き換えができたら、それをコピーしてSMAPIのコンソールに貼り付けて、エンターキーを押してください。
スタデューバレーのゲームのウィンドウに戻ると、あなたのNPCがそこにいるはず、です。

2 COMMENTS

マヨネズ

自作NPCを入れたくてwebを漁っていたら見つけました!
めちゃくちゃ参考になりました!!
日本語で書いてくれてるサイトが少ないので本当に助かりました!
ありがとうございます!!!!

ちなみに応用編って((

返信する

カスタムNPCの作り方を検索しているうちにこの記事に辿り着きました。
日本語で詳しく解説してくださっている方がなかなかいないため助かります!
ゲーム内での座標の調べ方などは、特にどうすればいいのか悩んでいたのでとても参考になりました。
素晴らしい記事を公開してくださり、本当にありがとうございます。
他の記事も読ませていただきます。

返信する

コメントを残す

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