【Arduino自動化04】パッチルドン自動受け取り(中国語・英語対応)

ますたーです。こんにちは。

ポケモン自動化4つ目の記事です。今回は、Arduino Leonardoで剣盾の化石ポケモン「パッチルドン」の受け取りを自動化します。これで色厳選・性格厳選・最遅厳選などができます。今回は、日本語のほかに、英語版・中国語版で動作確認しています。

Arduino Leonardoでの自動化環境の導入については、導入記事 を参考にしてください。

※本ブログに初めてお越しの方は「本ブログについて」もぜひ、ご覧ください。

 

概要

本記事では、「パッチルドン」の受け取りを自動化します。

f:id:tangential_star:20201114151526g:plain

カーソル移動があり連射コントローラーでは対応しにくい化石の受け取りも対応

 

では、もくじです。

 

作ったきっかけ

ポケモンの国際孵化のためにポケモン剣盾を英語版で遊んでいたのですが、Arduinoプログラムそのままだと動作がずれてうまく動きません。そこで、どうせなら外国語表記にも対応させよう!と思ったので作りました(だって外国語ってかっこいいじゃん…)

f:id:tangential_star:20201114170502g:plain

文字送り速度を調整して英語版でも正しく動くように!

ちなみに、パッチルドンに限らず化石ポケモンDLC冠の雪原でレイドで野生が解禁されました。こちらはレイドと違い、ボール厳選ができない反面、「完全放置」で「色厳選」ができます


使い方

諸々準備した後、ウカッツの前でArduinoを挿すだけです。

ちなみに、化石厳選を手動でやったことがある人なら知っているかもしれませんが、剣盾側で「設定」をいじる必要があります。注意しましょう。

デフォルトでは、日本語版の環境においてキリの良い100分(試行回数330回=11ボックス分)で止まるようなプログラムになっています。化石の所持数やボックスの空き状況などの必要に応じて、プログラムを書き換えてください。

準備はいいから早くソースコード寄越せって方は、どうぞ→ 読み飛ばす

f:id:tangential_star:20201114190354p:plain
f:id:tangential_star:20201114190401p:plain
左右の靴の色が違うミステリアスウーマン・ウカッツ氏は6番道路にいる
f:id:tangential_star:20201114191009p:plain
f:id:tangential_star:20201114191015p:plain
ボックスはしっかり空けておこう。連番で空けておくと後で確認が楽だ。

 

事前準備

準備としては、カセキ集め、ポケモン剣盾の設定とプログラムの書き換えの2つが必要です。それぞれの詳細は下記に載せますが、忘れがちな手順として、SEを消すなどがあるので注意しましょう。

化石を準備(カセキ集め)

パッチルドンの復元には、「カセキのトリ」「カセキのクビナガ」の2種類が必要です。充分な量を用意しましょう。カセキ集めは、ハシノマはらっぱの「穴掘り兄弟」の左側の兄貴(スキルのある方)にしてもらいましょう。ついでに「ねがいのかたまり」「ぎんのおうかん」などレアアイテムも掘りだせるのでコスパが良いです。

もし充分にカセキが無い人は、 自動ワット稼ぎ でワットをカンストしてから A連打で無限穴掘り をすると効率的です。

f:id:tangential_star:20201114211539p:plain

化石は余裕を持って準備しておく。パッチルドンは「トリ」「クビナガ」が必要だ。

ポケモン剣盾「設定」

設定画面を開き、下記の通り設定してください。「『SE』なんて項目が無いよ」って人は、エンジンシティで「すごいみみせん」をもらってください。

  • 話の速さ・・・「速い」
  • 手持ち/ボックス・・・「自動で送る」
  • ニックネーム登録・・・「しない」
  • SE・・・「0」

ちなみに、手動で化石厳選したことある人には分かると思いますが、SEを0にしないと、暗転した画面で「シュルルルルシュピッ!ピンポーン!」という音が2-3秒くらい入ります。1試行あたりの時間効率を上げるためにもSEは「0」推奨です。無論、今回のプログラムもそれに倣います。

