このスケッチについて
ポケモンZAでは20番ワイルドゾーン中心地にランダムなオヤブンポケモンが2匹出現します。このオヤブン達は、狙われながらセーブ&ロードし、ワイルドゾーン出口付近まで誘導することで、同時出現数を6匹まで増やすことができます。
この増殖のための動作をArduinoを用いて自動化させるスケッチを作成しました。
また、このスケッチとオヤブン厳選用スケッチを併用することにより、全自動で効率の良いオヤブン厳選を実行することが可能です。
動作内容
このスケッチでは関数alphaLeadによってオヤブンの誘導を行います。
ポケモンセンター:メディオへ移動し、最寄りのゲートから20番ワイルドソーンに侵入します。
中心部まで走り、ローリングを繰り返すことによってオヤブンポケモンをゲートとの中間地点まで誘導します。
その後セーブ&リセットし、中間地点まで誘導できたオヤブンポケモンをゲート付近まで再び誘導します。
セーブ&リセット後、ロズレイドを連れたNPC付近まで移動しさらにセーブ&リセットをすることで、誘導したオヤブンポケモンを維持しつつ、新たなオヤブンポケモンが中心部に出現するようにします。
この流れを4回(時間帯が切り替わらない程度)繰り返したのち、ワイルドゾーン中心部にて棒立ちし目の前をまっくらにしてポケセンへワープします。この動作によって誘導できていたオヤブンポケモンが初期位置に戻るため、運が良ければオヤブンポケモンが増えています。
これらの4回1セットの誘導複数回繰り返すことによって、オヤブンポケモンが最大6匹まで増えていきます。
注意点
- このスケッチを実行するには、ポケモンセンターが全て移動スポット登録されている必要があります。全9箇所が登録されているか確認の上で実行してください。
- 出現するオヤブンポケモンの種類や繰り出してくるわざの内容によって増殖に失敗することがあり、このスケッチの動作成功率は低いです。複数回の実行により6匹の増殖に成功することは確認済ですが、運が悪いと6匹まで増えない可能性もあります。その場合は追加で実行してください。
- このスケッチは人力で増殖を行う際より大幅に効率が悪いです。全自動でオヤブン増殖をしたい時などにご活用ください。
スケッチ内容
#include <auto_command_util.h>
// ワイルドゾーン20にランダムで出現するオヤブンポケモンを増やす
// ワイルド20中心部に行きオヤブンに追いかけられながらゲート付近まで誘導していきます
// 誘導と相性の悪いオヤブンが存在するほか、主人公が誘導時に気絶することもあるため、6匹にするには複数回の実行がおすすめです。
int benchwaittime,warpwaittime,titlewaittime,resetwaittime,count,leadcount;
// 設定項目ここから
// switch2だとロード時間が短いため、動作の高速化ができます
// switch2で実行する場合はtrueにしてください
bool is_switch2=false;
// switch2用 選択するユーザの順番 リセット時に必要になります(0~7)
int usernum =0;
// 設定項目ここまで
void gotoMedhioPokeCen() {
// ポケモンセンター:メディオへ移動
// マップを開く(野生ポケモンに狙われていないことを想定)
pushButton(Button::PLUS, 250);
pushButton(Button::Y, 50);
pushButton(Button::MINUS, 100);
pushHatButton(Hat::DOWN, 70,2);
pushButton(Button::A, 100);
pushHatButton(Hat::UP, 70,3);
pushButton(Button::A, 1000,2);
delay(warpwaittime);
delay(10000);
}
void medhioBenchRest(){
// ポケモンセンター:メディオ前のベンチで時間をつぶす
SwitchController().setStickTiltRatio(0, -100, 0, 0);
delay(900);
SwitchController().setStickTiltRatio(100, -80, 0, 0);
delay(2000);
SwitchController().setStickTiltRatio(-100, 0, 0, 0);
delay(1000);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
// ベンチで時間をつぶす
pushButton(Button::A, 250, 12);
// 動けるようになるまで待機
delay(benchwaittime);
}
void saveAndReset(){
// メニューを開き、レポートを書いたのちにZ-Aを再起動
pushButton(Button::X,1000);
pushButton(Button::R,100);
pushButton(Button::A,1500,2);
// home画面へ
pushButton(Button::HOME, 1000);
delay(1000);
//ユーザ切り替え起動
pushButton(Button::Y, 1000);
delay(300);
pushButton(Button::A, 1000);
delay(1000);
if(is_switch2==true){
// ユーザ選択左端へ
pushHatButton(Hat::LEFT, 3000);
delay(500);
pushHatButton(Hat::RIGHT, 100, usernum);
delay(500);
}
// ゲームを起動させる
pushButton(Button::A, 1000);
// DLCバーチャルゲームカードの認証画面が出た際「このままはじめる」を選択する
pushHatButton(Hat::UP, 500);
pushButton(Button::A, 100);
delay(titlewaittime);
pushButton(Button::A,resetwaittime);
}
void alphaLead() {
// ワイルドゾーン20のオヤブンポケモンを6匹に増やす
// ポケモンセンター:メディオ前からスタート
// ワイルド20入り口へ
int towerrad=0;
SwitchController().setStickTiltRatio(0, 100, 0, 0);
delay(1470);
SwitchController().setStickTiltRatio(100, 0, 0, 0);
delay(5350);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
pushButton(Button::L,300);
for(int i=0;i<4;i++){
pushButton(Button::A,2500);
SwitchController().setStickTiltRatio(towerrad, -100, 0, 0);
pushButton(Button::B,100);
delay(7200);
// 中心に到達 オヤブン達に気づかれるまで待機
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(3000);
// ある程度歩いて引き返す
for(leadcount=0;leadcount<6;leadcount++){
SwitchController().setStickTiltRatio(-1*towerrad, 100, 0, 0);
pushButton(Button::Y,100);
delay(100);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(2500);
}
// 中間あたりまで来たらはしって引き返す
SwitchController().setStickTiltRatio(-1*towerrad, 100, 0, 0);
pushButton(Button::B,100);
delay(2200);
// ワイルド20から脱出
SwitchController().setStickTiltRatio(0, 0, 0, 0);
pushButton(Button::A,2500);
// pushButton(Button::L,100);
// レポートを書き、ZAを再起動する
saveAndReset();
// 再度ワイルド20に入りある程度進む
SwitchController().setStickTiltRatio(0, 100, 0, 0);
delay(100);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(500);
pushButton(Button::A,3000);
pushButton(Button::L,100);
SwitchController().setStickTiltRatio(0, -100, 0, 0);
pushButton(Button::B,100);
delay(4000);
// 中心に到達 オヤブン達に気づかれるまで待機
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(2500);
for(leadcount=0;leadcount<5;leadcount++){
SwitchController().setStickTiltRatio(0, 100, 0, 0);
pushButton(Button::Y,100);
delay(100);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(2000);
}
SwitchController().setStickTiltRatio(0, 100, 0, 0);
delay(200);
// ワイルド20から脱出
SwitchController().setStickTiltRatio(0, 0, 0, 0);
pushButton(Button::A,2500);
// この時点で、オヤブンをゲート前まで誘導できた可能性がある
// レポートを書き、ZAを再起動する
saveAndReset();
// ロズレイド付近まで離れ、リセット
SwitchController().setStickTiltRatio(0, -100, 0, 0);
pushButton(Button::B,100);
delay(6500);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
saveAndReset();
// ワイルド20ゲートまで戻る
SwitchController().setStickTiltRatio(0, 100, 0, 0);
pushButton(Button::B,100);
delay(6500);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
towerrad=0;
}
// ワイルド20に入り、中心まで行く
pushButton(Button::A,2500);
SwitchController().setStickTiltRatio(0, 100, 0, 0);
delay(100);
pushButton(Button::L,1000);
for(leadcount=0;leadcount<8;leadcount++){
SwitchController().setStickTiltRatio(0, 100, 0, 0);
pushButton(Button::Y,100);
delay(100);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(3500);
}
// 中心まで行き棒立ち ポケセン送りにする
delay(30000);
pushButton(Button::B,3000,15);
}
void gotoWild20bench() {
// マップを開く(野生ポケモンに狙われていないことを想定)
pushButton(Button::PLUS, 250);
pushButton(Button::Y, 50);
// 移動スポットのカテゴリを「ゾーン」にする
pushButton(Button::MINUS, 100);
pushHatButton(Hat::UP, 50,2);
pushButton(Button::A, 100);
pushHatButton(Hat::RIGHT, 150);
pushHatButton(Hat::DOWN, 70,12);
// 決定し待機する
pushButton(Button::A, 1000,2);
delay(warpwaittime);
// ゲート前まで徒歩
SwitchController().setStickTiltRatio(0, -100, 0, 0);
delay(1200);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(500);
// ゲート入場
pushButton(Button::A,2500);
// ベンチへ向かう
SwitchController().setStickTiltRatio(40, -100, 0, 0);
delay(3500);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
}
void benchMarathon(){
// ベンチで時間をつぶす
pushButton(Button::A, 250, 12);
// 動けるようになるまで待機
delay(benchwaittime);
// 中心部まで走り引き返す
SwitchController().setStickTiltRatio(0, -100, 0, 0);
pushButton(Button::B,100);
delay(3000);
SwitchController().setStickTiltRatio(0, 100, 0, 0);
delay(3700);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
}
// Switchスリープ用関数
void sleepNow(){
SwitchController().pressButton(Button::HOME);
delay(1500);
SwitchController().releaseButton(Button::HOME);
pushButton(Button::A, 1000);
}
void setup() {
// Switch2用の各待機時間の調整
if (is_switch2==true){
benchwaittime=16000;
warpwaittime=2500;
titlewaittime=7000;
resetwaittime=10000;
}
else{
benchwaittime=24000;
warpwaittime=7000;
titlewaittime=15000;
resetwaittime=20000;
}
pushButton(Button::R, 500, 10);//最初の数回の入力は認識しないので無駄打ち
// ワイルドゾーン内にいる場合移動スポット一覧の初期値が変動するため、別の場所に移動しておく
pushButton(Button::PLUS, 250);
pushButton(Button::Y, 250);
pushButton(Button::A, 1000,3);
delay(warpwaittime+6000);
// 初回は移動の読み込み時間が安定していないため、多めに待つ
//ポケセンメディオへ移動。これも多めに待つ
gotoMedhioPokeCen();
delay(5000);
// ベンチで時間をつぶし、今後の動作途中で昼と夜が切り替わらないようにしておく
medhioBenchRest();
// オヤブンを増やす
for(count=0;count<5;count++){
gotoMedhioPokeCen();
alphaLead();
// 時間経過をリセット
gotoMedhioPokeCen();
medhioBenchRest();
}
// 完了したらスリープ
sleepNow();
}
void loop() {
}
付録 オヤブン厳選スケッチとの併用
オヤブンを増殖させた後、ベンチ厳選に移行するスケッチも作成したため、こちらに記載します。
#include <auto_command_util.h>
// ワイルドゾーン20にランダムで出現するオヤブンポケモンを増やす
// ワイルド20中心部に行きオヤブンに追いかけられながらゲート付近まで誘導していきます
// 誘導と相性の悪いオヤブンが存在するほか、主人公が誘導時に気絶することもあるため、6匹にするには複数回の実行がおすすめです。
int benchwaittime,warpwaittime,titlewaittime,resetwaittime,count,leadcount;
// 設定項目ここから
// switch2だとロード時間が短いため、動作の高速化ができます
// switch2で実行する場合はtrueにしてください
bool is_switch2=false;
// switch2用 選択するユーザの順番 リセット時に必要になります(0~7)
int usernum =0;
// 設定項目ここまで
void gotoMedhioPokeCen() {
// ポケモンセンター:メディオへ移動
// マップを開く(野生ポケモンに狙われていないことを想定)
pushButton(Button::PLUS, 250);
pushButton(Button::Y, 50);
pushButton(Button::MINUS, 100);
pushHatButton(Hat::DOWN, 70,2);
pushButton(Button::A, 100);
pushHatButton(Hat::UP, 70,3);
pushButton(Button::A, 1000,2);
delay(warpwaittime);
delay(10000);
}
void medhioBenchRest(){
// ポケモンセンター:メディオ前のベンチで時間をつぶす
SwitchController().setStickTiltRatio(0, -100, 0, 0);
delay(900);
SwitchController().setStickTiltRatio(100, -80, 0, 0);
delay(2000);
SwitchController().setStickTiltRatio(-100, 0, 0, 0);
delay(1000);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
// ベンチで時間をつぶす
pushButton(Button::A, 250, 12);
// 動けるようになるまで待機
delay(benchwaittime);
}
void saveAndReset(){
// メニューを開き、レポートを書いたのちにZ-Aを再起動
pushButton(Button::X,1000);
pushButton(Button::R,100);
pushButton(Button::A,1500,2);
// home画面へ
pushButton(Button::HOME, 1000);
delay(1000);
//ユーザ切り替え起動
pushButton(Button::Y, 1000);
delay(300);
pushButton(Button::A, 1000);
delay(1000);
if(is_switch2==true){
// ユーザ選択左端へ
pushHatButton(Hat::LEFT, 3000);
delay(500);
pushHatButton(Hat::RIGHT, 100, usernum);
delay(500);
}
// ゲームを起動させる
pushButton(Button::A, 1000);
// DLCバーチャルゲームカードの認証画面が出た際「このままはじめる」を選択する
pushHatButton(Hat::UP, 500);
pushButton(Button::A, 100);
delay(titlewaittime);
pushButton(Button::A,resetwaittime);
}
void alphaLead() {
// ワイルドゾーン20のオヤブンポケモンを6匹に増やす
// ポケモンセンター:メディオ前からスタート
// ワイルド20入り口へ
int towerrad=0;
SwitchController().setStickTiltRatio(0, 100, 0, 0);
delay(1470);
SwitchController().setStickTiltRatio(100, 0, 0, 0);
delay(5350);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
pushButton(Button::L,300);
for(int i=0;i<4;i++){
pushButton(Button::A,2500);
SwitchController().setStickTiltRatio(towerrad, -100, 0, 0);
pushButton(Button::B,100);
delay(7200);
// 中心に到達 オヤブン達に気づかれるまで待機
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(3000);
// ある程度歩いて引き返す
for(leadcount=0;leadcount<6;leadcount++){
SwitchController().setStickTiltRatio(-1*towerrad, 100, 0, 0);
pushButton(Button::Y,100);
delay(100);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(2500);
}
// 中間あたりまで来たらはしって引き返す
SwitchController().setStickTiltRatio(-1*towerrad, 100, 0, 0);
pushButton(Button::B,100);
delay(2200);
// ワイルド20から脱出
SwitchController().setStickTiltRatio(0, 0, 0, 0);
pushButton(Button::A,2500);
// pushButton(Button::L,100);
// レポートを書き、ZAを再起動する
saveAndReset();
// 再度ワイルド20に入りある程度進む
SwitchController().setStickTiltRatio(0, 100, 0, 0);
delay(100);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(500);
pushButton(Button::A,3000);
pushButton(Button::L,100);
SwitchController().setStickTiltRatio(0, -100, 0, 0);
pushButton(Button::B,100);
delay(4000);
// 中心に到達 オヤブン達に気づかれるまで待機
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(2500);
for(leadcount=0;leadcount<5;leadcount++){
SwitchController().setStickTiltRatio(0, 100, 0, 0);
pushButton(Button::Y,100);
delay(100);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(2000);
}
SwitchController().setStickTiltRatio(0, 100, 0, 0);
delay(200);
// ワイルド20から脱出
SwitchController().setStickTiltRatio(0, 0, 0, 0);
pushButton(Button::A,2500);
// この時点で、オヤブンをゲート前まで誘導できた可能性がある
// レポートを書き、ZAを再起動する
saveAndReset();
// ロズレイド付近まで離れ、リセット
SwitchController().setStickTiltRatio(0, -100, 0, 0);
pushButton(Button::B,100);
delay(6500);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
saveAndReset();
// ワイルド20ゲートまで戻る
SwitchController().setStickTiltRatio(0, 100, 0, 0);
pushButton(Button::B,100);
delay(6500);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
towerrad=0;
}
// ワイルド20に入り、中心まで行く
pushButton(Button::A,2500);
SwitchController().setStickTiltRatio(0, 100, 0, 0);
delay(100);
pushButton(Button::L,1000);
for(leadcount=0;leadcount<8;leadcount++){
SwitchController().setStickTiltRatio(0, 100, 0, 0);
pushButton(Button::Y,100);
delay(100);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(3500);
}
// 中心まで行き棒立ち ポケセン送りにする
delay(30000);
pushButton(Button::B,3000,15);
}
void gotoWild20bench() {
// マップを開く(野生ポケモンに狙われていないことを想定)
pushButton(Button::PLUS, 250);
pushButton(Button::Y, 50);
// 移動スポットのカテゴリを「ゾーン」にする
pushButton(Button::MINUS, 100);
pushHatButton(Hat::UP, 50,2);
pushButton(Button::A, 100);
pushHatButton(Hat::RIGHT, 150);
pushHatButton(Hat::DOWN, 70,12);
// 決定し待機する
pushButton(Button::A, 1000,2);
delay(warpwaittime);
// ゲート前まで徒歩
SwitchController().setStickTiltRatio(0, -100, 0, 0);
delay(1200);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
delay(500);
// ゲート入場
pushButton(Button::A,2500);
// ベンチへ向かう
SwitchController().setStickTiltRatio(40, -100, 0, 0);
delay(3500);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
}
void benchMarathon(){
// ベンチで時間をつぶす
pushButton(Button::A, 250, 12);
// 動けるようになるまで待機
delay(benchwaittime);
// 中心部まで走り引き返す
SwitchController().setStickTiltRatio(0, -100, 0, 0);
pushButton(Button::B,100);
delay(3000);
SwitchController().setStickTiltRatio(0, 100, 0, 0);
delay(3700);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
}
// Switchスリープ用関数
void sleepNow(){
SwitchController().pressButton(Button::HOME);
delay(1500);
SwitchController().releaseButton(Button::HOME);
pushButton(Button::A, 1000);
}
void setup() {
// Switch2用の各待機時間の調整
if (is_switch2==true){
benchwaittime=16000;
warpwaittime=2500;
titlewaittime=7000;
resetwaittime=10000;
}
else{
benchwaittime=24000;
warpwaittime=7000;
titlewaittime=15000;
resetwaittime=20000;
}
pushButton(Button::R, 500, 10);//最初の数回の入力は認識しないので無駄打ち
// ワイルドゾーン内にいる場合移動スポット一覧の初期値が変動するため、別の場所に移動しておく
pushButton(Button::PLUS, 250);
pushButton(Button::Y, 250);
pushButton(Button::A, 1000,3);
delay(warpwaittime+6000);
// 初回は移動の読み込み時間が安定していないため、多めに待つ
//ポケセンメディオへ移動。これも多めに待つ
gotoMedhioPokeCen();
delay(5000);
// ベンチで時間をつぶし、今後の動作途中で昼と夜が切り替わらないようにしておく
medhioBenchRest();
// オヤブンを増やす
for(count=0;count<5;count++){
gotoMedhioPokeCen();
alphaLead();
// 時間経過をリセット
gotoMedhioPokeCen();
medhioBenchRest();
}
// ワイルド20へ向かう
gotoWild20bench();
}
void loop() {
benchMarathon();
}