2022/02/06

【アルセウス×Arduino01】金策自動化(野盗三姉妹狩り@黒曜の原野)

 ※本記事は、ポケモンLegendsアルセウスの金策を自動化するプログラムについて解説した記事です。レジェンズアルセウスの操作をArduino Leonardoで自動化しております。「Arduinoって何?」って方は剣盾の00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。


2022/02/08追記:Ver1.1公開しました。長時間動作を続けて手持ちのきんのたまが多くなると、1回のデスで落とすきんのたまの数が多くなるため、ベースで休んだ後にベッドの右にある道具箱にきんのたまを預ける動作を追加しました。

 それに伴い、準備の項目に以下の文言を追加しました。

「道具箱を閉じる時のカーソルをポーチ左上にあわせておく。」


本記事では、このプログラム(スケッチ)でできることや原理を解説したうえで、スケッチを配布しています。とにかくスケッチが欲しいという方は下へと読み飛ばしてください。


 

きっかけ、動機

ポケモンレジェンズアルセウス発売されました。普段と違うポケモンということで楽しんでおります。皆様ご存じ、ラスボスのシュウゾウを倒すことを目標にがんばっております。

基本的にアクションゲームなので、マイコンでの自動化(画像認識等なし)でできる稼ぎは少ないです。そのため、本ブログで何種類も便利プログラムが出てくることはないかと思います。

その中でできそうな数少ない稼ぎとして、今回は対シュウゾウに必要なアイテム、きんのたまを回収します。もちろんボールなどの素材購入にも使えます。

これで何ができるの?

今作最大の金策は、フィールド上で確率湧きする野盗三姉妹と戦い、戦闘後にもらえるきんのたまを集めることとなります(今作にきんのたまおじさんは出てきません)。野盗の出現場所はある程度決まっており、コトブキ村からフィールド選択をするごとに確率で湧きが起こります。

今回は、自動化で最もエンカウントしやすいと思われる、黒曜の原野にて、中央の高台ベースから北に位置するオウメ(ドクロッグ)との戦闘を繰り返します。1時間でおおよそ3~4回の戦闘を行い、15~20個程度のきんのたま=15~20万円/時を回収します。

なお、この稼ぎはストーリーを一通り終えた後を前提としています。

原理、おおまかな流れ

概要

本プログラムでは、

①高台ベースからアヤシシで爆走し、野盗のオウメとエンカウントする
②高台ベースへ戻って博士に話しかけ、コトブキ村へ帰還、すぐに黒曜の原野に入りなおす

を繰り返します。

これをベースとして、オウメとの戦闘後や野生ポケモンとの接触(特にオヤブン)により想定した動きができなくなった時の対策を加えています。

 

野盗とのエンカウントについて

野盗三姉妹は天冠の山麓を除く各エリア、それぞれ特定の場所に出現します。3人それぞれ出現する範囲が決まっており、近い範囲の4か所のいずれかに湧くことがあります。

各エリアのうち、黒曜の原野は

・三姉妹の湧く位置が高台ベースの近く、それぞれ北、東、南東の方角に出現する
・平地が多く、複雑な昇り降りや高所からの飛び降りが少ない
 ≒アヤシシでの移動がしやすい
・道中に出現するポケモンが易しく、でたらめな操作でも逃げやすい(特に昼)
・進んだ先に川が存在し、野生ポケモンと敵対しても水路で逃げやすい

など、最初のエリア故に難易度低めにできております。

黒曜の原野の松竹梅のうち、松は使用ポケモンが2匹となり戦闘が長引くこと、竹は他の2人よりも出現場所が遠く川へ飛び込みにくいことから、残るオウメが最も自動化しやすいと判断しました。「シシの高台」から「シシの山道」にかけての曲がりくねった道に沿って出現場所となっているため、その道をアヤシシで走り抜ける動きを設定しています。

曲がりくねった道を抜けた後は、高台ベースの周囲を流れている川に向かって飛び込みます。川に飛び込むことで自動的にイダイトウのライドに切り替わります。道中で野生ポケモンと敵対して追われている場合、川を利用することで追いかけてこなくなり、敵対が解除されやすくなっています。また、川の中のコイキングや川の付近に出現するコロボーシは敵対することがないため、敵対が解除されて高台ベースへの移動が容易になります。

 

高台ベースへの帰還、コトブキ村への帰還について

本プログラムは基本的に高台ベースを始点としてあらゆる動作を行います。高台ベースではアヤシシで爆走(マップ移動した地点から後ろの方向)するほか、博士との会話によるコトブキ村への帰還、ギンガ団員との会話による時間帯の変更を行います(時間帯については後述)。

