読者です 読者をやめる 読者になる 読者になる

Minecraftとタートルと僕

PCゲームMinecraftのMOD「ComputerCraft」の情報を集めたニッチなブログです。

Redstone APIを使ってレッドストーン信号を出そう

今回の内容

redstone API説明してクラフティタートルプログラムの完成版を出そうと思ったら、
内容が多すぎてそこまでいかなかった・・・。プログラムは次回かな。

今回は、以下の内容でチュートリアルを進めましょう。

  • CCのLuaインタプリンタの説明
  • CCではレッドストーン信号をどうやって扱うのか
  • MFR2のRednet Cable便利すぎるのでその取り扱い説明
  • CCとRednet Cableの連携

Luaインタプリンタ

「今すぐレッドストーン信号ONにしたい」「そしてすぐに信号OFFにしたい」「ちょっとタートルの向きを変えたい」「真上に1ブロック分だけ移動させたい」などなど、
これらを実現するためには、はあらかじめ用意されたAPIを使わなくてはなりません。
しかし、少しだけAPI使いたいだけなのに、プログラム書いて、ファイルを保存して、実行してと毎回繰り返すのは面倒でわずらわしいのです。

そのようなときには、「Luaインタプリンタ」を利用してみましょう。
Luaインタプリンタを起動して、「Luaインタラクティブモード」にすることで、「少しだけAPIを使う」ことが手軽にできます。

Luaインタラクティブモード

  • f:id:hevohevo:20131215163713p:plain:w400
  • コンピュータ(タートル)の画面で、「lua」(エルユーエー)と打ち込み、Luaインタプリンタを起動。
  • Luaインタラクティブモードに切り替わったら、1行プログラムを書いてエンターキーを押そう。Luaインタプリンタがそれを逐次実行してくれる。
  • つまりこれは、「1行のLuaプログラムを入力→コンピュータがそれを実行」というインタラクティブなLuaプログラム実行環境。
  • たとえばここで、「turtle.turnRight()」と打ち込むと、タートルが右を向く。
  • なお、Luaインタプリンタを終了するには、「exit()」と打ち込めばいい。

それでは、Luaインタプリンタを使って、レッドストーン信号を出してみましょう。

レッドストーン信号を出す

  • f:id:hevohevo:20131215162408p:plain:w400
  • 図のように、タートルの左側にレッドストーンを敷いておく。
  • タートルの画面で、Luaインタプリンタ起動。以下を入力するとレッドストーン信号がONになる。
> rs.setOutput("left", true)
  • OFFにするには、以下を入力。
> rs.setOutput("left", false)

これで、任意のタイミングでレッドストーン信号を出すことができます。
たとえば、レッドストーンの先に扉があれば、好きなタイミングで開閉できるように。

しかしここで考えてみましょう。レッドストーンは、RS信号伝達手段としては制限が多すぎ、使いにくくないですか?
ブロックの上にしか設置できない、隣り合うと繋がってしまうため複数個所で使い分けるには隙間を空けたりして工夫しなくてはならない、高低差がある場所を繋ぐのに苦労する、信号が減衰するのでリピータを入れなくてはいけない、などなど。

次に紹介するMineFactoryReloaded2(MFR2)のRednetCable にはこのような制限がありません。

RednetCableを使う

特徴と基本知識

MFR2のRednetCableは、以下のような特徴があります。

  • レッドストーンと違い、立体的に設置できる。高いところに伝達するのがとても楽に!
  • ケーブルを16色に色分けでき、各色ごとに信号を入出力できる。
  • 信号が減衰しない。

百聞は一見にしかず、まずは単純に配線してみましょう。

「Standard Connection Mode」
  • f:id:hevohevo:20131216221819p:plain:w400
  • タートルの左側にRednetCableを3本引くことで、タートルとレッドストーンランプを繋ぐ。
  • 赤丸に注目。この状態は「Standard Connection Mode」と呼ばれ、「タートル→ランプ」という一方通行の信号伝達になる。

