計算ブロック活用

Last-modified: 2025-02-01 (土) 19:05:42

計算ブロックは数値の計算、オブジェクトの監視、論理演算等複雑な動作をする回路を作成することができる。
物流ブロックと組み合わせてモノの流れを細かく制御することも可能。
また、一部物流ブロックと同様にマナオーバーレイ画面にてマナパイプに対して設置することが可能。ただし物流ブロックと違い計算ブロックは通常エリアの高高度に設置される。マナは空の高いところで動いているのだろうか。

おことわり

計算ブロックの解説は公式wikiやgamemediaの記事を参考している部分もありますが、大部分が筆者の独自調査によるものです。
誤っている内容は多々あると思いますがご容赦いただきたいと思います。
また、開発者曰く(ver 0.108m現在)計算ブロックの機能は「まだまだ開発途上」ということなので、今後大きく仕様が変わる可能性があります。ご了承ください。

計算ブロックの基礎知識

リンク

計算ブロック同士を接続して回路を作成することをリンクと言う。
リンクには先行後続の概念があり、ここではそれぞれリンク元・リンク先と呼ぶ。
リンク元から受け取った値やトリガーを処理し、リンク先へトリガーと処理後の値を送出するのが基本動作となる。
計算ブロックは物流ブロックにもリンクを設定することができる。

リンクの設定方法

送出元となる計算ブロックを左クリックで選択し、リンク先となるブロックを右クリックで選択するとリンクされる。
ブロックをマウスオーバーするとそのブロックのリンク元、リンク先を見ることができるが、リンク元とリンク先の区別が非常にわかりづらい。
この点は今後のアップデートで改善を期待したい。

トリガー

リンク先のブロックへ何らかのアクションを依頼する動作をトリガーと呼ぶ。
画面上では青い光がリンク元からリンク先へ送出されているのが見えるようになっている。
ほとんどの計算ブロックはトリガーを受け取ることで何らかのアクションを実行し、リンク先へその結果とトリガーを送る。
論理プッシャーブロックを使用するとトリガーだけ送出することができる。リンク先のブロックの値を変更したくない場合に使用する。
プレイヤーの操作でトリガーを送出するにはブロックにカーソルを合わせReturnキーを入力する。対応しているブロックはトリガーとエージェントトリガーの2つ。
[添付]

値の保持

各計算ブロックは何らかの数値を内部に保持している。トグルならON/OFFの状態、番号ブロックなら内部の値、など。
基本的にはトリガー送出する際に一緒に値も送出されるが、論理セットブロックを使用すると値だけ送出することができる。その場合は黄色の光がリンク先へ送出されているように見える。
ほとんどのブロックは内部に保持している値をプレイヤー側で直接変更することができる。その際にトリガーは発生しない。
[添付]

計算ブロック一覧

トグル

計算ブロック活用_トグル.png

マウスカーソルを合わせてReturnキーを押すことにより、状態のON/OFFを切り替え、リンク先にトリガーを送出する。
リンク元からトリガーを受け取ると状態を反転してリンク先へトリガーと値を送出する。
送出する値は以下の通り。

状態
ON0
OFF0

インベントリセンサー

計算ブロック活用_インベントリセンサー.png

オフセットで設定した場所にある建物やユニットの中にあるアイテム合計数をブロック内部に保持する。
オフセットを指定しない場合は設置したタイル上を通過するユニットのインベントリを監視する。
建物の内部ストレージの状態が変化したときに建物・ユニットからトリガーとアイテム合計数が送出され、インベントリセンサー内に保持される。
建物・ユニットから受け取ったアイテム数をリンク先にトリガーと一緒に送出する。

アイテムフィルタを設定すると建物内の特定のアイテムのみ監視する。

オフセットの指定方法