コトブキ村への帰還は、野盗のランダム湧きをリセットするために、アヤシシでの爆走1周ごとに行います。

博士に話しかけると、

①捕まえたポケモンの報告
②研究ポイントの精算
③調査を続ける?帰る?の選択

を順に行います。今回はポケモンの捕獲は行わないので①は発生しません。

一方、技を見た回数などにより②が発生することがあるので、②が起こった時を想定してA連弾を行いつつ、その後に1度会話を終了してから③を行います。

想定外の動きへの対策について

本プログラムでは基本的に、アヤシシでの爆走とコトブキ村への帰還を交互に繰り返します。交互の動作を行ってみて、いくつか想定通りに進まなかった箇所があったので、その対策を施しました。

なお、対策はしていますが、ランダムで湧くオヤブン個体には対策しきれていないため、ハメ殺されることがあります。 

1.野生ポケモンと敵対したときの立ち回り

野盗オウメとの戦闘を終えると、ライドポケモンから降りた状態で道の中央に立っていることとなります。すぐ近くにイシツブテが出現しているため、戦闘後はほとんどの場合敵対する状態となります。

また、道中でオヤブンのポケモンが湧いた場合、発見時の威嚇行動でアヤシシから叩き落されます。

敵対した状態のときはマップを開いてベースまで空を飛ぶことができないため、攻撃を受け続けて瀕死になる前にその場を離れる必要があります。

この対策として、

①マップ移動がうまくできなかった時は、極力マップや図鑑を開いた画面を維持し、フィールド上で棒立ちになることを防止
②アヤシシ爆走の動作と同じタイミングで、敵対ポケモンから離れる動作を行う。また、壁にぶつかった状態を打開するために前移動だけでなく左右移動を追加

しています。プログラム各所にて、Bボタンなどを押すタイミングを調整しています。

 

2.オオニューラへのライド

今回、最も対策に苦労したのがオオニューラへのライドに切り替わってしまう点です。

オオニューラへのライドは、十字キー左右で切り替えるほか、壁に向かってAボタンを押すことで切り替わります。 そのため、上記「1.野生ポケモンと敵対~」と関連して、

 ①マップ移動がうまくできなかった時は、極力マップや図鑑を開いた画面を維持し、フィールド上で不用意にAボタンを押すことを防止(代わりにマップ上でスタンプ連打)

をしています。

関連して、Aボタンを連打しているときは基本的にスティック操作などをしていないため、オウメとの戦闘時はA連打のみとなり1番上の技を打ちます。 


3.時間帯の変更

黒曜の原野の「シシの高台」から「シシの山道」にかけての曲がりくねった道やその先の直線では、昼夜問わずイシツブテ夜のみズバットが出現します。この2匹はプレイヤーを発見すると敵対状態となるため、マップ移動を行う前に離れる必要があります。

イシツブテの攻撃方法は直線状にぶつかってくる体当たりのため、段差や岩の隙間などに阻まれやすく、あまり当たりません。対して、ズバットの攻撃(怪しい光?)はプレイヤーを眠気状態にしてきます。当たるとアヤシシライドもできなくなり、動きが止まるので目の前真っ暗になります(プログラム作成中は何度かやられています)。したがって、危険度の高いズバットは避ける方向性としました。

その対策として、定期的に時間帯の変更を行います。ベースにいるギンガ団員に話しかけて朝まで休むことで、しばらくのあいだ夜を迎えなくなります。定期的に行うことで、自動化の最中は常に朝か昼となり、ズバットと出会わなくなります。オウメとの戦闘タイミング次第で休憩を取り損ねることがあるため、余裕をもって上記のループ5周ごとに1休憩しています。

Ver1.1より、休んだタイミングで所持しているきんのたまを道具箱に預ける動作を追加しました。これにより、万が一目の前真っ暗になっても落とすきんのたまを少なくできます。


準備、必要なもの

本スケッチでは、マイコンを挿す前に以下の準備が必要となります。

 1. ポーチ内の道具を、ボール含めてすべて空にする
  その際、道具箱を閉じる時のカーソルをポーチ左上にあわせておく。

 2. 戦闘で繰り出すポケモンを、ドクロッグLv64?に先制して1撃で倒すことのできるポケモンにする。
  使う技を1番上にする(プログラム作成時はフワライド@じんつうりき を使用)

3. コトブキ村から黒曜の原野へ移動、ポケモンに見つからない場所へ(ベース内)

4. LRボタンで使用するポケモンを投げるボールに合わせる。

5. 左右十字キーでライドするポケモンをアヤシシに合わせる

6. マイコンを挿してスタート

 

作成したスケッチ

作成したスケッチはこちら。Ver1.1

