2021/07/31

【ポケモン×Arduino10】ふしぎなおくりものシリアルコード入力自動化(ストーリー自動化と一緒に)

※本記事は、ポケモン剣盾のふしぎなおくりものの受け取りの自動化について解説した記事です。ポケモン剣盾の操作をArduino Leonardoで自動化しております。「Arduinoって何?」って方は00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。

 

2021/10/23 色違いザシアンザマゼンタの配布に合わせ、調整しました。言語によってテキスト送りの時間に差があったため、全言語に対応すべく入力回数や猶予時間を増やしました。

2021/10/24 ろっこく 様より、 言語ごとに入力回数を変更できる改良版を提供いただきましたので、こちらにて公開させていただきます(ENG, SPA, ITA 以外であれば動作が速くなります)。

2021/10/25 こちゃてす 様より、Ver2.1をArduino Uno R3(ATmega16U2)用に変換したプログラムを提供いただきましたので、こちらに公開させていただきます。(私は16U2を使用していないため、こちらではサポートできません。ご了承ください。)

 2021/10/26 2番道路にて最初の短パン小僧付近の動きが少し不安定だったので、動きを変更したVer3.0(2.0より改良)を公開します。その他、スリープ関数の変更、ユーザー切り替え時に本体更新がされないための対策の追加をしました。

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


 

きっかけ、動機

執筆現在、7/31にウルトラボール、8/7にポリゴンZの配信がふしぎなおくりものにて予定されております。ふしぎなおくりものを1回や2回受け取るだけであればメインロムやサブロムのデータに対して自身で手入力すればよいのですが、これらを量産したい場合、新規データを作ってはストーリーを進める作業が必要となります。

ストーリーの周回については、以前に作成したストーリーの自動化(推薦状を貰って通信交換ができるようになるまで)を利用することで(効率は悪いですが)可能となります。それならば、意外と手間のかかるふしぎなおくりものの受け取りも自動化したい。というわけでキーボード入力に関する操作を自動化しました。


これで何ができるの?

今回作成したプログラムでは、メニューより「ふしぎなおくりもの」を開き、あらかじめ入力したシリアルコードを画面上キーボードで入力して受け取ります。

主な用途としては、ストーリーの自動化と組み合わせることで、新規データの作成からふしぎなおくりものを受け取るまでを一貫して自動化できます。

一応、今回のキーボード操作の機能は「文字」を「キーボード上の配置」に変換して入力をさせております。キーボード配置のデータを日本語入力などに置き換えることも可能なので、ふしぎなおくりもの以外にも文字入力の用途に使えるかと思います(使い道があるかは謎)。

 


原理、おおまかな流れ

概要

本プログラムでは、

非戦闘時、インターネット非接続状態からメニューを開ける状態からスタート

→メニューを開き、左下下段左から2番目(新規データ開始から進めた時の初期位置)の「ふしぎなおくりもの」を選択

→受け取る>シリアルコード と選択、ネットに接続する

→画面上キーボードにて、あらかじめ設定した文字列を入力する

→シリアルコードが正しければ受け取り、その後B連打でフィールド画面まで戻る

 

といった流れです。


準備、必要なもの

本スケッチでは、以下の準備が必要となります。

・ニンテンドーアカウントを連携し、ふしぎなおくりものをネットで受け取れるようにしておく

・メニュー画面左下下段左から2番目(新規データ開始から進めた時の初期位置)に「ふしぎなおくりもの」を配置する

・シリアルコードをスケッチ中の 「char giftcode[]」に設定しておく。文字は大文字か数字のみ。ふしぎなおくりものではO(オー)I(アイ)Z(ジィー)のアルファベットは使わず、数字の012に置き換えられているため注意。

 

作成したスケッチ

 今回は7/31~のウルトラボールの受け取りを行いました。

2021/10/23 色違いザシアン、ザマセンタの配布に合わせて調整しました。主に、全言語に対応するため、 入力回数や猶予時間を増やしました(詳しくはストーリー自動化にて)。

