４. 撲殺バットMODの作成（レシピ追加）

# 概要
今回追加した撲殺バットにはグレードが３つありました。
今回はアップグレード用のレシピと、レシピ習得のためのアイテムを追加します。[^1]

# １. レシピの追加
武器のアップグレードはレシピ機能で実現するものとし、以下の仕様とします。
* **レシピ１**
  * ティア２を材料に、ティア１へアップグレードする
  * アップグレードすると材料は消失する
  * 必要なスキルは「鈍器(大型)：Lv.6、保守能力：Lv.6」とする
  * 専用のレシピ本からレシピを習得する必要がある
* **レシピ２**
  * ティア３を材料に、ティア２へアップグレードする
  * アップグレードすると材料（ティア３）は消失する
  * 必要なスキルは「鈍器(大型)：Lv.4、保守能力：Lv.4」とする
  * 専用のレシピ本からレシピを習得する必要がある

## 定義ファイルの作成
アイテム定義やモデル定義の場合と同様に、下記の通り定義ファイルを作成します。
```
\media\scripts\P4BokusatsuBat_recipes.txt
```
:::note info
定義ファイルのファイル名は任意の名前で問題ありません。
また、アイテム定義やモデル定義と同じファイルに定義しても問題ありません。
:::

## レシピ定義の追加
作成した定義ファイルに、レシピの定義を追加します。
```text:P4BokusatsuBat_recipes.txt
module P4BokusatsuBat
{
	imports
	{
		Base
	}

	recipe Upgrade Bokusatsu Bat
	{
		destroy P4BokusatsuBatT2,

		Result:P4BokusatsuBatT1,
		Sound:P4BokusatsuBatUpgrade,
		Time:100.0,
		StopOnWalk:TRUE,
		SkillRequired:Blunt=6;Maintenance=6,
		NeedToBeLearn:TRUE,
		Category:Survivalist,
	}

	recipe Upgrade Bokusatsu Bat
	{
		destroy P4BokusatsuBatT3,

		Result:P4BokusatsuBatT2,
		Sound:P4BokusatsuBatUpgrade,
		Time:100.0,
		StopOnWalk:TRUE,
		SkillRequired:Blunt=4;Maintenance=4,
		NeedToBeLearn:TRUE,
		Category:Survivalist,
	}
}
```
:::note info
レシピ名については一意でなくとも構いません。
今回は両レシピを区別する必要が無かったため同一名としています。
:::
:::note info
レシピ定義の各プロパティ詳細については、下記URLを参照してください。
[PZwiki : Recipe Script Guide](https://pzwiki.net/wiki/Scripts_guide/Recipe_Script_Guide)
:::
プロパティ名から想像が付くと思うので詳細な説明は割愛します。レシピ定義は様々な指定が可能なので、上記の公式情報を一読することをお薦めします。もしくは、バニラや他MODのレシピ定義を参考にするのも良いでしょう。

また、Soundプロパティで、レシピ実行時に任意の効果音を鳴らすことも可能です。実装方法は前回解説した武器の効果音と同様で、今回は下記のファイルを配置しています。
```
\media\sound\P4BokusatsuBatUpgrade.wav
```
💾 [P4BokusatsuBatUpgrade.wav](https://www.pepepepe.com/zomboid/Qiita/P4BokusatsuBatUpgrade.wav)[^2]（MD5チェックサム：df3a33325c2180dce74230a71c9278fb）

# ２. レシピ本の追加
先程追加したレシピを習得するためのレシピ本を追加します。

## モデル定義の追加
今回は１アイテムの追加ですが、モデルは下記の２定義を追加します。
```text:P4BokusatsuBat_models.txt
	model P4BokusatsuBatBookS
	{
		mesh = Book,
		texture = Model_P4BokusatsuBatBookS,
	}

	model P4BokusatsuBatBookWS
	{
		mesh = P4BokusatsuBatBookWS,
		texture = Model_P4BokusatsuBatBookWS,
	}
```
* **P4BokusatsuBatBookS**
  * 本を読む際に参照されるモデル定義（StaticModel）
  * 3Dモデルはバニラの3Dモデルを流用とし、テクスチャのみ独自のものを指定
* **P4BokusatsuBatBookWS**
  * アイテムを地面に配置する際に参照されるモデル定義（WorldStaticModel）
  * 3Dモデルおよびテクスチャに独自のものを指定

また、独自に用意した3Dモデルとテクスチャは、下記のファイルをそれぞれ配置しています。
```
\media\models_X\P4BokusatsuBatBookWS.fbx
```
💾 [P4BokusatsuBatBookWS.fbx](https://www.pepepepe.com/zomboid/Qiita/P4BokusatsuBatBookWS.fbx)（MD5チェックサム：1db5f0da13149cd148179309ece8808b）
```
\media\textures\Model_P4BokusatsuBatBookS.png
\media\textures\Model_P4BokusatsuBatBookWS.png
```
![Model_P4BokusatsuBatBookS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/ae7f5b14-5dbd-f7c5-cdbd-55f9b35d95d0.png) Model_P4BokusatsuBatBookS.png

![Model_P4BokusatsuBatBookWS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/a026d1f4-6e16-f4c5-f94f-a3cd1dc2bfe1.png) Model_P4BokusatsuBatBookWS.png

## アイテム定義の追加
バニラのレシピ本の定義を参考に、レシピ本のアイテム定義を追加します。
```text:P4BokusatsuBat_items.txt
	item P4BokusatsuBatBook
	{
		DisplayCategory = SkillBook,
		Weight = 0.8,
		Type = Literature,
		DisplayName = Bokusatsu Bat Book,
		Icon = P4BokusatsuBatBook,
		TeachedRecipes = Upgrade Bokusatsu Bat,
		ReplaceOnUse = P4BokusatsuBatBook,
		StaticModel = P4BokusatsuBat.P4BokusatsuBatBookS,
		WorldStaticModel = P4BokusatsuBat.P4BokusatsuBatBookWS,
	}
```
基本的な内容は撲殺バットの定義と同じですが、今回特有の項目は下記になります。
* TeachedRecipes：使用することで習得可能なレシピ名を指定する
* ReplaceOnUse：使用後もアイテムを残存させるため、自身のアイテムタイプを指定する
* StaticModel：モデル定義で追加したStaticModelのモデル名を指定する
* WorldStaticModel：モデル定義で追加したWorldStaticModelのモデル名を指定する

また、アイコンは、下記のファイルを配置しています。
```
\media\textures\Item_P4BokusatsuBatBook.png
```
![Item_P4BokusatsuBatBook.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/35895b1c-c275-0b18-25d5-c6c22c6eaf62.png) Item_P4BokusatsuBatBook.png

# ３. レシピ本の湧き設定の追加
レシピ本はアイテム湧きでの取得とし、湧き設定を追加します。

## 湧き設定について
アイテムの湧き設定は、バニラでは下記のLuaファイルで実装されています。
```
C:\Program Files (x86)\Steam\steamapps\common\ProjectZomboid\media\lua\server\Items\ProceduralDistributions.lua
```

このファイルに、湧き場所に対してどのようなアイテムがどの程度湧くかが設定されています。例として、発電機本（ElectronicsMag4）の湧き設定の一部を下記に示します。
```lua:ProceduralDistributions.lua LL.8109-8130
ElectronicStoreMagazines = {
	rolls = 4,
	items = {
		"Magazine", 20,
		"ElectronicsMag1", 8,
		"ElectronicsMag2", 8,
		"ElectronicsMag3", 8,
		"ElectronicsMag4", 8,
		"ElectronicsMag5", 8,
		"EngineerMagazine1", 8,
		"EngineerMagazine2", 8,
		"Radio.RadioMag1", 8,
		"Radio.RadioMag2", 8,
		"Radio.RadioMag3", 8,
	},
	junk = {
		rolls = 1,
		items = {
			
		}
	}
},
```
:::note info
湧き設定の詳細については、下記URLを参照してください。
[PZwiki : Procedural distributions](https://pzwiki.net/wiki/Procedural_distributions)
:::

バニラ実装の湧き設定を参照し、類似アイテムの湧き場所などから湧き設定を追加していきます。追加は、MOD側に独自のLuaファイルを作成し、湧き場所のテーブルに対して、アイテムタイプと湧き率を追加します。今回は、書籍が湧く場所（ただし、電子機器点などの明らかにそぐわない場所を除く）に対して、発電機本と同程度の確率で湧くように設定しました。
```
\media\lua\server\Items\P4BokusatsuBatDistributions.lua
```
```lua:P4BokusatsuBatDistributions.lua
require 'Items/ProceduralDistributions'

table.insert(ProceduralDistributions.list["BookstoreBooks"].items, "P4BokusatsuBat.P4BokusatsuBatBook")
table.insert(ProceduralDistributions.list["BookstoreBooks"].items, 2)

table.insert(ProceduralDistributions.list["BookstoreMisc"].items, "P4BokusatsuBat.P4BokusatsuBatBook")
table.insert(ProceduralDistributions.list["BookstoreMisc"].items, 2)

table.insert(ProceduralDistributions.list["CrateMagazines"].items, "P4BokusatsuBat.P4BokusatsuBatBook")
table.insert(ProceduralDistributions.list["CrateMagazines"].items, 1)

table.insert(ProceduralDistributions.list["LibraryBooks"].items, "P4BokusatsuBat.P4BokusatsuBatBook")
table.insert(ProceduralDistributions.list["LibraryBooks"].items, 1)

table.insert(ProceduralDistributions.list["LivingRoomShelf"].items, "P4BokusatsuBat.P4BokusatsuBatBook")
table.insert(ProceduralDistributions.list["LivingRoomShelf"].items, 0.1)

table.insert(ProceduralDistributions.list["LivingRoomShelfNoTapes"].items, "P4BokusatsuBat.P4BokusatsuBatBook")
table.insert(ProceduralDistributions.list["LivingRoomShelfNoTapes"].items, 0.1)

table.insert(ProceduralDistributions.list["LivingRoomSideTable"].items, "P4BokusatsuBat.P4BokusatsuBatBook")
table.insert(ProceduralDistributions.list["LivingRoomSideTable"].items, 0.1)

table.insert(ProceduralDistributions.list["LivingRoomSideTableNoRemote"].items, "P4BokusatsuBat.P4BokusatsuBatBook")
table.insert(ProceduralDistributions.list["LivingRoomSideTableNoRemote"].items, 0.1)

table.insert(ProceduralDistributions.list["MagazineRackMixed"].items, "P4BokusatsuBat.P4BokusatsuBatBook")
table.insert(ProceduralDistributions.list["MagazineRackMixed"].items, 1)

table.insert(ProceduralDistributions.list["PostOfficeMagazines"].items, "P4BokusatsuBat.P4BokusatsuBatBook")
table.insert(ProceduralDistributions.list["PostOfficeMagazines"].items, 1)

table.insert(ProceduralDistributions.list["ShelfGeneric"].items, "P4BokusatsuBat.P4BokusatsuBatBook")
table.insert(ProceduralDistributions.list["ShelfGeneric"].items, 0.1)
```
:::note info
湧き率はパーセントではありません。実際の湧き状況は、他のアイテムの湧き設定やサンドボックス設定などに依存するため、相対的なものと捉えるのが良いでしょう。
:::

# ４. レシピ追加の確認
まず、湧き設定で追加した場所にレシピ本が湧いているかを確認します。発電機本と同レベルにしたので中々見つかりませんでしたが、正しく湧いていることが確認できました。また、この本を読むことで「Upgrade Bokusatsu Bat」のレシピを習得できることも確認できます。
![04-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/819c441b-7eff-f87d-d0c8-9282792a0dfa.png)


次に、レシピ本を読んでみます。StaticModel、WorldStaticModelともに正しくモデル定義が反映されていることが確認できます。また、読み終わるとレシピを習得できることが確認できます。
![04-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/1b91b1e2-5c61-f545-6b48-b56c4046dd7f.png)

レシピ一覧画面で、レシピが追加されていることが確認できます。レシピ定義で指定した通り、製作に必要な材料やスキル、成果物なども設定どおりになっていることが確認できます。では、実際にレシピを実行して、アップグレードをしてみましょう。
![04-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/18e137ba-2648-bbbf-7fb3-c8664246a7f3.png)

今回追加した２つのレシピを使って、現在所持しているティア３をティア２、ティア１へとアップグレードできました。
![04-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/925dc4e6-7200-7211-5929-82bf1ebe26fb.png)

# あとがき
ここでは、レシピの追加やアイテムの湧き設定について解説しました。
次回はアイテム名やレシピ名の多言語対応として翻訳を追加します。

---
索引：[Project ZomboidのMODを開発する](https://qiita.com/PePePePePeil/items/5db632d902eb91847541)
前：[３. 撲殺バットMODの作成（各種差替え）](https://qiita.com/PePePePePeil/items/0f0403e33f2bb4f83f6c) 
次：[５. 撲殺バットMODの作成（翻訳追加）](https://qiita.com/PePePePePeil/items/48fb6cbae1aa5b2b8952) 

[^1]: 今回の内容を反映したMODファイルは下記。
💾 [P4BokusatsuBat_04.zip](https://www.pepepepe.com/zomboid/Qiita/P4BokusatsuBat_04.zip)（MD5チェックサム：073b549d34ee6d312bac439b89d86575）
[^2]: 「[効果音ラボ](https://soundeffect-lab.info)」様の「演出・アニメ[1] ＞ アニメ ＞ 可愛く輝く1」を拝借。