f:id:tangential_star:20201114190048p:plain
f:id:tangential_star:20201114190054p:plain
「話の速さ」は「速い」、「手持ち/ボックス」は「自動で送る」に設定
f:id:tangential_star:20201114190132p:plain
f:id:tangential_star:20201114190127p:plain
さらに「ニックネーム登録」は「しない」、「SE」は「0」に設定

プログラムの書き換え(受け取る数)

前述の通り、このプログラムはパッチルドンを330匹(=11ボックス分)受け取ったら止まるようなプログラムになっています。化石の所持数やボックスの空き状況などの必要に応じて、プログラムを書き換えてください。

具体的には、「MAX_LIMIT_RECEIVE_POKEMON」の数字を必要に応じて「(330)」から書き換えます。日本語なら、1匹の受け取りにかかる時間は約18秒です。目安として、1ボックスで約9分、11ボックスで約100分です。

ちなみに、この1行をまるまる消すと、無限ループする(上限なく繰り返し続ける)プログラムになります。よくわからない人は素直に数字を入れてください。

// ↓受け取り上限数(空きボックス・所持化石の数で)を決めること
#define MAX_LIMIT_RECEIVE_POKEMON (330)

 

さらに、英語で遊んでいる人はその下にある「INTARVAL」の数字を「650」から「1300」に書き換える必要があります。中国語の人は「650」のままでOKです。

// ↓対応ロムの言語でINTARVAL(コマンド入力の間隔)を決めること 
#define INTERVAL (650)
// ←日本語・中国語ROM
//#define INTERVAL (1300) // ←英語版ROM

 

書いたプログラム

ウカッツに話しかけた時のセリフをひたすらAで進めていき、カセキの選択肢だけカーソル移動してAを押すだけのプログラム。

「そーれ がっちゃんこ! よし! よし! よしっ!」「パッチルドンを もらった!」 「パッチルドンを ボックスに転送しました!」など、待ち時間を調整しています。 

必要に応じて MAX_LIMIT_RECEIVE_POKEMON, INTERVALを書き換えてください。