また、複数のデータ、複数のシリアルコードを連続して受け取れるように調整しました。配布するプログラム中「★」付近のコメントアウトを外すことで、ふしぎなおくりもの受け取り後ユーザー切り替えを行い、開始時のユーザーの1つ右隣のユーザーとして続けて動作するようにしました。


 char giftcode1[] = "PC4F1NALSBEAST";

を変更することで、任意のシリアルコードを入力します。ザシザマのシリアルコードを入力してください(英大文字と数字のみ、1イチとIアイなどに注意)。

作成したスケッチのファイル

「ふしぎなおくりもの」のみのファイルはこちらv1.12

(New)ストーリー進行~受け取りまでの自動化を合わせたものの最新版はこちら(ザシザマ受け取り)v3.0

 2021/10/26 2番道路にて最初の短パン小僧付近の動きが少し不安定だったので、動きを変更したVer3.0(2.0より改良)を公開します。短パン小僧付近で右、上、右と3段階で動いていたところを右上1段階に変更しています。その他、スリープ関数の変更、ユーザー切り替え時に本体更新がされないための対策の追加をしました。

Ver3.0はVer2.0をベースに作成しております。上記 ろっこく 様のVer2.1の機能(言語ごとの調整)を使用する場合は、「sleepNow()」「goToRoute2()」のみ編集してください。

 

2021/10/24 ろっこく 様より、 言語ごとに入力回数を変更できる改良版を提供いただきましたので、こちらにて公開させていただきます(ENG, SPA, ITA 以外であれば動作が速くなります)v2.1

2021/10/25 こちゃてす 様より、Ver2.1をArduino Uno R3(ATmega16U2)用に変換したプログラムを提供いただきましたので、こちらに公開させていただきます。v2.1for16U2

なお、私は16U2を使用していないため、こちらではサポートできません。ご了承ください。 こちゃてす 様よりお問い合わせ等の対応をしていただけるとのことですが、ご迷惑のないようにお願いいたします。

 

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

以下は、ストーリー開始(言語選択)~ふしぎなおくりもの受け取りまでの自動化をあわせたものの旧ファイルとなります(v1.x 相当)。

ボールを受け取る場合はこちら。(ウルトラボール受け取りの旧Ver)

ポケモンを受け取る場合はこちら。(セキタンザン、受け取ったポケモンをボックスに預けるまでの動作を追加) 

ザシアン・ザマゼンタ用旧

(ストーリーについてはストーリーの自動化を参照)

2021/08/15追記:セキタンザン配布に合わせて、ポケモンを受け取る時のスケッチを公開しました。元々の動作に加えて、不思議な贈り物を受け取った後にブラッシータウンのポケモンセンターのPCまで移動し、手持ちの3番目以降をボックスに預けます。持ち物が必要なければ、ポケモンHOMEでの輸送がしやすくなります。

また、ポケモンを受け取る際に図鑑登録される時間を考慮し、微調整を行いました(v1.12)。

2021/07/31 v.1.1公開しました。ふしぎなおくりものを受け取ったことがない場合など、テキストが増えた場合にも受け取りができるようになりました。メニュー欄の「ふしぎなおくりもの」の位置を左下に変更しました。また、ストーリー自動化と合わせたものも公開しました。

なお、執筆者がスケッチを作成するにあたり使用した環境は以下のようになります。

・データは日本語のシールド(パッケージ版+DLCあり)


使用する言語、あるいは本体やソフトの動作環境、通信速度などによって待機時間などが変わる可能性があります。

本スケッチを実際に使用した動画はこちら↓(v.2.0、ストーリー自動化と合わせて)

旧動画はこちら(Ver1.0)。2:30程度。

 

 ↓Ver1.0

 
