それでは自動クラフトプログラムの改良をすすめましょう。
まずは、
チュートリアル(3)で掲載したプログラム仕様と今回の改良の方針についてまとめておきます。
改良の方針
改良前(チュートリアル(3))の仕様
- 1個のアイテムをそのままクラフトするようなレシピに対応
- たとえばサトウキビ1個→砂糖 など
- プログラムは、真上のチェストから材料を1スタック取りクラフト、という動作を繰り返す。
- 材料がなくなったら終了。
改良後の仕様
改良前の仕様に加えて、
- 1種類の材料を使うクラフトであればどんなレシピでも対応。
- 材料の並べ方をあらかじめプログラム中で登録しておく必要あり
- 1x1レシピ、2x2レシピ、3x3レシピ、3x3ドーナツ型レシピ についてはすでに登録済み
- プログラム実行時にどのレシピを使用するかレシピ番号を指定
- 特に指定しない場合は、デフォルトのレシピを使用する
プログラム
プログラムの簡単な解説
チュートリアル(3)のプログラムから変わった場所は大きく5か所あります。順番に説明しましょう。
- L21-28: 設定項目としてレシピの登録と、標準で使うレシピを指定
- L53-63: 汎用のアイテム等分配関数 distmaterials() の定義
- L65: craft1x1()からauto_craft()と関数の名前だけ変更
- L79-86: プログラム実行時の引数の処理(引数からどのレシピを使うかなど)
- L91-92: クラフト(auto_craft)の直前にアイテム分配関数(distmaterials)を実行
設定項目(L21-28)
- N_DEFAULT_RECIPE = 1
引数を何も入れずにプログラムを実行したときに使うデフォルトのレシピ番号。
ここではレシピ1を使います。
- RECIPE[2] = {1,2,5,6}
アイテムを振り分けるスロット番号を(テーブル型で)記載することでレシピを登録できる。
プログラム中では、計4つのレシピを登録済みです。
distmaterials() の定義(L53-63)
材料アイテムを指定したスロットに等分配する関数。
チュートリアル(4)で解説済みなので詳しくは省略。
関数名の変更(L65)
やっている内容は変わらないのだけど、craft1x1()という名前だと現状に合わないので、auto_craft()に名前だけ変更。
引数の処理(L79-86)
プログラム実行時の引数の処理部分。
簡単に言うと、
- 引数が指定してあって、なおかつその引数がちゃんとしたレシピ番号であるなら、レシピを変数名slots_patternに代入
- 引数を指定していなかったらデフォルトのレシピ番号を使い、そのレシピを変数名slots_patternに代入
メイン部分の微調整(L91-92)
クラフト(auto_craft)の直前にアイテム等分配関数(distmaterials)を実行することで、
色々なレシピに対応できるようになった。
まとめ
これで自動クラフトプログラムは一応の完成です。
面倒なクラフトの一部をタートル君にまかせることができるので、かなり楽ができるでしょう。
次回は、このプログラムとApplied Enegisticsとの連携について紹介します。
農場でもいいし工場でもいい、とにかく生産ラインの中にこのタートルを組み込む場合について、試行錯誤してみましょう。