/* ★自動カセキメラ受け取り【パッチルドン】★
【重要】設定 → SEを0、ニックネームはつけない、ボックスに自動で送る
上記設定で、ウカッツの前でセーブしてからArduinoを挿す。
*/ #include <SwitchControlLibrary.h> // ↓受け取り上限数(空きボックス・所持化石の数で)を決めること #define MAX_LIMIT_RECEIVE_POKEMON (330) // ↓対応ロムの言語でINTARVAL(コマンド入力の間隔)を決めること(どちらか) #define INTERVAL (650) // ←日本語・中国語ROM //#define INTERVAL (1300) // ←英語版ROM #define HOLDTIME (95) void PushHome(int delay_time_ms); void PushA(int delay_time_ms); void PushB(int delay_time_ms); void move_for(char* Direction); // ex: "right" "left" "up" "down" void move_for(char* Direction, int delay_time_ms); void move_for(char* Direction, int hold_time_ms, int delay_time_ms); void Debug(void); void setup() { PushHome(1000); PushHome(1000); PushHome(1000); PushHome(1000); PushHome(1000); PushHome(5000); // 5秒待つ PushHome(1000); delay(250); } void loop() { #ifdef MAX_LIMIT_RECEIVE_POKEMON int current_loop=0; for( current_loop=0; current_loop<MAX_LIMIT_RECEIVE_POKEMON; current_loop++ ){ #endif PushA(INTERVAL); // ん? カセキ そろってんね この ウカッツに みせてみ? PushA(INTERVAL); // はい //move_for("down"); // ウカッツの 眼鏡に かなう カセキは どれかね? delay(100); PushA(INTERVAL); // → カセキのトリを選択 delay(100); move_for("down"); // ウカッツの 興味を そそる カセキは どれかね? PushA(INTERVAL); // → カセキのクビナガ PushA(INTERVAL); // カセキのトリと カセキのクビナガで 復元? → それで よければ PushB(2200); // おけー! 復元しちゃって カセキの ナゾに せまるゾ!【暗転】 PushB(INTERVAL); // そーれガッチャンコ【明転】 delay(100); PushB(INTERVAL); // 目標 達成! みごとな 復元 カモ delay(100); PushB(INTERVAL); // 太古の ガラルで 暮らしていた 様子が 目に 浮かぶ ようだネ! PushB(4900); // かわいがって くれたまえよ PushB(2400);// パッチルドンを もらった! PushB(1200); // パッチルドンを 手持ちに 加えました! //Debug(); #ifdef MAX_LIMIT_RECEIVE_POKEMON } for(;;); // ここで処理終了(動作停止) #endif } void PushHome(int delay_time_ms){ SwitchControlLibrary().PressButtonHome(); delay(210); SwitchControlLibrary().ReleaseButtonHome(); delay(delay_time_ms); return; } void PushA(int delay_time_ms){ SwitchControlLibrary().PressButtonA(); delay(HOLDTIME); SwitchControlLibrary().ReleaseButtonA(); delay(delay_time_ms); return; } void PushB(int delay_time_ms){ SwitchControlLibrary().PressButtonB(); delay(HOLDTIME); SwitchControlLibrary().ReleaseButtonB(); delay(delay_time_ms); return; } void move_for(char* Direction){ // ex: "right" "left" "up" "down" switch(Direction[0]){ case 'r': case 'R': SwitchControlLibrary().MoveHat(2); // right delay(HOLDTIME); SwitchControlLibrary().MoveHat(8); // center delay(INTERVAL); break; case 'l': case 'L': SwitchControlLibrary().MoveHat(6); // left delay(HOLDTIME); SwitchControlLibrary().MoveHat(8); // center delay(INTERVAL); break; case 'u': case 'U': SwitchControlLibrary().MoveHat(0); // up delay(HOLDTIME); SwitchControlLibrary().MoveHat(8); // center delay(INTERVAL); break; case 'd': case 'D': SwitchControlLibrary().MoveHat(4); // down delay(HOLDTIME); SwitchControlLibrary().MoveHat(8); // center delay(INTERVAL); break; default: break; } } void move_for(char* Direction, int delay_time){ // ex: "right" "left" "up" "down" switch(Direction[0]){ case 'r': case 'R': SwitchControlLibrary().MoveHat(2); // right delay(HOLDTIME); SwitchControlLibrary().MoveHat(8); // center delay(delay_time); break; case 'l': case 'L': SwitchControlLibrary().MoveHat(6); // left delay(HOLDTIME); SwitchControlLibrary().MoveHat(8); // center delay(delay_time); break; case 'u': case 'U': SwitchControlLibrary().MoveHat(0); // up delay(HOLDTIME); SwitchControlLibrary().MoveHat(8); // center delay(delay_time); break; case 'd': case 'D': SwitchControlLibrary().MoveHat(4); // down delay(HOLDTIME); SwitchControlLibrary().MoveHat(8); // center delay(delay_time); break; default: break; } } void move_for(char* Direction, int hold_time_ms, int delay_time_ms){ // ex: "right" "left" "up" "down" switch(Direction[0]){ case 'r': case 'R': SwitchControlLibrary().MoveHat(2); // right delay(hold_time_ms); SwitchControlLibrary().MoveHat(8); // center delay(delay_time_ms); break; case 'l': case 'L': SwitchControlLibrary().MoveHat(6); // left delay(hold_time_ms); SwitchControlLibrary().MoveHat(8); // center delay(delay_time_ms); break; case 'u': case 'U': SwitchControlLibrary().MoveHat(0); // up delay(hold_time_ms); SwitchControlLibrary().MoveHat(8); // center delay(delay_time_ms); break; case 'd': case 'D': SwitchControlLibrary().MoveHat(4); // down delay(hold_time_ms); SwitchControlLibrary().MoveHat(8); // center delay(delay_time_ms); break; default: break; } } void Debug(){ // Homeボタンを2回押すだけの関数 PushHome(1000); PushHome(1000); return; }

 

動作確認

日本語版・英語版共にしっかりと動くはずです。
また、他の言語でやる場合も、上記プログラム書き換えの数字を調整すればうまくいくと思います(おそらく英語版と同じで動くのでは?)。

f:id:tangential_star:20201114151526g:plain
f:id:tangential_star:20201114170502g:plain
動作例(再掲)
※英語版では文字送り速度(プログラム上でINTERVAL)を650→1300に書き換え

 

