ロジック/サンプルプログラム

Last-modified: 2024-03-01 (金) 13:18:00

※使用方法からサンプルプログラムのみこちらに移動

コード表記ガイド

sensor result = @copper in block1
set A = 100
op sub result a b

上記の場合、以下のルールでマークアップする

  • 紫(Purple): 固定のコマンド
  • 暗い赤(Maroon): 選択式のサブコマンド
  • 黒(Black): 変数、他の変数とかぶらなければ半角英数で好きな名称にしてOK(数字単体や先頭数字はNG)
  • 緑(Green): 組み込み変数、先頭に@マークがつきペンシルアイコンから選択も可能
  • 青緑(Teal): リンク名、プロセッサとリンクさせたときに表示される名称
  • オリーブ(Olive): 値、数値や文字など任意のもの

基礎・応用

スイッチの使い方とenabled

スイッチの使い方とenabled.gif
スクリーンショット 2020-12-29 21.05.33.png
スクリーンショット 2020-12-29 21.05.51.png

sensor result switch1 @enabled
control enabled drill1 result 0 result 0
control enabled unloader1 result 0 result 0
control shoot ripple1 0 0 result 0

enabledというのは簡単に言うと「稼働しているか否か」のこと
1なら稼働している 0なら稼働していない
上のプログラムではレーザードリルと搬出機とリップルのenabledを変更することで動かしたり止めたりしている
sensor result switch1 @enabled でスイッチのオンオフを取得できる
スイッチがオンなら変数resultに1が代入される オフなら変数resultに0が代入される

enabled応用編 自爆しないトリウムリアクター

enabled応用編 自爆しないトリウムリアクター.gif
スクリーンショット 2020-12-29 22.03.51.png
スクリーンショット 2020-12-29 22.05.49.png

sensor result reactor1 @cryofluid
control enabled reactor1 result 0 0 0

1行目でトリウムリアクターが持つ冷却水の量を取得する
2行目で、冷却水が0ならトリウムリアクターを停止し、0でないなら動かす
上で「1なら稼働している」と書いたけど、正しくは「0でないなら稼働している」らしい。

Get Linkを使って複数のトリウムリアクターを同時に操作する

スクリーンショット 2021-01-11 22.03.33.png
スクリーンショット 2021-01-11 21.48.52.png

getlink result bango
control enabled result 0 0 0 0
op add bango bango 1
jump 5 lessThanEq bango 99
set bango 0
end

GetLinkを使えば「n番目にこのプロセッサーにリンクした建造物」を取得できる
例えばgetlink result 0 でひとつ目にリンクした建造物の情報が変数resultに格納される
今回は変数bangoが0~100である各場合について「getlink result bangoで得られた建造物のenabledを0にする」という処理をした
要はすべてオフにした
リンクさせるだけで同じ処理を加えられるので同じ種類の建造物を複数含む大規模なシステムを作るときに便利かもしれない

ユニットにユニットを見つけさせるUnit Radar

ユニットにユニットを見つけさせるUnit Radar.gif
スクリーンショット 2021-01-01 1.23.25_0.png

ubind @nova
uradar player any any health turret1 1 result
sensor xzahyo result @x
sensor yzahyo result @y
ucontrol move xzahyo yzahyo 0 0 0
ucontrol targetp result 1 0 0 0

Unit Radarを使えばユニットにユニットを見つけさせることができる
今回はplayer any anyと指定し、プレイヤーを見つけさせた

「どのユニットであるか」という情報が変数resultに格納される。
sensor xzahyo result @x で、resultのユニットのx座標を取得し、
sensor yzahyo result @y で、resultのユニットのy座標を取得することができる
それぞれを変数xzahyo 変数yzahyoに代入する

ucontrol move xzahyo yzahyo 0 0 0
バインドしたユニットを、プレイヤーが居る座標まで移動させることで、プレイヤーの後ろをついてくるユニットを作れる(かわいい)
せっかくだからucontrol targetp result 1 0 0 0 でresultのユニットが居る座標に射撃させてみた ユニットを治療できるユニットなんかが実装されてるなら便利かも?

アイテム管理

configureを使った反転ソーターの操作

configureを使った反転ソーターの操作01.gif
スクリーンショット 2021-01-01 15.17.10.png

