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 では、このように荷物が積載された列車が待機するので、要求に対して迅速に応答できるのです。
荷下ろし用 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 にします。