【Autonauts】砂・水の入手方法、バケツのスクリプトの書き方(ベリーソース)【オートノーツ】

このページで紹介しているのは、ゲーム「Autonauts(オートノーツ)」の「砂」や「淡水」など液体の入手方法と自動プログラムの書き方です。

参考にしていただければ幸いです。

スポンサーリンク

■ 「砂」「淡水」「バケツ」とは?

「ステージ4:村落」から登場する仕組みです。

「上質な作業台」で「粗雑なバケツ」を作ることができます。
「粗雑なバケツ」を使って、「砂」や「淡水」などの液体を拾います。

これまでは、「石」や「枝」などは手で拾うことができましたが、液体を拾う時に道具が必要になったわけですね。

これは、マップから採取するとき(砂地から砂を得るなど)だけでなく、保管庫(サイロなど)からクラフト台に移動するときにも必要になります。

「バケツ」は、「粗雑な斧」などと同じく耐久度があります。
繰り返し使用していると壊れてなくなります(何度でも作れます)。

■ 自動回収・補給スクリプト

これまで作ってきたスクリプトと、ほぼ同じ書き方でOKです。
但し、段階を経ていくと、これまでと同じ書き方では動かなくなります。

順番に説明します。

・拾うスクリプト

砂地から「砂」をすくう、水辺から「淡水」をすくう、といった収集し収納するスクリプトです。

繰り返し:永遠に!
  もし:手が空です
    粗雑なバケツの保管場所に移動
    粗雑なバケツの保管場所から取る
  もし:砂の保管場所がいっぱいではありません
    一番近い砂がある場所□
    砂に移動
    持っているアイテムを使う(バケツ)
    砂の保管場所に移動
    砂の保管場所に追加

この時点までゲームを進めているのであれば、上のスクリプトは読めると思います。

「砂の保管場所に空きがあれば、拾って入れる」
「バケツが壊れたら、取りに行く」
という処理を永遠と繰り返しています。

ちなみに「砂」は「サイロ」に保管し、「淡水」は「タル」に保管します。

・クラフト台に補給するスクリプト(基礎)

作業台や鍋などに、液体アイテムを追加し、アイテムクラフトをするスクリプトです。
上とほぼ同じです。

繰り返し:永遠に!
  もし:手が空です
    粗雑なバケツの保管場所に移動
    粗雑なバケツの保管場所から取る
  もし:○○の保管場所がいっぱいではありません
    淡水の保管場所に移動
    淡水の保管場所から取る
    粗雑な鍋に移動
    粗雑な鍋に追加

単一の液体のみを置いてクラフトするアイテムはないのですが、基本的なスクリプトの考え方は上記の通りです。

・クラフト台に補給するスクリプト(現実)

実際のゲーム内では、単一の液体を置いてクラフトするアイテムはありません。
「液体」+「別のアイテム」でアイテムクラフトを行います。

そのため、「バケツをしまう」「手に戻す」という動作が必要になります。
この処理は、ここまででもスクリプトを書いてきた人はいるかもしれませんね。

ちなみに以下は「ベリーソース」を作るスクリプトです。

繰り返し:永遠に!
  もし:ベリーソースの保管場所がいっぱいではありません
    もし:手が空です
      粗雑なバケツの保管場所に移動
      粗雑なバケツの保管場所から取る
    繰り返し:2回
      淡水の保管場所に移動
      淡水の保管場所から取る
      粗雑な鍋に移動
      粗雑な鍋に追加
    持っているアイテムをしまう
    スパイスを加えたベリーの保管場所に移動
    繰り返し:2回
      スパイスを加えたベリーの保管場所から取る
    粗雑な鍋に移動
    繰り返し:2回
      粗雑な鍋に追加
    土器の壺の保管場所に移動
    土器の壺の保管場所から取る
    粗雑な鍋に移動
    粗雑な鍋に追加
    回収する

ポイントは、「持っているアイテムをしまう」と「回収する」の場所です。

「淡水」を追加し終えたら「バケツ」をしまい(バックパックに一時的に移動して手を空にする)、「スパイスを加えたベリー」と「土器の壺」を追加し終えたら、「バケツ」を手に戻します。

・クラフト台に補給するスクリプト(現実エラー改善)

上のスクリプトは、動かしてみると確かに動きます。
しかし長時間動かしていると、知らない間にエラーで止まっていることに気づくはずです。

これは、「バケツ」の耐久度の影響です。

バケツには耐久度があり、拾い・入れるの動作の度に減っていきます(入れる時だけかも?)。
そのため、スクリプトの最初に段階で「手が空なら:バケツを持ってくる」という処理を入れるだけでは不十分です。

2回拾い入れをしている途中で壊れることがある、というわけですね。

下記のようにします。

