見出し画像

Minecraft 1.12.2 BotaniaのCorporea Networkにおける要求式全自動クラフトの実現

Quark0257

Abstract

MinecraftのModの一つであるBotaniaのItemネットワークであるCorporea Networkを用いてNetwork内で要求されたItemを自動でクラフトして供給するシステムを構築した。使用したModはBotania, 配線用のproject redでありMinecraftのバージョンは1.12.2である。後述するがProjectRedは見た目や若干のサイズ低減のために配線用Modとして使用しており、必須というわけではない。

Introduction

MinecraftのModの一つであるBotaniaにはCorporea Networkと呼ばれる倉庫システムがある。Corporea Network(以下Network)は1つのMaster Corporea Sparkと複数のCorporea Sparkから構成され、それぞれのCorporea Sparkが内部インベントリを持つものの上に設置されていることでCorporea Sparkがついているインベントリ同士が接続され一つの大きな倉庫として扱うことができる。アイテムの取り出し(以下要求)はCorporea Funnel(以下Funnel)あるいはCorporea Index(以下Index)を用いることでできる。使い方についてはこの場では省略する。Corporea Intercepter(以下Intercepter)はFunnelあるいはIndexにて要求されたItemがその個数分Network内にない場合、隣接したCorporea Retainer(以下Retainer)に要求の情報(どこから、何が何個要求されているか)を保存し、レッドストーンパルスを発生させる。Retainerはレッドストーン信号が入力されると、内部に保存されている要求をもう一度要求する。IntercepterはIndexやFunnelから直接要求されたものだけでなくRetainerから要求されたものにも反応し、Retainerは要求を保存しているとき他の要求を受け付けない性質がある。これらの特徴を駆使すればApplied Energetics 2のような高度な自動クラフトシステムを構築できるのではないか、という予想に基づいて作成を行った。

Material and Method

前述したようにMinecraftのバージョンは1.12.2、使用したModはBotania, レッドストーン配線のためのProjectRedとなっている。自動クラフトにはBotaniaのCrafty Crateを用いた。
回路作成にあたって、このような複雑なシステムの構築では、部分別に作成し、それらをつなぎ合わせる方が動作不良の原因がわかりやすく作業の効率化が図れる。今回は次のように回路を分けた。

(1). 注文を行う部分(Funnel, Index周辺)
(2). 注文が正常に行われたかどうか判定して注文しなおす部分
(3). 自動クラフトをする部分
(4). (2), (3)を接続してユニットとし、注文が競合しないようにユニットをコントロールする部分

(1). 注文を行う部分(Funnel, Index周辺)

まず(1)を作るにあたって、個数を調整するためにはFeedforward制御では現実的ではなくFeedback制御である必要がある。しかし、FunnelやIndexは注文された個数を満たしていなくても、Network内にある分だけ送ってしまう。そこで送られた先にもNetworkをつないで、Network内の個数が注文された個数を満たすまで処理を繰り返す設計にした。

Fig. 1. Funnelの場合でのFeedback制御

Figure. 1にFunnelの場合を示した。Funnelは直接インベントリに送るので非常にシンプルな形となった。

Fig. 2. Indexの場合でのFeedback制御

Figure. 2にIndexの場合を示した。Indexは使用すると送られてきたアイテムがばらけて空中に散らばるためホッパーで回収する機構になった。Hopperhockでは動作速度が足りなかった。中心部分のIndexにはMaster Corporea Sparkを付けた。一番下のhopperにリピータがついているのは自動クラフトが終わるまでChestに入らないようにするためのもの(詳しくは後述)でChestにCorporea Sparkをつければ、なくてもよい。

(2). 注文が正常に行われたかどうか判定して注文しなおす部分

Fig. 3. 再発注機構

(2)は満たされなかった要求に対し、自動クラフトの指令と再要求をする機構である。Figure. 3はOak Wood Planksを再発注する最もシンプルな機構である。Intercepterを2つのRetainerで挟んだ形になっており、IntercepterからつながったリピータはOak Wood Planksをクラフトする時間より長い必要がある。Retainerによって再要求された要求は、再び要求が満たされない場合に再要求したRetainerには保存されない。したがってこの図のように2つのRetainerを用いる必要がある。

