これはpyspa アドベントカレンダー 2023の19日目の記事です。昨日は@aodagのミス・マープルでした。
はじめに#
このエントリはFactorioのSpace Explorationというmodを導入して遊んでいる人向けのエントリである。
Factorioというゲームがどんなゲームであるかについては、多くの情報がネットにあふれているので、ここでは説明を繰り返すことはしない。
Space Exploration mod は、Factorioの何もmodを導入していない状態でロケットを打ち上げる所までは遊んだ人向けのmodだ。つまり、クリア後の世界を拡張するものである。
Factorioでロケットを打ち上げた後、この世界はどうなるんだろう?と思った事はないだろうか?開拓した星を飛び出して宇宙空間や更なる惑星を求めて冒険に出たいと思ったことは無いだろうか?
それをかなえてくれるのがSpace Explorationだ。このmodを導入することでどんな景色が見れるのか少し紹介させてほしい。
- 衛星軌道にむかってそびえたつ軌道エレベーター
- 衛星軌道上に作られた宇宙ステーションと地上の間を巡回する銀河鉄道
- 水のない惑星に立つ謎のピラミッド
膨大なコンテンツが含まれている大型modだが、信じられない事になんと無料だ。そして、日本語で遊べる。注意点としては、modはPC版のみ対応だ。もしPC版Factorioを一通り遊んだことのあるなら是非遊んでみて欲しい。
このエントリは、Space Exploration modにおける中盤以降で建築することになる宇宙船に関する攻略情報つまり、ネタバレを含むものである。もし、完全に自力で攻略したいと思っているなら、読むのを避けて欲しい。
それでは本題に入っていこう。
最小の宇宙船#
まずは、テックレベルをSpaceship consoleが作れるところまでゲームを進めて欲しい。そうしたら、床と壁を作ってその中にSpaceship consoleを配置することで宇宙船を建築できる。
今回の説明で使う宇宙船は、そこからさらにテックレベルを進めてIon Engineを作成できるようになっている。
具体的にはこういうものだ。説明に使った宇宙船は最後のまとめでBlueprint Bookのインポート用文字列を用意してあるので、説明できなかった部分を詳細に知りたいという事であれば使って欲しい。
棺桶である。かっこよさは微塵もない事は認める。何せ筆者は絵心というものを気がついたら、どこか遠くに置いてきてしまったのだ。取りに戻ろうとしたが、もう分からなくなってしまった。
冗談はさておき、この棺桶は宇宙を飛び回れるし、惑星に着陸したうえで、大気圏を突破して宇宙に戻ることもできる。
⚠️ Space Explorationを遊んだことのある人は違和感を覚えるかもしれない。 本来なら、液体ロケット燃料を使うロケットエンジンが無ければ、地表面から宇宙に出られない筈なのだが、現在の仕様ではなんと液体ロケット燃料のタンクだけ据え付けておけば大気圏脱出できる。このバグが修正されたらロケットエンジンを自分で追加して欲しい。
レーザータレットは宇宙空間で飛んでくる隕石を打ち落とすために必須なので設置している。上を歩けるフラットな太陽光パネルと広域電柱を配置して電気系統は実装してある。
ここまでは特に難しいことは無いはずだ。
手動スイッチによる発着#
Spaceship consoleに回路を接続して操作するための基本的な部分から理解していこう。
まずは、定数回路を使った離陸と着陸について説明する。
最小の宇宙船に定数回路を2個と宇宙船を係留するクランプを取り付けてある。クランプは宇宙船側に一つと港側に一つ付けると宇宙船の着陸を自動化できる。
今回の回路で使うシグナルは、その他のタブに配置されているものを使う。
二つの定数回路とSpaceship consoleは単一の回路ネットワークで接続してある。
左側の定数回路には、宇宙船の離陸を表すシグナルを設定した。かっこいい宇宙船に上向きの黄色い三角がついているシグナルだ。値としては1以上の数値を設定すればなんでもいいので1を設定してある。この定数回路の電源をOnにしてシグナルをSpaceship consoleに送信すると宇宙船は離陸する。
右側の定数回路には、着陸するためのシグナルを設定してある。
シグナルパレットには、クランプを表すシグナルが4つあるが、三角の向きが同じ黄色と青のシグナルが対応関係にある。
黄色い三角がついているシグナルが宇宙船に設置してあるクランプを表す。青い三角がついているシグナルが港に設置してあるクランプを表す。
クランプの値は、クランプを一意に特定するためのIDを表す。黄色い三角形側のクランプは各宇宙船の中で一意になっていればよい。大抵の宇宙船はクランプが一つだけなので実質的にどんな値でも問題ない。青い三角形側のクランプに設定された値は、それぞれのマップごとに設置した複数のクランプの中で一意になっている必要がある。例えば、軌道衛星上と母星の地表はマップが違うので値が重複してもよい。
最初のうちは複数の宇宙船を単一のクランプに複数の宇宙船を係留しようとすることは事故につながるためやらない方が良いだろう。分かり易さのため宇宙船のクランプに付与するIDと港のクランプに付与するIDは同じにするのがおすすめだ。
なお、単一のクランプに対して、複数の宇宙船を係留しようとすると二つ目以降の宇宙船は該当するクランプが空くまで着艦しない。また、同一のIDを持つクランプが複数ある場合には空いているところに着艦する。
筆者にはFactorioで管制塔の制御システムを実装するだけの根性はないが、誰かが挑戦するのであれば見てみたいという気持ちはある。
この定数回路では、宇宙船に設置した500番のクランプを使って、港に設置した500番のクランプに係留するように指示している。
それでは、宇宙船に配置したクランプを見てみよう。クランプ本体をクリックして、シグナルのアイコンをさらにクリックするとIDを編集できる。ここでは500を設定している。
同じように港側のクランプにも500番を設定した。
宇宙船は二か所以上の港を移動する。つまり、係留する可能性のある港側のクランプは全部同じIDを割り振るのがコツだ。違った値を割り当てても良いが、その分回路は複雑になる。
例えば、このケースでは軌道衛星上の宇宙港と、母星の地表にある港のクランプのIDとしてそれぞれ500を割り当てている。軌道衛星上と母星はマップが別なのでクランプの値が重複していても正しく動作する。
このクランプの仕様を理解するのに筆者は大分苦しんだが、これを読んでいるあなたはすんなり理解できただろうか?もしすぐに理解できたなら非常にうれしい。
加速の自動化#
宇宙船が惑星間を移動する際には、係留状態から離陸状態になり、その後加速状態なる。離陸状態の宇宙船は速度がゼロなので一切移動しない。ロケットエンジンやIon Engineが動作して加速状態になった宇宙船は一定の時間経過によって目的地に到着し、速度がゼロになる。
離陸シグナルを定数回路からSpaceship consoleに送信することで離陸するとすでに説明した。実はそれだけでは宇宙船は移動しない。宇宙船が加速を開始するにはSpaceship consoleに対して目標となる速度を入力する必要がある。
というわけで、宇宙船に新しい定数回路を配置して回路ネットワークに接続した。
速度を指定する定数回路では、タコメータのようなシグナルを選んで値として目標速度を設定する。船の最大速度は船自体の大きさやエンジンの数によって決まるので、ここで設定した値の速度で必ず船が飛ぶという訳ではない。
設定された速度を目標に頑張ってエンジンを動かすだけだ。つまり、無理な目標を設定しても、エンジン性能の限界を超えた速度がでることはない。
なお、離陸していない宇宙船は速度を設定しても単に無視する。係留状態のままエンジンをふかしたりはできないのだ。
目的地設定の自動化#
離陸と着陸、それに加速を定数回路のON/OFFで操作できるようになったので、次は少し複雑な回路を組んでみよう。
条件回路自体の使い方について詳しく知りたい人は、factorio@jp Wiki の 回路ネットワーク を見て欲しい。
まずは、目的地の自動設定回路を組み込むために、宇宙船を少し拡張した。
この回路について説明する前にSpaceship consoleが出力するシグナルについて理解しておいた方が良いだろう。様々なシグナルが出力されているので一つずつ説明していく。
まず全体としては、例えばこんなふうにシグナルが出力されている。
左から順に説明する。
Spaceship consoleのアイコンで34が出力されているシグナルは、宇宙船のIDを表している。複数の宇宙船を建造したらこのIDが意味を持つようになるが、管制システムでも作らない限り使い道は無いと思う。
タコメーターのアイコンで-2が出力されているシグナルは、宇宙船の速度を表している。0未満は特別な値で、-1は宇宙船が停止していることを意味する。-2は港に係留していることを意味する。
定規のような目盛りのアイコンで-2が出力されているシグナルは、宇宙船に設定された目的地と現在地の距離を表している。0未満は特別な値で、-1は到着済み、-2は係留済み、-3は目的地が設定されていないことをそれぞれ表す。
惑星に木星のようなわっかがついているアイコンで475が出力されているシグナルは、宇宙船に設定された目的地を表している。これは、設定されたり入力された値がそのまま出力されているので、注意して欲しい。また、目的地の種類ごとにアイコンは変わる。
アルファベットのDアイコンで100が出力されているシグナルは、宇宙船の周りにある小惑星や隕石の密度を表している。このキャプチャを取った時には港に係留されている状態なのだけども、何か高密度な隕石の中にいると判定されているようだ。唯一使い方の分からない数字でもある。
アルファベットのAアイコンで475が出力されているシグナルは、宇宙船が係留されている時のみ出力される。これは係留された宇宙船の現在地を表す。
では、宇宙船の現在地とはどういうことだろうか。Space Explorationで拡張される機能の中にUniverse Explorerという機能がある。これを使うと、探査衛星を打ち上げて発見した惑星や太陽、アステロイドベルトなどを一覧できる。
例えば、筆者がやっているゲームではNauvisが母星である。母星をマウスでクリックして選択状態にすると、選択した要素の詳細情報がウィンドウの右上あたりに表示される。
では、母星の詳細情報を確認してみよう。色んな事が書いてあるが、今重要なのは、Automation signal という値だ。ここでは474となっている。つまり、宇宙船を母星の地表面に係留するとSpaceship consoleにおいてAの値が474になるということだ。ちなみに、目的地として使う際には、数字の左側についているアイコンも同じものにする必要がある。
続いて、母星の軌道衛星を見てみよう。ここでも注目するのは、Automation signalだ。軌道衛星を表すアイコンと共に475という数字が読み取れる。つまり、Spaceship consoleの出力シグナルをキャプチャした際に、宇宙船が係留されていたのは母星の軌道衛星上であるというわけだ。
これを踏まえて回路に設定された条件を確認してみよう。
Spaceship consoleから出力されたシグナルは、右側の赤いケーブルから入力されてくる。
右上の条件回路では、現在地が474、つまり母星の地表面に宇宙船が係留されている時チェックシグナルを出力する。右下の条件回路では、現在地が475、つまり母星の軌道衛星上に宇宙船が係留されている時チェックシグナルを出力する。つまり、右列にある二つの条件回路はいずれか一つだけが成立する。
中央上の定数回路では、軌道衛星を表すシグナルで475の値を出力しており、左上の条件回路のみに接続している。中央下の定数回路では474の値を出力しており、左下の条件回路のみに接続している。
左列にある二つの条件回路は全く同じ条件と出力を設定している。つまり、チェックマークのシグナルが1の時に、定数回路と条件回路から入力されたシグナルを全て出力するというわけだ。
回路全体を俯瞰すると、母星の地上に宇宙船が係留されている時は目的地を軌道衛星上に設定し、宇宙船が軌道衛星上に係留されている時は母星の地上に目的地を設定するというわけだ。
着陸と加速の自動化#
宇宙船の現在地に応じて目的地を自動的に決められるようになったので、次は着陸と加速の自動化をやっていこう。
これは特に難しいことは無くて、すでに作りこんだ係留と加速の定数回路のスイッチをONにしっぱなしにするだけだ。これによって、宇宙船から定数回路が一つ減ることになる。
Spaceship consoleの左側にある定数回路が二つになっていることが確認できるだろう。
減った定数回路の中に設定されていたシグナルを、Spaceship consoleのすぐ左隣りにある定数回路の中に統合した結果、このようになる。
どちらかというと、何故着陸と加速という矛盾したシグナルをSpaceship consoleに送りっぱなしにしても正しく機能するのかを理解する方が難しい。
Space Explorationにおける宇宙船には、係留状態、停止状態、加速状態という3つの状態があると少し前に説明した。
まず、クランプアイコンの係留シグナルは、目的地の上空で停止状態の時にしか機能しない。係留状態や加速状態の時は勿論の事、目的地でない場所で停止していても単に無視される。つまり、係留シグナルはSpaceship consoleに送りっぱなしで問題ない。
次に、タコメーターの速度目標シグナルは、目的地以外の上空で停止状態の時にしか機能しない。係留状態でエンジンをフカそうとしても単に無視される。目的地上空で係留待ち状態になっている時も無視される。というわけで加速シグナルもSpaceship consoleに送りっぱなしで問題ない。
入出荷の自動化#
宇宙船の自動運行について説明するのもそろそろ大詰めだ。最後の説明を始める前にそもそも何で宇宙船を自動運行するのか忘れてしまわないように、荷物を載せたり下ろしたりする方法について確認しておこう。
まずは積込みだ。このキャプチャでは右側の大きい箱からインサーターを使って取り出したものを宇宙船内の箱に格納している。ベルトコンベヤを配置するにあたって邪魔になった広域電柱の位置を少々調節した。
次は荷下ろしだ。積込みの際にはつながっていなかったベルトコンベヤの先に地下ベルトを通って物資が輸送されている様子が確認できるだろう。積込みの際に使っていた右側の地下ベルトの先には何もない。
離陸の際に使う液体ロケット燃料は、どこの惑星でも補充できるようにパイプを組むと紛れが無くなって宇宙船の運行状況が安定する。なお、宇宙用のパイプは地上用のパイプと問題なく接続できる。
離陸の自動化#
ここまでは、宇宙船内に配置した定数回路のON/OFFを切り替えることで宇宙船を離陸してきたが、最後は宇宙船を自動的に離陸できるように回路を組もう。
クランプを中心に宇宙船の離陸と関係がありそうな設備をケーブルで接続している。ここでは、宇宙船の電力状況を安定させるために蓄電池(Accumulator)を追加している。
接続されたクランプ同士は、それぞれに入力されたシグナルを相手方に送信する。つまり、宇宙船内部の液体ロケット燃料やIon Stream、蓄電池の残量はクランプを通して外の回路に伝達されるのだ。すごい。
赤いケーブルで接続された各資源の情報がクランプにシグナルとして送信されていることを確認してみよう。このキャプチャでは赤い背景の入力シグナルとして、液体ロケット燃料、Ion Stream、蓄電池の残量割合が送信されている。この例では、Spaceship consoleの出力と、蓄電池の出力に同じAシグナルを使っている。これらが同じ回路ネットワーク内に流れることで合算されてしまうと完全に意味のない値になってしまうので、回路の接続経路で混ざってしまわないよう注意して欲しい。
これらのシグナルを受け取る回路がどんな構成になるのか確認していこう。これが宇宙船の自動運行に関する最後の説明になる。もう少しだけ付き合って欲しい。
まず、宇宙船の離陸条件を検証する回路を宇宙船の外側に置くというアイディアこそが最も重要なことだ(なお、筆者のアイディアではない)。宇宙船の内部に離陸条件を検証する回路を置こうとするとどうしても回路が巨大になってしまうのだ。資源効率や横展開に関わるので、宇宙船は出来る限りコンパクトに実装したい。
次に重要なのはクランプのすぐ左にある条件回路だ。チェックシグナル3つを受け取ったら離陸シグナルを送るようになっている。なお、宇宙船は1tick離陸シグナルを受け取るだけで離陸する。つまり、離陸によって宇宙船が係留状態でなくなるので、左側のクランプから右側のクランプに離陸シグナルは送信されなくなるが、特に問題はない。
ちなみに、宇宙船内に定数回路で離陸シグナルを送れるようにしているのは、緊急避難的に宇宙船を離陸するためだ。自分のキャラクターから遠く離れた場所で宇宙船が動けなくなったとしても、Universe Explorerを使って宇宙船を表示したら定数回路のON/OFFをリモートで切り替えられる。なお、Spaceship consoleの離陸ボタンをリモートで押すこともできる。
残りの3つの条件回路は一つの資源ごとに条件を設定して、それぞれがチェックシグナルを1つずつ送るようにしてある。単一の回路ネットワーク内において複数の回路が同じシグナルを送信すると、そのシグナルの値は合算される。つまり、この回路においては3つの条件が成立した時に宇宙船が離陸するというわけだ。
より条件を複雑にしたければ、条件回路を単に増やしていけばいい。港側に条件回路を配置する構造なので、回路が大きくなってもほとんど問題はない。
というわけで、宇宙船の自動運行に関する説明はこれで終わりだ。残りは、細々としたTipsや回路の改良などを説明していく。
自動運行する宇宙船の改良#
ここまで説明に使った宇宙船を自分がプレイしているゲーム内のリソースを使って改良してみた。
改良点として分かり易いのは、太陽光パネルと蓄電池だ。テックレベルを上げていくとより強力なものが使えるようになる。ここでは色が赤いものに切り替えた。
次に、目的地を自動設定するための回路群をコンパクトにまとめた。二点間を移動するだけの回路であれば、合計10マス程度で実現できる。もしかしたら、これさえも港側で実装できるかもしれない、という気はするもののまだ試してみていない。
ちょっと分かりづらい改良としては、荷下ろしをするためのインサーターに対して、Spaceship consoleからの出力シグナルを接続するようにしたことだ。荷下ろし用の港に宇宙船が係留されている時だけ動作するようにインサーターの条件を設定している。これで意図しないものがベルトコンベヤ上に乗るのを避けられる。
まとめ#
以上がSpace Exploration modにおいて筆者が持っている自動運行に関するノウハウの全てだ。それほど多くの情報がある訳ではないが、丁寧に説明したので文章量としては非常に多くなってしまった。全て読むのはすごく大変だったことだろう。この文章を書きあげるのは勿論すごく大変だった。
宇宙船の自動運行については、筆者自身もまだノウハウを積み上げ始めたばかりで、あまり複雑なことは出来ていない。今後三点間の巡行や、資源の少ない場所への優先的な巡行、条件回路を全て宇宙船の外側に配置するなどの方式に挑戦してみたいと考えている。
ここまで、読んでいただいた読者に感謝するとともに、説明で使った宇宙船を各バージョンごとにブループリントとして記録しておいた。Space Exploration modをすでに導入済みで、このエントリでは説明しきれなかった微細な部分に興味がある方は是非インポートして使ってみて欲しい。