/**
* ふしぎなおくりものを開き、指定したパスワードを入力して受け取る
* 非戦闘時、インターネット非接続状態からメニューを開ける状態からスタート
* メニュー左下に「ふしぎなおくりもの」を配置。あるいはプログラムを調整。
*
* ニンテンドーアカウントと連携が必要
*/

// 以下に'ふしぎなおくりものシリアルコード'を入力。大文字or数字のみ(Oオー,Iアイ,Zジィーなどは数字012に置き換え注意)
// 入力ミスは考慮していないため、要確認。大文字か、OIZを使っていないか。
char giftcode[] = "PC4F1NALSBEAST";

// キーボード配列。
char key[4][11] = {"1234567890",
                   "QWERTYU??P",
                   "ASDFGHJKL?",
                   "?XCVBNM???"};

#include <auto_command_util.h>
#include <avr/sleep.h>



// メニュー左下のふしぎなおくりものを選択、シリアルコードを入力して受け取り。
// あらかじめ上記でgiftCodeを設定すること。
void mysteryGift(){
    // メニュー左下を選択
    pushButton(Button::X, 1000);
    pushHatButtonContinuous(Hat::DOWN_LEFT, 1000);
    pushButton(Button::A, 1200);

    // おくりもの受け取る>シリアルコード
    pushButton(Button::A, 400);
    pushHatButton(Hat::DOWN, 200, 2);
    pushButton(Button::A, 200, 10);

    // インターネット接続中...待機時間要調整
    delay(10000);
    // インターネット接続完了
    pushButton(Button::A, 300, 8);
    SwitchController().pressButton(Button::B);
    delay(1500);
    SwitchController().releaseButton(Button::B);

    // キーボード入力開始
    keyTyping(giftcode);

    // コード確認中...待機時間要調整
    delay(7000);
    // 受け取り完了、その後B連打でフィールド画面へ戻る
    pushButton(Button::A, 10000);
    pushButton(Button::B, 400, 25);
}


// キーボードが開かれたところで指定されたコードを1文字ずつ入力し、最後に決定する
void keyTyping(char code[]){
    // 初期位置を指定。左上角を0,0とする
    int nowPosition[2] = {0, 0};
    // 1文字ずつ、文字が何行目、何列目かを確認
    for (int n = 0; n < strlen(code); n++){
      int gyo = 0;
      int retsu = 0;
      for (int i = 0; i < 4; i++){
        for (int j = 0; j < 10; j++){
          if (code[n] == key[i][j]){
            gyo = i;
            retsu = j;
            break;
          }
        }
        if (code[n] == key[gyo][retsu]){
          break;
        }
      }

      // 何文字↓、→に動かすかを確認(負の場合は逆方向)
      int sita = gyo - nowPosition[0];
      int migi = retsu - nowPosition[1];
      if (sita < 0){
        pushHatButton(Hat::UP, 100, sita * -1);
      } else {
        pushHatButton(Hat::DOWN, 100, sita);
      }
      if (migi < 0){
        pushHatButton(Hat::LEFT, 100, migi * -1);
      } else {
        pushHatButton(Hat::RIGHT, 100, migi);
      }
      pushButton(Button::A, 100);

      // 入力後の位置を現在位置として設定
      nowPosition[0] = gyo;
      nowPosition[1] = retsu;
    }

    // +ボタンで入力完了
    pushButton(Button::PLUS, 100, 2);
}


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

void loop(){
    

}
 

 

最後に

本スケッチを使用することで、ふしぎなおくりものでの配布を自動で受け取ることができます。受け取る動作単体での労力削減は少ないので、ストーリー自動化などと組み合わせて周回することをおすすめします。

やろうと思えば、

アカウント①でストーリー&受け取り→アカウントを切り替えて②で受け取り→③...

と連続で操作させて、複数の配布をまとめて受け取ることも可能です。

とりあえず今回はウルトラボールの受け取りを何度も行おうと思います。

 

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


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



0 件のコメント:

コメントを投稿

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

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