sensor result switch1 @enabled
jump 4 equal result 1
control configure sorter1 @copper 0 0 0
end
control configure sorter1 @lead 0 0 0
end

configureというのはコレ↓のこと
スクリーンショット 2021-01-01 15.18.29.png
反転じゃないほうのソーサー、搬出機、アイテムソースについても同じ。ユニット工場にどれを作らせるかもconfigureで操作できる
ジャンプ文があるので少しややこしいけど、
スイッチがオンなら反転ソーターのconfigureを鉛にして
スイッチがオフなら反転ソーターのconfigureを銅にする

@configをSensorすることで、どのアイテムが選択されているかを取得できる
組み込み変数である@configと@configureがそれぞれ何を意味してどう違うのか私にはよく分かりませんでした。詳しい人に追記をお願いします。
参考までに@configを取得してディスプレイに表示するサンプルプログラムを残しておきます
configureを使った反転ソーターの操作02.gif

sensor result sorter1 @config
drawflush display1
draw clear 0 0 0 32 0 0
draw image 25 25 result 32 0 0

おまけ
こういうコンパクトな合金溶鉱炉をマルチプレイでよく見る
これもロジックで搬出機のconfigureを操作してる
configureを使った反転ソーターの操作 合金溶鉱炉.gif

ユニットによる資源輸送(プロセッサーの範囲内の建造物から範囲内の建造物へ編)

ユニットによる資源輸送(プロセッサーの範囲内の建造物から範囲内の建造物へ編).gif
スクリーンショット 2021-01-01 22.26.11.png

ubind @mega
sensor mochimono @unit @thorium
jump 8 greaterThanEq mochimono 30
sensor xzahyo nucleus1 @x
sensor yzahyo nucleus1 @y
ucontrol move xzahyo yzahyo 0 0 0
ucontrol itemTake nucleus1 @thorium 30 0 0
end
sensor xzahyo vault1 @x
sensor yzahyo vault1 @y
ucontrol move xzahyo yzahyo 0 0 0
ucontrol itemDrop vault1 60 0 0 0
end

このロジックは3つの段階に分かれている
1.そのmegaがトリウムをいくつ持っているか取得する(2~3行目)
2.(30個未満なら)コアまで帰ってトリウムを30個引き出す(4~7行目) それから1行目に戻る(end)
3.(30個以上持ってるなら)ボールトへ行ってトリウムを60個置いてくる(9~12行目) それから1行目に戻る(end)

1は5chスレで話題に出たように、組み込み変数@unitを使えばそのユニット自身がトリウムをいくつ持っているかを参照できる
トリウムの所持数を変数mochimonoに代入し、それが30より多いか少ないかを判断する

2はUnit Control itemTakeという命令を使う
プレイヤーと同じように近くにある建造物からしかアイテムを引き出せないみたいなので、
まずそこまで移動させる必要がある(4~6行目)

3はUnit control itemDropという命令を使う
プレイヤーと同じように近くにある建造物へしかアイテムを納品できないみたいなので、
まずそこまで移動させる必要がある(9~11行目)

ここではmegaに輸送させてるけど、flare(空軍灰色のほうT1)に運ばせることが多いみたい(空軍緑は採掘だったりブロックの修復だったり別の仕事をしてくれるから)
この命令ではすべてのmegaを駆り出してしまうので、Unit Bindに工夫を加えて、1機のみ駆り出すとか3機まで駆り出すとか制限する必要がある
またプロセッサーの範囲外のコアから資源を輸送したい場合、Unit Locateを使って、ユニットにコアを発見させる必要がある

Unit Locateを使って、プロセッサーの範囲外のタイルや建造物を、ユニットに発見させる編

Unit Locateを使って、プロセッサーの範囲外のタイルや建造物を、ユニットに発見させる編.gif
スクリーンショット 2021-01-03 18.41.14.png

ubind @mega
ulocate building core false @titanium outx outy found building
ucontrol move outx outy 0 0 0

