このエントリーは pyspa Advent Calendar 2020 の 16 日目の記事です。昨日は @kumagi の「ブロックチェーンは攻撃手法で分類するとよい」でした。
はじめに#
皆さんこんにちは。世界は疫病に覆われ行動変容を余儀なくされていますが、いかがお過ごしですか?
私は元々引きこもり体質で、家からできる限り出たくないタイプの人間なので我が世の春を謳歌しています。
このエントリでは、私が今年一年かなりの時間を使ったゲームである Factorio を拡張して便利にしてくれる MOD の紹介をします。
Factorio#
そもそも Factorio というゲームをご存じでしょうか?
Factorio は、SF 的な世界観のゲームです。ゲームは不時着した宇宙船の横に一人だけで佇む主人公がいる所から始まります。(オンラインマルチプレイもあります。)
この不時着した惑星では、何故か鉄や銅、石炭といった資源が地表面に露出しており簡単に鉱石として掘り出せるのです。
そうやって掘り出した鉱石を溶かして機材を作り、設備を作り、それらを組み合わせて最終的には母星に対して SOS を送るためのロケットを打ち上げる。
そんな巨大なシステムを運用するには自動化が必須です。そうです、Factorio は自動化するゲームなのです。
興味が沸いてきたら、公式 Wiki のクイックスタートガイドを読んでみてください。
すぐにでも遊んでみたいという気持ちになったら、まずはデモ版があります。サイトは英語ですが日本語の UI で遊べますよ。
初心者がゆっくりやっても 50 時間くらいでロケットは打ちあがると思います。
もしこれが楽しいと感じられるなら、もう後は何百時間でも引きこもっていられるでしょう。
何故でしょうか?それは、とても成熟した MOD のサポートと、それを提供するコミュニティがあるからです。
特に大型 MOD と呼ばれるタイプのものは、ゲームを何段階も複雑にします。
PyMods#
私は今、PyMods という一連の MOD をインストールして Factorio を遊んでいます。
この MOD は、Factorio をとてつもなく重厚長大にしてくれるものです。
どんな内容なのかは、以下のエントリを読むと雰囲気が掴めます。
少なくとも Factorio で一度以上はロケットを打ち上げたことが無いと何を言っているか全く分からないでしょう。
そして、今日紹介するのは、PyMods をやるようなプレイヤー向けの MOD です。
Train Supply Manager(TSM) とは何か?#
一言で言うと、Factorio における列車の運行制御を効率化するための MOD です。
列車の運行制御を効率化する MOD としては、LTN - Logistic Train Networkが有名です。
こちらは日本語での解説文書や、解説動画が沢山揃っているので、探せば情報をすぐに見つけられるでしょう。
このエントリで紹介する TSM は LTN に比べるとかなり新しい MOD でユーザ数が少ないためか、日本語での情報がほとんどありません。
前述の、PyMods を紹介している ossan が書いたエントリがほぼ唯一の文書と言っていい状況です。
- Factorio @ 2020-08-27
- TSM を選んだ理由が説明されているエントリ
- Factorio - Train Supply Manager (TSM) @ 2020-09-04
- TSM の使い方を説明したエントリ。ちょっと分かりづらい。
このエントリでは、私が TSM を理解する過程で ossan の説明では分かりづらかった部分や誤解した部分を再構成して説明します。
TSM を理解するにあたって、私が一番に誤解していたポイントは、Train Supply Manager の Supply が何を指すか?です。
これを、当初私は貨物列車に積載された資源を Supply するのだと勘違いしていました。
しかし、TSM はそのように動作しません。TSM が Supply するのはあくまでも Train つまり列車です。
そして、TSM は列車の停車駅および、そこでの待機条件を自動的に挿入したり削除したりするだけの MOD です。
これが、LTN との根本的な違いであり、TSM の動作が LTN に比べて軽い理由です。
TSM の使い方#
ここからは、TSM の使い方を説明します。ここでは、Factorio において鉄道を使いたくなる典型的な状況に沿って説明します。
ちなみに、Factorio で TSM を使い始めるには MOD としてインストールした後に、ゲーム内で TSM というテクノロジーを研究してください。
TSM の典型的な利用状況#
資源の採掘地と消費地が離れており、消費地では常に資源が要るわけではない、という状況です。
この状況では、列車は待機用の駅で出荷を待ちます。とは言え、大抵の場合に出荷すべき資源は溢れているので待機時間は限りなくゼロに近いでしょう。
待機駅にいる列車は、資源を出荷したい駅に移動して鉱石などの資材を積み込みます。
その後、当該資源を要求されるまで別な待機用の駅で待つことになります。資源を満載して待っている列車は、消費地から呼び出されればすぐにそこへ向かって移動していきます。
まずは、駅の配置を全景しておきましょう。5 つの駅が配置されていますね。
駅の配置#
TSM は列車の運行制御を行う MOD なので駅の配置から始めます。
空の列車用 Supplier Train Stop の設置#
貨物を何も積載していない列車が停車する駅を配置します。地図上では、中央上部で EmptySupplier と表示されています。
大きくS
の字が刻印されている Supplier Train Stop を設置しましょう。
TSM において要求待ちをする列車が停車する駅が Supplier Train Stop です。これは、TSM 独自のオブジェクトです。
出荷用 Requester Train Stop の設置#
次は、貨物を積載するために列車が停車する駅を配置します。地図上では、右側で IronProvider と表示されています。
大きく R
の字が刻印されている Requester Train Stop を配置します。これは、TSM 独自のオブジェクトです。
加えて Requester Train Stop の隣に Train Requester を配置します。ランプのような見た目をしていますが、これは、TSM 独自のオブジェクトです。
そして Train Requester の隣に Decider combinator (条件回路)を配置します。このオブジェクトは Factorio に標準搭載されているものです。
Train Requester と Decider combinator を配置したら、それらと駅をケーブルで接続します。
列車に積み込みたい貨物が入った箱と Decider combinator もケーブルで接続しましょう。
出荷用 Requester Train Stop における信号制御#
Requester Train Stop における回路ネットワークを構成したので、次はそれらを流れる信号制御を設定します。
まずは、Decider combinator をクリックして信号制御のダイアログを表示します。
ここでは、iron ore が 1000 個より多く箱に入っている場合に、緑のチェックシグナルを送出し続けると設定しています。
条件式における不等号の向きに注意してください。
次は、Train Requester をクリックして信号制御のダイアログを表示します。
ここでは、緑のチェックシグナルが入力されたら列車を要求する信号を送出すると設定しています。
条件式における列車アイコンと緑のチェックシグナルの位置に注意してください。列車アイコンが左辺です。
これで、EmptySupplier に待機している列車を IronProvider に要求する準備ができました。
荷物を積載した列車用 Supplier Train Stop の設置#
IronProvider で貨物が積載された列車が停車して、その貨物を消費したい駅からの要求待ちをする駅を配置します。地図上では、中央下部で FullSupplier と表示されています。
大きくS
の字が刻印されている Supplier Train Stop を設置します。
TSM では、このように荷物が積載された列車が待機するので、要求に対して迅速に応答できるのです。
荷下ろし用 Requester Train Stop の設置#
最後は、貨物の消費地を設置します。地図上では、左側で IronConsumer と表示されています。
大きく R
の字が刻印されている Requester Train Stop を配置します。
この例では、分かりやすさのために、供給用車両が待機している駅と消費地の駅を 1:1 で対応させています。
実際の運用では Supplier Train Stop 1 つに対して Requester Train Stop を複数設置できますし、その逆も可能です。
このように列車を必要に応じて行ったり来たりさせるような設定を自動的に行うことが TSM の主たる機能です。
荷下ろし用の Requester Train Stop でも、Train Requester と Decider combinator を配置しケーブルで接続します。
荷下ろし用 Requester Train Stop における信号制御#
荷下ろし用の Requester Train Stop でも信号制御を設定します。
まずは、Decider combinator の設定をしましょう。
ここでは、箱の中に入ってる iron ore が 200 個を下回ったら、緑のチェックシグナルを送出し続けると設定しています。
不等号の向きが出荷用の駅とは逆になっているので注意してください。
Train Requester の設定は出荷用の駅と同じです。
これで、FullSupplier に待機している列車を IronConsumer に要求する準備ができました。
燃料補給用 Train Stop の設置#
列車が走り続けるには、燃料の補給が必要です。
最初に列車を動かし始めるための燃料は手作業で充填しますが、その後は自動的に充填したいですよね。
それに対して、TSM では FuelStop1
という名前の Train Stop を設置すると、必要に応じて列車の巡回ルートの中に燃料補給駅を組込んでくれるのです。
燃料補給の閾値を変えたいなら、Mod settings の Map タブに設定があります。
列車に充填されている燃料の数が、Minimum Refuelling Amount を下回ると燃料補給駅に停車します。
列車の巡回ルートを設定する#
駅を配置したので、次は列車を配備しましょう。列車は、EmptySupplier より少し手前に配置するのがコツです。
列車をクリックすると巡回する駅の設定画面が表示されます。駅の設定画面における初期状態は何も設定されていません。
これに対して、巡回させたい Supplier Train Stop を設定します。今回は、EmptySupplier と FullSupplier です。
これらの駅で列車がどう振舞うかは TSM が決めますので、最初の設定状態としては、それぞれの駅では列車が永久に停車するよう設定します。
ここでは、待機条件(wait condition)を Circuit で不特定の資源が 0 個未満である時、停車し続けるという風に設定しています。
プログラミングなら、while(true){}
と書いているようなものですね。
この画像では、運行制御が Manual になっていますが自動運行を開始する際には燃料を充填したうえで Automatic にします。
貨物積載待ち列車用の Supply Source Priorities を設定する#
Supply Source Priorities とは、各 Supplier Train Stop に停車している列車の振る舞いを定義し、優先順位付けする設定項目です。
TSM の設定で最も複雑で難しい部分は、この Supply Source Priorities の設定です。これを理解して乗り切れば後は、自由自在に列車を自動運行できますよ。
ここからは、TSM 固有の UI を使って設定します。TSM のメニューを表示するには画面の右上あたりにある列車アイコンのボタンを押しましょう。
TSM のメニューを表示したら、左から三番目にあるオレンジ色の上向き矢印をクリックして、Supply Source Priorities のダイアログを表示します。
ここでは、Resource と Id と Station List を設定します。
Resource には、Supplier Train Stop から発車した列車が Requester Train Stop で停車する際に参照する貨物の種類を設定します。ここでは、iron ore を設定しました。
Id には、Resource と組合せて Train Requester が、Supplier Train Stop を一意に識別するためのアイコンを設定します。ここでは、Empty を意味するE
を設定しましたが、単に名前付けするための設定なので何でもいいです。
次は、StationList の-- Select --
ボタンを押すと表示されるダイアログで Wait Conditions(待機条件)を設定していきます。
ここで設定できる条件は、どれか 1 つでも満たすと待機状態を終了する(OR
)か、全てを満たすまで待機状態を継続する(AND
)です。
二行目の Include は、貨車の状態が空(Empty)か満タン(Full)を条件にしたい時、チェックボックスを有効化します。
三行目の Inactivity は、設定された数値の期間列車に対して操作が行われないことを条件にしたい時、チェックボックスを有効化します。単位は秒です。
四行目の Wait timer は、設定された数値の期間が経過したことを条件にしたい時、チェックボックスを有効化します。単位は秒です。
五行目の Count は、Supply Source Priorities で設定した Resource が貨車の中にどれだけあるかを条件にしたい時、チェックボックスを有効化します。単位は個数です。
それでは、Wait Conditions を設定してみましょう。
ここで設定する Wait Conditions は、EmptySupplier に停車していた列車が要求されて IronProvider に移動して停車している間にどのように振舞うかを設定しています。
貨物の積み込みを行うので貨車が満タンになれば作業を終了して、次の駅に移動して欲しいので、Include は Full です。
次に、駅の箱に入っている資源が枯渇した場合にも正しく動作できるよう Inactivity を 5 秒に設定しています。これによって、iron ore が箱から無くなって 5 秒経過すると列車が発車します。
そして、貨車に積み込まれた iron ore の個数が 1000 個を超えたら列車が発車するように、Count を >
で 1000 に設定しています。
お気づきのことと思いますが、この条件は最初の Include と内容が重複しています。貨車には 1000 以上の iron ore を積載できますが、この設定によって 1000 個の iron ore が積載された時点で列車が発車します。
最後は、ここで設定した Wait Conditions を適用する駅を選択しています。今回は、貨物を何も積載していない列車が停車する駅である EmptySupplier ですね。
Wait Conditions を全て設定したら、最後は Save ボタンを押します。
これで、貨物を積み込むための列車が停車している駅である EmptySupplier の設定が終了しました。
出荷用の駅に列車を呼ぶために Train Requester を設定する#
TSM の設定はいよいよ大詰めです。ここでは、Supply Source Priorities で設定した駅から列車を呼び出すための設定をしていきます。
まずは、EmptySupplier で待機している列車を、IronProvider に呼び出す設定をしましょう。
TSM の専用メニューにある左から二番目の Train Requester ボタンを押すと Requesters の一覧が表示されます。
ここでは、IronProvider で設定した Train Requester に何も割り当てられていないことが表示されていますね。
Requesters で、e
ボタンを押すと Train Requester に Priority Schema を設定するダイアログが表示されます。
ここでは、iron ore を搭載するため EmptySupplier に待機している列車を呼び出したいので左側に iron ore を、右側にE
を設定しています。
これによって、列車が以下のように動作します。
- IronProvider に設置されている Train Requester が Decider combinator からの信号によって有効化されると、
- EmptySupplier で待機している列車が IronProvider にやってきて停車します。
- 駅でインサータなどが動作した結果、Supply Source Priorities に設定された Wait Conditions が満たされたら、
- 列車は FullSupplier に向かって発車します。
貨物荷下ろし待ち列車用の Supply Source Priorities を設定する#
荷物を満載した列車が停車している駅である FullSupplier についても設定していきましょう。
まずは、Supply Source Priorities ですね。
Resource には、Supplier Train Stop から発車した列車が Requester Train Stop で停車する際に参照する貨物の種類を設定します。ここでは、iron ore を設定しました。
Id には、Resource と組合せて Train Requester が、Supplier Train Stop を一意に識別するためのアイコンを設定します。ここでは、Full を意味するF
を設定しました。
サクサクいきましょう。次は、FullSupplier 用の Wait Conditions(待機条件)を設定していきます。
貨物の荷下ろしを行うので貨車が空っぽになれば作業終了です。そうしたら、次の駅に移動して欲しいので Include は Empty を選んでいます。EmptySupplier で設定した内容とは逆ですね。
次に、荷受け用に用意された駅の箱が満タンになっても正しく動作できるよう Inactivity を 5 秒に設定しています。これによって、iron ore を貨車からインサータが取り出さなくなって 5 秒経過すると列車が発車します。
この Wait Conditions を使用する駅は、FullSupplier でしたね。
荷下ろし用の駅に列車を呼ぶために Train Requester を設定する#
これが最後の設定です。TSM の専用メニューにある左から二番目の Train Requester ボタンを押して Requesters の一覧を表示します。
IronConsumer で設定した Train Requester に何も割り当てられていないことが表示されていますので、Priorities Schema を設定します。
iron ore を貨車に積んで FullSupplier で待機している列車を呼び出したいので、左側に iron ore を、右側にF
を設定しています。
お疲れさまでした。これで TSM の設定は完了です。
TSM で運行制御された列車の動作確認#
列車がどのように動作していくのか確認していきましょう。
まずは、列車に燃料を積んだ上で運行制御を Manual から Automatic に変更します。
そうすると、EmptySupplier 駅の少し手前に配置した列車が動きだします。ここでは、まだ TSM は動作していません。
EmptySupplier に列車が停止すると、TSM によって IronProvider への運行がスケジュールされます。
EmptySupplier で設定した Supply Source Priorities の Wait Conditions が適用されていますね。
IronProvider に停車した列車に iron ore が積み込まれていきます。
iron ore が 1000 個貨車に積載されることで Wait Conditions を満たした列車は、IronProvider を発車し FullSupplier を目指します。
FullSupplier に列車が停車すると、TSM によって IronConsumer への運行がスケジュールされます。
FullSupplier で設定した Supply Source Priorities の Wait Conditions が適用されていますね。
IronConsumer に停車した列車から iron ore が積み出されていきます。
iron ore が全て出荷されることで Wait Conditions を満たした列車は、IronConsumer を発車し EmptySupplier を目指します。
最初の駅に戻ったので、後は燃料が不足するまで同じことを繰り返します。
燃料が不足する場合#
IronConsumer で停車中に燃料が不足している状態になったらどうでしょうか?
FuelStop1 への運行がスケジュールされます。
iron ore が全て出荷されることで Wait Conditions を満たした列車は、FuelStop1 を目指します。
FuelStop1 へ無事到達した列車は燃料の補給を受けます。
燃料が満タンになったので、EmptySupplier を目指して発車します。
上手くいかないときの確認点#
TSM には、それなりにややこしい部分があります。始めて使うときは細かい作業ミスによって、列車が思うように動いてくれないこともあるでしょう。
私自身、勘違いや作業ミスで列車が動かないことが多数ありました。
ここでは、私が実際に遭遇した作業ミスと対応策をまとめましたので、必要に応じて参照してください。
列車が走りださない#
列車は様々な理由で止まったまま動かなくなります。
燃料を確認する#
列車が動かない時は、まず燃料を確認しましょう。
列車をクリックして表示される画面の Fuel(燃料)タブで、木材や石炭などを充填します。
列車の運行設定を見直す#
駅の再配置などで駅名が変わってしまったり、線路を付けたり外したりしているうちに列車が目的の駅へ運行不能になることはよくあります。
列車の Schedule(スケジュール)タブで、駅を再設定してみましょう。
TSM を使うのであれば、Supplier Train Stop を二つ設定するだけです。
ちなみに、TSM によって自動挿入される運行計画は消してしまっても、TSM の管理下で動き始めればまた追加されます。
Requester Train Stop の 状態を確認する#
Requester Train Stop には、最初から Constant combinator(定数回路) が組み込まれており、列車がその駅に停車しているかどうかを管理しています。
マニュアル操作で列車を Requester Train Stop に停車させたり、Requester Train Stop に停車している列車を作業途中に回収すると、Constant combinator の値がおかしくなったまま修復されないことがあります。
そういう時は、思い切って Requester Train Stop を再配置してみましょう。大体、それでなおります。
Train Requester が光らない#
Train Requester が光っていない Requester Train Stop には決して電車はやってきません。
Decider combinator (条件回路) の設定を見直す#
よくあるミスは、Decider combinator の不等号の向きが誤っていたり、評価しようとしている資源のアイコンを間違えていることです。
出荷用の駅では、箱に入っている資源の量が一定量を超えていることが条件になるので、不等号としては大なり(>)を使います。
逆に、荷下ろし用の駅では、箱に入っている資源の量が一定量を下回っていることが条件になるので、不等号としては小なり(<)を使います。
Train Requester の設定を見直す#
Train Requester に設定する列車アイコンの位置を間違えることもよくあります。左側に列車アイコンを設定してください。
列車が一瞬で発車してしまう#
列車が、どの駅でも停車して荷物が動き始める前にさっさと電車が走り出してしまうことがあります。
Supply Source Priorities の Wait Conditions の設定を見直す#
列車がすぐに走り出してしまうパターンでは、Supply Source Priorities の設定が誤っていることが多いので内容をよく確認しましょう。
Wait Conditions は、その条件が満たされると列車が発車します。私は、その条件が満たされている間は列車が停車していると誤解していて苦しみました。
おまけ:おすすめの便利な MOD たち#
最後に私が普段使っている MOD の中であまりゲームに強い影響がない便利な MOD を紹介します。
名前の横にある ★ の数 はおススメ度です。
- ★★★ 明確におススメ。チュートリアルが終わったあたりで導入してもいいくらい
- ★★ 一度くらいロケットを飛ばした後にはおススメ
- ★ 大型 MOD を導入したらおススメ
ゲームバランスに影響が無いもの#
ゲームバランスに対して影響のない MOD で特におすすめできるものです。
Factorio 自体はかなり洗練された UI のゲームではありますが、これらの MOD を導入することでさらに快適に遊べるようになります。
★★★ Alien Biomes#
Alien Biomesは、単調な森と荒地ばかりの Factorio に豊かな色彩をもたらしてくれる MOD です。
これを導入したゲームではマップを上を歩き回って新しい資源を探すのが非常に楽しい体験になります。
★★★ Bottleneck#
自動化という作業における解決しなければならない本質的な問題は、ボトルネックの発見と解消です。
Bottleneckは、生産設備の動作状態を赤、黄、青の三色で見やすく表示してくれる MOD です。
赤や黄色が表示されている設備は何らかの問題があって正しく動作していません。改善しましょう。
★★ FNEI#
FNEI は、アイテムのレシピや特定のアイムを使って作れるものを調べられる MOD です。
PyMods では作れるアイテムが非常に多いのでかなり重要な MOD です。
★ Helmod#
Helmod はアイテムの生産ライン計画を立てるための MOD です。
最終成果物に至るまでのステップ数が 5 段階くらいを越えたあたりから記憶しておくのは難しくなります。また使っている素材の種類が多いとそれぞれについて、生産工程が必要になりますので、短期記憶だけで工場のラインを構築するのは不可能です。
また、生産したい部材の生産量に応じて生産設備をいくつも並行稼働する必要がありますが、Helmod を使えば単位時間あたりの出力を設定するだけで、生産ライン上の設備をいくつ用意すればいいのか自動的に計算してくれます。
ゲームバランスに影響があるもの#
ここで挙げる MOD はゲームバランスに影響が少なからずあるものです。
とはいえ、PyMods のようにゲームバランスが根本から変わるようなものではなく、ちょっとした不満やストレスが解消されるようなものです。
★★★ Squeak Through#
Factorio の資材には大別するとベルトコンベア上を流れる固体と、パイプの中を流れる流体があります。
MOD を全く導入していないとしても、ベルトコンベア上は自由に歩けます。しかし、パイプは一切通過できないのです。
工場が大規模化してくると、流体を使うために所せましとパイプを並べる必要が出てくるのですけども、パイプを横切れないせいで、作業効率が非常に悪いのですよね。
そういう地味なストレスをSqueak Throughは、パイプを横切れるようにすることで解消してくれます。
最早、これなしに Factorio を遊ぶことなど考えられません。パイプを引いたせいで工場の中を遠回りするのは特に楽しい体験ではないのです。
★★ Long Reach#
工場の規模がある程度大きくなって、部分的な作り直しを始めると画面を遠景にして設備を沢山同時に置いたり撤去したくなります。
そうしたとき、Long Reachを導入すると、手の届く範囲を広げられます。
私は、大体 200 くらいの距離で普段使っています。
序盤から使ってしまうと、人力でアイテムを運んでしまいがちになり自分自身がベルトコンベアの一部になってしまう危険があるので ★★ です。
★ Adaptive Movement Speed#
実は Factorio には、レンガブロック系のアイテムを床に敷き詰めることで、その上を移動する際の速度を向上する機能があります。なので、工場の敷地内を歩き回るだけなら移動速度を上げる必要はほとんどありません。
しかし、PyMods のような大型 MOD を導入すると工場がとてつもなく巨大になります。その上、貴重な資源を探すために遠出する必要があります。
そういう状況では、Adaptive Movement Speedで、移動速度を上げるとゲームプレイが快適になります。
★ Factorissimo2#
Factorissimo2は、マップ上に工場用の建物を配置して、それをマトリョーシカのように入れ子にできる MOD です。
建物の中に配置したベルトコンベアや生産設備をまとめて拾い上げてアイテムとして運ぶこともできます。ある種のモジュール化が実現できる MOD という訳です。
まとめ#
このエントリでは、Factorio における鉄道の運行を自動制御する MOD である TSM を紹介しました。
MOD を全く入れていない Factorio において鉄道の能力は明らかにオーバースペックで、実際ほとんど使わなくてもロケットを打ち上げられます。
しかし、PyMods や Bob's Mods といった大型 MOD を導入すると話は全く変わります。それは工場が Mega Base と言われるくらいに大きくなるからです。
COVID-19 対策のワクチン接種が始まりましたが、少なくともこの冬の間は、それが有効に機能して COVID-19 が封じ込められるという所まではいかないでしょう。
つまり、必要最低限の外出だけで日々生活する必要があるのです。こういった状況では Factorio のように延々と作業できるゲームは非常に有効です。
このエントリが、大型 MOD を導入して Factorio を遊ぶ皆様の助けに少しでもなれば幸いです。
明日は、hirotaka hata です。