Factorio modding 最小構成について
このドキュメントの目的
modを作成するための基本的な情報をここに纏めます。
背景
2025年1月現在、factorio の modding について、纏まった正しい情報はどこにも見つけられなかった。
公式ドキュメント、いろんなブログ、wiki、ChatGPTを確認しながら進めてはみるものの、結局どうすれば良いのか判明しない部分については各サイトを巡って、またはそれっぽいのを総当たりで調べることになる。
変更された古いバージョンの正しい情報や、古い情報の誤った情報、新しいバージョンの誤った情報が氾濫していて、これが非常に厄介だったので、ここには「実際に試して正しいと分かった情報」を纏めていきたい
開発環境
最小構成
テキストエディタだけでOK (500~1000行くらいなら十分だと思います)
推奨構成
vscode、git (普通の開発環境です)
フォルダ構成
※ 以下DebugMod というmodであると仮定します
AAAというフォルダは以下にて
[フォルダ] AAA
と表記します
BBB.lua というファイルは以下にて
[ファイル] BBB.lua
最小構成
[フォルダ] DebugMod_0.0.6
┣ [ファイル] info.json
┗ [ファイル] thumbnail.png
なんの機能も持たないmodが、これで作成できます。
フォルダ名の0.0.6は、バージョン情報です。 info.jsonの内容と一致する必要があります(後述)
推奨構成
通り一遍の機能が、これで実装できます
※ いくついかのフォルダ分けは実は必須ではないですが、こうした方が良いよという整理込みです(後述)
[フォルダ] DebugMod_0.0.6
┣ [フォルダ] graphics
┣ [フォルダ] locale
┣ [フォルダ] en
┣ [フォルダ] ja
┗ [フォルダ] ・・・
┣ [フォルダ] scripts
┣ [フォルダ] tests
┣ [ファイル] changelog.txt
┣ [ファイル] control.lua
┣ [ファイル] data.lua
┣ [ファイル] data-final-fixes.lua
┣ [ファイル] data-updates.lua
┣ [ファイル] info.json
┣ [ファイル] LICENSE
┣ [ファイル] settings.lua
┗ [ファイル] thumbnail.png
上記のファイルとフォルダは、要するに最小構成で必要だったもの以外は、使わないなら置かなくて良いです。
この構成さえ分かっていれば、ググれますし、chat gptにも効率よく聞けます。
カスタム機能
実装
[ファイル] control.lua に書きます。あとはluaの文法に準拠。
基本的には、細かい機能は [フォルダ] scripts に作っておいて、control.luaからrequireするのがキレイです。
アイテム追加
実装
[ファイル] data.lua に記載します。
以下は、投げたら壊れる卵 (鮮度パラメータ付き) を定義してみた例です
「DebugMod」という文字列は、自分のMod名に置き換えます
data:extend({
{
type = "capsule",
name = "demolisher-egg",
localised_name = {"item-name.demolisher-egg"},
localised_description = {"item-description.demolisher-egg"},
icon = "__DebugMod__/graphics/icons/icon_demolisher_egg.png",
icon_size = 64,
subgroup = "capsule",
order = "a[new-item]",
stack_size = 1,
spoil_ticks = 90000, -- 鮮度の維持時間(秒)
spoil_result = "spoilage", -- 腐敗後に変換されるアイテム
weight = 1000000,
capsule_action = {
type = "throw",
attack_parameters = {
type = "projectile",
ammo_category = "capsule",
cooldown = 30, -- クールダウンタイム
range = 15, -- 投擲可能距離
ammo_type = {
category = "capsule",
target_type = "position",
action = {
{
type = "direct",
action_delivery = {
type = "instant"
}
}
}
}
}
},
}
})
画像ファイル
通常 [フォルダ] graphics に配置します。
(上記の通りパス指定ができるので、どこでも良いのですが)
言語設定
[フォルダ] locale フォルダの各対応言語フォルダの内容に記載します。日本語であれば [フォルダ] ja の [ファイル] item.cfg です。
レシピ追加
[ファイル] data.lua に記載します
以下は、低温プラントで、しかもアクィロに限定して制作可能な冷凍卵、というのを定義してみた例です。アイテムと流体を必要としてあります。
data:extend({
{
type = "recipe",
name = "demolisher-egg-freeze-recipe",
category = "cryogenics",
enabled = false,
energy_required = 60,
ingredients = {
{type = "item", name = "demolisher-egg", amount = 1},
{type = "item", name = "captive-biter-spawner", amount = 10},
{type = "item", name = "biochamber", amount = 20},
{type = "fluid", name = "sulfuric-acid", amount = 200},
{type = "fluid", name = "fluorine", amount = 200},
{type = "fluid", name = "fluoroketone-cold", amount = 200}
},
results = {
{type = "item", name = "demolisher-egg-frozen", amount = 1}
},
surface_conditions = {
{
property = "pressure",
min = 100,
max = 600
}
},
}
})
研究追加
実装
[ファイル] data.lua に記載します
以下は、研究によって、レシピが解放される例です
「DebugMod」という文字列は、自分のMod名に置き換えます
data:extend({
{
type = "technology",
name = "demolisher-egg-unlock",
icon_size = 256,
icon = "__DebugMod__/graphics/technology/demolisher-egg-tech.png",
prerequisites = {"captive-biter-spawner"},
unit = {
count = 8000,
ingredients = {
{"automation-science-pack", 1},
{"logistic-science-pack", 1},
{"military-science-pack", 1},
{"chemical-science-pack", 1},
{"production-science-pack", 1},
{"utility-science-pack", 1},
{"space-science-pack", 1},
{"metallurgic-science-pack", 1},
{"electromagnetic-science-pack", 1},
{"agricultural-science-pack", 1},
{"cryogenic-science-pack", 1}
},
time = 60
},
effects = {
{
type = "unlock-recipe",
recipe = "new-spieces-demolisher-egg-recipe",
effect_description = {"technology-effect-description.new-spieces-demolisher-egg-recipe"}
}
},
order = "z"
}
})
画像ファイル
アイテム追加と同じ
言語設定
[フォルダ] locale フォルダの各対応言語フォルダの内容に記載します。日本語であれば [フォルダ] ja の [ファイル] technology.cfg です。
スクリプトのマルチ言語対応追加
[フォルダ] locale フォルダの各対応言語フォルダの内容に記載します。日本語であれば [フォルダ] ja の [ファイル] locale.cfg です。
たとえば、
[item-description]
demolisher-growth=成長度: __1__/__2__
と定義しておくと、カスタムスクリプトで
caption = {
"item-description.demolisher-growth-breedable",
10,
50
}
のように利用できます。
カスタムデータのセーブ
変数名が変更になっています!(気づかなくて3時間くらい溶けました)
以下の通り実行しましょう。 globalじゃないです、storageです。
if storage == nil then
storage = {}
end
if storage.teststr == nil then
storage.teststr = "teststr1"
end
その他
また何か作ったら追記します。
補足
私のmodはgitで公開したので、参照してもらえれば、最低でも同じものが作れます。
Moddingの基本として、だいたい先駆者がいるので、困ったら誰かのを見ると良いです。このnoteでも、Wikiでもブログでも、詳細は書ききれないので。