上のロジックでは、新しく生産されたmegaに味方のコアを見つけさせてそこに移動させている
Uint Locateのサブコマンドでは「ore(鉱石)」「building(建造物)」「spawn(敵の出現地点)」「damaged(被害を受けた建造物)」のいずれかを指定することができる
見つけたタイルや建造物のx座標とy座標をそれぞれ変数outxと変数outyに代入し、見つけられたかどうかを変数foundに代入し(見つけたなら1)、どの建造物であるかを変数buildingに代入する
サブコマンドbuildingのさらにサブコマンドで「core」「strage」「generator」など色々なものを見つけさせることができる
(余談だけどこのサブサブコマンドの中では、トリウムリアクターはreactorに属してインパクトリアクターはgeneratorに属するみたい。不思議)
enemyの欄で、敵と味方のどちらの施設を見つけるか指定できる。trueは敵、falseは味方。
どの建造物であるかを変数buildingに代入してくれるのが便利で、itemTakeとitemDropの命令文にbuildingと書き込めばうまくやってくれる
ucontrol itemTake building @thorium 30 0 0
ucontrol itemDrop building 60 0 0 0  みたいに書ける

ユニット1機のみの操作(コンテナからコアへのアイテム輸送)

Unit Bindだけでは同種の機体をまとめて操作することになるが、Flagを使用することで個別に使用可能(1機につき1プロセッサが必要な設計)
ユニット1機のみの操作(コンテナからコアへのアイテム輸送).gif

  • 配置例
    • プロセッサとコンテナ(container1)を接続しておく
    • 輸送機を生産しておく(速度が速いフレアがおすすめ)
      unit_cont_container_to_core.png
  • コード
    ※キャプチャは先頭で変数の宣言をしていないため少し内容が異なります。
    unit_cont_container_to_core_code.png
    set flag 1111
    set UType @flare
    set Item @titanium
    jump 8 notEqual @unit null
    ubind UType
    sensor f @unit @flag
    jump 8 equal f flag
    jump 4 notEqual f 0
    ucontrol flag flag dy 0 0 0
    sensor hold @unit @firstItem
    sensor capa @unit @itemCapacity
    jump 17 greaterThan hold 0
    sensor dx container1 @x
    sensor dy container1 @y
    ucontrol move dx dy 0 0 0
    ucontrol itemTake container1 Item capa 0 0
    end
    ulocate building core false @copper cx cy c core
    ucontrol move cx cy 0 0 0
    ucontrol itemDrop core 999 0 0 0
  • 上記のコードをコピー→クリップボードから読み込み
  • 変更箇所は上3行
    • 1行目 1111 : フラグ番号、複数のプロセッサで実行する場合は2台目以降この番号を1112など被らないものに変更して実行する
    • 2行目 "@flare" : 機体名称、フレア以外の機体にする場合はここを変更
    • 3行目 "@titanium" : アイテム名称、例ではチタンだが他のアイテムにしたい場合はここを変更
  • 設計解説
    • 1 ~ 3行目は変更して使うことが多い変数
    • 4 ~ 9行目は機体を1機確保してフラグを付与する、あるいは確保した機体のフラグが変数と一致するかで1機を指定するロジック
    • 10 ~ 11行目は機体のアイテム保有数と保有上限数を取得
    • 12行目で機体がアイテムを持っているかの分岐
    • 13 ~ 17行目はアイテムを持っていない場合、コンテナーからアイテムを機体の保有上限まで取得
    • 18 ~ 20行目はアイテムを持っている場合、コアに移動してアイテムを全て(999個で指定)格納する

「ユニット1機のみの操作」の応用編 :同じ設計図を複数置きたい

スクリーンショット 2021-01-11 23.41.33.png

jump 7 notEqual @unit null
op rand bango 99999999 b
ubind @flare
sensor F @unit @flag
jump 7 equal F bango
jump 1 notEqual F 0
end
ucontrol flag bango 0 0 0 0
sensor mochimono @unit @totalItems
jump 14 greaterThan mochimono 15
ulocate building core false @copper outx outy found building
ucontrol move outx outy 0 0 0
ucontrol itemTake building @silicon 30 0 0
end
sensor xzahyo dome1 @x
sensor yzahyo dome1 @y
ucontrol move xzahyo yzahyo 0 0 0
ucontrol itemDrop dome1 999 0 0 0
end
(シリコンを運ばせるプロセッサーのもの フェーズを運ばせるプロセッサーもだいたい同じ)

