Mindustry ロジックノート 第一編 (コマンド概覧)

この記事では、主に説明していくのは各種コマンドの使い方、そして軽い使用例を説明していく。
これらは今後のため(主に自分のため)にまとめられたものである。
この記事の一番の目的は「ロジックでこんなのを作りたい!」とアイデアが出た際に、手っ取り早く実現させるためのチートシートにする事である。
そのため、第一編でコマンドを軽く解説したあと、第二編以降では実際に使われているロジックにどのようにコマンドが埋め込まれているかに焦点を当てて解説していく(予定)。
おことわり
- ロジックの使い方を丁寧に教える記事ではない。
- この記事を読むにはプログラミングのイロハくらいの知識がある方が良いかもしれない。
- 筆者は別にロジックのプロでもなんでもなくて人様のロジックを少し自分好みに改変するくらいしかしてないので誤ったことを書いている可能性がある。
- タイトルにロジックノートと書いてあるがルーター・ソーターの話も含むかもしれない。
- そもそも Mindustry を1番やってた時期が V5 の頃なのでロジックに関しては全く明るくない。間違いがあればぜひご教授ください。
- 筆者は受験生で休憩時間にこの記事を書いているため、第二編以降は出てこないかもしれない。
ロジック概覧
Read/Write
- メモリーセルやメモリーバンクから指定セルの値を読み取る/書き込む。
- アドレスには数字のみならず文字列も指定可能という噂があるが要検証。
Draw/DrawFlush
- 描画ができる。Drawで溜め込み、Flushで吐き出し。
- 使いこなせる気がしない。グラフ描画はできるようになりたい。
- ちなみに画像を Mindustry の描画ロジックに落とし込んでくれるツールがある。詳細はこちらを参照の事 → 画像をディスプレイアートにするMod
Print/PrintFlush
- Print で出力したい文字をバッファに溜め込み、PrintFlush で吐き出す。
[color]
で色を指定できる。使用できる色のリストは分からない。追記: ulwepoさんが色の記事を書いてました "result is {var}"
とか"result is "var
みたいな書き方はどうやらできない。諦めて Print 文を2回書くこと。
GetLink
- リンクした順でブロックを管理したい時に使う。
- ループを用いて、種類を問わず全ブロックに同じ操作をしたい時などに使う事もできる。
- GetLink 1つだけを使うロジックもある。”フレアにアイテムを運ばせる” の項で説明する予定。
Control
- ブロックの大体の操作できる。何ができるかはプルダウンで纏められているし特に説明することもないので割愛。
- 特筆すべきはDisabledの存在で、ブロックに
disabled=1
を指定するとそのブロックは動作をしなくなる。- アイテム工場のみならずコンベア、発電機などにも指定できる。
- 冷却水が不足した際にトリウムリアクターを停止させるロジックなどは有名。(詳細はコンボ集から参照)
- 条件を満たさなくなったら自動的に
disabled=0
にはなるが結構タイムラグがあるので自分でdisabled=0
を記述しておいた方が良い。
Rader
- ブロックの周囲の情報を取得できる。
- 検知できる範囲はRaderの対象がタレットなら射程範囲と同じになるらしい。
- タレットでない場合はよくわからない。
- 敵が来た時だけ展開するシールド等。詳細はコンボ集から。
Sensor
- 指定したブロック、ユニットの情報を取得できる。
- ほぼ全情報が扱える。チート。
- ただしシールドの情報は扱えない。
Set
- 変数/定数の値の設定。
- 別に Set 文を記述せずとも Sensor とかで直接値を代入して扱える。
Operation
- あらゆる演算をする。
- 四則演算、論理演算、max/min、bitシフト、三角関数、ベクトル… 大抵の計算はできる。
- ベクトルと角度計算の機能も用意されているのでわざわざ自分で三角関数を使用する必要がないことに注意(1敗)。
Jump
- while文にもIf文にもなる。
- 毎回実行されるので無限ループを自分で書く必要は無い。
- ただし変数の情報とかを保存して置きたいのなら自分で無限ループを書く必要はある。
- Ifみたいにして使う時は否定の条件を書く必要があることに注意。If文のノリとは逆
- Or/Andを使いたい時は Jump を複数書かずに Operation を使用する。可読性のため。
End
- Return文。
Unit Bind
- 指定した種類のユニットを管理下に置ける。これを実行した段階では特に何も起きない。
- 後述のBind以外のUnit系コマンドを実行するとバインドされたユニットは即座に停止して指示待ち状態になる。
- コマンドを実行しないまま数秒経ったら指示待ち状態が解除されて司令塔の指示に従うようになる。
- 見つけてきたユニットの情報が
@unit
に格納される。
sensor @unit hp;
if hp < 50:
unit locate nearest repair point
- 上記のような気持ちのコードを書けば(お気持ちコードです、動きません!)HP が 50 以下のユニットだけ勝手に動いてくれる。HP が 50 以上のユニットの動きを阻害する事はない。
- 良くわからないけど unitBind 1 つで全種類のユニットを操作できる。恐らくUnitBindをするたびに Mindustry 側で次のユニットを指定してくれているのだと思う。
UnitLocate
- 最寄りの指定した種類のブロックを探してデータに格納してくれる。
- HPが少なくなったら自動的に最寄りの修復ポイントに向かうようにしたり。
UnidRader
- RaderのUnit版。特になし。使い所があまり思いつかない。と思っていたが キモい面白いロジックがSakuraDiscordに投下されていたので余裕があったら紹介しようと思う。内容はフレアがスキャッターを避けながらコアに向かうというもの。
UnitControl
- Unitを直接操作した時にできる操作が全部できる。
- またflagを立てることでユニットを1体コントロールする、みたいなことが出来るようになる。詳しい使い方は後述。
次回予告;ロジックコンボ集
ただコマンドの説明を書いても使い方がわからなければ意味が無い。なので次回は実際にどのようなロジックがどのように組み込まれているかを説明していく。
基本
プログラミングをよく知らなくても気合いで何とか使いこなせるようになるもの。
- ユニットに爆発性化合物を持たせる
- ユニットの全自動回復装置
- トリウムリアクターを爆発から守る
- ヘイルと力場プロジェクター
発展
少し難易度が上がる。この記事に載っていない知識も必要になるかもしれない。
- タレットの回転や操作
- 電気残量のアナログ表示
- ゼニスのリモコン
- フレアにアイテムを運ばせる
超発展
筆者がこれすげーってずっと書くだけ。(私が)自力で作れるようになりたい。
- サージ合金工場
- t5スクラップ工場