140字以上つぶやき

主にゲームの事とか。気まぐれで別の何か。

【ポケモンSV藍の円盤】相棒と心を重ねてBPを自動回収している話【Arduino】


サムネ画像  
 
どうも。あずきです。

最近、ものすごく久しぶりにポケモンを起動しました。
DLC後編『藍の円盤』が来てから少しだけやったのですが、BP集めがあまりにも苦痛すぎて投げ出していたことを思い出しました。
ブルレクを4人で集まると効率よくBPを集められるらしいですが、僕にそこまでの人徳はない(というか人集めて作業ゲーしたくない)ので、今回も文明の利器に頼って自動でBP集めをしたいと思います。
 
これまでのブログの中で、今でも剣盾のダイマックスアドベンチャーやバトルタワー、DLC前のSV学校最強大会の自動周回記事へのアクセス数が上位に上がっているので、みんな面倒なことはしたくないよね・・・そうだよね・・・という気持ちです。
僕の拙く面白みもないブログを見に来てくれて、本当にありがとうございます。  
 
SVにおけるBP集めはかなり苦痛で、ネットで探してみても
 
1. ブルレク
2. そらをとぶチャレンジ
 
の2択が主流になっています。
 
 
ぶっちゃけ、どっちもめんどくさいですよね???
 
 
何かいい策はないかと学園内を探索していたところ、ブルーベリー学園の『センタースクエア』北東にいるシンクロミという女性から、BPを貰えることが判明しました。  
 
どうやら『シンクロ』(L押しながらRを押すとできるやつ、特性ではない)を10回以上やってから話しかけると、10~50BPをプレゼントしてくれるようです。
ということは、『シンクロを10回やってシンクロミに話しかける』を無限にループすることで、BPを永遠に貰えるということになります。
これを発見した時は「やべえの見つけちゃった・・・」という気持ちでしたが、よく調べると「シンクロミからBPを貰える」という話は既出だったようです。じゃあなんで自動化の記事がないの・・・?
 
 
で、いつもならサーバーガジェット製のマクロ機能付きコントローラーを使って自動化を組むのですが、今回はマクロツールを使って自動化を組みたいと思います。
 
[2024.5.12追記]
Arduino対応しました。
 
用意したのは、ArduinoではなくNX Macro Controller(以下:NX Macro)というPCアプリケーションです。
いや本当はArduinoを使いたかったんですよ?使いたかったんですが、Amazonで購入したArduino Unoの互換機にドライバーをあてることができず、買い直したleonardoも届くのが数日先になってしまうので、もうめんどくさいし前から使っているNX Macroでいいか・・・となった感じです。
といっても、マクロの記述方法が違うだけで、動作自体はNX MacroもArduinoも同じことができる・・・はずです。僕はArduinoを全く理解できていないので、詳しい人がこの記事を参考に分かりやすいArduino解説記事を書いてくれるんじゃないかなチラチラ
 
今回NX Macroを使用した理由ですが、NX MacroにはPCに接続しているBluetoothアダプターをSwitchコントローラーとして認識させる機能があるためです。これにより、マクロボードを持っていなくても、PCさえ起動していれば複雑なマクロを実行できます。
この機能を使うためにはBluetoothアダプターのドライバーを書きかえる必要があるため、マザーボードについているBluetoothアダプターは使わず、USBで外付けできるBluetoothアダプターにドライバーを焼くことにしました。
僕はAmazonでセールをしていたTP-LinkのBluetoothアダプターを使っています(型番忘れた)
NX Macroのインストールについては割愛します。多分みんなArduino使うから気にしないでしょ(適当)

[2024.5.12追記]
Arduino対応しました。
 
今回マクロ機能付きコントローラーを使わなかった理由は、仕込みたいマクロがギリギリ30秒に収まるか怪しかったためです。
それと、10回シンクロしてから話しかけるのが一番効率が良いのですが、マクロ機能付きコントローラーの場合は『シンクロ2回+シンクロミに話しかける』という動作が必要となり、ループ破綻しない最適化が難しかったためでもあります。
要望があればマクロ機能付きコントローラーでもできるようなコマンドを探しますが、Arduinoが有名になった今、あまり需要はないかと思うので積極的な更新はしない予定です。
 
マクロコマンド自体はそこまで複雑ではないので、サクッと進めます。
 
 
みんなもれっつら周回!!
 
 
 

はじめに