gifを軽くしてくれている人へ ありがとうございます 重いgifを貼ります ごめんなさい
このサンプルロジックのページの「ユニット1機のみの操作(コンテナからコアへのアイテム輸送)」の応用編
該当項目のロジックではユニットに「1111」というフラグを付けてバインドしているが
同じ設計図を複数置こうとしても同じ「1111」のユニットをバインドしたりしてしまってうまく行かなかった
じゃあバインドするたびに新しい番号を発行してフラグ付けしたら、違うユニットをうまくバインドできるのではないか?というコンセプトで作ったロジック
gifではわかりにくいけど、シリコンを運ばせるプロセッサーとフェーズを運ばせるプロセッサーとoverdrive domeからなる設計図をコピーして置くと、待機しているflareの中から新しくバインドされた個体がコアへと出発している うまくバインドできてる 同じ設計図を複数置けて便利
マルチプレイで使うときは、このロジックが「すでにフラグ付けされていたらそのユニットは誰かが使用中である」という前提で動いていることに注意すること
フラグ付けせずにコントロールするロジックや、フラグ付けだけして放置しているロジックなどとは共存できない

せっかくなので設計図を貼ります 良かったら使ってください
bXNjaAF4nAGFAnr9AAQAAwIABG5hbWUAEueVquWPt+ODqeODs+ODgOODoAALZGVzY3JpcHRpb24AAAIAD21pY3JvLXByb2Nlc3NvcgAOb3ZlcmRyaXZlLWRvbWUAAAADAAAAAAEOAAABDXicbVFNToUwEOaZuOkp5gImj6gx7lgoift3gQEGqLYdLK0BT+wtnvS1CBppwuKb728yhyw7fL16PcADGHbP7x4VFN5IB8YrJXgAi6aBCk3H8Jg+qISv5AIXrUJLYiQzsoUyKQPaieRKF8syOkQw36JKOAoyjfA1G2dZQZCmtGN8q7vmupeaDa8pjh2qF0d6TLZ30FlCR/bUo9nx83vhFdfLBCovVSNNBzVbghbVSFDUPAxkgb2bwm+Gln3YOXG3cpo/aEeL9X6mcqlywrddSDH0ONJNi5WVNdxGflg3rTR9Yj8zNKwph2Ja4fkXPP/JT6JE+qfDk12uFsXhVltqthw7u75Msqvz+RvAwatdAwAAAAACDgAAAQd4nG1RzU6EMBBmTbz0KeYRlqgx3npwSbzvCxQYoNp2sLQGfF0fZG23RdBIEw7f70zmUBSHr1evR3gEQ+707oUC7o10YLxSjEawwrRQC9MTPOUPauZrGWDeKWGRTWgmslBlZ0R7llPxGlmlhASWW1UFR4amZb4h4ywpiNbcdkxvTdfUDFKTobXFkRPqxaGecuw99BaFQ3sehNnpywfmFTWBgdpL1UrTQ0MWoRNqQuANjSNaIO/m+FugIx93ztptOE0fuJOl8X5YGUY5i7ddCZ+kkoGGuySNm+Zt5k8xLAQtaSyBzyu8/IKXP9XZlEX/1D/bcLBkjmfaWotw5+L2yhQ3l8s3U4+ppAMBAAIAAQACOoIcxA==
(余談だけどサンドボックスモードだとプロセッサーの建築が速すぎてうまくバインドできない 片方がフラグ付けするより早くもう一方が同じユニットをバインドしてしまう)

フラグの応用:指定した数のユニットを操作する(コアへのアイテム輸送)

使い方

  • 最初の3行で以下を設定
    • 1行目:どのアイテムを運ぶか
    • 2行目:どのユニットで運ぶか
    • 3行目:ユニットを何体動かすか
  • プロセッサを搬出元のストレージや工場などにリンクさせれば動き始める
  • UNumを0にすればここで確保したユニットのフラグを0に戻せる

注意点

  • あまり多くのユニットを確保すると動作が遅くなる
  • 輸送機が頻繁に死ぬ環境だとフラグ付けしたユニットが減少していく
  • もちろん、フラグを使わず無制限にバインドして操作するプログラムとは共存できない
