ますたーです。こんにちは。
ポケモン自動化4つ目の記事です。今回は、Arduino Leonardoで剣盾の化石ポケモン「パッチルドン」の受け取りを自動化します。これで色厳選・性格厳選・最遅厳選などができます。今回は、日本語のほかに、英語版・中国語版で動作確認しています。
Arduino Leonardoでの自動化環境の導入については、導入記事 を参考にしてください。
※本ブログに初めてお越しの方は「本ブログについて」もぜひ、ご覧ください。
概要
本記事では、「パッチルドン」の受け取りを自動化します。
では、もくじです。
作ったきっかけ
ポケモンの国際孵化のためにポケモン剣盾を英語版で遊んでいたのですが、Arduinoプログラムそのままだと動作がずれてうまく動きません。そこで、どうせなら外国語表記にも対応させよう!と思ったので作りました(だって外国語ってかっこいいじゃん…)。
ちなみに、パッチルドンに限らず化石ポケモンはDLC冠の雪原でレイドで野生が解禁されました。こちらはレイドと違い、ボール厳選ができない反面、「完全放置」で「色厳選」ができます。
使い方
諸々準備した後、ウカッツの前でArduinoを挿すだけです。
ちなみに、化石厳選を手動でやったことがある人なら知っているかもしれませんが、剣盾側で「設定」をいじる必要があります。注意しましょう。
デフォルトでは、日本語版の環境においてキリの良い100分(試行回数330回=11ボックス分)で止まるようなプログラムになっています。化石の所持数やボックスの空き状況などの必要に応じて、プログラムを書き換えてください。
準備はいいから早くソースコード寄越せって方は、どうぞ→ 読み飛ばす
事前準備
準備としては、カセキ集め、ポケモン剣盾の設定とプログラムの書き換えの2つが必要です。それぞれの詳細は下記に載せますが、忘れがちな手順として、SEを消すなどがあるので注意しましょう。
化石を準備(カセキ集め)
パッチルドンの復元には、「カセキのトリ」「カセキのクビナガ」の2種類が必要です。充分な量を用意しましょう。カセキ集めは、ハシノマはらっぱの「穴掘り兄弟」の左側の兄貴(スキルのある方)にしてもらいましょう。ついでに「ねがいのかたまり」「ぎんのおうかん」などレアアイテムも掘りだせるのでコスパが良いです。
もし充分にカセキが無い人は、 自動ワット稼ぎ でワットをカンストしてから A連打で無限穴掘り をすると効率的です。
設定画面を開き、下記の通り設定してください。「『SE』なんて項目が無いよ」って人は、エンジンシティで「すごいみみせん」をもらってください。
- 話の速さ・・・「速い」
- 手持ち/ボックス・・・「自動で送る」
- ニックネーム登録・・・「しない」
- SE・・・「0」
ちなみに、手動で化石厳選したことある人には分かると思いますが、SEを0にしないと、暗転した画面で「シュルルルルシュピッ!ピンポーン!」という音が2-3秒くらい入ります。1試行あたりの時間効率を上げるためにも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です。
#define INTERVAL (650)
書いたプログラム
ウカッツに話しかけた時のセリフをひたすらAで進めていき、カセキの選択肢だけカーソル移動してAを押すだけのプログラム。
「そーれ がっちゃんこ! よし! よし! よしっ!」「パッチルドンを もらった!」 「パッチルドンを ボックスに転送しました!」など、待ち時間を調整しています。
必要に応じて MAX_LIMIT_RECEIVE_POKEMON, INTERVALを書き換えてください。
#include <SwitchControlLibrary.h>
#define MAX_LIMIT_RECEIVE_POKEMON (330)
#define INTERVAL (650)
#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);
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);
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);
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);
#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){
switch(Direction[0]){
case 'r':
case 'R':
SwitchControlLibrary().MoveHat(2);
delay(HOLDTIME);
SwitchControlLibrary().MoveHat(8);
delay(INTERVAL);
break;
case 'l':
case 'L':
SwitchControlLibrary().MoveHat(6);
delay(HOLDTIME);
SwitchControlLibrary().MoveHat(8);
delay(INTERVAL);
break;
case 'u':
case 'U':
SwitchControlLibrary().MoveHat(0);
delay(HOLDTIME);
SwitchControlLibrary().MoveHat(8);
delay(INTERVAL);
break;
case 'd':
case 'D':
SwitchControlLibrary().MoveHat(4);
delay(HOLDTIME);
SwitchControlLibrary().MoveHat(8);
delay(INTERVAL);
break;
default:
break;
}
}
void move_for(char* Direction, int delay_time){
switch(Direction[0]){
case 'r':
case 'R':
SwitchControlLibrary().MoveHat(2);
delay(HOLDTIME);
SwitchControlLibrary().MoveHat(8);
delay(delay_time);
break;
case 'l':
case 'L':
SwitchControlLibrary().MoveHat(6);
delay(HOLDTIME);
SwitchControlLibrary().MoveHat(8);
delay(delay_time);
break;
case 'u':
case 'U':
SwitchControlLibrary().MoveHat(0);
delay(HOLDTIME);
SwitchControlLibrary().MoveHat(8);
delay(delay_time);
break;
case 'd':
case 'D':
SwitchControlLibrary().MoveHat(4);
delay(HOLDTIME);
SwitchControlLibrary().MoveHat(8);
delay(delay_time);
break;
default:
break;
}
}
void move_for(char* Direction, int hold_time_ms, int delay_time_ms){
switch(Direction[0]){
case 'r':
case 'R':
SwitchControlLibrary().MoveHat(2);
delay(hold_time_ms);
SwitchControlLibrary().MoveHat(8);
delay(delay_time_ms);
break;
case 'l':
case 'L':
SwitchControlLibrary().MoveHat(6);
delay(hold_time_ms);
SwitchControlLibrary().MoveHat(8);
delay(delay_time_ms);
break;
case 'u':
case 'U':
SwitchControlLibrary().MoveHat(0);
delay(hold_time_ms);
SwitchControlLibrary().MoveHat(8);
delay(delay_time_ms);
break;
case 'd':
case 'D':
SwitchControlLibrary().MoveHat(4);
delay(hold_time_ms);
SwitchControlLibrary().MoveHat(8);
delay(delay_time_ms);
break;
default:
break;
}
}
void Debug(){
PushHome(1000);
PushHome(1000);
return;
}
動作確認
日本語版・英語版共にしっかりと動くはずです。
また、他の言語でやる場合も、上記プログラム書き換えの数字を調整すればうまくいくと思います(おそらく英語版と同じで動くのでは?)。
あとがき
DLC「冠の雪原」が導入されて、パッチルドンを始めとする剣盾カセキポケモン4匹(通称カセキメラ)もレイドバトルで出現するようになりました。これが意味することは、彼らのボール厳選ができるようになってしまった、ということです(ショック)。
とはいえ、良くも悪くも今作のカセキポケモン4匹は「タマゴ未発見」グループのため、孵化厳選ができません。もとよりシンクロで性格固定もできないわけですし、レイドと今回の比較で見るならば、「色厳選」の観点で完全放置でできるこちらに軍配が上がりますよね。
同DLCで夢特性「ゆきかき」も解禁されたわけですし、色違いの「ゆきかきパッチルドン」の「でんげきくちばし」なんでのも面白いかと思います。
妄想が膨らみますね(この記事を書いている間にもずっとプログラム動かしていますが未だに色違いは見ていません。はやく会えるといいなぁ…)。→翌日に会えました。
ニックネームをつけよう【余談】
完全に余談ですが、どうして今回は英語版や中国語版に対応させようと躍起になったかと言うと、ニックネームに英語7文字以上や漢字の入力がしてみたくなったからです。特に中国語(漢字)を使ったニックネームはマイブームでして、人気アニメのキャラクター名や必殺技名、地名や会社名など、色々と表記できるなぁと感心しています。
ちなみに、中国語で使われる漢字には「簡体字」と「繁体字」の2種類がありますが、後者は台湾や香港で使われている漢字で、日本語のそれと字体が近いものが多いんですね。Switchでは入力にコツがいりますが、漢字は日本人にとっても読みやすいものですし、いろいろなニックネーム付けや「おや」の名前が面白くできるので、個人的におすすめです。
実は、繁体字には、日本にない自体の漢字だったり、対応する漢字がそもそも無かったりなど、ちょっとだけ工夫が必要なので注意しましょう。
私としてはネタで、例えば
- エンテイに「唯一神」(第4世代以前のネタ
- ブースターに「唯一王」(第5世代以前のネタ
- しんそくマッスグマ(オリジナル)に「神」(第7世代以前のネタ
- 自信過剰ヘラクロス♂に「刺穿死棘槍」とつけてメガホーン@ハチマキ
あたりは面白いんじゃないかなーとか思っています。
あ、完全に話がそれちゃいましたね。
以上、今回のあとがきでした。
ではではc⌒っ.ω.)っ
前記事:
【Arduino自動化03】ワット稼ぎ・自動回収
11月15日22時半追記:無事にパッチルドンの色違いに出会えました。
試行回数は9,592匹でした。かかった時間は丸1日。
でも昨日作って今日出てきたので効率としては悪く無い…よね…?(苦行でした)
ちなみに、これまた余談ですが、彼ら剣盾のカセキポケモンたちは「ひかるおまもり」の効果を受けないため、一律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開発環境の導入