画面右上のオフセット座標(x,y,z)の欄を左クリックし、対象の建物または場所を右クリックする。
座標はマインクラフトと同様でxが東西方向,yが垂直方向,zが南北方向でインベントリセンサーからの相対距離で表示される。
オフセットを設定しただけでは建物のアイテム数がインベントリセンサーに送出されない。建物側のストレージ状態の変化が必要。
ユニットに関しては通過するたびに所持アイテム数とトリガーが送出される。

ブール機能

計算ブロック活用_ブール一覧.png

トリガーを受け取るとリンク元のブロックの値(複数可)に対して指定のブール関数を適用し、その結果をトリガーと一緒にリンク先へ送出する。
内部的には値"0"がFalse(偽)で、それ以外の値は全てTrue(真)で処理される。送出する値は0か1のどちらか。

関数の種類説明
And論理積。リンク元ブロックに1つでも値が0のものがあれば結果は0。それ以外は1。
Or論理和。リンク元ブロックに1つでも値が0以外のものがあれば結果は1。すべて0なら結果は0。
Not否定。トリガーを送出したブロックの値の真偽を反転して送出する。この関数のみトリガーしたブロック以外のリンク元の値は参照されない。
Nand否定論理積。Andの結果が反転される。リンク元ブロックが全て真なら結果は0、それ以外の場合は1。
Nor否定論理和。Orの結果が反転される。リンク元ブロックが全て偽なら結果は1、それ以外の場合は0。
Xor排他的論理和。リンク元ブロックの値が全て真、またはすべて偽なら結果は0、それ以外の場合は1。

エージェントトリガー

計算ブロック活用_エージェントトリガー.png

オフセットで指定したタイルを何らかのオブジェクトが通過した際に状態がOnになり、合わせて状態の値とトリガーを送出する。
オフセットを指定しない場合はエージェントトリガーを設置したタイルに対して作用する。
トリガータイプにより動作が異なる。

トリガータイプ動作
Enterオブジェクトが指定タイルに侵入したときにトリガーを送出する。
Exitオブジェクトが指定タイルから離れたときにトリガーを送出する。

アイテムフィルターを設定することにより特定のアイテムまたは特定のアイテムを持ったユニットのみを監視対象とすることができる。
マウスカーソルを合わせてReturnキーを入力するとトグルと同じように状態の反転と値、トリガーの送出を行う。
状態がOffにしてもオブジェクトが通過するとOnになってしまうので状態のOn/Offで監視の有効無効を切替することができない。他のブロックを使って切替機能を構築する必要がある。
エージェントトリガーのOnOff切替.png
シグナルゲートを使った切替機能の例。

論理ランプ

計算ブロック活用_論理ランプ.png

状態がオンの時に青く、オフの時に赤く光るトリガーブロック。
基本的に現在の状態を可視化する目的で使用する。
トグルと同様にリンク先にトリガーと値を送ることができるが、Returnキーで状態の切替をすることができない。

論理セットブロック

計算ブロック活用_論理セット.png

リンク先のブロックの値を書き換えたいがトリガーは送出したくない場合に使用する。
リンク元から受け取った値を、リンク先へそのまま送出する。トリガーは送出しない。

論理プッシャーブロック

計算ブロック活用_論理プッシャー.png

論理セットブロックとは逆に、リンク先ブロックの値は書き換えたくないがトリガーだけ送出したい場合に使用する。
リンク元からトリガーを受け取るとリンク先へトリガーのみ送出する。その際、通常みられる青い光は表示されない。

カウンターブロック

計算ブロック活用_番号ブロック.png

トリガーを受け取るたびに内部に保持している値を1ずつ加算する。
加算後の値とトリガーを送出する。
保持した値は画面に表示される。手動で初期値を設定することができる。

番号ブロック

計算ブロック活用_番号ブロック.png

トリガーを受け取ると一緒に受け取った値を内部に保持し、画面に表示する。
内部に保持した値とトリガーを送出する。
手動で値を設定することもできる。プログラムでいうところの変数に近い扱い。

数学ブロック

計算ブロック活用_数学ブロック.png