set item @titanium
set UType @flare
set UNum 5
getlink from 0
jump 0 equal from null
sensor thisX @this @x
op floor thisX thisX 0
sensor thisY @this @y
op floor thisY thisY 0
op mul thisX2 thisX 1e4
op add flagBase thisX2 thisY
op rand r 999 0
op floor r r 0
op mul r r 1e8
op add flag r flagBase
set cnt -1
op add cnt cnt 1
jump 26 greaterThanEq cnt UNum
ubind UType
sensor f @unit @flag
op mod fBase f 1e8
jump 24 equal f null
jump 18 notEqual fBase flagBase
jump 33 equal f flag
ucontrol flag flag 0 0 0 0
jump 16 always 0 0
ubind UType
sensor f @unit @flag
op mod fBase f 1e8
jump 26 notEqual fBase flagBase
jump 33 equal f flag
ucontrol flag 0 0 0 0 0
jump 26 always 0 0
ubind UType
sensor f @unit @flag
jump 33 notEqual f flag
sensor hold @unit item
jump 43 notEqual hold 0
sensor x from @x
sensor y from @y
ucontrol move x y 0 0 0
ucontrol itemTake from item 999 0 0
jump 33 always 0 0
ulocate building core false 0 coreX coreY found core
ucontrol move coreX coreY 0 0 0
ucontrol itemDrop core 999 0 0 0
jump 33 always 0 0

コード解説

  • 4,5行目:リンクしている施設がない場合は動かないように
  • 6~15行目:フラグの設定(やってることは以下の2本の式と同等)
    • flagBase = floor(@x in @this) * 10^4 + floor(@y in @this)
    • flag = floor(rand(999)) * 10^8 + flagBase
      • rand,@x,@yで生成した数は全て実数値なので、floor関数で整数にしないと下の桁と混ざる
    • flagの下8桁(flagBase)はプロセッサのxy座標によって定まる識別子として使う
    • flagの上3桁は乱数(設定変更などでプロセッサが再起動されるたびに更新される)
  • 16~26行目(1つ目のubindの3行前から):ループを回し、指定された数のユニットにフラグを付ける
    • 22~24行目:ユニットのフラグに応じて場合分け
      • 他のプロセッサによってフラグ付けされていた場合:別のユニットをバインド
      • フラグ付けされていなかった場合:フラグ付け
      • フラグの下8桁(Base)のみが一致:乱数部分を上書き
      • フラグが(乱数部を含め)完全一致:現在のループで発行されたフラグなので、一通りのユニットを走査し終えたと判断し、ループ終了
  • 27~33行目(2つ目のubind以降):フラグの下8桁(Base)に基づいて不要になったユニットを開放
  • 34~47行目(3つ目のubind以降):アイテムの輸送

フラグに関して:
数桁ごとにフラグの用途を分け、擬似的に複数のフラグを持たせている
xy座標をもとにフラグを発行することで、そのフラグがどこのプロセッサによって発行されたものかを判別できるようになった

n体にランダムなフラグを付けただけだと上3行の設定を変えた際、それまで使っていたユニットはフラグが付いたまま放置される
このプログラムでは一度に大量のユニットを確保するため、それでユニットを食いつぶしてしまう事があった

ディスプレイの操作(コアのアイテム量を表示)