とりあえず最低要件として満たす必要があること
 
DLC『藍の円盤』を進め、ブルーベリー学園のテラリウムドーム内『センタースクエア』に行くことができること
・ 複雑なマクロを実行できる環境が整っていること(NX MacroやArduinoなど)
・ いかなる不具合が生じても自己責任であること
 
これらの条件を満たした方は先にお進みください。  
 

マクロコマンド

NX Macroでのコードになります。それぞれに合ったコマンドに翻訳してください。

NX Macroのコード(クリックで展開)
Loop()
{
  //シンクロ動作
    Loop(10)
    {
      //LRを押してシンクロ開始
        Press(L, R, 0.10)
      //Lボタン押しっぱなしで5秒待機
        Press(L, 5.00)
      //LRを押してシンクロ終了
        Press(L, R, 0.10)
      //「シンクロマシンをやめる」のテキスト送り
        Press(A, 0.10)
      //1秒待機
        Wait(1.00)
      //やめる「はい」
        Press(A, 0.10)
      //5秒待機
        Wait(5.50)
    }
  //シンクロミに話しかける
    Press(A, 0.10)
  //2秒待機
    Wait(2.00)
  //テキスト送り
    Press(A, 0.10)
  //1.2秒待機
    Wait(1.20)
  //テキスト送り
    Press(A, 0.10)
  //4秒待機
    Wait(4.00)
  //テキスト送り
    Press(A, 0.10)
  //1.5秒待機
    Wait(1.50)
  //下に0.5秒移動して0.1秒待機
    Press(DOWN_L, 0.50, 0.10)
  //上に0.5秒移動して0.1秒待機
    Press(UP_L, 0.50, 0.10)
  //0.5秒待機
    Wait(0.50)
}

 
[2024-5-12追記]
Arduinoでも書きました。冗長すぎる気はしますが、動くのでヨシ!!
今回はボタンの同時押しに対応できる『Switch Controll Library』のv2系を利用しました。

Arduinoのコード(クリックで展開)
#include <SwitchControlLibrary.h>

// Aを0.1秒押して離す短縮コマンド
void PushA(){
  SwitchControlLibrary().pressButton(Button::A);
  SwitchControlLibrary().sendReport();
  delay(100);
  SwitchControlLibrary().releaseButton(Button::A);
  SwitchControlLibrary().sendReport();
}

// ↓無線コントローラーから切替える場合のセットアップ↓
// HOME→コントローラー→持ちかた/順番を変える の画面から実行

// HOMEを0.1秒押して離す短縮コマンド
void PushHOME(){
  SwitchControlLibrary().pressButton(Button::HOME);
  SwitchControlLibrary().sendReport();
  delay(100);
  SwitchControlLibrary().releaseButton(Button::HOME);
  SwitchControlLibrary().sendReport();
}

void WirelessControllerSetup(){
  // for内を5回繰り返す
  for(int i=0; i<5; i++){
    // LRを0.1秒押して離す
    SwitchControlLibrary().pressButton(Button::L);
    SwitchControlLibrary().pressButton(Button::R);
    SwitchControlLibrary().sendReport();
    delay(100);
    SwitchControlLibrary().releaseButton(Button::L);
    SwitchControlLibrary().releaseButton(Button::R);
    SwitchControlLibrary().sendReport();
    // 0.5秒待機
    delay(500);
  }
  // 1秒待機してAを0.1秒押して離す
  delay(1000);
  PushA();
  // 1秒待機してHOMEを0.1秒押して離す
  delay(1000);
  PushHOME();
  // 1秒待機してHOMEを0.1秒押して離す
  delay(1000);
  PushHOME();
  // 4秒待機
  delay(4000);
}
// ↑ここまで無線コントローラーから切替える場合のセットアップ↑

// ↓有線コントローラーから切替える場合のセットアップ↓
// 有線コントローラーの本体接続を解除してから実行
void ControllerSetup(){
  // for内を5回繰り返す
  for(int i=0; i<5; i++){
    // Lを0.1秒押して離す
    SwitchControlLibrary().pressButton(Button::L);
    SwitchControlLibrary().sendReport();
    delay(100);
    SwitchControlLibrary().releaseButton(Button::L);
    SwitchControlLibrary().sendReport();
    // 0.5秒待機
    delay(500);
  }
  // 2秒待機
  delay(2000);
}
// ↑ここまで有線コントローラーから切替える場合のセットアップ↑

