１. サンプルMODの作成（Hello World）

# 概要
本記事では、サンプルMODを使って、PZのMOD開発における基本的な構成を説明します。

# １. フォルダ・ファイル構成について
MOD開発における「ルートフォルダ」は下記になります。
ルートフォルダ直下にMOD毎のフォルダを配置していきます。
```
C:\Users\%username%\Zomboid\Workshop
```
:::note info
ルートフォルダをプロジェクトのトップフォルダとして構成管理するのがお勧めです。
:::

ルートフォルダ以下のフォルダ・ファイル構成は下記の通りです。
尚、デフォルトで「ModTemplate」が用意されていますので、そちらを例にします。
```
C:\Users\%username%\Zomboid\Workshop
 └─ ModTemplate                 ←--  MODフォルダ１
     │  preview.png             ←--  Workshopで表示されるMODアイコン
     │  workshop.txt            ←--  Workshopで表示されるMOD概要
     │
     └─ Contents
         └─ mods
             └─ ModTemplate     ←--  MODフォルダ２
                 │  mod.info    ←--  MOD設定ファイル
                 │  poster.png  ←--  ゲーム内のMOD一覧で表示されるMODアイコン
                 │
                 └─ media       ←--  MOD実装
                     └─・・・
```
「MODフォルダ」（１、２）については任意のフォルダ名になります。MODフォルダはパス上に２カ所出てきますが、それぞれ別のフォルダ名でも問題ありません。ただし、「MODのIDを表すフォルダ名」で統一するのが通例のようです。

「media」フォルダ以下に実際のMOD実装を施していきます。MOD開発は主にこのフォルダ以下での作業となるため、以降のパスの説明はこのフォルダをベースとします。また、このフォルダ以下の構成は一部フォルダ名の決まりなどがありますので、下記のバニラ実装も参考にしてください。
```
C:\Program Files (x86)\Steam\steamapps\common\ProjectZomboid\media
```
:::note info
MODフォルダ内のmediaフォルダ以下と、バニラ実装のmediaフォルダ以下は同じ構成になります。そのため、MOD開発で不明点が発生した場合は、バニラ実装の同一実装部分を参考にして解決することをお薦めします。
:::

# ２. サンプルMODの作成
それでは、サンプルMODを実際に作成してみましょう。
サンプルMODでは、ゲームキャラに「Hello, world!」と発言させます。[^1]

## ひな型の用意
まずは、ルートフォルダ直下にひな型を用意します。
デフォルトで用意されている「ModTemplate」を流用するのが良いでしょう。
尚、今回のチュートリアルでは、フォルダ名は「HelloWorld」とします。
```
C:\Users\%username%\Zomboid\Workshop
 └─ HelloWorld
     └─ Contents
         └─ mods
             └─ HelloWorld
                 │  mod.info
                 │  poster.png
                 │
                 └─ media
```
:::note info
上記フォルダ・ファイル構成以外（preview.png、workshop.txt、mediaフォルダ以下）については、サンプルMODでは不要なので無視して構いません。
:::

## MODの設定
「mod.info」ファイルを編集し、MODの設定を行います。
今回はサンプルMODの内容に合わせて、下記のようにします。
```text:mod.info
name=Hello World
id=HelloWorld
description=This is an example mod, say hello world.
poster=poster.png
```
* ***name***：MODの名称を指定します、ゲーム内やWorkshopに表示されます。
* ***id***：MODのIDを指定します、ユニークなIDが望ましいようです。
* ***description***：MODの概要を指定します、ゲーム内に表示されます。
* ***poster***：ゲーム内で表示されるMODアイコンのファイル名を指定します。
:::note info
上記以外の項目や詳細については、下記URLを参照してください。
[Discord : Setting up the mod.info file](https://discord.com/channels/136501320340209664/232196827577974784/901629291274575883)
:::

また、poster.pngについては、宜しければ下記をダウンロードしてご利用ください。
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/e753fa00-7016-76fc-27bb-f36c17cf88a1.png"> poster.png

## Luaスクリプトの実装
MOD開発のメインであるLuaスクリプトを実装します。
ちなみに、Luaスクリプトはmediaフォルダ内に下記のようなフォルダ構成を取ります。
```
\media
 └─ lua
     ├─ client  ←--  クライアント側スクリプト
     ├─ server  ←--  サーバ側スクリプト
     └─ shared  ←--  共有スクリプト
```
* ***client***：画面操作や描写などのクライアント側のスクリプトを配置する。
* ***server***：レシピ処理や湧き設定などのサーバ側のスクリプトを配置する。
* ***shared***：翻訳ファイルなどの共有のスクリプトを配置する。

では、「プレイヤーに『Hello, world!』と発言させる」スクリプトを実装します。
各スクリプト置き場より下は自由にフォルダ・ファイルを配置して構いません。
今回はクライアント側フォルダの下に「HelloWorld.lua」を作成します。
```
\media\lua\client\HelloWorld.lua
```
```lua:HelloWorld.lua
local HelloWorld = {}

HelloWorld.OnKeyPressed = function(key)
	if key == 26 then -- "@"
		local player = getSpecificPlayer(0)
		player:Say("Hello, world!")
	end
end
Events.OnKeyPressed.Add(HelloWorld.OnKeyPressed)
```
コード詳細は次回以降のチュートリアルで説明しますが、上記では「キー押下イベントをフックし、"@"が押された場合にゲームキャラに『Hello, world!』と発言させる」という実装になります。

## サンプルMODの有効化
クライアントを起動し、MOD一覧でサンプルMODが表示されることを確認します。
「mod.info」で指定した内容が反映されていることが確認できます。
確認できましたら、MODを有効化してください。
![サンプルMODの有効化](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/f072c92d-35c1-8d23-7b50-ddc0ea8a3fb5.png)

## サンプルMODの動作確認
MODを有効にしたデータでゲームを開始し、"@"キーを押してみましょう。
ゲームキャラが「Hello, world!」と発言します。
![サンプルMODの動作確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2481343/7f2a21fd-c4cb-f33e-771e-95bae0df9ce1.png)

# あとがき
ここでは、PZのMOD開発における基本的な構成とサンプルMODを解説しました。
次回からは、実際のMODを作成するチュートリアルを開始します。

---
索引：[Project ZomboidのMODを開発する](https://qiita.com/PePePePePeil/items/5db632d902eb91847541)
前：－
次：[２. 撲殺バットMODの作成（アイテム追加）](https://qiita.com/PePePePePeil/items/de2b4e2ddeb96a737378) 

[^1]: サンプルMODファイルは下記。
💾 [HelloWorld.zip](https://www.pepepepe.com/zomboid/Qiita/HelloWorld.zip)（MD5チェックサム：421215bf6b99dc8293dd140b54de0221）