ストレージ(コアやコンテナ)内のアイテム数をリアルタイムで更新するグラフ表示、容量いっぱいになると赤く表示される(レイアウト的に8アイテムのみの設計)
ディスプレイの操作(コアのアイテム量を表示).gif

  • 配置例
    • プロセッサにディスプレイとストレージを接続しておく
      display_storage_monitor_map.png
  • コード
    set Storage container1
    set Item1 @copper
    set Item2 @lead
    set Item3 @graphite
    set Item4 @silicon
    set Item5 @metaglass
    set Item6 @titanium
    set Item7 @plastanium
    set Item8 @thorium
    sensor Cnt1 Storage Item1
    sensor Cnt2 Storage Item2
    sensor Cnt3 Storage Item3
    sensor Cnt4 Storage Item4
    sensor Cnt5 Storage Item5
    sensor Cnt6 Storage Item6
    sensor Cnt7 Storage Item7
    sensor Cnt8 Storage Item8
    sensor Capa Storage @itemCapacity
    op div Per1 Cnt1 Capa
    op div Per2 Cnt2 Capa
    op div Per3 Cnt3 Capa
    op div Per4 Cnt4 Capa
    op div Per5 Cnt5 Capa
    op div Per6 Cnt6 Capa
    op div Per7 Cnt7 Capa
    op div Per8 Cnt8 Capa
    op mul Y1 22 Per1
    op mul Y2 22 Per2
    op mul Y3 22 Per3
    op mul Y4 22 Per4
    op mul Y5 22 Per5
    op mul Y6 22 Per6
    op mul Y7 22 Per7
    op mul Y8 22 Per8
    draw clear 0 0 0 0 0 0
    jump 37 lessThan Per1 1
    draw color 255 0 0 255 0 0
    draw rect 3 17 16 Y1 0 0
    draw color 255 255 255 255 0 0
    jump 41 lessThan Per2 1
    draw color 255 0 0 255 0 0
    draw rect 23 17 16 Y2 0 0
    draw color 255 255 255 255 0 0
    jump 45 lessThan Per3 1
    draw color 255 0 0 255 0 0
    draw rect 43 17 16 Y3 0 0
    draw color 255 255 255 255 0 0
    jump 49 lessThan Per4 1
    draw color 255 0 0 255 0 0
    draw rect 63 17 16 Y4 0 0
    draw color 255 255 255 255 0 0
    jump 53 lessThan Per5 1
    draw color 255 0 0 255 0 0
    draw rect 3 57 16 Y5 0 0
    draw color 255 255 255 255 0 0
    jump 57 lessThan Per6 1
    draw color 255 0 0 255 0 0
    draw rect 23 57 16 Y6 0 0
    draw color 255 255 255 255 0 0
    jump 61 lessThan Per7 1
    draw color 255 0 0 255 0 0
    draw rect 43 57 16 Y7 0 0
    draw color 255 255 255 255 0 0
    jump 65 lessThan Per8 1
    draw color 255 0 0 255 0 0
    draw rect 63 57 16 Y8 0 0
    draw color 255 255 255 255 0 0
    draw image 10 8 Item1 16 0 0
    draw image 30 8 Item2 16 0 0
    draw image 50 8 Item3 16 0 0
    draw image 70 8 Item4 16 0 0
    draw image 10 48 Item5 16 0 0
    draw image 30 48 Item6 16 0 0
    draw image 50 48 Item7 16 0 0
    draw image 70 48 Item8 16 0 0
    drawflush display1
    • 上記のコードをコピー→クリップボードから読み込み
    • 変更箇所は上9行
      • 1行目 container1 : ストレージのリンク名称、コンテナーならcontainer1、ボールトならvault1、コアならshard1に書き換える(末尾の数字はリンクした数によって変わる)
      • 2~9行目 @copperなど : アイテムの組込変数、表示したいものに変更可能
  • 設計解説
    • 1 ~ 9行目は変更して使うことが多い変数
    • 10 ~ 18行目はストレージのアイテム数と保有上限取得
    • 19 ~ 26行目は各アイテムが上限の何%まで保有しているかの計算
    • 27 ~ 34行目はグラフ表示の縦の長さ(Y軸)のピクセル数計算
    • 35行目はディスプレイの背景色を黒に指定
    • 36 ~ 67行目は1アイテムずつ容量いっぱいか否かで図形の色を赤にするかの分岐後、グラフの四角形を描画、次のアイテム処理に移る前に図形色を白に指定、次のアイテムへという繰り返し処理
    • 68 ~ 75行目はアイテムのアイコン画像を指定した位置とサイズで表示
    • 76行目はディスプレイへこれまでの描画処理を反映

戦闘補助

建造物にユニットを見つけさせるRadarと、マウスカーソルの位置を取得できる@shootXと@shootY

建造物にユニットを見つけさせるRadarと、マウスカーソルの位置を取得できる@shootXと@shootY.gif
スクリーンショット 2021-01-04 21.18.02.png

radar player any any distance @this 1 result
sensor xzahyo result @shootX
sensor yzahyo result @shootY
control shoot ripple1 xzahyo yzahyo 0 0
control shoot foreshadow1 xzahyo yzahyo 0 0
ubind @crawler
ucontrol move xzahyo yzahyo 0 0 0