さて次に、RednetCableの中央にある赤い部分を、MFR2のPrecision-Sledge-Hammerなどで右クリックしましょう。次のような形状に変わり、モードが切り替わります。

「Forced connection mode」
  • f:id:hevohevo:20131215162434p:plain:w400
  • このモードは、タートル→ランプだけではなく、ランプ→タートルという双方向の信号を伝えることができる。
  • たとえばランプに直接レバーを貼り付けてONにすると、タートル側にもON信号が伝わる。
  • またこれは白ケーブルなので、他の白ケーブルにも信号を伝達できる(ケーブルの色については後述)。

そして、さらにRednetCableを右クリックすると、以下のモードに切り替わります。

「cable-only connection mode」
  • f:id:hevohevo:20131215162440p:plain:w400
  • ケーブルとしか繋がっておらず、隣接するブロックには信号を伝えない。

色分けしつつ配線しよう

  • f:id:hevohevo:20131215184324p:plain:w600

上図を見てください。注目してほしいのは赤丸部分です。左から順に黄色・青・白となっています。
色のついた部分を右クリックすることで計16色、次々と変更できます。

それでは、青色ケーブルにだけレッドストーン信号を出しましょう
例によって、タートルでLuaインタプリンタを起動して、次のようなプログラムを打ち込むと、上図のように青ケーブルの先にあるランプが点灯します。

> rs.setBundledOutput("left", colors.blue)

ここで注意点。
RednetCableは、前述のrs.setOutput系の関数が使えません。
「どの色のケーブルに出力するか」という部分が重要になるので、Redstone APIの中でも「Bundled」系の関数しか利用できません。

またrs.setBundledOutputは、何らかの色を指定したらその他の色はOFFとなります。
そして全色OFFにするためには、色を指定する箇所に「0」(ゼロ)を入れます。

この色分けのおかげで、次のような面白いこともできます。

  • f:id:hevohevo:20131215190004p:plain:w500
一度に複数の色ケーブルを指定する方法

(2014.1.14追記)
colors.whiteは定数で、その実態は数値です。

> print(colors.white)
1

そして複数の色を指定したいときにはそれら数値の和*1を指定することになっています。
つまり、白(1)とオレンジ(2)の2色を同時に指定したいならば、和である「3」を指定します。
これは次のように記述できます。

-- 白とオレンジケーブルにRS信号を送る(非推奨)
> rs.setBundledOutput("left", colors.white + colors.orange)

ただしこのような単純に和(+)を取る方法だと、次のようなときに問題が出ます。

-- 白(1)と白(1)を足して・・・・・オレンジ(2)! え?w
> rs.setBundledOutput("left", colors.white + colors.white)

このようなトラブルを避けるために、Colors APIに専用の関数「colors.combine()」があるので、こちらを積極的に使いましょう。

-- 白とオレンジケーブルにRS信号を送る(こちらを推奨)
> color_set = colors.combine(colors.white, colors.orange)
> rs.setBundledOutput("left", color_set)
-- 単純な和(+)ではなく内部でビット論理和(bor)を行うことで、まるで集合演算のように振る舞う。
-- そのため、次のようないじわるな記述にも正常対応可
> color_set = colors.combine(colors.white, colors.white)
> print(color_set)
1 -- つまりcolors.white

(参考資料)
http://computercraft.info/wiki/Colors_(API)
http://www50.atwiki.jp/mccc/pages/16.html#id_81ad7043
(追記ここまで)

まとめ

今回は、MFR2のRednetCableの便利さアピールと、CCとの連携について解説してみました。
次回こそはクラフティプログラムをまとめたいと思います。

以下に、非公式CC WikiのAPIページへのリンクをまとめておくので、
熟読して、Redstone APIをマスターしてください。

*1:正確には数値を2進数表現したときのビット演算論理和(bor)。ビット演算なんてわからないよ!という初心者の方のためにColors APIに専用の関数が用意されているので大丈夫。