Train Supply Managerで始める列車自動運行
このエントリーは 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 では、このように荷物が積載された列車が待機するので、要求に対して迅速に応答できるのです。
