> For the complete documentation index, see [llms.txt](https://nosrith.gitbook.io/tpf2-mod/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nosrith.gitbook.io/tpf2-mod/station-mod/construction.md).

# コンストラクションファイルを作成する

コンストラクションファイルでは、モジュールを設置できる場所（スロット）を定義し、駅建設時のパラメータと動作を設定することができます。駅MODのコンストラクションファイルに書かれる内容は非常に多く複雑なため、一から作成するのはとても大変です。そこで、ここではプリセットの駅のコンストラクションファイルを流用し、オリジナルのモジュールが設置できるようにする方法を紹介します。

プリセットの駅のコンストラクションファイルは、TpF2フォルダの `res/construction/station/rail/modular_station/modular_station.con` にあります。これを作成しているMODの同じパスに配置して、ファイル名を好きな名前に変更してください（他のMODと衝突しないようにしてください）。

書き換える場所は大きく2か所あります。**テンプレート（駅建設メニューに表示される単位）の設定** と、**駅建設時のモジュール配置の設定** の2つです。

## テンプレートの設定

テンプレートは、駅建設メニューに表示される単位で、メニューへの表示名やアイコン、パラメータなどを設定します。

テンプレートを設定するには、modular\_station.con ファイルの makeTemplates 関数（110行目～177行目）を、次のように書き換えます。

```
local function makeTemplates()
	return {
		{	
			constructionType = "RAIL_STATION",
			type = "DYNAMIC",
			availability = {
				yearFrom = 0,
				yearTo = 0
			},
			description = {
				name = _("Passenger station"),
				description = _("Modular train station for passengers."),
				icon = "ui/construction/station/rail/modular_station/station_era_c.tga"
			},
			data = {
				params = makeBaseParams()
			}
		}
	}
end
```

ここで、各設定値の意味は次の通りです。作成中の MOD に合わせて内容は変更してください。

| 設定項目             | 設定値                 |
| ---------------- | ------------------- |
| yearFrom, yearTo | 駅建設が有効になる期間（年）      |
| name             | 駅建設メニューに表示される名前     |
| description      | 駅建設メニューに表示される説明文    |
| icon             | 駅建設メニューに表示されるアイコン画像 |

## 駅建設時のモジュール配置の設定

駅建設時には、プレイヤーが指定したパラメータの条件に従って、モジュールの配置を決定する必要があります。この設定は、modular\_station.con の createTemplateFn（194行目～414行目）に、Lua の処理として記述します。

基本的な createTemplateFn は、次のようになります。

```
	createTemplateFn = function(params)
		local result = {}
		
		local length = ({ 2, 3, 4, 6, 8 })[params.length + 1]		
		local s = -math.floor((length - 1) / 2)
		local e = math.floor(length / 2)
		local even = length % 2 == 0
		
		-- [メイン駅舎設定]
		-- 中央上端 (i = 0, j = 0) に駅舎を追加
		local k = even and 2 or 0
		local o = 1  -- !!! 0 or 1
		result[GetId(mainBuildingTag, throughBackTag, 0, 0, k, o)] = "station/rail/modular_station/main_building_3_era_c.module"

		-- [線路/プラットフォーム設置]
		local trackModule = "station/rail/modular_station/platform" .. 
			(params.trackType == 0 and "" or "_high_speed") .. 
			"_track" .. 
			(params.catenary == 0 and "" or "_catenary") .. ".module"
		local numTracks = params.tracks + 1
		local numPlatforms = math.ceil((numTracks + 1) / 2)
		for i = 0, numTracks + numPlatforms - 1 do
			if i % 3 == 0 then
				-- 長さ方向すべてのスロットにホームと屋根を追加
				for j = s, e do
					result[GetId(platformTag, passengerTag, i, j)] = "station/rail/modular_station/platform_passenger_era_c.module"
					result[GetId(addonTag, roofTag, i, j)] = "station/rail/modular_station/platform_passenger_roof_era_c.module"
				end
				-- 中央 (j = 0) に階段を追加
				result[GetId(addonTag, genericAddonTag, i, 0)] = "station/rail/modular_station/addon_platform_passenger_stairs_era_c.module" 
			else
				-- 長さ方向すべてのスロットにホームと屋根を追加
				for j = s, e do
					result[GetId(trackTag, nil, i, j)] = trackModule
				end
			end
		end

		return result
	end,
```

各行の内容を順に説明します。

#### 4～7行目

パラメータに指定されたホームの長さから、スロットの j 座標の最小位置 (s) と最大位置 (e) を算出しています。ホームは j = 0 を中心に左右に、均等に広がって設置されるようにしています。とくにMODごとに変更することはありません。

#### 13行目

スロット位置を指定して、駅舎モジュールを設置しています。モジュールファイル名を変えることで、MOD側で用意した駅舎モジュールに差し替えられます。

注意として、12行目の `local o = 1` は、駅舎モジュールのモジュールタイプによって変える必要があります。モジュールタイプが `rail_main_building_size3` の場合は 1、それ以外の場合は 0 を設定します。

#### 22行目～37行目

スロット位置を指定して、線路・ホーム・アセットのモジュールを設置しています。処理の概要は次のようになっています。

* i 座標（幅方向）を 0 から順にカウントアップさせながら、処理をループする。
* i 座標が 3 の倍数ならホーム設置処理に入る。
  * j 座標（長さ方向）を s から e までカウントアップさせながら、処理をループする。
    * ホームを設置する。`GetId(platformTag, passengerTag, i, j)` で、(i, j) 座標のプラットフォームスロットの ID を取得できる。
    * 屋根を設置する。`GetId(addonTag, roofTag, i, j)` で、(i, j) 座標の屋根スロットの ID を取得できる。
  * 長さ方向中央 (j = 0) に階段を設置する。`GetId(addonTag, genericAddonTag, i, j)` で、(i, j) 座標の汎用アセットスロットの ID を取得できる。
* i座標が 3 の倍数でなければ、線路を設置する。

ループや条件分岐を組み合わせることで、ホームの一部にだけ屋根を表示したり、複数の階段を設置したりできるようになります。

## 動作を確認する

以上の設定で、駅 MOD としての設定はひととおり完了です。ゲーム上で操作を確認してみてください。
