このページは現在編集中です
高度な論理制御でほとんどの機械や作業をを自動化できるIntegrated Dynamics(以下IDs)。このページではIDsとそのアドオンであるIntegrated Tunnels(以下ITs)の解説をしていきます
高度な論理制御でほとんどの機械や作業をを自動化できるIntegrated Dynamics(以下IDs)。このページではIDsとそのアドオンであるIntegrated Tunnels(以下ITs)の解説をしていきます
目次
初級編
IDsを始めるにあたって、最初に覚えるべきことをまとめていきます
Variable Card(変数カード)
様々な値を保存するアイテムです。IDsにおける論理処理はこれが無いと何もできません。たくさん用意しておきましょう。
Value(値)
変数カードに保存された情報を値と言います。情報が何を表しているかによって値の種類は変わり、値の種類によってカードを挿せる場所が異なります。
値の種類:
+ | ... |
Logic Programmer(論理プログラマー)
変数カードに値を書き込むための道具です。名前にもある通り、IDs上の論理を司るアイテムです。


- 緑枠:文字を打ち込んで検索ができます
- 赤枠:書き込む値の内容が選べます
- 黄色枠:入力と出力の種類で検索ができます
- 青枠:書き込む値の詳細の入力ができ、右下のスロットに変数カードをいれることで指定した値を書き込めます
ネットワーク
Logic Cableやvariable storeなどのネットワークパーツで構成されるマルチブロックをネットワークと言います。ネットワークパーツにはリーダー、ライター、+αの三種類があります。リーダーは周りの環境から特定の情報を読み取り、変数カードにリンクさせます。ライターはセットされた値を元に何かしらの形で具現化します。関数、リーダーとリンクしたカード、ライターにセットするカードはそれらを作る際に使った他のカードやネットワークパーツに依存しているので同ネットワーク内に必要なパーツやカードがないとエラーを吐きます。また、例外として何も書き込んでいないカードをライター類(ITsエクスポーター、インポーター含む)にいれるとtrueの値を持っているとみなされます。
パーツ一覧
リーダー
+ | ... |
ライター
+ | ... |
その他
+ | ... |
Integrated Tunnels(ITs)
- interface
インターフェースにはエネルギー、液体、アイテムの三種類あり、対面したブロックの内容物をネットワークが認識できるようにします。優先度やチャンネル、稼働頻度を設定できます。
- importer/exporter
インポーター、エクスポーターというのはネットワーク目線での挙動です。インポート(搬入)、エクスポート(搬出)する主体がネットワークであり、対面するブロックは動作の対象なのでブロック目線だと挙動は逆になります。右側にある「+」を押せばチャンネル、ラウンドロビン(等量分配)、フィルターの精度などが設定でき、右上のボタンを押すと優先度と稼働頻度が設定できます。また、セットするカードの値の種類によって制御方法が異なります。
制御方法
Export/Import All 〇〇 | Boolean | 真の場合にすべての物を搬出入します |
Export/Import 〇〇 Amount | Integer | セットされた速度で搬出入します |
Export/Importer 〇〇 | Item/Fluid | セットしたものだけを搬出入します |
Export/Import 〇〇s | List | セットされたリストに含まれるものだけを搬出入します |
Export/Import Items Predicate | Operator | ITsへの応用にて後述 |
Export/Import 〇〇s NBT | NBT | セットしたNBTを含む物を搬出入します |
- player interface
エクスポーターの亜種としてプレイヤーインターフェースというものが存在します。これは搬出するアイテムを制御するのではなく、疑似プレイヤーが手に持ったアイテムを制御します。右クリック、左クリック、シフト、オフハンド、長押しなどを設定してシミュレートできます。
- world系
World Item 〇〇 | ドロッパーなどのようにアイテムをエンティティの形で搬出入します |
World Fluid ○○ | 空間に存在する液体を搬出入します |
World Block ○○ | 指定されたブロックをを空間に搬出入します |
中級編
Operator(関数)
論理プログラマーを使うと、「値に対して操作を行った値」をもったカードを作ることができます。操作の内容を関数といい、操作される値、操作の結果得られる値をそれぞれ入力、出力と呼びます。例えば、「 f(x) = x+5 」という関数があったとき、関数fはx(入力)に対して+5という操作を行って出力する関数であると言えます。「リーダーで読み取った値に関数で操作を重ねていき、目的の値を得る」ということがIDsの本質です。IDsの関数には足し算やand、リストの何番目を取得するなどといった関数が存在し、「自分の目当ての情報を入手するためにどんな情報が必要か?」「その情報をどう操作すればいいか?」を考えるのがIDsを利用する上で重要な考え方になります。

