【マイコン】ポケモン剣盾のワット稼ぎを自動化!スイッチのVer11以降に対応!

マイコンを使ったポケモン剣盾のワット稼ぎを自動化してみました。

ニンテンドースイッチでは2020年12月にリリースされたVer11.0.0以降、UIが一新されましたね。それに対応したコードを紹介していますので、最新の本体を使っている方でも自動化できるものとなっています。

この記事をご覧になる前に

マイコンをまだ導入していない方は、以下の記事を参考に導入してみてください。このブログでは、Arduino Leonardoというマイコンを使っているため、異なる種類のものではうまく動かない可能性があります。

関連記事

マイコンと呼ばれるものをご存知でしょうか? Switchに接続するだけで様々な作業を "自動" で行ってくれるというものです。 導入すれば作業が楽になるだけでなく、寝てる間に色々稼ぐこともできちゃう便利なアイテムなわけですね! […]

マイコンを使って
ポケモン剣盾
自動化しよう!
【導入編】

※2021年2月11日追記:当ブログで使用するライブラリが「NintendoSwitchControlLibrary」へと変わりました。旧ライブラリのコードも残しておきますが、基本的には新しいライブラリをダウンロードして新しいコードを使ってください。

ダウンロードして解凍したら、『Arduino』フォルダの中にある『libraries』フォルダの中にコピーすればOKです。(展開を終えたら展開元のzipファイルは削除してしまって構いません。)

作成した経緯

ワット稼ぎに関しては、ネット上にサンプルコードがたくさん転がっています。

Qiita

