ラベル Stardew Valley の投稿を表示しています。 すべての投稿を表示
ラベル Stardew Valley の投稿を表示しています。 すべての投稿を表示

Stardew Valley クラッシュ → SMAPIの更新 説明


1.症状


Stardew Valleyを久々に起動したら下記のコマンドプロンプトが出てクラッシュする。


適当にキーを押すと


ゲームが全画面薄紫色みたいなので一瞬立ち上がるがすぐクラッシュする。




[SMAPI] The game crashed last time you played.
That can be due to bugs in the game, but if it happens repeatedly you can ask for help here: https://community.playstarbound.com/threrads/108375/.
[SMAPI] If you ask for help, make sure to share your SMAPI log: https://log.smapi.io.
[SMAPI] Press any key to delete the crash data and continue playing.



[SMAPI]前回プレイしたときにゲームがクラッシュしました。
これはゲーム内のバグが原因である可能性がありますが、それが繰り返し発生する場合は、ここで助けを求めることができます。:https://community.playstarbound.com/threrads/108375/。
[SMAPI]あなたが助けを求めるなら、あなたのSMAPIログを共有することを忘れないでください:https://log.smapi.io。
[SMAPI]クラッシュデータを削除して再生を続けるには、任意のキーを押します。






2.SMAPI削除


原因はおそらくゲーム自体をバージョンアップしてしまったせいだと思われるが、よくわからないのでSMAPIを最新のものに入れなおす為一旦削除。


install on Windows.batをダブルクリック。(多分大丈夫だとは思うが、念のため自分がインストールしたSMAPIのバージョンのinstall on Windows.batを使うこと)


2を押してエンター。


これでSMAPIの削除は完了(SteamのStardew Valleyの起動オプションは入ったままだが最新のSMAPIに入れなおすのでそこは削除する必要はなし、後述)




3.最新のSMAPIをダウンロード


SMAPIの公式から最新のSMAPIをダウンロード

SMAPI 2.11.1 が最新(2019.03.21時点)