Ver1.1公開しました。ベースで休んだ後にベッドの右にある道具箱にきんのたまを預ける動作を追加しました。 

マイコンを挿す前にあらかじめ、道具箱を閉じる時のカーソルをポーチ左上にあわせてください。 

旧ファイルはこちらVer1.0

本スケッチを実際に使用した動画はこちら↓


 
/**
* レジェンドアルセウス、原野での野盗三姉妹のオウメ(ドクロッグ)狩り自動化
* 黒曜の原野の高台ベースから、オウメのいる可能性のある道中をアヤシシで爆走、
* オウメに見つけてもらい、きんのたま5個を強奪するプログラム。
*
* アヤシシで爆走と、コトブキ村へ帰還を繰り返す。
* また、夜はズバットの怪しい光を受けると高確率で目の前真っ暗なので、定期的に朝まで休み、夜を回避する。
*
* 初期条件は以下の通り
* 1. ポーチ内の道具を、ボール含めてすべて空にする
* 2. 戦闘で繰り出すポケモンを、ドクロッグLv64?に先制して1撃で倒すことのできるポケモンにする。
*  使う技を1番上にする(プログラム作成時はフワライド@じんつうりき を使用)
* 3. コトブキ村から黒曜の原野へ移動、ポケモンに見つからない場所へ(ベース内)
* 4. LRボタンで使用するポケモンを投げるボールに合わせる。
* 5. 左右十字キーでライドするポケモンをアヤシシに合わせる
* 6. マイコンを挿してスタート
*/

#include <auto_command_util.h>

// マップを開き、高台ベースへ移動
// 敵対時は移動できず、次にBボタンが押されるまでマップ画面のまま待機

void moveToTakadaiBase(){
    //マップ開く
    pushButton(Button::MINUS, 1000);
    // 高台ベースを選択し、移動
    pushButton(Button::X, 1000);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 100, 25);
}

// 高台ベースから北へ移動し、野盗オウメがいれば会話を始める
void plumHunter(){
    // 高台ベースへ移動
    moveToTakadaiBase();
    //マップ画面から高台ベースへ到着後、下方向を向く
    tiltJoystick(0, 100, 0, 0,500);
    // カメラリセット
    pushButton(Button::ZL, 200, 2);
    // 敵対によりマップを開いたままの場合、ここでマップを閉じる
    pushButton(Button::B, 300, 2);
    // アヤシシ呼び出し、まっすぐ進む
    pushButton(Button::PLUS, 1500);
    SwitchController().setStickTiltRatio(0, -100, 0, 0);
    SwitchController().pressButton(Button::B);
    delay(3000);
    // 走りながら左へ方向転換
    SwitchController().setStickTiltRatio(-90, -40, 0, 0);
    delay(1500);
    // カメラリセットし、まっすぐ進む
    pushButton(Button::ZL, 200, 2);
    SwitchController().setStickTiltRatio(0, -100, 0, 0);
    delay(1000);
    // 走りながら右へ方向転換
    SwitchController().setStickTiltRatio(90, -40, 0, 0);
    delay(2600);
    // カメラリセットし、まっすぐ進む
    pushButton(Button::ZL, 200, 2);
    SwitchController().setStickTiltRatio(0, -100, 0, 0);
    delay(1100);
    // 走りながら左へ方向転換
    SwitchController().setStickTiltRatio(-90, -40, 0, 0);
    delay(4000);
    // カメラリセットし、まっすぐ進む
    pushButton(Button::ZL, 200, 2);
    SwitchController().setStickTiltRatio(0, -100, 0, 0);
    delay(1000);
    // 走りながら右へ方向転換、ここまでで野盗遭遇ポイントは終了
    SwitchController().setStickTiltRatio(90, -80, 0, 0);
    delay(800);
    SwitchController().releaseButton(Button::B);
    // カメラリセットし、まっすぐ進む、川へ落ちてイダイトウにのって待機
    pushButton(Button::ZL, 200, 2);
    // ここからB連打し、野党との会話を進める
    SwitchController().setStickTiltRatio(0, -100, 0, 0);
    pushButton(Button::B, 100, 25);
    SwitchController().setStickTiltRatio(-100, 0, 0, 0);
    pushButton(Button::B, 100, 2);
    SwitchController().setStickTiltRatio(0, -100, 0, 0);
    pushButton(Button::B, 100, 5);
    SwitchController().setStickTiltRatio(100, 0, 0, 0);
    pushButton(Button::B, 100, 2);
    SwitchController().setStickTiltRatio(0, -100, 0, 0);
    pushButton(Button::B, 100, 15);
    // ポケモンと敵対している状態から逃げるため、左方向へ川を進む
    SwitchController().setStickTiltRatio(-100, 0, 0, 0);
    pushButton(Button::B, 100, 10);
    SwitchController().setStickTiltRatio(-80, 80, 0, 0);
    delay(500);
    SwitchController().setStickTiltRatio(-100, 0, 0, 0);
    pushButton(Button::B, 100, 10);
    SwitchController().setStickTiltRatio(0, 100, 0, 0);
    pushButton(Button::B, 100, 2);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
}

