はじめに
少しだけ間が空きましたが、
で紹介したプログラムの解説です。
プログラムのインストール
「obsigen」という名前でプログラムをインストール
> pastebin get fh4TPjsq obsigen
プログラムの実行
何か引数を与えて実行すると、施設建設→黒曜石生成
> obsigen build
すでに施設があるなら、引数無しで実行して黒曜石生成
> obsigen
プログラム解説
設定(config)項目
BLOCK = 13 CHEST = 14 WATER = 15 FUEL = 16 MIN_FUEL_LEVEL = 40 REDSTONE = 1 LAVE = 2 OBSIDIAN = 3
それぞれ必要なアイテム(ブロック)をどのスロットに入れるかを設定します。 またMIN_FUEL_LEVELは、施設建設に必要な燃料(移動数)ですが、特に変える必要はありません。
メイン部分
- L121-148: 大きく3つとなります。
- 要求アイテムが指定したスロットにセットされるまで待つ部分(L123-131)、施設を建設する部分(L133-139)、そして持っているレッドストーンを使って黒曜石を製造する部分(L141-148)です。
アイテム準備部分
- L122: プログラム実行時の引数を変数argsに代入しています。
- このプログラムの仕様として、何か引数を与えたら施設を建設し、与えなかったら建設せずにすぐに黒曜石生成に入ります。
- L123-128: 何らかの引数が指定されていたら施設を建設しなくてはならないので、建設用アイテムを要求し、指定スロットに指定個数が挿入されるまで待ちます。
- L130-131: 黒曜石生成に必要なアイテムを要求し、待ちます。
建設部分
- 引数が何か指定されていたら建設を開始します。
- build()、build2()、build3()という関数を指定していますが、それぞれ移動&方向転換&ブロック設置を繰り返しているだけです。
黒曜石生成
- L141: レッドストーンが何個あるのかを数えて、
- L144-148: その回数だけ黒曜石を生成しようとします。
- 黒曜石生成のために行う手順を、レッドストーン設置(placeRedstone())、溶岩設置(placeLave())、黒曜石採掘(digObsidian())という3つのサブ関数に分けて、プログラムの見通しをよくしています。
自分で定義した関数
- L22-35: レッドストーン設置(placeRedstone())、溶岩設置(placeLave())、黒曜石採掘(digObsidian())については、見たとおりですね。
L66-119: 施設建設のための手順を大きく3つに分けて実行しています。
- 同じことの繰り返し部分については、forループで実行したり、
- あるいは、指定した関数を指定した回数だけ繰り返す関数(loop())などを作って見やすくしています。
L30-47: waitForEnoughItems(itemName, n, slot)
- 指定スロットに指定個数のアイテムが挿入されるのを待つ関数です。今回は必要なアイテムが多いので、この関数を多用しています。
- インベントリの指定スロット内容の変化を
os.pullEvent("turtle_inventory")
で監視します。 - 指定スロットのアイテムが、指定数以上あるかどうかを監視しますが、アイテムそのものが間違えていないかどうか(たとえばそれが本当に溶岩バケツかどうか)は監視していないので注意。
L49-64: waitForEnoughFuel(minLevel, slot)
- インベントリの指定スロット内容の変化を
os.pullEvent("turtle_inventory")
で監視します。 - 必要最小限の燃料minLevelあるかどうかを調べて、補給されるまで待ちます。
- インベントリの指定スロット内容の変化を
まとめと次回について
この施設を少し工夫することで、丸石製造機にできます。次回はその方法について解説しましょう。
またちょっと強引ですが、無理やり焼石製造機にすることもできます。 焼石を回収するためにはシルクタッチが必要なので、シルクタッチタートルを使う必要があるのが難点ですけど:P