// シンクロを10回行う
void Synchro(){
  // 10回繰り返す
  for(int i=0; i<10; i++){
  // Lを押す
  SwitchControlLibrary().pressButton(Button::L);
  SwitchControlLibrary().sendReport();
  // 0.5秒待機してRを押す
  delay(500);
  SwitchControlLibrary().pressButton(Button::R);
  SwitchControlLibrary().sendReport();
  // 0.5秒待機してLRを離す
  delay(500);
  SwitchControlLibrary().releaseButton(Button::L);
  SwitchControlLibrary().releaseButton(Button::R);
  SwitchControlLibrary().sendReport();
  // 0.1秒待機してLを押す
  delay(100);
  SwitchControlLibrary().pressButton(Button::L);
  SwitchControlLibrary().sendReport();
  // 5秒待機してRを押す
  delay(5000);
  SwitchControlLibrary().pressButton(Button::R);
  SwitchControlLibrary().sendReport();
  // 0.5秒待機してLRを離す
  delay(500);
  SwitchControlLibrary().releaseButton(Button::L);
  SwitchControlLibrary().releaseButton(Button::R);
  SwitchControlLibrary().sendReport();
  // 1.5秒待機してAを0.1秒押して離す
  delay(1500);
  PushA();
  // 1秒待機してAを0.1秒押して離す
  delay(1000);
  PushA();
  // 5.5秒待機
  delay(5500);
  }
}

// シンクロミに話しかける
void TalkSynchromi(){
  // Aを0.1秒押して離す
  PushA();
  // 3秒待機してAを0.1秒押して離す
  delay(3000);
  PushA();
  // 1.2秒待機してAを0.1秒押して離す
  delay(1200);
  PushA();
  // 4秒待機してAを0.1秒押して離す
  delay(4000);
  PushA();
  // 1.5秒待機
  delay(1500);
}

void setup() {
  // 有線コントローラーからArduinoに切替える
  // 無線コントローラーの場合は関数の『 /* */ 』を消す
  /*Wireless*/ControllerSetup();
}

void loop() {
  // 10回繰り返す
  for(int i=0; i<10; i++){
    Synchro();
    TalkSynchromi();
  }
  // 下に0.5秒移動して離す
  SwitchControlLibrary().moveLeftStick(128, 255);
  SwitchControlLibrary().sendReport();
  delay(500);
  SwitchControlLibrary().moveLeftStick(128, 128);
  SwitchControlLibrary().sendReport();
  // 0.5秒待機して上に0.4秒移動して離す
  delay(100);
  SwitchControlLibrary().moveLeftStick(128, -255);
  SwitchControlLibrary().sendReport();
  delay(400);
  SwitchControlLibrary().moveLeftStick(128, 128);
  SwitchControlLibrary().sendReport();
  // 0.5秒待機
  delay(500);
}  

 
プログラミング初心者なので、書き方が汚いのは目をつぶってください。
これで2日ほど放置していますが、今のところ止まることはないです。
 

コマンド解説

シンクロミ接触し、マクロを実行します。
各ボタンを100ms押すことにしているので、Arduinoに書く時は、各ボタン入力の間に待機時間を入れたり、各待機時間を調整してみてください。
Lボタンを長押ししているのは、カメラの正面リセットを避けるためです。正面リセットをするとオブジェクトが多いセンタースクエア中心部を見ようとするので、処理落ち回避のためにカメラ移動をしないように組みました。
 
[2024.5.6追記]
移動せずに同じ場所に留まり続けると処理落ちするようなので、シンクロミ会話後に意図的に移動させ、処理落ちを回避させるようにしました。
今のところ不具合は生じていませんが、移動させることでシンクロやシンクロミに話しかける動作に問題が生じる可能性があります。
問題が見つかった場合は修正&追記します。
 

動作のコツ

壁とシンクロミに対して直角に立たず、少し斜めに立つとシンクロ召喚が安定します。
シンクロするポケモンは、浮いていなくて身体が小さいポケモンが良さげです。 浮いていたり身体が大きいと、シンクロミに押しやられてポケモンの座標がズレて、その動作が遅延になりループ抜けすることがありました(1敗)
ちなみに、僕はタマゲタケでシンクロしています。タマゲタケかわいいね
 
 
 
なにかあればまた追記します。
それでは、よいポケモンライフを。

おしまい