Radarを使えば建造物にユニットを見つけさせることができる
今回は@this(つまりプロセッサー自身)にplayer any anyでプレイヤーを見つけさせた
@thisのところをripple1とかにすればリップルとかがユニットを見つけられる
どうやら建造物の射程距離(黄色の輪っか)の内にあるユニットだけを見つけられるらしい
どのユニットを見つけたかが変数resultに格納される
1行目でプレイヤーを見つけさせて、2~3行目で(resultに格納されているユニットである)プレイヤーのマウスカーソルの位置(@shootX, @shootY)を取得した
取得した座標にリップルとフォーシャドウの銃口を向けさせたり(4~5行目)、クローラーをマウスカーソルに追従させたりしてみた(6~7行目)
マルチプレイだと炎上したコアを消火するTsunamiを制御するときにこういうロジックが使われる
あと射程が長いせいで別の目標に目移りしてしまうリップルを制御するときも便利

enabledを使ったドアの開閉による地上敵誘導

5chスレ1の969より転載
動画から想定できるサンプルコードを下記に記載

  • 配置例
    • プロセッサとドア(door1)を接続しておく
      door_open_by_enabled.png
  • コード
    set sec 3
    sensor isOpen door1 @enabled
    set lasttime @time
    set now @time
    op sub pasttime now lasttime
    op mul msec sec 1000
    op lessThanEq isPassed pasttime msec
    jump 3 equal isPassed 1
    op equal doorChange isOpen 0
    control enabled door1 doorChange 0 0 0
    • 先頭1行目の3はドア開閉の秒数指定、好きに変えられるが1秒より短いとプログラムの処理時間で正しく実行されないようだ

全てのフレアに爆発性化合物を持たせる

  • コード
    printflush message1
    print "Flare"
    sensor result switch1 @enabled
    jump 6 equal result 1
    ucontrol unbind 0 0 0 0 0
    end
    ubind @flare
    sensor mochimono @unit @firstItem
    jump 16 greaterThan mochimono 0
    ulocate building core false @copper corex corey found core
    ucontrol approach corex corey 5 0 0
    sensor capa @unit @itemCapacity
    ucontrol itemTake core @blast-compound capa 0 0
    end
    sensor mochimono @unit @firstItem
    jump 16 greaterThan mochimono 0
    ucontrol unbind 0 0 0 0 0
    end
  • 設計図
    bXNjaAF4nAGcAWP+AAMAAQMABG5hbWUAFExldCBGbGFyZSBoYXZlIGJsYXN0AAtkZXNjcmlwdGlvbgAAAAZsYWJlbHMAAltdAwAHbWVzc2FnZQAPbWljcm8tcHJvY2Vzc29yAAZzd2l0Y2gAAAADAAAAAAAEAQAFRmxhcmUAAQABAAAOAAABF3icrVHbSsQwEE1BcM1XDPsubAX3ubAg+L4/ME2nbTQ3kwy6X+qv+GTtxVJ98UkCIXPmzJyTmUKI4j1E7XJrOPVgKSXsqJQzBvsHg5H2MpFLPkKkxCZDetVZ9SVU5LA21MgntgGOQC+MZiWVkpV3OXoD7GrtGjisR5JrJM9Y1U4Ca3/rVa+tdx4qdjqPWR1TfsxkF4nyCF0kzBTPPbof9INk49WYgJq1abTrQPlI0KJJBJXyIVCcobf5vkDreZSf3ptPDCF6VP0v4v3s+NugwoCrNz3aOo2x0vmy9ZjQMz7Tol/VBlO+Vd6GRW+qXyfwD5/+c8JCiCuxc6wMcSrFzfAhdut+h2HMXi+LvBs+t6AUhRBf6/m39QACAAIAAAoAAM+5rDo=

稼働中の全てのフレアに爆発性化合物を機体の最大容量分だけ持たせる。
スイッチをONにすると、最寄りのコアに近づいてアイテムを取り出す。
アイテムを取得した機体はunbindでプロセッサーの制御を解く。
既にアイテムを持っている機体は制御されない。

フレア以外の機体を制御したい時は、7行目Unit Bind命令の@flareを変える。
1~2行目はメッセージブロックに表示するためのもので、別に変えなくても良い。

