沖の雑記帳

基本的には趣味に絡んで雑多な内容を色々と

Bots Are Stupidを遊んでみた

12月16日にSteamで発売したばかりのBots Are Stupidというゲームを買ってプレイしてます。

この記事は、えだ管理Discord鯖 Advent Calendar 2022の12月24日の記事です。 adventar.org

はじめに

ゲームの内容はボットの動作コードを自分で書いてアクションステージをクリアしていくだけの単純な内容
行数をできるだけ短くしたり、クリア時間をできるだけ短くしたり詰める要素は色々あるけども、まずは全ステージクリアを目指したいと思ってます。

コード部分は自分で考えたほうが楽しいと思うので、今回は苦戦したステージと他2ステージの動画を切り抜きで作成してみました。

ステージ動画と感想

Easy Iは、初めてhook down <direction>コマンドが出てくるステージだけど、難易度の順番間違えてるんじゃない?ってくらい難しかった。
あと、コマンドの説明が不十分でヒントには hook down を使えみたいに出てくるんだけど、Invalid parameter(s)って出てて実行できない。
なんで実行できないんだろう?スペルは間違ってないし…って延々と書き換えたり使わないで行ける方法探ったり数時間かかってようやくゴール
コマンドは、 hook down <direction> で方向の入力が必須だったんですね… youtu.be

Easy Iをクリアしたあとはとりあえず hook down を使うこともなく、Easy IIIをクリア youtu.be

Medium IIは、上へ上へ登っていく感じのステージでこれまで比較的下に降りたり左右に進んだりするステージが多かった中で結構苦労した youtu.be

と、こんな感じでボットを動かすコードを書いて、書いたとおりにボットが動作してゴールするのが基本的なルールです。

コマンドは動画では省きましたが、画面の左側にあるコードパレットに入力してAlt + Enterまたは、再生ボタンで実行していく
?ボタンを押して表示されるパレットからドラッグアンドドロップでコマンドをコードパレットに持っていくこともできるし、IDEのようにコマンドを途中まで入力してTab補完もできる。
Ctrl + CCtrl + XCtrl + VCtrl + Aなどの基本的なコマンドも実装されているので、コピー&ペーストも可能。
わかりにくいけどメニューをESCでメニューを開いてNew Scriptを選択すれば、コードを書き換えることなく新しいコードを作成することもできる。

コマンド入力画面

waitなんかはトライアンドエラーで実行を繰り返して調整したりしてます。

コマンドリスト

これはコマンドパレットからも確認できるけども直感的にわかりにくかったので自分用メモを兼ねてます。
あと、日本語訳は間違ってるかもしれないのでそこはご容赦いただければと思います。

(オプション)は任意、[オプション]は必須。|はどれかを選択。
コマンドと各オプションの間は1個以上の空白が必要。

コマンド オプション 説明 備考
move [left|right] stopコマンドを実行するか、方向が変わるまで、その方向に移動し続ける。 地上だけではなく空中でも方向を変えることができる move right
wait [time] 指定した時間が終了するまでスクリプトの実行を一時停止する。 小数点以下第2位まで有効 wait 1.23
wait [frames] 指定したフレームが終了するまでの間、スクリプトの実行を一時停止する。 1秒は200f。後述の-tickrateで変更できる wait 100f
wait [until] (not) [grounded] 地面に接地するまでの間、スクリプトの実行を一時停止する。 notの場合は、地面に接地していない間 wait until grounded
wait [until] (not) [boosted] ブーストを取得するまでの間、スクリプトの実行を一時停止する。 wait until boosted
wait [until] (not) [hooked] フックがかかるまでの間、スクリプトの実行を一時停止する。 notの場合は、フックがはずれるまでの間 wait until not hooked
wait [until] (not) [stopped] 停止するまでの間、スクリプトの実行を一時停止する。 notの場合は、動くまでの間 wait until stopped
wait [until] (not) [falling] 落下するまでの間、スクリプトの実行を一時停止する。 上昇から落下に切り替わった瞬間 wait until falling
wait [until] (not) [orbpickup] オーブを取得するまでの間、スクリプトの実行を一時停止する。 wait until orbpickup
stop 移動や加速を停止する。 空中にいる間は停止せず、地面に接地した際に停止/減速する stop
jump ジャンプする 地面に接地していない場合は何もしない。停止中にジャンプすると垂直方向にジャンプする jump
hook (up|down) [left|right] フックを上下左右4方向いずれかに伸ばす (up|down)を指定しない場合は、上方向に伸ばす hook down right
unhook フックがかかっている間は外す。そうじゃない場合は、フックを伸ばすのをやめる。 unhook
say [seconds] [text] 指定時間、ボットにテキストを喋らせる。 say 5.00 Hello World!
-tickrate
[low|legacy|default|high] 秒辺りのシミュレーション時間を変更する。 low (50/s)
legacy (128/s)
default (200/s)
high (1000/s)

他にもコマンドパレットにはないもののrepeat [ammount]repeatendなどの命令がサジェストには出てくるのでループ命令のようなことが実行可能なようです。
ただし、repeat命令はネストできないようであくまでも1つの動作をammountで指定した回数を繰り返す1つのループが可能なだけと思われます。
使い方次第では行数の短縮に使えるかもしれないですね。

もしかしたら、他にもコマンドがあるのかもしれないので見つけ次第追記していきたいと思います。

リンク

2023年1月6日までリリースセール中なので、20%オフで購入できるようです。