ポケモン剣盾 余った卵が捨てられないので自動孵化させよう
はじめに
どうも、しゅんぞうと申します。
このちっぽけな記事をご覧いただいている皆様は、おそらく剣盾廃人&色厳選ガチ勢だと思います。ありがとうございます。
色違い欲しすぎ問題
私は先人たちの知恵を借り、Arduinoでポケモンの自動孵化をやっていました。エアームドの色違いがどうしても欲しかったのですが、これまでに10体ほど自力で色違い厳選をしている中で、時間・体力・めんどくささなど、正直限界を感じていました。
そんな中、出会ったのが以下の記事です。
衝撃を受けました。まさに革命的。私は早速AmazonでArduinoを購入し、実践してみました。
(まずは上記の記事をご覧ください。まあこの記事にたどり着いた方はすでに実践済みかもしれませんが。)
こちらの記事に記載の通りにArdinoを買い、プログラムをコピペし、いざやってみると、なぜかうまくいきませんでした。
というのも、卵が産まれすぎてしまったのです。(500匹あたり200個ぐらい卵のままで孵化できていない)
いろいろ検証してわかったのですが、どうやら卵の孵化秒数を誤ったようです。
const int TIME_TO_HATCHING_SEC = 70;
一般的には70ぐらいでいけるみたいですが、私が厳選していたエアームドはもう少し遅いようで、だいたい90~100ぐらいは必要みたいです。
ああああああああああああああちゃんと調べればよかったああああああああああああああああああああああああああああああああああああああああああ。。。。。。。。
丸一日放置したボックスは悲惨の一言
えげつないほどの卵の量。だいたい200個ほど卵が余ってしまいました。
「はあああああああ!?!!?!?めんどくせえええええええええええ、捨てよっと。」
ポケモンはこれができません。倫理上の問題とからしいです。知らんけど。
いやいやいやいや、いちいち割るのめんどくせええええええええええええ!!!!!!!!!!!!!!
そう考えた私はひらめきます。
「じゃあ卵を受け取らないで、ひたすらボックス内の卵を割りまくるようにプログラムを書き換えたらいいんじゃね?」
(カタカタカタカタカタカタ)
(トン)
数時間後
できました。こちらです。
#include <auto_command_util.h>
const int TIME_TO_HATCHING_SEC = 100;
// 空飛ぶタクシーでハシノマはらっぱに移動
void moveToInitialPlayerPosition(){
pushButton(Button::X, 1000);
pushHatButtonContinuous(Hat::LEFT_UP, 1000);
pushButton(Button::A, 2500);
tiltJoystick(20, -20, 0, 0, 200); /*←この行を追加します。*/
pushButton(Button::A, 1500, 2);
delay(2000);
}
// 預かり屋さんの位置からスタートして5番道路を往復する
void runAround(int run_time_sec){
// 通行人とぶつかることを避けるため道路の中央位置に移動する
tiltJoystick(0, 100, 0, 0, 100);
// 15秒右へ行く→振り返る→15秒左へ行く→振り返るを繰り返す
for(int i=0; i<run_time_sec/30; i++){
tiltJoystick(100, 0, 0, 0, 15000);
pushButton(Button::PLUS, 500);
tiltJoystick(-100, 0, 0, 0, 500);
pushButton(Button::PLUS, 500);
tiltJoystick(-100, 0, 0, 0, 15000);
pushButton(Button::PLUS, 500);
tiltJoystick(100, 0, 0, 0, 500);
pushButton(Button::PLUS, 500);
}
// 最後に30秒に満たない端数分走る
if(15 < run_time_sec%30){
tiltJoystick(100, 0, 0, 0, 15000);
pushButton(Button::PLUS, 500);
tiltJoystick(-100, 0, 0, 0, 500);
pushButton(Button::PLUS, 500);
tiltJoystick(-100, 0, 0, 0, ((run_time_sec%30)*1000)-15000);
} else {
tiltJoystick(100, 0, 0, 0, (run_time_sec%30)*1000);
}
}
// 卵が孵化するのを待つ
void waitEggHatching(){
pushButton(Button::B, 500, 40);
}
// 孵化した手持ちのポケモンをボックスに預ける
// box_line : 何列目にポケモンを預けるか
void sendHatchedPoemonToBox(int box_line){
// ボックスを開く
pushButton(Button::X, 1000);
pushHatButtonContinuous(Hat::LEFT_UP, 1000);
pushHatButton(Hat::RIGHT, 500);
pushButton(Button::A, 2000);
pushButton(Button::R, 2000);
// 手持ちの孵化したポケモンを範囲選択
pushHatButton(Hat::LEFT, 500);
pushHatButton(Hat::DOWN, 500);
pushButton(Button::Y, 500, 2);
pushButton(Button::A, 500);
pushHatButtonContinuous(Hat::DOWN, 2000);
pushButton(Button::A, 500);
// ボックスに移動させる
pushHatButton(Hat::RIGHT, 500, box_line+1);
pushHatButton(Hat::UP, 500);
pushButton(Button::A, 500);
//もしボックスの最終行の手前だった場合は
if(box_line<5){
// 右の列に移動してポケモンを選択する
pushHatButton(Hat::RIGHT, 500);
pushButton(Button::A, 500);
pushHatButtonContinuous(Hat::DOWN, 2000);
pushButton(Button::A, 500);
pushHatButton(Hat::LEFT, 500, box_line+1);
pushHatButton(Hat::LEFT, 500);
pushHatButton(Hat::DOWN, 500);
pushButton(Button::A, 500);
}
else{
}
// ボックスを閉じる
pushButton(Button::B, 1500, 3);
}
// ボックスを次のボックスに移動させる
void moveToNextBox(){
// ボックスを開く
pushButton(Button::X, 1000);
pushHatButtonContinuous(Hat::LEFT_UP, 1000);
pushHatButton(Hat::RIGHT, 500);
pushButton(Button::A, 2000);
pushButton(Button::R, 2000);
// ボックスを移動
pushHatButton(Hat::UP, 500);
pushHatButton(Hat::RIGHT, 500);
pushHatButton(Hat::DOWN, 500);
pushButton(Button::Y, 500, 2);
pushButton(Button::A, 500);
pushHatButtonContinuous(Hat::DOWN, 2000);
pushButton(Button::A, 500);
pushHatButton(Hat::LEFT, 500);
pushHatButton(Hat::DOWN, 500);
pushButton(Button::A, 500);
// ボックスを閉じる
pushButton(Button::B, 1500, 3);
}
// 手持ちが1体の状態から、卵受け取り→孵化を繰り返す
void reciveAndHatchEggs(){
for(int egg_num=0; egg_num<3; egg_num++){
moveToInitialPlayerPosition();
runAround(TIME_TO_HATCHING_SEC);
waitEggHatching();
tiltJoystick(-100, 0, 0, 0, 500);
waitEggHatching();
tiltJoystick(100, 0, 0, 0, 500);
waitEggHatching();
tiltJoystick(-100, 0, 0, 0, 500);
waitEggHatching();
tiltJoystick(100, 0, 0, 0, 500);
waitEggHatching();
}
}
// 孵化シーケンスを実行
void execHatchingSequence(){
for(int box_line=0; box_line<6; box_line++){
reciveAndHatchEggs();
sendHatchedPoemonToBox(box_line);
}
moveToNextBox();
}
void setup(){
moveToInitialPlayerPosition();
}
void loop(){
execHatchingSequence();
}
ノンプログラマーでもちょっと考えればいじることができました。先人の知恵は素晴らしい。
私はこちらでひたすら卵を割ることに成功しました。
ボックスがスッキリして最高!!!!!!!!!!!!!
まあ色違い出てないけどね。
以上、あざしたぁ。