このページで紹介しているのは、ゲーム「Autonauts(オートノーツ)」の「砂」や「淡水」など液体の入手方法と自動プログラムの書き方です。
参考にしていただければ幸いです。
スポンサーリンク
■ 「砂」「淡水」「バケツ」とは?
「ステージ4:村落」から登場する仕組みです。
「上質な作業台」で「粗雑なバケツ」を作ることができます。
「粗雑なバケツ」を使って、「砂」や「淡水」などの液体を拾います。
これまでは、「石」や「枝」などは手で拾うことができましたが、液体を拾う時に道具が必要になったわけですね。
これは、マップから採取するとき(砂地から砂を得るなど)だけでなく、保管庫(サイロなど)からクラフト台に移動するときにも必要になります。
「バケツ」は、「粗雑な斧」などと同じく耐久度があります。
繰り返し使用していると壊れてなくなります(何度でも作れます)。
■ 自動回収・補給スクリプト
これまで作ってきたスクリプトと、ほぼ同じ書き方でOKです。
但し、段階を経ていくと、これまでと同じ書き方では動かなくなります。
順番に説明します。
・拾うスクリプト
砂地から「砂」をすくう、水辺から「淡水」をすくう、といった収集し収納するスクリプトです。
繰り返し:永遠に!
もし:手が空です
粗雑なバケツの保管場所に移動
粗雑なバケツの保管場所から取る
もし:砂の保管場所がいっぱいではありません
一番近い砂がある場所□
砂に移動
持っているアイテムを使う(バケツ)
砂の保管場所に移動
砂の保管場所に追加
この時点までゲームを進めているのであれば、上のスクリプトは読めると思います。
「砂の保管場所に空きがあれば、拾って入れる」
「バケツが壊れたら、取りに行く」
という処理を永遠と繰り返しています。
ちなみに「砂」は「サイロ」に保管し、「淡水」は「タル」に保管します。
・クラフト台に補給するスクリプト(基礎)
作業台や鍋などに、液体アイテムを追加し、アイテムクラフトをするスクリプトです。
上とほぼ同じです。
繰り返し:永遠に!
もし:手が空です
粗雑なバケツの保管場所に移動
粗雑なバケツの保管場所から取る
もし:○○の保管場所がいっぱいではありません
淡水の保管場所に移動
淡水の保管場所から取る
粗雑な鍋に移動
粗雑な鍋に追加
単一の液体のみを置いてクラフトするアイテムはないのですが、基本的なスクリプトの考え方は上記の通りです。
・クラフト台に補給するスクリプト(現実)
実際のゲーム内では、単一の液体を置いてクラフトするアイテムはありません。
「液体」+「別のアイテム」でアイテムクラフトを行います。
そのため、「バケツをしまう」「手に戻す」という動作が必要になります。
この処理は、ここまででもスクリプトを書いてきた人はいるかもしれませんね。
ちなみに以下は「ベリーソース」を作るスクリプトです。
繰り返し:永遠に!
もし:ベリーソースの保管場所がいっぱいではありません
もし:手が空です
粗雑なバケツの保管場所に移動
粗雑なバケツの保管場所から取る
繰り返し:2回
淡水の保管場所に移動
淡水の保管場所から取る
粗雑な鍋に移動
粗雑な鍋に追加
持っているアイテムをしまう
スパイスを加えたベリーの保管場所に移動
繰り返し:2回
スパイスを加えたベリーの保管場所から取る
粗雑な鍋に移動
繰り返し:2回
粗雑な鍋に追加
土器の壺の保管場所に移動
土器の壺の保管場所から取る
粗雑な鍋に移動
粗雑な鍋に追加
回収する
ポイントは、「持っているアイテムをしまう」と「回収する」の場所です。
「淡水」を追加し終えたら「バケツ」をしまい(バックパックに一時的に移動して手を空にする)、「スパイスを加えたベリー」と「土器の壺」を追加し終えたら、「バケツ」を手に戻します。
・クラフト台に補給するスクリプト(現実エラー改善)
上のスクリプトは、動かしてみると確かに動きます。
しかし長時間動かしていると、知らない間にエラーで止まっていることに気づくはずです。
これは、「バケツ」の耐久度の影響です。
バケツには耐久度があり、拾い・入れるの動作の度に減っていきます(入れる時だけかも?)。
そのため、スクリプトの最初に段階で「手が空なら:バケツを持ってくる」という処理を入れるだけでは不十分です。
2回拾い入れをしている途中で壊れることがある、というわけですね。
下記のようにします。
繰り返し:永遠に!
もし:ベリーソースの保管場所がいっぱいではありません
繰り返し:2回
もし:手が空です
粗雑なバケツの保管場所に移動
粗雑なバケツの保管場所から取る
淡水の保管場所に移動
淡水の保管場所から取る
粗雑な鍋に移動
粗雑な鍋に追加
持っているアイテムをしまう
スパイスを加えたベリーの保管場所に移動
繰り返し:2回
スパイスを加えたベリーの保管場所から取る
粗雑な鍋に移動
繰り返し:2回
粗雑な鍋に追加
土器の壺の保管場所に移動
土器の壺の保管場所から取る
粗雑な鍋に移動
粗雑な鍋に追加
回収する
こうすることで、毎回バケツが壊れていないか判定をしています。
・ステップアップ
プログラムというものは、上から下に順番に実行されます。
それはつまり、一番上に書いた命令文と一番下に書いた命令文は、実行されるタイミングが変わります。
例えば上のスクリプトですと、「繰り返し:永遠に!」が付いているので、一番上に書こうが一番下に書こうが同じものだと思えますよね。
しかし実際には異なります。
上のスクリプトは、下記のように書くと、もっとよくなります。
繰り返し:永遠に!
もし:ベリーソースの保管場所がいっぱいではありません
回収する
繰り返し:2回
もし:手が空です
粗雑なバケツの保管場所に移動
粗雑なバケツの保管場所から取る
淡水の保管場所に移動
淡水の保管場所から取る
粗雑な鍋に移動
粗雑な鍋に追加
持っているアイテムをしまう
スパイスを加えたベリーの保管場所に移動
繰り返し:2回
スパイスを加えたベリーの保管場所から取る
粗雑な鍋に移動
繰り返し:2回
粗雑な鍋に追加
土器の壺の保管場所に移動
土器の壺の保管場所から取る
粗雑な鍋に移動
粗雑な鍋に追加
「回収する」を最後に書いていたものを、最初に持ってきました。
よく考えてみてください。
「繰り返し:永遠に!」がついているのだから、最後に「回収する」だろうが、最初に「回収する」だろうが同じでは?
「回収する」をしてから「繰り返し」をする。
「繰り返し」をしてから「回収する」。
同じ・・・では?
いえいえ違います。
「最初の1回目」が違うのです。
プログラムを実行した最初の1回目に、「回収する」をしてから次の命令文に移ります。
以前のスクリプトでは、「回収する」は最後に書かれていましたから、最初の1回目は、「回収する」をせずに命令文に移っています。
例えばこんな状況が起こります。
最初のスクリプトで動かしていたボットを途中で止める。
スクリプトの修正や予期せぬエラーによって、一旦止めることってありますよね。
この時に、「バックパックにバケツを持っている」状態になることがあるのです。
「持っているアイテムをしまう」の後にボットを止めた場合です。
そうすると最初に「回収する」が必要になります。
もし「回収する」を最初にしていないと、
「バックパックにバケツが残っているにも関わらず、バケツを取りに行ってしまう」
そうすると、バックパックが1個しかないボットの場合は、「持っているアイテムをしまう」ができなくなってしまいます。
表にすると以下のようになります。
最初のスクリプトは、初期状態が以下の状態では動きません。
手 | バックパック | |
○ | 空 | 空 |
○ | バケツ | 空 |
× | 空 | バケツ |
ステップアップのスクリプトでは、初期状態が以下の状態でも動きます。
手 | バックパック | |
○ | 空 | 空 |
○ | バケツ | 空 |
○ | 空 | バケツ |
これはゲームをしばらく遊んでいると、たびたび遭遇すると思います。
通常ボットは、基本状態から起動させます。
そしてその行動を見て、きちんと動いているかを確認します。
しかし現実には、
途中で止めたり、他の作業ボットを持ってきたりとイレギュラーな状態から起動させる場合があります。
こういう時にでもエラーを起こさずに動くプログラムを組めるようになると、予期せぬエラーの頻度が減ります。
結果として、急な対応や調査をする時間が減るというわけですね。
ちなみに上のスクリプトでは、下記の状態には対応できません。
手 | バックパック | |
○ | 空 | 空 |
○ | バケツ | 空 |
○ | 空 | バケツ |
× | バケツ | バケツ |
この状況になることはほぼありませんが、この対応スクリプトも考えてみると面白いと思います。
・複数体のボットに処理させる
「バケツ」を使った液体と、手に持つ固形物の両方が必要になるアイテムクラフトは、スクリプトが複雑になりがちです。
1体のボットに全てをやらせず、
・「バケツ」の液体を運び入れるボット
・固形物を運び入れるボット
の2体を動かして、1つのアイテムクラフトをするという方法もアリだと思います。
■ 終わりに
以上、「【Autonauts】砂・水の入手方法、バケツのスクリプトの書き方(ベリーソース)【オートノーツ】」でした。
楽しいゲームに出会うための参考としていただければ幸いです。
スポンサーリンク