Skip to main content
Lua Script ブロック(マイクロコントローラー内部の type 56)は、マイクロコントローラー内で Lua コードを実行します。ゲーム本体が提供する Lua 環境は Lua 5.3 相当です。

基本制約

  • スクリプトの長さは 最大 8192 文字です。
  • ピン構成は固定です。in1 = Composite 入力、in2 = Video 入力、out1 = Composite 出力、out2 = Video 出力。
  • Composite の入出力チャンネルは 1〜32 で扱います(信号モデル を参照)。

onTick と onDraw

スクリプトは onTick()onDraw() という2つの関数(定義してあれば呼ばれる)を中心に動作します。

onTick()

  • 物理ティックごとに呼び出されます(60Hz)。引数はありません。
  • input.* / output.* はこの関数の中でのみ呼び出せます。screen.* はここでは呼べません。
  • 実行に 16ms を超えると、物理エンジンの進行が遅くなります。

onDraw()

  • onTick() の直後、接続されている電源オンのモニター1台につき1回呼び出されます。モニターが接続されていなければ呼ばれません。
  • screen.* はこの関数の中でのみ呼び出せます。input.* / output.* はここでは呼べません。
  • onTick() で読んだ値を変数に保存しておき、onDraw() で使うのが基本的な書き方です。
  • ゲームが一時停止している間は onTick() / onDraw() のどちらも呼ばれません。
onTick() / onDraw() を含め、Lua が呼び出されるあらゆる場面で実行時間が 1000ms を超えると、その Lua はクラッシュします。クラッシュするとエラー画面が表示され、以降そのスクリプトは処理されなくなります。復帰するにはワークベンチに戻る必要があります。

Composite I/O

Composite 信号のチャンネル 1〜32 に対して読み書きします。
output.setNumber / output.setBool で一度書いた値は、次に上書きするまで保持されます。毎ティック 0 にリセットされるわけではありません。

Property API

マイクロコントローラーのプロパティパネルに配置した Property ブロックの値を読みます。ラベルは大文字・小文字を区別します。

Screen API(onDraw 内のみ)

screen.drawText のフォントサイズは固定で、1文字4×5ピクセルです。screen.getWidth() / screen.getHeight() はモニターの解像度をピクセル単位で返し、モニター1ブロックあたり32ピクセルです。 screen.setMapColorOcean / screen.setMapColorLand などのマップ描画用の色設定関数もあります(Ocean・Shallows・Land・Grass・Sand・Snow・Rock・Gravel の各要素に対応)。

Map API

画面上のピクセル座標とワールド座標を相互変換します。どちらも2つの値を返します。

HTTP API

localhost への GET リクエストを送信します。1ティックにつき1リクエストまでです。応答は httpReply(port, request, response) というコールバック関数で受け取ります。

タッチスクリーン入力

タッチスクリーン対応モニターを接続すると、Composite 入力に次のチャンネルが自動的に設定されます。
タッチが離されると Bool のタッチ中フラグは false になりますが、X・Y の座標値は最後にタッチしていた値を保持し続けます。

利用可能な標準ライブラリ

math.atan は1引数・2引数のどちらの呼び出し方にも対応しますが、math.atan2 という別名の関数は存在しません。
io, os, require, load, dofile, loadfile, debug, rawset, rawget は使用できません。print によるコンソール出力もありません。

その他の注意点

  • Lua はサーバーと各クライアントで独立して実行されます。マルチプレイでは math.random() の結果がクライアントごとに異なります。Composite の入出力は同期されますが、screen.* による描画結果はクライアントごとに異なる場合があります。
  • ビークルがアンロード(デスポーン)されると、Lua のすべての変数がリセットされます。ティックをまたいで値を保持したい場合は、Memory Register ブロックなどロジック側の状態を使う必要があります。