どうやらStardew Valley 1.3.36以降にゲームをクラッシュさせるMODを無効にしてくれるらしい。
いやそもそも、SMAPIのせいでクラッシュしたんですが(汗





4.最新のSMAPIをインストール


SMAPI-2.11.1-installer.zipを解凍。


install on Windows.batをダブルクリック。


1を押してエンター。


これで最新のSMAPIのインストールは完了。





補足


一度steam版のStardew ValleyでSMAPIをインストールした人だったら問題ないと思うが、steamのStardew Valleyの起動オプションに以下を設定するとsteamオーバーレイ、実績解除ともに使用可能になる
(以下ファイルパスが合っていたら何も弄らずにそのままコピペ)


"C:\Program Files (x86)\Steam\steamapps\common\Stardew Valley\StardewModdingAPI.exe" %command%


Steamの左のメニューからStardew Valleyを右クリック→プロパティ


起動オプションを設定


コピペしたものを貼り付けて→OK






5.起動確認





無事に起動できるようになりました。


以上、Stardew Valley クラッシュ → SMAPIの更新 説明でした。
おつかれさまでした。


Content Patcher用MODの作成方法(中級編)


今回は中級編ということで「config.json」を使用してのMODを作成してみたいと思います。
「config.json」を使用すると、ユーザー自身が値を変更することにより、キャラクターごとにMODをオンオフ/MODの選択等が出来るようになります。
また「content.json」で条件指定も行ってみたいと思います。

初級編で使わせてもらった「Velverette's Anime Portrait and Sprite Mod」を再び使用して複数のキャラクターのPortraitsとCharactersを変更してみようと思います。
これが分かれば過去にxnbで出回っていたMODを自分自身でCP用に作り変えられると思います。


使うものは初級編と同じです

初級編で行った操作は理解しているという前提でいきますので、よくわからなくなったら初級編も見てみて下さい。
ではCP用完全版を目指して作成してみましょう。以下が流れです


  1. xnbをrepackしてpngにする
  2. フォルダとファイルの構成を決める
  3. manifest.jsonを作成する
  4. content.jsonとconfig.jsonを作成する
  5. 1つのキャラクターに複数のファイルがある場合を考える
  6. まとめ




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の作成方法(中級編)でした。
おつかれさまでした。


Global tokens(Content Patcher)



Content PatcherのGlobal tokensの項目について、日本語に翻訳したもの。
元のサイト「Content Patcher Global tokens(英語)



グローバルトークンの値はContent Patcherによって定義されているので、他に何もしなくても使用できます。
これらのトークン値は、あらゆるパッチの条件およびトークンプレースホルダとして使用できます。
グローバルトークン名 説明、指定出来る可能な値
Day 1ヶ月の中の特定の日。
可能な値: 1から28までの任意の整数
DayEvent その日行われているフェスティバルや結婚式。
可能な値:
  • wedding; (現在のプレイヤーが結婚している)
  • dance of the moonlight jellies; (ゲッコウクラゲのダンス)
  • egg festival; (エッグフェスティバル)
  • feast of the winter star; (冬星祭)
  • festival of ice; (氷まつり)
  • flower dance; (フラワーダンス)
  • luau; (ルアウパーティー)
  • stardew valley fair; (スターデューバレーまつり)
  • spirit's eve; (スピリットイブ)
  • a custom festival name. (MODなんかで追加したフェスティバルの名前?)
DayOfWeek 曜日。
可能な値: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, and Sunday.
DaysPlayed 現在のセーブでプレイされたゲーム内の合計日数(最初の日が始まる1日から始まる)
FarmCave 農場の洞窟タイプ。
可能な値: None, Bats, Mushrooms.
FarmhouseUpgrade 農家のアップグレードレベル。
通常の値は、0(初期農家)、1(キッチンを追加)、2(子供部屋を追加)、3(地下室を追加)です。MODを使った場合、それ以上のアップグレードレベルを加えるかもしれません。
FarmName 現在のファームの名前。
FarmType 農場のタイプ。
可能な値: Standard, Riverland, Forest, Hilltop, Wilderness, Custom.
Language ゲームの現在の言語。
可能な値:
コード言語名
deGerman
enEnglish
esSpanish
jaJapanese
ruRussian
ptPortuguese
zhChinese
PlayerGender プレイヤーの性別。
可能な値: Female, Male.
PlayerName プレイヤーの名前。
PreferredPet プレイヤーの好みのペット。
可能な値: Cat, Dog.
Season シーズン名。
可能な値: Spring, Summer, Fall, and Winter.
Weather 天気のタイプ。
可能な値:
意味
Sun天気は晴れです(祭りや結婚式の日を含む)。 他に値が適用されない場合、これがデフォルトの天気です。
Rain雨が降っていますが、雷はありません。
Storm雷と雨が降っています。
Snow雪が降っています。
Wind目に見える破片と一緒に風が吹いています。(例えば春には花びら、秋には葉)
Year 年数(1または2など)




これらのトークン値は、条件として、および(tokenName:value形式でのみ)トークンプレースホルダーとして使用できます。
グローバルトークン名 説明、指定出来る可能な値
HasFile ファイルがコンテンツパックフォルダに存在するかどうか。 ファイルパスはキーの一部として指定する必要があり、トークンを含めることができます。 trueまたはfalseを返します。
例えば:
"When": {
  "HasFile:assets/{{season}}.png": "true"
}
HasProfession プレイヤーが学んだ職業。
可能な値:
  • [戦闘] Combat skill: Acrobat, Brute, Defender, Desperado, Fighter, Scout.
  • [農業] Farming skill: Agriculturist, Artisan, Coopmaster, Rancher, Shepherd, Tiller.
  • [釣り] Fishing skill: Angler, Fisher, Mariner, Pirate, Luremaster, Trapper.
  • [採取] Foraging skill: Botanist, Forester, Gatherer, Lumberjack, Tapper, Tracker.
  • [採鉱] Mining skill: Blacksmith, Excavator, Gemologist, Geologist, Miner, Prospector.
modによって追加されたカスタム職業は、それらの整数の職業IDによって表されます。
HasWalletItem プレイヤーの財布の中の特別アイテム。
可能な値:
フラグ意味
DwarvishTranslationGuideドワーフと話すロックを解除します。
RustyKey下水道のロックを解除します。
ClubCard砂漠のカジノのロックを解除します。
SpecialCharm毎日の運を恒久的に増加させます。
SkullKey砂漠のSkull CavernとStardrop SaloonのJunimo Kartのロックを解除します。
MagnifyingGlass秘密のメモを見つける機能のロックを解除します。
DarkTalisman魔女の沼をロック解除します。
MagicInk魔法使いをスルーして魔法の建物をロック解除し、魔女の沼地の暗い神社もロック解除する。
BearsKnowledgeブラックベリーとサーモンベリーの販売価格を上げる。
SpringOnionMastery葉タマネギの販売価格を上げます。
HasFlag プレイヤーが受け取ったレターID。 ゲームはこれを使用していくつかの有用なフラグを保存します。
例えば:
フラグ意味
artifactFoundプレイヤーは少なくとも一つのアーティファクトを見つけました。
Beat_PKプレイヤーはアーケードゲームのアドベンチャー・オブ・プレーリーキングをクリアしました。
beenToWoodsプレイヤーは少なくとも1回は秘密の森に入りました。
canReadJunimoTextプレイヤーは、ジュニモの言語を読むことができる。(すなわち、公民館内の金の巻物[the plaques])
ccIsCompleteプレイヤーは公民館を完成しました。特定のセクションフラグも参照してください: ccBoilerRoom, ccBulletin, ccCraftsRoom, ccFishTank, ccPantry, ccVault.
Joja倉庫の同等のセクションフラグ: jojaBoilerRoom, jojaCraftsRoom, jojaFishTank, jojaPantry, jojaVault.
doorUnlockAbigailプレイヤーはAbigailの部屋へのアクセスをロック解除しました。 他のNPCのためのフラグ:
doorUnlockAlex, doorUnlockCaroline, doorUnlockEmily, doorUnlockHaley, doorUnlockHarvey, doorUnlockJas, doorUnlockJodi, doorUnlockMarnie, doorUnlockMaru, doorUnlockPenny, doorUnlockPierre, doorUnlockRobin, doorUnlockSam, doorUnlockSebastian, doorUnlockVincent.
galaxySwordプレイヤーはギャラクシーソードを獲得しました。
geodeFoundプレイヤーは少なくとも1つのジオードを見つけました。
guildMemberプレイヤーは冒険者ギルドのメンバーです。
jojaMemberプレイヤーはJojaマート会員権を購入しました。
JunimoKartプレイヤーはアーケードゲームのジュニモカートをクリアしました。
landslideDone鉱山へのアクセスを妨げている区域が解除される。
museumCompleteプレイヤーは博物館アーティファクト収集を完了した。
openedSewerプレイヤーが下水道のロックを解除しました。
qiChallengeCompleteプレイヤーはドクロの洞窟でレベル25に到達することでQiの挑戦のクエストを完了しました。
HasMod インストールされているmod ID(manifest.jsonのUniqueIDフィールドと一致)
HasSeenEvent プレイヤーが見たイベントID。「Data \ Events」ファイル内のIDと一致します。(デバッグモードを使用してゲーム内のイベントIDを確認できます。)
Hearts プレイヤーがNPCに与えた友好度の高さ。 次のように、キーの一部としてキャラクター名を指定できます(翻訳に関係なく、英語の名前を使用します):
"When": {
   "Hearts:Abigail": "10, 11, 12, 13"
}
または、次のように複数のNPCに対して一致するようにできます:
"When": {
   "Hearts": "Abigail:10, Leah:10" // Abigail または Leah が友好度10
}
注:これはセーブが1度完全にロードされた後にのみ使用可能になるため、条件付きマップの生成ロジックに確実に影響を与えるとは限りません。
Relationship 特定のNPCまたはプレイヤーとプレイヤーの関係。 次のように、キーの一部としてキャラクター名を指定できます(翻訳に関係なく、英語の名前を使用します):
"When": {
   "Relationship:Abigail": "Married"
}
または、次のように複数のNPCに対して一致するようにできます:
"When": {
   "Relationship": "Abigail:Married, Leah:Married" // Abigail または Leah と結婚している
}
有効な関係タイプは...
意味
Friendly他に該当しない場合のデフォルト。
Datingプレイヤーは彼らにブーケを贈りました。
Engagedプレイヤーは彼らに人魚のペンダントを渡しましたが、結婚はまだしていません。
Marriedプレイヤーは彼らと結婚しました。
Divorcedプレイヤーは結婚してから離婚しました。
注:これはセーブが1度完全にロードされた後にのみ使用可能になるため、条件付きマップの生成ロジックに確実に影響を与えるとは限りません。
SkillLevel プレイヤーのスキルレベル。このようにスキルレベルをキーの一部として指定できます:
"When": {
   "SkillLevel:Combat": "1, 2, 3" // 戦闘スキルが1or2or3
}
または、次のように複数のスキルに対して一致するようにできます:
"When": {
   "SkillLevel": "Combat:1, Farming:2" // 戦闘スキル1 or 農業スキル2
}
有効なスキルは: Combat, Farming, Fishing, Foraging, Mining, Luck(通常のゲームでは未使用)です。
Spouse プレイヤーの配偶者の名前(翻訳に関係なく英語の名前を使用)。
"Action": "Load"に関する特別な注意点:
各ファイルは1つのパッチによってのみロードできます。 異なる条件を持つ複数のロードパッチを持つことができ、条件が変わったときに正しいものが使用されます。 ただし、特定のコンテキストで複数のパッチを適用できる場合、Content PatcherはSMAPIコンソールにエラーを表示し、それらを適用しません。


要約するとつまり、"Action": "Load"で複数のパッチが同一のファイルに当たるような状況になるとエラーになる。そういう場合には、「"Action": "EditImage"を使いましょう」ということだと思われる。



以上。




後記
本当は全部翻訳しようと思ったが量が多いのと所々意味のわからない部分もあって途中で折れた。というわけで色々と使えそうな「Global tokens」のみ完了。
他はどうしようか迷い中です。

Content Patcher用MODの作成方法(初級編)


昔のStardew ValleyのmodなんかでContent Patcher用に作られていないものをContent Patcherへ対応させるための方法です。(Content Patcherを以下CPと呼びます)

SMAPI、CPの導入方法等は色々なところで解説されているので省きます。

基本的にここに書くことはContent Patcherの製作者のReadme(英語)に載ってます。

XNB用のmodとCP用のmodとを比較した時のメリット


とりあえずCP用modを使うメリットとしてはゲームの内部(オリジナル部分)を弄らなくてもいいので、modを入れるたびにゲーム丸ごとバックアップ取ったりしなくていいので楽ということです。

他にも例えば、CPを知り尽くすと1度設定しておくだけでNPCのポートレイトを色々な人が作ったmodに季節ごとに、曜日ごとに、天気、プレイヤーの各種スキルレベル、年数経過、友好度が10以上の時・・・etc 自由自在に変えて表示させることも可能です。


実際にまだCP用として作られていない「Velverette's Anime Portrait and Sprite Mod」を使ってCP用に作り変えてみます。これはnexusmodsにあるxnb用のmodです。


使うもの



では試しにアビゲイルのポートレイト1つをCP用にしてみましょう。
以下が流れです

  1. xnbをrepackしてpngにする
  2. manifest.jsonを作成する
  3. content.jsonを作成する
  4. 上記1~3で作成したファイルを適切に配置する


MOD適用前



1.xnbをrepackしてpngにする


XNB-Mod-Toolkitv2を使います。
一応昔のwikiに使い方は載ってます。
(なぜか今のwikiからはページ自体消滅しているみたいですね)

まずVelverette's Anime Portrait and Sprite ModのページのFILESにあるVillagers- Vanilla Colors-の方「Villagers- Vanilla Colors--645-.zip」をダウンロードして解凍します。
その中の「Portraits」フォルダに入っている「Abigail.xnb」をXNB-Mod-Toolkitv2の「Packed」フォルダに入れます。その後、XNB-Mod-Toolkitv2の「UNPACK FILES.bat」をダブルクリックして実行します。



「Villagers- Vanilla Colors--645-.zip」ファイルを解凍した後の「Portraits」フォルダの中身


XNB-Mod-Toolkitv2の「Packed」フォルダに「Abigail.xnb」ファイルを入れる


「Packed」フォルダに「Abigail.xnb」を入れたら、XNB-Mod-Toolkitv2の「UNPACK FILES.bat」をダブルクリックして実行します。


そうすると一瞬コマンドプロンプトが表示されてXNB-Mod-Toolkitv2の「Unpacked」フォルダの中に「Abigail.png」ファイルと「Abigail.yaml」ファイルができます。
(「Abigail.yaml」ファイルは今後使わないので必要ありません。yamlファイル自体何に使うのか知らない)

これでpngファイルのunpack(取り出し)に成功しました。



2.manifest.jsonを作成する


今から作成するMODの概要を宣言するファイルが「manifest.json」です。SMAPIが読み取るためのファイルです。
適当にテキストファイルを新規作成して下記をコピペでOK。
ファイル名を「manifest.json」にします(【注意】拡張子をjsonにすること)。

{
   "Name": "Villagers_Vanilla_Abigail",
   "Author": "cronosylph",
   "Version": "1.0.0",
   "Description": "Reconstruct old xnb",
   "UniqueID": "cronosylph.Villagers_Vanilla_Abigail",
   "MinimumApiVersion": "2.9.0",
   "UpdateKeys": [],
   "ContentPackFor": {
      "UniqueID": "Pathoschild.ContentPatcher",
      "MinimumVersion": "1.6.0"
   }
}


各種フィールドをざっくり説明するとこんな感じです。詳しくはここ(英語)

フィールド 説明
Name modの名前
Author modの作者名
Version modのバージョン
Description modの概要(短めの短文)
UniqueID modのユニークなID、推奨されるフォーマットは「<your name>.<mod name>」
MinimumApiVersion このmodを動作させるのに必要なSMAPIの最小バージョン
UpdateKeys Nexus Modsなんかに登録する場合には入れる
ContentPackFor どのmodによって(このmodを)読み取る事が出来るかの指定(ContentPatcherが必要な場合は変えなくてOK)
  UniqueID 要求modのユニークID(この場合ContentPatcherのUniqueID)
  MinimumVersion (オプション)必要な要求modの最小バージョン



3.content.jsonを作成する


MODの中身、実際にどういう動きをさせるかを記述するのが「content.json」です。
manifest.jsonと同様に適当にテキストファイルを新規作成して下記をコピペでOK。
ファイル名を「content.json」にします(【注意】拡張子をjsonにすること)。

{
  "Format": "1.6",
  "Changes": [
       {
          "Action": "Load",
          "Target": "Portraits/Abigail",
          "FromFile": "Portraits/Abigail.png"
       }
    ]
}


"Format"で「content.json」の書式のバージョンを記入します。(現在は1.6)
"Changes"での指定でどのファイルを置き換えるかや、ファイルの中へイメージをコピーしたりします。
上記のコードだと具体的には"FromFile"で指定した場所にあるファイルを"Target"で指定したファイルに、"Load"(置き換える)します。
この場合"Target"に指定しているファイルはxnbですが拡張子まで記述する必要はないです。


4.1~3で作成したファイルを適切に配置する


「[CP] Villagers_Vanilla_Abigail」フォルダを作成してその中に2~3で作成したファイルを入れます。 (フォルダ名は分かりやすければ何でもいいですが、CP用のMODなので頭に[CP]と付けるといいと思います、実際にCP用のMODの多くに付けられてます。)
そして「Portraits」フォルダを作成します。


「Portraits」フォルダの下に1で作成した「Abigail.png」を入れてください。


全てのファイルを適切に配置したら「[CP] Villagers_Vanilla_Abigail」フォルダをStardew ValleyのMODフォルダへ入れて完了です。


以上で作業は終わりです。



一応作成したファイルを用意しました。

[CP] Villagers_Vanilla_Abigail



実際にゲームを起動してMODが適用されてるか確かめてみましょう



ゲーム起動時に表示されるコンソール1

ゲーム起動時に表示されるコンソール2

ゲームを起動するとこのようなコンソールが表示されて、どのMODが読み込まれているか表示されます。update keyがないと表示されてますがそもそも入れてないので無視してOKです。

MOD適用後

ちゃんとMODが適用されました。


以上、Content Patcher用MODの作成方法(初級編)でした。
おつかれさまでした。