トリガーを受け取ると、一緒に受け取った値に対して指定の演算を行い、結果をリンク先のブロックへ送出する。
内部には演算の種類と演算に使用する設定値を保持している。演算の種類は算術演算子と比較演算子がある。

演算子画面上の表記処理内容
加算+xxリンク元の値と設定値を足し算してリンク先へ送出する。
減算-xxリンク元の値から設定値を引き算してリンク先へ送出する。
乗算*xxリンク元の値と設定値を掛け算してリンク先へ送出する。
除算/xxリンク元の値を設定値で割り算してリンク先へ送出する。計算結果に小数が含まれる場合、ゼロ方向に丸められる。
等しい==xxリンク元の値と設定値が等しい場合は1、そうでない場合は0を送出する。
等しくない!=xxリンク元の値と設定値が等くない場合は1、そうでない場合は0を送出する。
より大きい>xxリンク元の値が設定値より大きい場合は1、そうでない場合は0を送出する。
より大きいか等しい>=xxリンク元の値が設定よりも大きいか等しい場合は1、そうでない場合は0を送出する。
より小さい<xxリンク元の値が設定よりも小さい場合は1、そうでない場合は0を送出する。
より小さいか等しい<=xxリンク元の値が設定よりも小さいか等しい場合は1、そうでない場合は0を送出する。
剰余%xxリンク元の値を設定値で除算した際のあまりを送出する。余りが小数の場合はそのまま小数で送出される。

シグナルゲート

計算ブロック活用_シグナルゲート.png

リンク元から受け取ったトリガーと値をそのままリンク先へ送出するブロックだが、シグナルゲート自身の状態がOFFの場合はリンク先へデータを送出せずブロックする。
シグナルゲート自体のON/OFFは手動で設定するほか、論理セットブロックからトリガーなしの値を受け取ることでも変更させることができる。

タイマーブロック

計算ブロック活用_タイマー.png

リンク元からトリガーを送ると値に設定した時間だけ待ってからリンク先へトリガーを送出するブロック。タイマーというよりは遅延実行に近い。
設定値の単位は秒。小数入力可能。10を入力するとおおよそ10秒待ち、0.5を入力するとおおよそ0.5秒待つ。
送出は1回限りで、続けてタイマーを起動させたい場合はその都度リンク元からトリガーを送る必要がある。
シグナルゲートと同様に、設定値そのものを変更したい場合は論理セットブロックを使って値を受け取る必要がある。

筆者の想像が多分に入っているタイマー実行タイミングの仕様

FactoryTownの論理回路はマインクラフトのレッドストーン回路と同様に、一定時間ごとに回路の状態をチェックし更新処理を行っていると考える。この更新処理インターバルをtickと表記する。1tick=1/60秒≒16msと考えられる。
タイマーブロックも1tickごとに状態が監視され、トリガーを受け取ると状態の更新処理に1tick費やし、その後設定値相当のtickが経過したあとタイマーブロックのトリガー送出処理が実行されると考えられる。なので、後述のクロック回路を作った際、実際のクロック発生間隔は設定値+1tickになる計算になる。もし0.1秒ごとにトリガーを発生させたい場合、タイマーブロックの設定値は100ms-16ms=84ms、すなわち0.084とすることでちょうど0.1秒ごとにトリガーが発生する。
(環境によりぴったり0.1秒で動くとは限らないかもしれない)

デルタブロック

計算ブロック活用_デルタ.png

リンク元から受け取った値をブロックに保存し、その値とトリガーをリンク先に送出する。
ただしリンク元から受け取った値とブロックに保存された値が等しい場合、リンク先にトリガー、値を送出しない。
デルタブロックを使うと値の更新があったときのみトリガーが発生する仕組みを作成できる。

計算ブロック活用例

物流ブロックと組み合わせた活用例も紹介していきます。

アイテムを2:1に分けるスプリッター