(3). 自動クラフトをする部分

Fig. 4. Oak Wood Planksを自動クラフトする機構

(3)では(2)からレッドストーン信号が送られてくることを想定し、レッドストーン信号に対し自動クラフトを試みる機構である。Figure. 4はレッドストーン信号が入力された時にOak Wood Planksを自動クラフトする最もシンプルな機構である。より複雑なものでは以下に示したFigure. 5のようになる。

Fig. 5. Oak Fenceを自動クラフトする機構

Figure. 5では、ほぼ同時に複数のFunnelから同じアイテムが要求される。この場合(4)で言及したような注文の競合が発生する可能性があり、その場合にFigure. 4のような構造では、クラフトが正常に行われず、最悪の場合はCrafty Crateが詰まり、人の手で修復しなければならない。これを解決するためにいったん必要なアイテムをホッパーのところで止めておき、すべてのアイテムがそろったときにクラフトをするという機構にした。この際、ホッパーにストックがあるときにその上のFunnelがItemを要求しないようにレッドストーン信号を操作している。この機構ではこの装置から材料が注文され注文の競合が起きた際に、Crafty Crateが詰まったり、装置が壊れたりすることはないが、Craftが行われない場合がある。つまり、レッドストーン信号が1度入力されたらクラフトが1回行われるといったFeedforward制御ができないため、Itemの個数が満たされるまで処理を繰り替えすFeedback制御をする必要がある。Crafty Crateは搬入の順番が異なっていてもCraftすることはできないため、ここではMana DetecterとPulse Mana Spreaderを使用して順番にホッパーを動かしている。ちなみにPulse Mana SpreaderとMana Detecterの先にはMana Poolを設置してそのMana PoolからMana SpreaderでPulse Mana Spreaderが送信するためのマナがあるもとのMana Poolに送り返すことでManaの全体量を減らさずに、つまり無限回動作させることができるようになっている。またCrafty Crateへの搬入はRed Stringed Containerを用いているが、残念ながらRed String Containerは8ブロックまでしか届かないので、作業台の9マスすべてを使うレシピの場合はCrafty Crateを挟み込むように反対側にも同じ機構を作る工夫がいる。

(4). (2), (3)を接続してユニットとし、注文が競合しないようにユニットをコントロールする部分

(4)について、(2)と(3)を接続するにはFigure. 6のように接続するだけでよい。ただし、この場合ではクラフト時間に合わせてRetainerが再要求するまでの時間を短くしている。これをユニット(Crafting Unit)とする。

Fig. 6. 再要求機構と自動クラフト機構をつなげたもの

クラフトの競合における問題点は次のようなものである。自動クラフトする際、クラフトにかかる時間は材料がすべてあらかじめNetwork内に存在する場合に最速となり、この時間をクラフト時間として再要求機構に組み込むのが望ましい。しかし、この時間で設定すると、材料がNetwork内になく材料のクラフトが要求される場合、材料のクラフト中に再注文が発生し、余分に材料がクラフトされてしまう。この問題点を解決するためにクラフトの競合を避ける必要がある。今回は、より1次資源(最初から材料としてNetwork内にあるべきもの)に近いもの(例:Oak Wood Planks)を優先度:高、遠いもの(例:Oak Fence)を優先度:低とし、あるユニットについてそのユニットより優先度の高いクラフトが行われている場合、そのユニットが動作を停止するように設計した。すなわちそのユニットの材料がクラフトされている間、そのユニットは動作しない設計である。これを実現するには、各ユニットからクラフト中であることを示すレッドストーン信号(以下Crafting Signal)を出力し、各ユニットに対してそのユニットより優先度の高いユニットから出力されるCrafting SignalのORがHのときそのユニットが停止するようにすればよい。しかし、ユニットが増えるごとにこのCrafting Signalは増え、100個目のユニットには99個のCrafting SignalのORを入力しなければならない。これは非現実的である。ユニットA, B, C, ….のCrafting SignalをそれぞれA, B, C, ….とするとユニットB, C, Dに入力される論理値Z(X)は次のようになる。