あとがき

DLC「冠の雪原」が導入されて、パッチルドンを始めとする剣盾カセキポケモン4匹(通称カセキメラ)もレイドバトルで出現するようになりました。これが意味することは、彼らのボール厳選ができるようになってしまった、ということです(ショック)。

とはいえ、良くも悪くも今作のカセキポケモン4匹は「タマゴ未発見」グループのため、孵化厳選ができません。もとよりシンクロで性格固定もできないわけですし、レイドと今回の比較で見るならば、「色厳選」の観点で完全放置でできるこちらに軍配が上がりますよね。

同DLCで夢特性「ゆきかき」も解禁されたわけですし、色違いの「ゆきかきパッチルドン」の「でんげきくちばし」なんでのも面白いかと思います。

妄想が膨らみますね(この記事を書いている間にもずっとプログラム動かしていますが未だに色違いは見ていません。はやく会えるといいなぁ…)。→翌日に会えました

f:id:tangential_star:20201114224834p:plain
f:id:tangential_star:20201114224427p:plain
昼も夜も休むことなくウカッツはカセキを復元し続ける…

ニックネームをつけよう【余談】

完全に余談ですが、どうして今回は英語版や中国語版に対応させようと躍起になったかと言うと、ニックネームに英語7文字以上や漢字の入力がしてみたくなったからです。特に中国語(漢字)を使ったニックネームはマイブームでして、人気アニメのキャラクター名や必殺技名、地名や会社名など、色々と表記できるなぁと感心しています。

ちなみに、中国語で使われる漢字には「簡体字」と「繁体字」の2種類がありますが、後者は台湾や香港で使われている漢字で、日本語のそれと字体が近いものが多いんですね。Switchでは入力にコツがいりますが、漢字は日本人にとっても読みやすいものですし、いろいろなニックネーム付けや「おや」の名前が面白くできるので、個人的におすすめです。

f:id:tangential_star:20201114153541j:plain

中国語(繁体字)でのニックネーム例。
日本語では表せない厨二病くさいネームもお手の物だ。

実は、繁体字には、日本にない自体の漢字だったり、対応する漢字がそもそも無かったりなど、ちょっとだけ工夫が必要なので注意しましょう。

私としてはネタで、例えば

  • エンテイに「唯一神(エンテイ)」(第4世代以前のネタ
  • ブースターに「唯一王(ブースター)」(第5世代以前のネタ
  • しんそくマッスグマ(オリジナル)に「(マッスグマ)」(第7世代以前のネタ
  • 自信過剰ヘラクロス♂に「刺穿死棘槍(ゲイ・ボルク)」とつけてメガホーン@ハチマキ

あたりは面白いんじゃないかなーとか思っています。

 

あ、完全に話がそれちゃいましたね。

 

以上、今回のあとがきでした。

ではではc⌒っ.ω.)っ

 

前記事:

【Arduino自動化03】ワット稼ぎ・自動回収

 


11月15日22時半追記:無事にパッチルドンの色違いに出会えました。

試行回数は9,592匹でした。かかった時間は丸1日。

でも昨日作って今日出てきたので効率としては悪く無い…よね…?(苦行でした)

f:id:tangential_star:20201115230253g:plain

色違いのパッチルドンに会えた瞬間。受け取った直後に色違いかどうかが確認できる。

f:id:tangential_star:20201115224704g:plain

震える色違いパッチルドンかわいいいい!!

ちなみに、これまた余談ですが、彼ら剣盾のカセキポケモンたちは「ひかるおまもり」の効果を受けないため、一律1/4,096の確率で色違いが出現します。n回目に色違いと出会える確率pは、p=1-(4095/4096)^nで計算できます。

私と同様に9,592回厳選すれば、上記pは90.3%となりますので、10人に9人は色違いに会える計算となりますね。

 

ではでは c⌒っ.ω.)っ 

 

前記事:

【Arduino自動化03】ワット稼ぎ・自動回収

後記事:

【Arduino自動化05】乱数調整レイドで色違いパッチルドン探し【冠の雪原】

導入記事:

【Arduino自動化01】Arduino開発環境の導入