モジュールファイルを作成する

モジュールファイルでは、作成した3Dモデルをゲーム内で駅モジュールとして使用するための設定を行います。バニラ含めた既存のモジュールファイルは、様々な機能を実現するためにかなり複雑な作りになっていますが、最もシンプルなモジュールファイルの構成は次のようになります。

local transf = require "transf"
local vec3 = require "vec3"

function data()
	return {
		availability = {
			yearFrom = 0,
			yearTo = 0,
		},
		cost = {
			price = 0,
		},
		category = {
			categories = { "misc", },
		},
		description = {
			name = "Sample module",
			description = "Sample module",
			icon = "ui/construction/station/rail/modular_station/sample_module.tga",
		},
		type = "passenger_platform_addon",
		order = {
			value = 1
		},
		metadata = {
			platform = true,
			passenger_platform = true,
		},
		updateFn = function(result, baseTransf, tag, slotId, addModelFn, params)
			...
		end,
		getModelsFn = function()
			...
		end,
	}
end
  • type には、モジュールタイプを設定します。モジュールタイプは「線路」「旅客用ホーム」「旅客用ホームアセット」などが設定できます(詳細は 公式ドキュメント を参照)。モジュールタイプによって、配置できる位置や条件(アセットにはホームが必要、など)が決まります。

  • order は、駅設定メニューでのモジュールの表示順を表します。

metadata, updateFn, getModelsFn については、このあと章を分けて順に説明します。

metadata

metadata セクションには、コンストラクションファイルや他のモジュールファイルから参照できるモジュールのパラメータを設定します。ここでパラメータを設定することで、たとえば「隣のモジュールの track が true なら(= 隣のモジュールが線路なら)」といった条件によって表示するモデルを切り替えるような処理が可能になります。

設定できるパラメータはドキュメント化されておらず、また駅MOD側でパラメータ自体を自由に定義できるため、駅MODごとにどのようなパラメータを使用しているか調べて設定するしかありません。バニラ駅について現時点で判明しているところで、MOD側で設定する必要があるパラメータは次の通りです。

updateFn

updateFn は、モジュールが使用するモデルを順次設定していく処理を定義します。この処理は、駅が建設された時点、または建設中にスロットにマウスがあたってプレビューが表示される時点で呼び出されます。条件によって使用するモデルを切り替える仕組みは、updateFn の処理フローによって実現できます。

もっとも単純な、モデルをひとつだけ設定するような updateFn は、次のようになります。

		updateFn = function(result, baseTransf, tag, slotId, addModelFn, params)
			addModelFn(
				"station/rail/sample.mdl",
				transf.rotZTransl(math.rad(-90), vec3.new(0, 0, -2))
			)
		end
  • addModelFn 関数を呼び出すことで、モデルを追加できます。addModelFn の引数の一つ目は mdl ファイル、二つ目は transf です。ここでは transf.rotZTransl を利用して、回転角と位置を指定することで transf を設定しています。

  • 複数の mdl ファイルを使用する場合は、addModelFn 関数を順に呼び出します。

また、隣接するスロットのモジュールのメタデータを参照し、その値によって使用するモデルを切り替えるには、次のように書きます。

		updateFn = function(result, baseTransf, tag, slotId, addModelFn, params)
			-- 設置しようとしているスロットのスロット位置を取得する
			local coords = result.GetCoord(slotId)
			local i, j = coords[1], coords[2]

			-- 隣接するスロットにある線路またはホームのモジュールを取得する
			local nextModule = result.GetModuleAt(i, j - 1)

			if nextModule and nextModule.metadata.platform then  
				-- 隣接するスロットにモジュールが存在し、ホームだった場合
				addModelFn(
					"station/rail/sample1.mdl",
					transf.rotZTransl(math.rad(-90), vec3.new(0, 0, -2))
				)
			end
			
			if not nextModule then
			  -- 隣接するスロットにモジュールが存在しない場合
			end
		end,
  • result.GetCoord(slotId) で、モジュールを設置しようとしているスロットの位置を取得できます。

  • result.GetModuleAt(i, j) で、(i, j) にあるスロットの線路またはホームのモジュールを取得できます。バニラ駅ではスロットはグリッド状に配置されているため、(i - 1, j)、(i + 1, j)、(i, j - 1)、(i, j + 1) で4方向の隣接スロットを表すことができます。i は線路幅方向、j は線路長方向です。

  • 取得したモジュールの metadata を参照することで、メタデータに設定されたパラメータを参照でき、それによって条件分岐を記述することができます。

getModelsFn

getModelsFn には、駅建設中にスロットが未選択のときにホバーで表示されるモデルを設定します。内容は次のようになります。

		getModelsFn = function()
			return {
				{
					id = "station/rail/sample1.mdl",
					transf = transf.rotZTransl(math.rad(-90), vec3.new(0, 0, 0)),
				},
				{
					id = "station/rail/sample2.mdl",
					transf = transf.rotZTransl(math.rad(-90), vec3.new(5, 0, 0)),
				},
			}
		end,

updateFn の addModelFn で設定したのと同じように、mdl ファイルと transf の組を、モデルの数だけ指定します。

以上のように設定を行ってモジュールファイルを作成し、所定のフォルダにファイルを格納すると、ゲーム内の駅設定メニューで新しいモジュールが選べるようになります。

最終更新