タレットが現在向いている方角へ撃ち続ける

  • コード
    getlink result_link 1
    set Turret result_link
    sensor result_sw switch1 @enabled
    jump 5 equal result_sw 1
    end
    sensor Rotation Turret @rotation
    sensor Range Turret @range
    sensor X Turret @x
    sensor Y Turret @y
    set Range Range
    op cos cos(Theta) Rotation b
    op mul Rcos(Theta) Range cos(Theta)
    op add RX X Rcos(Theta)
    op sin sin(Theta) Rotation b
    op mul Rsin(Theta) Range sin(Theta)
    op add RY Y Rsin(Theta)
    control shoot Turret RX RY 1 0
    sensor result_sw switch1 @enabled
    jump 21 equal result_sw 1
    control shoot Turret RX RY 0 0
    end
    jump 10 always x false
  • 設計図
    bXNjaAF4nAFoAZf+AAIAAQMABG5hbWUAHEtlZXAgZmlyaW5nIGF0IGN1cnJlbnQgYW5nbGUAC2Rlc2NyaXB0aW9uAAAABmxhYmVscwACW10CAA9taWNyby1wcm9jZXNzb3IABnN3aXRjaAAAAAIAAAAAAA4AAADzeJyNUcFuAiEQxV6a8BVzaWJvS5Pe/YaNBz0Z3J262yIoA1n9+wIVFhNjegCG9968N8ksGHt5O6BTo/4Bi+SV26VacEIHa29teCoiwJqMzRBNQNPoukHACrXcK+z5tz+e4BPw7KWqdIKj7nN7a5x0o9E5YWVvQBFIfcCZjb9MbQp8ydC2QNc09193urk5QWconuV6QCff5/B9JI9eQVuzqXcGokb2PbSbkNze4zTqeJ4Y12wynoFivA3zV0LeGe2sUUCDMWUHIT4IBTT/3cCHeLCCJ9ZNsI4bSs2iAakmeSW4wJdUhJwxtmCvt6hQsl8w98FXAAEAAQAACgAAfMuVbw==

タレットを1つリンクさせてスイッチをONにすると、タレットが現在向いている方角へ撃ち続ける。
角度の調整はプレイヤーがタレットに乗り込めば可能。
スイッチがONの間は、敵が射程範囲内に存在してもそちらを向かずに無視するので注意。
自動で弾幕を張り続けたい時、射程内に無い力場プロジェクターのバリアを自動で割りたい時などに使える。

タレットの設置されている座標(x,y)と、タレットの射程と向きから、三角関数を用いて撃つ座標を算出している。
Control命令のshootは、座標(x,y)を必ず指定しなければならず、
空欄では射撃を行わず、nullを入れるとマップ左下端の座標(0,0)を狙ってしまう。

デフォルトでは最大射程の地点を狙うようにしているので、
リップル等でより近い地点を狙いたい時は、10行目set命令のRange=Rangeの右辺を任意の数値に変えよう。

(更新:2024年03月01日 処理を改善。スイッチOFFで砲撃がすぐ止まるように。)

応用ネタ。自動で回転しながら撃ち続けるスペクター。
Rotationを加算していくループ。
Rotation加算値を30以上にすると、砲塔の回転限界速度を超えてしまい、砲撃が正常に行われなくなるので注意。

  • コード
    getlink result_link 1
    set Turret result_link
    sensor result_sw switch1 @enabled
    jump 5 equal result_sw 1
    end
    sensor Rotation Turret @rotation
    sensor Range Turret @range
    sensor X Turret @x
    sensor Y Turret @y
    set Range Range
    op add Rotation Rotation 10
    op cos cos(Theta) Rotation b
    op mul Rcos(Theta) Range cos(Theta)
    op add RX X Rcos(Theta)
    op sin sin(Theta) Rotation b
    op mul Rsin(Theta) Range sin(Theta)
    op add RY Y Rsin(Theta)
    control shoot Turret RX RY 1 0
    sensor result_sw switch1 @enabled
    jump 22 equal result_sw 1
    control shoot Turret RX RY 0 0
    end
    jump 10 lessThan Rotation 360
    set Rotation 0
    jump 10 always x false

コメント欄