ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

Factorio Space Explorationメモ:貨物ロケットの自動準備

FactorioのSpace Exploration Modをプレイしていると、そのうち母星の資源が枯渇してくる。そうなると他の惑星へ資源を奪いに行く必要がある。Factorioの醍醐味は様々な工夫による作業の自動化にあるので、できれば奪った資源の輸送も自動化したい。しかし、ここで問題になるのは貨物ロケットの発射準備方法。貨物ロケットを発射するには、発射台に以下をセットする必要がある。

  • 宇宙カプセル×1
  • 貨物ロケットセクション×100
  • 液体燃料×(目的地までの距離により異なるらしい)

このうち、液体燃料は生産・貯蔵設備からパイプを発射台に繋げておけば勝手に必要量だけ重点されるので楽なのだが、残りの2つが曲者。発射台にはロケットに載せる貨物もセットできるのだが、貨物のセット先も上記ロケットの部品のセット先も共通なのだ。そのため、何も考えずにインサーターで宇宙カプセルや貨物ロケットセクションを発射台にセットする構成にすると、必要量以上がセットされてしまい貨物ロケットがこれら部品で埋まってしまう。そのため、以下の仕掛けが必要になる。

  • 発射準備中であることを認識する
  • 発射準備中ならば部品を必要量だけセットする

発射準備中かどうかは発射台から出てくる信号で識別ができ、0が準備中、1が準備完了である。またFactorioでは信号の比較、信号の加減乗除ができ、ラッチ回路等も作れる。以上の道具立てからすると、実現方法は・・いくつもあるなあ。思いついた各方式の概要を列挙してみる。

  • 1->0の信号変化をトリガーに所定の個数をセットする。
  • 1のときはセットせず、0の間だけ所定の個数をセットする。
  • 宇宙カプセルを1個だけセット後、信号が1になるまで貨物ロケットセクションをぶちこむ。
  • 打ち上げに必要な部品はセットと同時に消滅する(発射台に吸収される)ことを利用し、各部品をひたすらセットするインサーターとひたすら取り除くインサーターを設置する(信号は使わない)

・・・あれ?ラッチとかが必須かと思ったけど、一番最後のをちょっぴり改良して、セットするインサーターを発射台からの信号で直接制御してあげれば行けるんじゃない?つまり、こうだ。

f:id:donadonasan:20200526180659p:plain

ひたすら部品のセットと除去をする例(失敗)

でも、これは失敗。セットする方にスタックフィルタインサータを使ったにも関わらず、なぜか普通のフィルタインサータが全てを瞬時に除去してしまうのだ。

ということで、他の方式を検討する。まずラッチ方式だが、リセット信号のエッジ検出がめんどくさそうなのでパス。そこで、信号が1の間は部品をセットせず、信号が0の間だけ所定の個数セットする方式にする。所定の個数をカウントする回路のクリアは、信号=1を条件とすればタイミングチャート的に大丈夫なはず・・。

f:id:donadonasan:20200526184841p:plain

3個だけインサータでセットする場合のタイミングチャート

などと思いながら回路を組んでいたら、発射台からセット済みアイテムの個数も出力されていたことが発覚。ラッキー。(でも考えたり記事書いたりしたのにかかった数時間は無駄に)

f:id:donadonasan:20200526191705p:plain

発射台からの出力信号例。Lは発射先までの距離、Eは空いている貨物スロット数、Fは埋まっている貨物スロット数