計算ブロック活用_npassソーター.jpg
スプリッター設計図.png
剰余の数学ブロックとカウンターを使って通過数が3の倍数になる場合だけプッシャーのON/OFFを切り替える。
結果、まっすぐの方向に流量の2/3、下方向に流量の1/3が流れていく。

累計売却金額計算

計算ブロック活用_金額計算.jpg
累計販売金額設計図.png
アイテムをコンベアで市場に売却する際、搬入口にエージェントトリガーを仕掛けることにより通過数を取得。単価と掛け合わせて累計売却金額を計算する。

クロック回路

計算ブロック活用_クロック回路1.jpg
クロック回路設計図.png
同じタイマー時間をセットしたタイマーブロックを2つ用意し、お互いにトリガーを送りあうとクロック回路になる。
ただしそれだけだと起動する手段も止める手段もないので、トリガーとシグナルゲートを使ってON/OFFを設定できるようにしたほうが良い。公式wikiでも紹介されている。

生産スピード調査

計算ブロック活用_SW1.jpg
[添付]
クロック回路を利用したストップウォッチ。エージェントトリガーでスタート/ストップを制御する。
タイマーブロックとクロック回路の説明で述べたとおりの回路を作ればほぼ正確に0.1秒単位での計測が可能。

アイテムが溜まるまでカートを待たせる

計算ブロック活用_カート進入制御.png
カート通行制御設計図.png
公式wikiで紹介されている minecart loading station の応用例。

  • 荷物を持っていないカートを側道に流して、
  • サイロにアイテムが20以上溜まっていなければソーターでカートの通行をブロックする。
  • サイロのアイテムが20以上になったらソーターを無効にしてカートの通行を許可する。

コメント

  • エージェントトリガーにカーソルを合わせてEnterキーを押すとトリガーが発生するよ。あと、トグルにカーソルをあわせた時の右下のON/OFFはダミーで機能していないって表記が欲しいかも。 -- 浮遊都市1600? 2019-05-25 (土) 11:33:45
    • エージェントトリガーについては確認しました。他にちょっと不思議な挙動をするのでそれも含めて追記します。トグルに限らず右下の状態を変更してもトリガーが発生しないだけで決してダミーではないと思います。 -- ムッチー? 2019-05-25 (土) 12:33:42
  • すごーい! 参考になります! ありがたや! -- ぺんしる? 2019-05-27 (月) 00:40:45
  • ありがたいことです。助かります。Factorio歴は3年だけどこれ系の回路は未だわからず。とりあえず倉庫の中の特定アイテム数表示までは理解。現在マナパイプの交通整理を思案中。 -- 「先週から始めたニワカ」改め、「膠のニワカ」? 2020-07-07 (火) 06:36:22
  • ブール機能でフリップフロップも出来た。サイトの前にゲートを付けて在庫20以上になったら在庫0になるまでゲートを開けるとかも出来るな。 -- 2020-10-12 (月) 00:48:19
  • スプリッタの機能が追加されて、分割比率も設定出来るようになりましたね -- 2021-12-25 (土) 19:28:12
  • スプリッタの分配比に外部から入力する方法ってありますかね? -- 2024-10-10 (木) 21:43:08
    • 外部から入力するってのはどういうことだろう?自分でキーボードで入力するということではないのかな? -- 2024-11-17 (日) 21:05:29
      • サイロ→リチャージャー→サイロをマナパイプで繋げる回路を作るときに、リチャージャーを縦に並べて、サイロから複数のリチャージャーに分散させるようにしているんですが、 -- 2024-12-07 (土) 23:33:18
      • スプリッターにいちいち数値を入力するのがめんどくさいなぁ…と。(ミスして途中で投稿してしまった…) -- 2024-12-07 (土) 23:36:34
      • スプリッターをクリックして選択した状態でCtrl+Cでコピーできるから必要な数値だけ変えれば多少手間は減るかな? -- 2025-01-08 (水) 04:43:21
      • ありがとうございます!グラバーではコピペ使うのに何故かその発想に至りませんでした(笑) -- 2025-02-01 (土) 19:05:42