ユニットB:Z(B)=A
ユニットC:Z(C)=A+B
ユニットD:Z(D)=A+B+C
 
これは次のように表しなおすことができる。
 
ユニットB:Z(B)=A
ユニットC:Z(C)=Z(B)+B
ユニットD:Z(D)=Z(C)+C
 
これはAとB、BとCの出力をリピータでつなぎ、優先度が高い方へ逆流しないようにすれば、1本の信号線で論理値的には完結できることを示している。しかし、実際にはこれらのCrafting Unitは時間管理されており、リピータの2 game tickの遅延は複数個重なることによって数十秒もの遅延を生み出し、拡張性のあるクラフト競合の対策とはいえない。そこで今回はこのリピータの代わりにMod環境でありながら無遅延リピータを使用した。

Fig. 7. 無遅延リピータ

使用した無遅延リピータは一般的によく使用されるものなので、使い方、仕様については省略する。このタイプの無遅延リピータはパルスに弱い特徴があるが、Crafting Signalの配線にProject RedのInsulated Wireを使用するにあたってレッドストーンブロックによって出力されるこの形が最適であると判断した。この無遅延リピータはON、OFFともに無遅延であるが、ユニットが動作を再開するまでの処理時間を考慮して、OFFの場合は逆に遅延させる必要がある。これはバニラのリピータを並列に接続することで解決できる。これらによって構成されるCrafting Signalが1本にまとめられた信号線をCrafting Busと呼ぶことにする。
また、あるユニットに対して、Crafting BusがHのときそのユニットは動作をしないだけでなく、Intercepterからの情報も保持している必要がある。これはFigure. 8に示されるようなバッファと遮断回路を追加すればよい。これをすることによって材料のクラフトが終わってから再びクラフトが始まり材料の余分な注文が避けられる。

Fig. 8. Crafting Busつきユニット

Crafting Busに入力するにあたって速度を求めるならばクラフト指令が送られる(上の図だとFunnelに信号が入る)のと同時でなければならないが、クラフト指令はパルス信号であるためにクラフト中ずっと信号が出続けるような回路を挟む必要がある。そこで採用したのがコンパレータを使ったOFF遅延回路(タイマー)である(Figure. 9)。

Fig. 9. コンパレータ式OFF遅延回路

Results

Figure. 10に前項の(1), (2), (3), (4)を組み合わせたものを示した。Crafting Busはここでは黄色のInsulated Wireである。Indexの部分にレッドストーンランプを取り付けて自動クラフト中であることを示せるようにした。またFig. 2のリピータにCrafting Busの最後尾を接続し、出力用チェストとCorporea Networkを分離した。

Fig. 10. 全体像

上の図では右方向に無限に拡張可能であり、ユニット化したことでスペースはとるもののFig. 5のような複雑なレシピも簡単に登録できる。

Discussion

これにて要求からクラフトまでを自動化した、いわゆるAE2のME倉庫のようなものが完成した。だが、実際のこの装置には問題点がある。それは内部にある程度在庫があるとき、注文した数だけでなく追加で「在庫÷一度のクラフトでできる数の余り」が送られてくる場合がある。これはCorporea Sparkの接続の方法と場所依存であり、根本的な解決はない。技術的な話をするとCorporea Networkは内部システムでCacheを形成しており、おそらくNetwork内のすべてのCorporea Sparkを取り除くことでリセットでき、それを再設置することで問題を解決できる可能性があるが、あまり現実的ではない。

Conclusions

ここまででBotaniaのCorporea Networkにおける自動クラフトシステムが実現可能であることを示した。しかし、実際にこれをサバイバルで作るには相当なコストと時間とスペースが必要であり、これらの機能が追加されるModであるApplied Energetics 2やRefined Storageを素直に使った方がよいだろう。これらに飽きた人やロマンを追い求める人にはぜひチャレンジしてみてほしい。

Acknowledged

このプロジェクトを実行するにあたってMatchaCraft96(twitter : @MatchaCraft96)による協力があったことについてこの場で感謝の意を表する。

Reference

Vazkii Botania 1.12.2-final https://github.com/VazkiiMods/Botania/tree/1.12-final (visit 2023/04/23)


この記事が気に入ったらサポートをしてみませんか?