// 高台ベースで博士に話しかけ、コトブキ村へ戻り、再度黒曜の原野へ入る
void goBackKotobuki(){
    // 高台ベースへ移動
    moveToTakadaiBase();
    //マップ画面から高台ベースへ到着後、右上方向へ進み博士に話しかける
    //図鑑の更新があることを想定し、A連打

    SwitchController().setStickTiltRatio(65, -90, 0, 0);
    delay(1000);
    pushButton(Button::A, 100, 5);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    pushButton(Button::A, 100, 15);
    // 一度会話を終了、図鑑更新の場合は調査ポイント画面へ移動
    pushButton(Button::B, 100, 5);
    // オオニューラに切り替わるのを防ぐため、高台ベースへ移動
    moveToTakadaiBase();
    SwitchController().setStickTiltRatio(65, -90, 0, 0);
    delay(1500);
    pushButton(Button::A, 300);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    // 再び会話を開始、村へ戻るを選択
    pushButton(Button::A, 500);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 500);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 500);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 500);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 100, 60);
    // 村に戻ったらすぐに下方向(手前)に動き、再び黒曜の原野へ移動
    tiltJoystick(0, 100, 0, 0,1500);
    // オオニューラ対策の方向転換(門にたどり着いていれば問題なし)
    tiltJoystick(0, -100, 0, 0,100);
    // マップ上にいる時の対策として、マイナスボタンでマップを開く
    pushButton(Button::MINUS, 500);
    pushButton(Button::A, 100, 75);
    pushButton(Button::B, 100, 5);
}

// 高台ベースで団員に話しかけ、朝まで休む(夜にズバットに狩られるため、夜以外にのみ周回する)
void sleepAtNight(){
    // 高台ベースへ移動
    moveToTakadaiBase();
    //マップ画面から高台ベースへ到着後、左上方向へ進み団員に話しかける
    //図鑑の更新があることを想定し、A連打

    SwitchController().setStickTiltRatio(-55, -90, 0, 0);
    delay(1500);
    pushButton(Button::A, 500);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    // 休む→朝まで休む
    pushButton(Button::A, 500, 3);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 100, 50);
    pushButton(Button::B, 100, 5);
}

void setup(){
    pushButton(Button::B, 300, 13);  // 最初の数回の入力はswitchが認識しない場合があるので、無駄打ちをしておく
    
}

void loop(){
  // 夜になる前に休み、朝にする(戦闘などで休めないことがあるため、こまめに実行)
  sleepAtNight();
  // 日中にアヤシシライドと村帰還を繰り返し。夜になる前に余裕をもって休めるようにループ数を設定。
  for(int i=0; i<5; i++){
    plumHunter();
    goBackKotobuki();
  }
 
}

 

最後に

本スケッチを使用することで、効率は低めですが全自動できんのたまを収集することができます。枯渇しがちなボール素材の購入資金とするほか、打倒シュウゾウにお役立てください。1晩で貢物1回分以上は稼げるかと思います。


プログラムの不備、改善点などありましたらコメントやお問い合わせからお願いいたします。

Arduino Arduino Leonardo (ピンソケット・ピンヘッダ実装済) 【A000057】
by カエレバ

 

3 件のコメント:

  1. 野盗との遭遇後に技選択のためのAボタンを押す動作が無いように思うのですが、どのコードで技選択されているのでしょうか?

    返信削除
  2. Arduinoは持ってなかったので、Raspberry Pi用に書き換えて使用させてもらいました。
    何時間か放置しましたが、問題なく集めることができました!
    ありがとうございます!

    https://drive.google.com/file/d/1-_B4i_8iSNYj0zeCZ8QLtOIPzCMhP_Gs/view?usp=sharing

    返信削除
  3. 既に金策の必要性ないかもですけど、かちぬき道のシンジュ団周回のほうが道具失うリスクないのでいいかもしれないです。

    返信削除

【ポケモンSV×arduino06】道具プリンター乱数自動化(藍の円盤)

 ※本記事は、ポケモンSVの藍の円盤(DLC)にて、 道具プリンター を決まった日時に起動することで 特定のアイテム、ボールを狙って量産する操作を自動化 するプログラムについて解説した記事です。ポケモンSVの操作をArduino Leonardoで自動化しております。 本記事の内...