【マイコン】ポケモンBDSPでボックスのポケモンを逃がすコード【自動化】

ポケモンBDSPにおけるポケモンを逃がすコードを作成いたしました。

自動孵化でいっぱいになったボックスのポケモンたちをこちらのコードで逃しちゃってください。

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

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

関連記事

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

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

今回のコードは「NintendoSwitchControlLibrary」を使用しています。まだダウンロードされていない方は、解凍したフォルダを『Arduino』フォルダの中にある『libraries』フォルダの中にコピーしておいてください。

ソースコード

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

2022年1月31日追記:ボックスを開く時間に余裕を持たせ、安定性を向上させました。

/**
 * 指定された数のボックスに存在するポケモンをすべて逃がし、空の状態にするスケッチ
 *
 * 18行目の "const int BOX_COUNT = 2;" の箇所に、空にしたいボックス数を指定した状態(必ず半角数値で入力してください)で使用してください。
 * 【例:"const int BOX_COUNT = 5;" と指定すると、5ボックス分のポケモンを逃がすコードになる】
 *
 * 初期条件は以下の通り
 * 1.Xボタンを押したときに「タウンマップ」が左上、「ポケモン」がその右にあること
 * 2.30匹フルにポケモンが預けられたボックスが続いた状態であること。(タマゴなど逃がせないポケモンが混じった状態はNG)
 * 3.無線のコントローラーが接続されていないこと
 * 4.「設定」から「話の速さ」を「速い」にしておくこと
 */

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

// 何ボックス分逃がすかをここで指定する
const int BOX_COUNT = 2;

// ボタンを押した際の猶予時間
const int PUSH_BUTTON_DELAY = 500;
const int PUSH_HAT_DELAY = 50;

// ポケモンを逃がす関数
void releasePokemon() {
    // 「にがす」を選択
    pushButton(Button::A, PUSH_BUTTON_DELAY);
    pushHat(Hat::UP, PUSH_HAT_DELAY, 2);
    pushButton(Button::A, PUSH_BUTTON_DELAY);
    pushHat(Hat::UP, PUSH_HAT_DELAY);

    // 「本当に 逃がしますか?」
    pushButton(Button::A, 1000);
    pushButton(Button::A, PUSH_BUTTON_DELAY);
}

// 1ボックス分(30匹)ポケモンを逃がす関数
void releaseBox() {
    // 現在のボックスの列(左に移動するか、右に移動するかの判別に使用する)
    int boxline = 1;

    for (int i = 1; i <= 30; i++) {
        // ポケモンを逃がす
        releasePokemon();
        // 次のポケモンにカーソルを合わせる
        if (i % 6 == 0) {
            pushHat(Hat::DOWN, PUSH_HAT_DELAY);
            boxline++;
        } else if (boxline % 2 == 1) {
            pushHat(Hat::RIGHT, PUSH_HAT_DELAY);
        } else {
            pushHat(Hat::LEFT, PUSH_HAT_DELAY);
        }
    }

    // 次のボックスに移動する
    pushButton(Button::R, PUSH_BUTTON_DELAY);
    pushHat(Hat::DOWN, PUSH_HAT_DELAY, 2);
    pushHat(Hat::RIGHT, 500, 2);
}

void setup() {
    // Switchがマイコンを認識するまでは信号を受け付けないため、適当な処理をさせておく
    pushButton(Button::L, PUSH_BUTTON_DELAY, 5);

    // マイコンを認識したら、メニューの左上にカーソルを持っていく
    pushButton(Button::X, 750);
    holdHat(Hat::UP_LEFT, 1500);

    // ボックスを開く
    pushHat(Hat::RIGHT, PUSH_HAT_DELAY);
    pushButton(Button::A, 1250);
    pushButton(Button::R, 2500);
}

int loopCount = 0;
void loop() {
    // 指定されたボックス分のポケモンを逃し終えたら処理を終了する
    if (loopCount == BOX_COUNT) exit(0);

    releaseBox();
    loopCount++;
}

コードの使い方

コードを使うに以下の設定を確認してください。

設定の確認

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

  1. Xボタンを押したときに「タウンマップ」が左上、「ポケモン」がその右にあること
  2. 30匹フルにポケモンが預けられたボックスが続いた状態であること。(タマゴなど逃がせないポケモンが混じった状態はNG)
  3. 無線のコントローラー(プロコンなど)が接続されていないこと
  4. 「設定」から「話の速さ」を「速い」にしておくこと

「何ボックス分のポケモンを逃がすか?」を指定する

コードの18行目に注目してください。

const int BOX_COUNT = 2;

となっている箇所が見つけられましたか?

デフォルトでは2が指定されていますが、こちらの値を書き換えることで何ボックス分のポケモンを逃がすかを変更することができます。

例えば、5ボックス分のポケモンを逃したい場合は以下のように編集します。

const int BOX_COUNT = 5;
必ず半角数値で設定してください。

最後に

こちらのコードは複雑な操作も少ないため、問題なく動作すると思います。

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

スポンサーリンク