繰り返し:永遠に!
  もし:ベリーソースの保管場所がいっぱいではありません
    繰り返し:2回
      もし:手が空です
        粗雑なバケツの保管場所に移動
        粗雑なバケツの保管場所から取る
      淡水の保管場所に移動
      淡水の保管場所から取る
      粗雑な鍋に移動
      粗雑な鍋に追加
    持っているアイテムをしまう
    スパイスを加えたベリーの保管場所に移動
    繰り返し:2回
      スパイスを加えたベリーの保管場所から取る
    粗雑な鍋に移動
    繰り返し:2回
      粗雑な鍋に追加
    土器の壺の保管場所に移動
    土器の壺の保管場所から取る
    粗雑な鍋に移動
    粗雑な鍋に追加
    回収する

こうすることで、毎回バケツが壊れていないか判定をしています。

・ステップアップ

プログラムというものは、上から下に順番に実行されます。
それはつまり、一番上に書いた命令文と一番下に書いた命令文は、実行されるタイミングが変わります。

例えば上のスクリプトですと、「繰り返し:永遠に!」が付いているので、一番上に書こうが一番下に書こうが同じものだと思えますよね。
しかし実際には異なります。

上のスクリプトは、下記のように書くと、もっとよくなります。

繰り返し:永遠に!
  もし:ベリーソースの保管場所がいっぱいではありません
    回収する
    繰り返し:2回
      もし:手が空です
        粗雑なバケツの保管場所に移動
        粗雑なバケツの保管場所から取る
      淡水の保管場所に移動
      淡水の保管場所から取る
      粗雑な鍋に移動
      粗雑な鍋に追加
    持っているアイテムをしまう
    スパイスを加えたベリーの保管場所に移動
    繰り返し:2回
      スパイスを加えたベリーの保管場所から取る
    粗雑な鍋に移動
    繰り返し:2回
      粗雑な鍋に追加
    土器の壺の保管場所に移動
    土器の壺の保管場所から取る
    粗雑な鍋に移動
    粗雑な鍋に追加

「回収する」を最後に書いていたものを、最初に持ってきました。

よく考えてみてください。

「繰り返し:永遠に!」がついているのだから、最後に「回収する」だろうが、最初に「回収する」だろうが同じでは?

「回収する」をしてから「繰り返し」をする。
「繰り返し」をしてから「回収する」。
同じ・・・では?

いえいえ違います。

「最初の1回目」が違うのです。

プログラムを実行した最初の1回目に、「回収する」をしてから次の命令文に移ります。
以前のスクリプトでは、「回収する」は最後に書かれていましたから、最初の1回目は、「回収する」をせずに命令文に移っています。

例えばこんな状況が起こります。

最初のスクリプトで動かしていたボットを途中で止める。
スクリプトの修正や予期せぬエラーによって、一旦止めることってありますよね。

この時に、「バックパックにバケツを持っている」状態になることがあるのです。
「持っているアイテムをしまう」の後にボットを止めた場合です。

そうすると最初に「回収する」が必要になります。

もし「回収する」を最初にしていないと、
「バックパックにバケツが残っているにも関わらず、バケツを取りに行ってしまう」
そうすると、バックパックが1個しかないボットの場合は、「持っているアイテムをしまう」ができなくなってしまいます。

表にすると以下のようになります。
最初のスクリプトは、初期状態が以下の状態では動きません。

バックパック
バケツ
× バケツ

ステップアップのスクリプトでは、初期状態が以下の状態でも動きます。

バックパック
バケツ
バケツ

これはゲームをしばらく遊んでいると、たびたび遭遇すると思います。

通常ボットは、基本状態から起動させます。
そしてその行動を見て、きちんと動いているかを確認します。

しかし現実には、
途中で止めたり、他の作業ボットを持ってきたりとイレギュラーな状態から起動させる場合があります。
こういう時にでもエラーを起こさずに動くプログラムを組めるようになると、予期せぬエラーの頻度が減ります。

結果として、急な対応や調査をする時間が減るというわけですね。

ちなみに上のスクリプトでは、下記の状態には対応できません。

バックパック
バケツ
バケツ
×バケツバケツ

この状況になることはほぼありませんが、この対応スクリプトも考えてみると面白いと思います。

・複数体のボットに処理させる

「バケツ」を使った液体と、手に持つ固形物の両方が必要になるアイテムクラフトは、スクリプトが複雑になりがちです。

1体のボットに全てをやらせず、
・「バケツ」の液体を運び入れるボット
・固形物を運び入れるボット
の2体を動かして、1つのアイテムクラフトをするという方法もアリだと思います。

■ 終わりに

以上、「【Autonauts】砂・水の入手方法、バケツのスクリプトの書き方(ベリーソース)【オートノーツ】」でした。

楽しいゲームに出会うための参考としていただければ幸いです。

スポンサーリンク

スポンサーリンク
スポンサーリンク
検索
スポンサーリンク
検索

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
スポンサーリンク
検索