何かしらの関数で処理した値をカードに書き込む場合、まず赤枠の中から使用する関数を選び、青枠に関数に代入する値を持ったカードをセットします。関数に入力できる値の種類は決まっており、それ以外を入力するとエラーを出力します。

何かしらの関数で処理した値をカードに書き込む場合、まず赤枠の中から使用する関数を選び、青枠に関数に代入する値を持ったカードをセットします。関数に入力できる値の種類は決まっており、それ以外を入力するとエラーを出力します。
関数一覧
+ | ... |
小技・テクニックなど
Labeller
IDsで何か装置を作ろうとすると、変数カードたくさん使うのでカードの役割が分かりづらくなります。Labellerを使うとカードに名前をつけられるようになり、カードの整理が簡単になります。インベントリにLabellerがある状態だと論理プログラマーのGUIに名前を入力する欄が出てくるのでいちいちLabellerを開く必要のありません。また、Labellerは経験値を消費せずにアイテムの名付けができるので、AE2のMEインタフェースなどの名付けにも使えます
再帰
IDsでは直接再帰構造を実装する方法がありません。無理やり実装してもエラーを吐いてしまうので、少し工夫する必要があります。
1.ディレイヤー
ディレイヤーの上部スロットに再帰的参照をするカードを入れ、値の履歴を関数に組み込むことで数tick後の値を処理することになり、本質的には違う値となるのでエラーを吐きません。また、初期値が必要になるので履歴の中の要素を取得する際はgetではなくgetOrDefaultを使うのが良いでしょう。
ディレイヤーの上部スロットに再帰的参照をするカードを入れ、値の履歴を関数に組み込むことで数tick後の値を処理することになり、本質的には違う値となるのでエラーを吐きません。また、初期値が必要になるので履歴の中の要素を取得する際はgetではなくgetOrDefaultを使うのが良いでしょう。
2.レッドストーンリーダーライター
レッドストーンリーダーとレッドストーンライターを向かい合わせに設置することで、ライターが具現化した値がリーダーの方で読み取らせることができます。ライターにセットする関数にリーダーが読み取った値を使えるので再帰的な処理が行えます。しかし、booleanとintegerでしか使えないのでカウンターやフリップフロップ以外の実装にはあまり使えません。
レッドストーンリーダーとレッドストーンライターを向かい合わせに設置することで、ライターが具現化した値がリーダーの方で読み取らせることができます。ライターにセットする関数にリーダーが読み取った値を使えるので再帰的な処理が行えます。しかし、booleanとintegerでしか使えないのでカウンターやフリップフロップ以外の実装にはあまり使えません。
レッドストーン
バニラの論理制御要素であるレッドストーン。一部のmodのブロックは特定の状況でレッドストーン信号を発したり、逆にレッドストーン信号を受け取ることで制御できることがあります。これを活用すれば自動化が楽になることがあります(特にBotania)。自動化機構を考える前に加工設備や導管の仕様について知っておきましょう。
ピックアップディレイフィルタリング
アイテムを拾えるようになるまでの時間をピックアップディレイといい、World Item Exporterはこの時間を自由にいじることができます。これを活用するとワールド上でアイテムエンティティを加工する設備を簡単に自動化できます(特にBotania)。
セットアップ
Ignore Pickup DelayをオフにしたWorld Item Importerと、ピックアップディレイを加工時間より長く設定したWorld Item Exporterをアイテムが加工される場所に向けて設置します。Importerには素のvariable cardをセットし、Exporterを加工のトリガーと同時にアイテムを搬出するようにすればセットアップは完了です。
Ignore Pickup DelayをオフにしたWorld Item Importerと、ピックアップディレイを加工時間より長く設定したWorld Item Exporterをアイテムが加工される場所に向けて設置します。Importerには素のvariable cardをセットし、Exporterを加工のトリガーと同時にアイテムを搬出するようにすればセットアップは完了です。
仕組み
最初に材料がExporterから搬出されます。Exporterから搬出されたアイテムはピックアップディレイがあるのでImporterに搬入されず、そのまま加工設備によって加工されます。そして加工されたときに出現する成果物はピックアップディレイがリセットされるので、Importerに回収されます。これにより加工後のアイテムだけを回収する仕組みが作れます。特にBotaniaのRunic Altarは下位ルーンが上位ルーンの素材になるため成果物のリストを使わずにフィルタリングを行うことで上位ルーン用と下位ルーン用で自動化設備を共有できます。
最初に材料がExporterから搬出されます。Exporterから搬出されたアイテムはピックアップディレイがあるのでImporterに搬入されず、そのまま加工設備によって加工されます。そして加工されたときに出現する成果物はピックアップディレイがリセットされるので、Importerに回収されます。これにより加工後のアイテムだけを回収する仕組みが作れます。特にBotaniaのRunic Altarは下位ルーンが上位ルーンの素材になるため成果物のリストを使わずにフィルタリングを行うことで上位ルーン用と下位ルーン用で自動化設備を共有できます。
上級編
NBT
アイテム、ブロック、エンティティなどが何かしらの個性(エンチャント、保持電力、体力など)を持つ場合、その個性の情報はNBTに記録されます。NBTとはいわば表で、値(タグ)とそれに紐づいた名前(タグネーム)の集まりです。IDsはブロックリーダーやitem NBT関数等を使ってゲーム上に存在するNBTを取得でき、NBTの中からNBT compound value ~関数を使って目当ての値を取り出すことができます。NBTに対して特定のタグネームを持った値を取得することでブロックの状態に基づいた制御が可能になります(特にBotania)。
関数の編集
中級編では関数とは操作であるという認識でも問題ありませんでしたが、より深く理解するために中級編での関数の定義をもう一度見てみましょう。
操作の内容を関数といい、操作される値、操作の結果得られる値をそれぞれ入力、出力と呼びます。
初級編の値の種類にOperatorがあったり、関数の定義で薄々察することができますが、操作の内容を情報として扱うことで関数を値の中の一種とすることができ、IntegerやItemと同じように値として関数に入力することも出力されることもできます。ここから先は言語化が難しいので説明に擬似コード(抽象化した大まかなプログラム)や図を用いることがあります。
変数カードに保存した関数は特定の関数を使うことで編集することが可能です。独自の関数を作成し、さらに複雑な処理を行うことができます。
関数 | 入力の種類 | 出力の種類 | 処理 |
Apply | Operator,Any | Any | 入力した関数に入力した値を代入します。 f = ( a, x, y, z ) -> { ... } とすると、 apply( f, value1 ) ≒ ( x, y, z ) -> f( value, x, y, z ) |
Apply 2 | Operator,Any,Any | Any | 入力した関数に2つ値を代入します。 f = ( a, x, y, z ) -> { ... } とすると、 apply( f, value1, value2 ) ≒ ( y, z ) -> f( value, value2, y, z ) |
Apply 3 | Operator,Any,Any,Any | Any | 入力した関数に3つ値を代入します。 f = ( a, x, y, z ) -> { ... } とすると、 apply( f, value1, value2, value3 ) ≒ ( z ) -> f( value, value2, value3, z ) |
Pipe | Operator,Operator | Operator | 1つ目の関数の出力を2つ目の関数の入力に流します。 f = ( a ) -> { ... }, g = ( x, y ) -> { ... } とすると、 pipe( f, g ) ≒ ( x, y ) -> g( f( x ), y ) |
Pipe 2 | Operator,Operator,Operator | Operator | 1つ目、2つ目の関数の出力を3つ目の関数の入力に流します。 f = ( a ) -> { ... }, g = ( b ) -> { ... }, h = ( x, y ) -> { ... } とすると、 pipe2(f, g, h) ≒ ( x ) -> h( f( x ), g( x ) ) |
Flip | Operator | Operator | 最初の2つの入力の順番を入れ替えます。 f = ( a, b ) -> { ... } とすると、 flip( f ) ≒ ( x, y ) -> f( y, x ) |
Conjunction | Operator,Operator | Operator | 入力された関数をANDに流します。 conjunction( f, g ) == ( x, y ) -> f( x ) && g( y ) ) |
Disjunction | Operator,Operator | Operator | 入力された関数をORに流します。 disjunction( f, g ) == ( x, y ) -> f( x ) ‖ g( y ) ) |
Negation | Operator | Operator | 入力された関数をNOTに流します。 negation( f ) == ( x ) -> !f( x ) |
値としての関数の利用
Lazy List Builder | Any,Operator | List | 漸化式の要領でリストをを生成します。 lazyListBuilder( x, f ) == [ x, f( x ), f( f( x ) ), f( f( f( x ) ) ), ...] |
Map | Operator,List | List | リストの値を順に関数に代入していき、入力した結果リストを出力します。 map( f, list ) == [ f( list[0] ), f( list[1] ), f( list[2] ), ...] |
Reduce | Operator,List,Any | Any | ![]() |
Reduce 1 | Operator,List | Any | ![]() |
Predicate(述語)
関数の中でも出力の種類がBooleanの関数のことをPredicate(述語)と言います。IDsに置いては大抵の場合入力の数が1つのものを指します。何かしらの入力があったときに、それが条件を満たしているかを判別する事ができます。前述した関数編集をを行うことで用途に合わせた条件を持った述語を作成できます。
述語の利用
Contains Predicate | List,Operator | Boolean | リストの中に述語が真を出力するような要素があれば真を出力します |
Count Predicate | List,Operator | Integer | リストの中の述語が真を返す要素の数を返します |
Unique Predicate | List,Operator | List | 入力が2つある述語を「2つの値を同一とみなすか」の判断に使い、その結果見つかった固有な要素のみを含むリストを出力します。 |
Filter | Operator,List | List | リストの要素に対して、「取り除くべき要素であるか」の判断に述語を使い、該当する要素を取り除いたリストを出力します。 |
ITsへの応用
様々なmodのアイテムパイプや液体パイプが色々なフィルタリング機能を持っている中、フィルタリングという機能の本質は「どれが通って良いかを決める」という判断に集約します。この判断を述語に任せることで、ただのホワイトリストやブラックリストはもちろん、鉱石辞書に特定の文字列を含むなどの複雑かつ強力なフィルタリングが可能になります。ITsの各種インポーター、エクスポーターのGUIの一番下には述語をセットできるスロットがあるのでそこに適切な型を入力に持った述語のカードをセットすることで述語を利用したフィルタリングができます。
添付ファイル
- 2022-01-17_08.19.15.png
- audio reader.png
- audio writer.png
- block reader.png
- delayer.png
- display panel.png
- dynamic light panel.png
- effect writer.png
- energy exporter.png
- energy importer.png
- energy interface.png
- entity reader.png
- entity writer.png
- extra dimentional reader.png
- facade.png
- fluid exporter.png
- fluid importer.png
- fluid interface.png
- fluid reader.png
- image.webp
- inventory writer.png
- inventroy reader.png
- item exporter.png
- item importer.png
- item interface.png
- machine reader.png
- machine writer.png
- materializer.png
- mono-directional connector.png
- network reader.png
- omni-directional connector.png
- player interface.png
- proxy.png
- redstone reader.png
- redstone writer.png
- reduce 1.png
- reduce.png
- static light panel.png
- variable store.png
- world block exporter.png
- world block importer.png
- world energy exporter.png
- world energy importer.png
- world fluid exporter.png
- world fluid importer.png
- world item exporter.png
- world item importer.png
- world reader.png