背景ポケモン剣盾の孵化作業をArduinoで完全自動化するという記事で孵化厳選の自動化、ポイントアップ(ポイントマックス…

しかし、そのほとんどがスイッチのVer11以降に対応していませんでした。そこで、最新の本体にも対応したコードを自分で用意してみることにしました!

ただ、Ver11以降に対応させるだけではおもしろくないので、削れるところは削りつつもシビアなところは少し猶予をもたせるなど、高いパフォーマンスと安定感を両立させており、効率的にワットを稼ぐことができるようにしています。

ワット稼ぎには、ランクバトルを行う手法も存在します。ですが、気軽に使えるシンプルなコードにしたかったため、通常の状態で回すコードを書くことにしました。

ソースコード

実際に書いたコードはこちらになります。

2022年1月24日追記:時間変更度に再度巣穴をチェックするまでの時間を少し長くすることで安定感を高めました。

旧ライブラリ(NintendoSwitchControll)を使用している方はこちらをクリック
/**
* 巣穴からワットを回収し続けるスケッチ
*
* 初期条件は以下の通り
* 1.願いのかたまりを投げ入れた巣穴の前にいること
* 2.巣穴のワットは回収済みであること
* 3.インターネットで時間をあわせるがOFFになっていること
* 4.オフライン状態であること
* 5.無線のコントローラーが接続されていないこと
* 6.「設定」から「話の速さ」を「速い」にしておくこと
* 7.モンスターボールを1つ以上所持していること
*/

// ライブラリを読み込むためのコード
#include <auto_command_util.h>

// ワットを回収するシーケンス
void execWattGainSequence()
{
    // 募集開始
    pushButton(Button::A, 3000);
    // ホーム画面 > 設定
    pushButton(Button::HOME, 500);
    pushHatButton(Hat::DOWN, 25);
    pushHatButton(Hat::RIGHT, 25, 5); // SwitchのVer11〜に対応。11未満の場合は、最後の5を4にする必要がある
    pushButton(Button::A, 100);
    // 設定 > 本体 > 日付と時刻
    pushHatButtonContinuous(Hat::DOWN, 2000);
    pushHatButton(Hat::RIGHT, 25);
    pushHatButton(Hat::DOWN, 25, 4);
    pushButton(Button::A, 200);
    // 日付と時刻 > 現在の日付と時刻
    pushHatButton(Hat::DOWN, 25, 2);
    pushButton(Button::A, 500);
    pushHatButton(Hat::RIGHT, 25, 2);
    pushHatButton(Hat::UP, 25);
    pushHatButton(Hat::RIGHT, 25, 3);
    pushButton(Button::A, 50);
    // ホーム画面 > ゲーム画面
    pushButton(Button::HOME, 600);
    pushButton(Button::A, 600);
    // レイド募集中止
    pushButton(Button::B, 1000);
    pushButton(Button::A, 6000);
    // ワット回収
    pushButton(Button::A, 1000);
    pushButton(Button::B, 1000); // ここをBにすることで、月が変わった際にキャンセルできず詰んでしまう問題をスマートに解決できる
    pushButton(Button::A, 1000);
}

// マイコンのセット時に1度だけ行われる処理
void setup(){
    // Switchがマイコンを認識するまでは信号を受け付けないため、適当な処理をさせておく
    pushButton(Button::B, 500, 5);
    // 巣穴をチェックする
    pushButton(Button::A, 1000);
}

// ここに記述した内容がループされ続ける
void loop(){
    execWattGainSequence();
}
/**
 * 巣穴からワットを回収し続けるスケッチ
 *
 * 初期条件は以下の通り
 * 1.願いのかたまりを投げ入れた巣穴の前にいること
 * 2.巣穴のワットは回収済みであること
 * 3.インターネットで時間をあわせるがOFFになっていること
 * 4.オフライン状態であること
 * 5.無線のコントローラーが接続されていないこと
 * 6.「設定」から「話の速さ」を「速い」にしておくこと
 * 7.モンスターボールを1つ以上所持していること
 * 8.ちょいらくモードが「しない」であること
 */

// ライブラリを読み込むためのコード
#include <NintendoSwitchControlLibrary.h>

// Nintendo Switchのシステムバージョンを設定する
const int SWITCH_SYSTEM_VERSION = 13;

// Nintendo Switch Liteの場合はtrueを設定する
const bool IS_SWITCH_LITE = false;

// ホーム画面にSwitchのVer11から登場した Nintendo Switch Onlineのメニューが存在するか
bool hasNintendoSwitchOnlineMenu(int systemVersion) {
    return systemVersion >= 11;
}

// 設定 > 本体 に ドックの更新 メニューが存在するか
bool hasDockUpdateMenu(int systemVersion, bool isSwitchLite) {
    if (isSwitchLite) {
        return false;
    } else {
        return systemVersion >= 13;
    }
}

// ワットを回収するシーケンス
void execWattGainSequence() {
    // 募集開始
    pushButton(Button::A, 3000);
    // ホーム画面 > 設定
    pushButton(Button::HOME, 500);
    pushHat(Hat::DOWN, 25);
    if (hasNintendoSwitchOnlineMenu(SWITCH_SYSTEM_VERSION)) {
        pushHat(Hat::RIGHT, 25, 5);
    } else {
        pushHat(Hat::RIGHT, 25, 4);
    }
    pushButton(Button::A, 100);
    // 設定 > 本体 > 日付と時刻
    holdHat(Hat::DOWN, 2000);
    pushHat(Hat::RIGHT, 25);
    if (hasDockUpdateMenu(SWITCH_SYSTEM_VERSION, IS_SWITCH_LITE)) {
        pushHat(Hat::DOWN, 25, 9);
    } else {
        pushHat(Hat::DOWN, 25, 4);
    }
    pushButton(Button::A, 200);
    // 日付と時刻 > 現在の日付と時刻
    pushHat(Hat::DOWN, 25, 2);
    pushButton(Button::A, 500);
    pushHat(Hat::RIGHT, 25, 2);
    pushHat(Hat::UP, 25);
    pushHat(Hat::RIGHT, 25, 3);
    pushButton(Button::A, 50);
    // ホーム画面 > ゲーム画面
    pushButton(Button::HOME, 600);
    pushButton(Button::A, 600);
    // レイド募集中止
    pushButton(Button::B, 1000);
    pushButton(Button::A, 6000);
    // ワット回収
    pushButton(Button::A, 1000);
    pushButton(Button::B, 1000);  // ここをBにすることで、月が変わった際にキャンセルできず詰んでしまう問題をスマートに解決できる
    pushButton(Button::A, 1000);
}

// マイコンのセット時に1度だけ行われる処理
void setup() {
    // Switchがマイコンを認識するまでは信号を受け付けないため、適当な処理をさせておく
    pushButton(Button::B, 500, 5);
    // 巣穴をチェックする
    pushButton(Button::A, 1000);
}

// ここに記述した内容がループされ続ける
void loop() {
    execWattGainSequence();
}

Nintendo Switchのバージョンを確認する

※2021年9月19日追記:Nintendo Switchのバージョン13に対応しました。設定の項目数が増えたことで「日付と時間」までに必要なコマンドが少し変化したため、以下の設定を追加で確認してください。
なお、旧ライブラリ(NintendoSwitchControll)はNintendo Switchのバージョン13に対応しておりません。予めご了承ください。

コードの19行目には、現在使っているNintendo Switchのバージョン(小数点以下は不要)を入力してください。

const int SWITCH_SYSTEM_VERSION = 13;

コードの22行目には、現在使っているSwitchがNintendo Switch Liteの場合は「false」となっている箇所を「true」としてください。

Nintendo Switch ・Nintendo Switch(有機ELモデル)の場合

const bool IS_SWITCH_LITE = false;

Nintendo Switch Liteの場合

const bool IS_SWITCH_LITE = true;

設定の確認

マイコンを繋げる前に、以下の状態になっていることを確認してください。

ちょいらくモードが「しない」であることを追加しました。
  1. 願いのかたまりを投げ入れた巣穴の前にいること
  2. 巣穴のワットは回収済みであること
  3. インターネットで時間をあわせるがOFFになっていること
  4. オフライン状態であること(2021年9月24日追記:機内モードにはしないでください。レイドバトルの募集ができず、ワットを回収することができなくなります。
  5. 無線のコントローラー(プロコンなど)が接続されていないこと
  6. 「設定」から「話の速さ」を「速い」にしておくこと
  7. モンスターボールを1つ以上所持していること
  8. ちょいらくモードが「しない」であること

ワットは回収済み、巣穴をチェックしていない状態からのスタートです。以下の画像のようになっていればOKです。

巣穴の前

最後に

数時間放置しても問題なく動作していたため、安定性に関してはおそらく大丈夫かと思います。

ですが、万一ループから抜けてしまうようなことがありましたら、@lefmarnaまでお知らせください。

スポンサーリンク