【Arduino自動化21】自動ドロップアイテム回収【ミント島でミント集め】

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

今回は、ドロップアイテムの無限回収の記事です。自動でミント回収ができます。

Arduino自動化記事も第21回。引き続きよろしくお願いします。

 

なお、Arduino Leonardo自動化の導入・機材構成については導入記事を参考にしてください。

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

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

 

概要

目の前のドロップアイテム(キラキラ光るアイテム)を延々と回収し続けます。

★NintendoSwitch Ver.13.0アップデート対応済です。
★NintendoSwitch Ver.15.0アップデート対応済です(2022年10月23日追記)。

f:id:tangential_star:20211018001718p:plain
f:id:tangential_star:20211016184833g:plain
キャンプを2回挟むことでアイテムが復活。自動で延々とミントを拾い続けるぞ

もくじです。

折角なのでArduinoを持っていない人も楽しく読めるように、手動ミント周回の方法や説明を交えつつ、自動化したポイントについても紹介します。ミントの収集おすすめ場所もブログ最後に載せました。

ソースコードだけ欲しいという方はどうぞ→ソースコード

 

ミントの自動回収ができました(結論)

結論ファーストです。

わずか50分間の放置で18個の性格補正ミントが、全自動で回収できました(この数字には「まじめミント」を含みません!)。効率にして「0.36個/分」なので、3~4分に1個の性格補正ミントが手に入ることになります*1

f:id:tangential_star:20211016184755g:plain

わずか50分(1時間足らず!)放置するだけで、18個のミントが自動的に拾い上げられた

本記事では、ドロップアイテムについての基礎知識と、「ミント」の取れるポイントをまとめ、自動化プログラムのソースコードを紹介します!

※自動化のやり方はこちら→プログラムの使い方ソースコードはこちら→ソースコード

 

日付更新と画面更新でドロップアイテムが復活する

さて、まずは前提知識から紹介します。もちろん、読み飛ばしOKです。→「ミント島の説明」まで読み飛ばす

ポケモン剣盾には、ワイルドエリアの地上や5番道路の橋の上、海の上、木々の根本など、様々な場所に「キラキラと光るアイテム」が落ちていることがあります。これは便宜的に「ドロップアイテム」と呼ばれます*2。このドロップアイテムですが、実は日付更新&画面更新によって同じ場所に復活します。

f:id:tangential_star:20211016221004p:plain
f:id:tangential_star:20211016192540p:plain
ドロップアイテムは、ガラル本土やDLCの水上のいたるところに落ちている(浮いている?)

より詳しく拾ったアイテムの復活の条件を書くとすれば、Switchの時刻が24時を超えた後に画面更新、すなわち、日付が回った後に「そらとぶタクシーによる移動」「ポケモンキャンプ」「野生ポケモンとのエンカウント」などを行うこと、です。

この特性を利用すれば、日付更新バグを活用することで、高速にドロップアイテムの回収ができます。

例えば、本ブログのArduino自動化第11回の記事では、5番道路での羽系アイテム集めを自動化しています。この際には、任意の場所で日付を変更できる裏技、いわゆる「ランクマバグ*3を活用し、「そらとぶタクシー」で画面更新を行うことでドロップアイテムの復活をしています。

最初の位置から周回するためにも、一般的には「そらとぶタクシー」を使って「画面更新」を兼ねるのが一般的です。

f:id:tangential_star:20210111121951g:plain
f:id:tangential_star:20210111151537g:plain
「日付変更」の後の「画面更新(そらとぶタクシー)」でドロップアイテムが復活する
(左:ランクマバグで日付変更/右:巣穴時渡りで日付変更)

なお、ドロップアイテムで手に入るもののうち、特筆すべきは下記2つでしょうか。

  • 端数の努力値振りアイテムとして有用な(5番道路)
  • 性格補正が変えられる「ミント」系アイテム(離れ島海域)

ハネ系アイテムの説明は過去記事(Arduino自動化11)に譲りますが、これらは対戦ガチ勢はもちろんのこと、これから育成・対戦を始めてみたい初心者の方には特に有用です。ミントについては後述します。

 

ミントを使えば、性格の能力補正を上書きできる

「ミント」とは、ポケモンが持つ「性格ごとに定められた能力補正値*4」を、性格とは別に設定させるアイテムです。

主に、旅で使った仲間のポケモンや、厳選難度が高いポケモン*5を、対戦用に育成する際に使われます。他にも、「性格はそのまま」という仕様を活かして、投げつける・トリック対策で「混乱きのみの嫌いな味」を性格補正値と変えて厳選したり、「すがた」で性格が分かってしまう「ストリンダー」の補正値を変えたりなど、初心者~対戦ガチ勢まで幅広く利用されるアイテムです。

f:id:tangential_star:20211017164335p:plain
f:id:tangential_star:20211017164338p:plain
一緒に旅をした仲間のポケモンも、ミントがあれば対人戦向けに育て上げられる

鎧の孤島に「ミント」が効率的に拾える島(通称:ミント島)がある

さて、前述の「ミント」ですが、従来、入手方法はバトルタワーで50BPとの交換だけでした。ところが、DLC「鎧の孤島」「冠の雪原」では、ドロップアイテムとして日替わり回収ができるようになりました。特に有名な回収ポイントとして、DLC第1弾「鎧の孤島」海上の北西に位置する島(離れ島海域;通称「ミント島」)が挙げられます。

「ミント島」への行き方

この「ミント島」ですが、アクセスも良好で、そらとぶタクシーで「チャレンジビーチ」に降りたら、そのまま反対側の海に向かってまっすぐ進むだけです。「みずの塔」のちょうど反対側に位置し、目印となる大きな木があるので、迷うことなくたどり着けます。

f:id:tangential_star:20211017192121p:plain
f:id:tangential_star:20211016220832g:plain
そらとぶタクシーで「チャレンジビーチ」に行けば、ミントが取れる島(いわゆる「ミント島」)は目と鼻の先だ

「ミント島」はミント周回に最適

誰が呼んだか「ミント島」と異名が付くこの島の、唯一無二にして最大の特徴が、島内5箇所にあるドロップアイテムで全種類のミントが手に入ることです。

その異名が語るとおり、他のドロップアイテムポイントよりもミントの出現率も高く、島をぐるっと1周拾い集めるだけで、2,3個のミントを回収することができます。さらに、誂え向きにポケモンの巣穴が島の中央にあるため、日付変更バグも島内で行うことができます

アクセスが好立地であることもあり、まさに、ミント周回してくださいと言わんばかりの好条件が整っています。

f:id:tangential_star:20211017170909p:plain

離れ島海域(いわゆるミント島)で拾えるミント位置 逆引きマップ(筆者作成)
島内をぐるっと一周すれば、各補正ミントが拾い集められるぞ!

ミント周回のやり方(手動)@ミント島

前述の通り、ドロップアイテムは「日付変更」&「画面更新」で復活します。

「日付変更」については、島の中央にある巣穴を使えばペナルティ無しで行うことができます。さらに、「画面更新」についても「野生ポケモンとの戦闘」か「キャンプを開く」ことで実施できます。

これを手順としてまとめると、下記のようになります。

  1. ミント島に行き、島の中央の巣穴に「ねがいのかたまり」を投げ入れる
  2. 島を1周して、落ちているドロップアイテムを拾い集める
  3. 巣穴で「みんなで挑戦!」から「日付変更」を行う
  4. ポケモンキャンプを開くor「野生ポケモンと戦闘する(すぐ逃げてもOK)」
  5. ミントが復活するので、好きなだけ2~4を繰り返す

実は、上記4の画面更新で、「ポケモンキャンプ」を開くのはあまり知られておらず、一般的なミント周回作業では、「野生ポケモンとの戦闘」の利用が多いようです。

もっとも、時間効率という点ではどっちもどっちですが、草むらに入って野生ポケモンを探す手間が省けるので、キャンプのほうが楽だと思います。

f:id:tangential_star:20211017191054g:plain

ミント集め周回作業(手動)の様子。ミスって1箇所飛ばしている…
巣穴で日付変更をした後、キャンプで画面更新をしているのがミソだ

 

長時間の自動化のためには、シンプルかつ短い動作の繰り返しが必要条件

さて、おまたせしました。ここからは、Arduino自動化のお話です。まずは、今回のミント島での自動化プログラムが作りにくい理由・自動化の設計指針について解説です。

テクニカルな話なので、興味がない人は読み飛ばしOKです読み飛ばす

 

Arduinoを使ってコントローラー操作の自動化を実装する際に、もっとも気を配るのが「どんな状況でもほぼ確実に同じ動作をすること(=動作に再現性があること)」です。言い換えると「ループが破綻しないこと」です。そのためには、野生ポケモンとのエンカウントなどの「予想外」の動きが発生することや、だんだんとミリ秒単位での動作誤差(オフセット)が溜まっていくことに留意せねばなりません。

したがって、可能な限り、不定な動きをする可能性がある要素は排除し、可能な限り、プレイヤー(キャラクター)が動かないで済む操作で済ませることが、自動化の定石と言えます。やむを得ずプレイヤーを操作させる場合にも、その動きによって発生しうる誤差をリセットあるいは吸収する手段を講じます。代表的な例としては「そらとぶタクシー」による座標リセット、壁にぶつかることで擬似的に動きを局所的に制限するなどです。

f:id:tangential_star:20210116212540g:plain
f:id:tangential_star:20210921201235g:plain
プレイヤー操作の自動化には「そらとぶタクシー」での誤差リセットが定番。
特に、誤差の溜まりやすいワイルドエリア(オープンワールド)ではマストだ

さて、こういった技術的な制約もとい設計指針に立って、今回のミント島での回収作業の自動化を考えると、かなり自動化の実現ハードルが高いことが分かります

  • 円形のルートを通らなければならない→動作が複雑で、そもそも自動化に向かない
  • 周りに壁などが無い→冗長なコマンド入力でも動作誤差をリセットできない
  • そらとぶタクシー発着点が無い→最寄りの「チャレンジビーチ」で座標をリセットしても、海を越えなければならない
  • 草むらが近くにあり、野生シンボルが多く出現→予期しないエンカウントの恐れがある
  • オープンワールドで日付変更を行う→天候などによる動作のカクつき・操作誤差の発生の恐れがある

そこで、抜本的に考え方を改めるため、初心に立ち返り、ミント集めの動機を考えました。我々がミント周回をするのは「ミント」が必要だからですが、別に21種類すべてのミントが必要なわけではありません。つまりは、よく使う特定のミントさえあれば、実用には困らないはずです。

例えば「いじっぱり」「ようき」「ひかえめ」「おくびょう」だけが必要であれば、ミント島のアイテムドロップ回収ポイントの5箇所すべてではなく、「こうげき」「とくこう」「すばやさ」の3箇所だけ回れば良いことになります。突き詰めれば、いずれか1箇所を3回に分けて自動化すれば、総じて無駄の少ない自動化が可能です。

漫然とミントを集めるのではなく、特定の種類のミント1種類「だけ」を周回するように設計すれば、プレイヤーの操作も必要なく、上記の種々の問題はクリアできます。前述の通り、ミント島で拾えるミントは場所によって拾えるミントの種類(こうげき、ぼうぎょ、など)に偏りがあるので、任意の1箇所でドロップアイテムを拾い続けることで、上記要件を満たすことができます。

したがって、今回のミント回収自動化プログラムでは、任意の1箇所でドロップアイテムを拾い続ける仕様としました。

 

自動化プログラムの使い方

おまたせしました!Arduinoプログラムの使い方についてです。と言っても、準備は非常にシンプルです。剣盾側の準備はわずか2つ、ソースコードの修正はわずか1箇所です。

自動化プログラムを使うための準備(ポケモン剣盾)

剣盾側の準備としては、下記2つです。

  1. Xでメニューを開いたときに「キャンプ」にカーソルが合う状態にする
  2. 狙いのミントがAで拾える場所の目の前でセーブする

わずか2つの準備で、ひたすら目の前のキラキラ(ドロップアイテム)を拾い続けてくれます。「ねがいのかたまり」や「ランクマバグ」は一切使いません!便利ですね。

f:id:tangential_star:20211017223716p:plain
f:id:tangential_star:20211017223721p:plain
メニューで「キャンプ」にカーソルを合わせて、拾いたいアイテムの前でセーブすれば準備完了

自動プログラムのソースコードの修正

お使いの環境に合わせて(true)を(false)に変えるだけです。具体的には、IGNORE_NEW_ITEMを、そのROMで入手したことがないアイテムを拾う可能性がある場合に(false)に書き換えます。

要するに、その場所で拾える特定の能力補正がかかるミント4種類とまじめミントの5種類のうち1個でも所持していないものがあれば(false)です。サブロムなどでは注意しましょう。

#define IGNORE_NEW_ITEM (true) // ★その場所で拾えるアイテムのうち、「まだ拾っていないもの」がある場合は「false」にしてください。
f:id:tangential_star:20211016173732p:plain
f:id:tangential_star:20211017233939p:plain
入手したことがないアイテムを拾うと動作がズレる。リュックをしっかり確認しよう
(アイテムを並び替えるとわかりやすい。右図だと「わんぱくミント」が1つもない)

 

ソースコード

アイテムドロップの場所の目の前でArduinoを挿すだけのカンタン仕様です。メニューを開いたときに「キャンプ」にカーソルをあわせることをお忘れなく。

NintendoSwitch Ver.13.0アップデート対応済(詳細はこちら
NintendoSwitch Ver.15.0アップデート対応済(Liteは未検証;2022年10月23日追記)
※Switch Liteをご利用の方は「#define SWITCH_VER (15)」を「#define SWITCH_VER (12)」に書き換えてご利用ください。

/*  ★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 *  ★目の前のドロップアイテム(ミントや羽)を拾い続けるやつ★
 *  ★★★★★★★★★★★★★★★★★★★★★★★★★★★★
 *  
 *  「●●ミント」や「●●のハネ」など、地上のドロップアイテムを永遠に拾ってくれます。
 *  
 *  ★目の前にドロップアイテムが落ちているところで使います。
 *  ★Xボタンを押したときに「キャンプ」にカーソルが合う状態で使うこと【重要】
 *  ★野生ポケモンが突っ込んでこないところでやりましょう。特に雨下のオニシズクモのような、
 *   プレイヤー側に走って向かってくるポケモンが出る場所は要注意。
 *  
 *  【利用方法】
 *  地上で使ってください。水上のドロップアイテム回収は無理です。
 *  ワイルドエリアや5版道路の橋など、日付経過でドロップアイテムが復活する場所で使います。
 *  目の前にキラキラ光るアイテムが落ちていて、Aを押したら拾える場所に立ってください。
 *  Xボタンでメニューを開いたときに「キャンプ」にカーソルを合わせてメニューを閉じてください。
 *  あとは、Arduinoを挿すだけでドロップアイテムを永遠に回収してくれます。c⌒っ.ω.)っ
 *  
 *  (c) 2021 ますたーの忘備録
 *  https://tangential-star.hatenablog.jp/
*/

#include <SwitchControlLibrary.h>

#define HOLDTIME (95) // 1回のキー入力の長押し時間

#define SWITCH_VER (15)
// ★Lite利用者は「12」にしてください★
// SwitchのVer13, Ver15アップデートに伴う記述。

#define IGNORE_NEW_ITEM (true)
// ★その場所で拾えるアイテムのうち、「まだ拾っていないもの」がある場合は「false」にしてください。
// ※筆者は未検証です。

#define SHOW_PICKUP (false)
// ワイルドエリアなどで、プレイヤーが拾っている様子を見たい人は「true」にしてください。
// 大きなポケモンを連れ歩きしているときなど、プレイヤーの様子が見えなくて悲しい人向け。
// RやLでカチャカチャした後に、右スティックでカメラを回転させて、筆者好みの角度にしてくれます。
// ※自動化には何の影響もありません。単純に好みです。

void PushRL(int delay_time_ms);
int PushKey(char* keyname, int holdtime, int delaytime);
void NextDayInCheatMode(void);
void TiltRightStick(int direction_deg, double power, int holdtime, int delaytime);

void setup() {
  // コントローラーとして認識されるためにRLを7回ほどカチャカチャする
  for(int i=0;i<7;i++)PushRL(300);
  delay(1000);

  if(SHOW_PICKUP){
    // TiltRightStick(0,  1.0,  300, 100);
    TiltRightStick(90, 1.0, 1480, 100); // カメラ チルト回転
    TiltRightStick(180,1.0,  300, 100); // カメラ パン回転
  }
}


void loop() {

  // ★アイテムを拾う
  PushKey("A", HOLDTIME, 800);
  PushKey("B", HOLDTIME, 800); // ○○は ○○を みつけた! ▼ 

  if(IGNORE_NEW_ITEM){
    // [NEW] むじゃきミント
    // ポケモンに 香りを かがせると 
    // 素早さが 上がりやすく なるが 
    // 特防は 上がりにくくなる ミント。
    PushKey("A", HOLDTIME, 800); // 説明文おくり(2行パターン)
    PushKey("B", HOLDTIME, 800); // 説明文おしまい
  }

  // ★キャンプを開く(日付変更)
  PushKey("X", HOLDTIME, 500);
  PushKey("A", HOLDTIME, 10200); // 顔アップから始まるとタイムロス(悪天候でなければ9800でOK)

  // ★日付を回すやつ
  NextDayInCheatMode();
  delay(300);

  // ★キャンプをとじる
  PushKey("B", HOLDTIME, 800);  // キャンプを 終了 しますか?
  PushKey("A", HOLDTIME, 5300); //  ⇒ はい
  
  // ★キャンプを開く(画面更新)
  PushKey("X", HOLDTIME, 500);
  PushKey("A", HOLDTIME, 10200); // 顔アップから始まるとタイムロス(悪天候でなければ9800でOK)

  // ★キャンプをとじる
  PushKey("B", HOLDTIME, 800);  // キャンプを 終了 しますか?
  PushKey("A", HOLDTIME, 5300); //  ⇒ はい


}

void PushRL(int delay_time_ms){
  SwitchControlLibrary().PressButtonR();
  SwitchControlLibrary().PressButtonL();
  delay(HOLDTIME);
  SwitchControlLibrary().ReleaseButtonR();
  SwitchControlLibrary().ReleaseButtonL();
  delay(delay_time_ms);
  return;
}
int PushKey(char* keyname, int holdtime, int delaytime){
  // ホームボタン・方向キーはRight, Left, Up, Down, Homeなど2文字以上で入力。
  // その他ボタン入力は1文字(A,B,X,Y,R,L,+,-)ZR・ZLにも対応
  // 同時押しは非対応
  
  if(strlen(keyname)==1){
    switch(keyname[0]){
      case 'A': case 'a': // A
        SwitchControlLibrary().PressButtonA(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonA(); delay(delaytime);
      break;
      case 'B': case 'b': // B
        SwitchControlLibrary().PressButtonB(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonB(); delay(delaytime);
      break;
      case 'X': case 'x': // X
        SwitchControlLibrary().PressButtonX(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonX(); delay(delaytime);
      break;
      case 'Y': case 'y': // Y
        SwitchControlLibrary().PressButtonY(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonY(); delay(delaytime);
      break;
      case 'L': case 'l': // L
        SwitchControlLibrary().PressButtonL(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonL(); delay(delaytime);
      break;
      case 'R': case 'r': // R
        SwitchControlLibrary().PressButtonR(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonR(); delay(delaytime);
      break;
      case 'H': case 'h': // Home
        SwitchControlLibrary().PressButtonHome(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonHome(); delay(delaytime);
      break;
      case '+': case 'p': case 'P': // Plus
        SwitchControlLibrary().PressButtonPlus(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonPlus(); delay(delaytime);
      break;
      case '-': case 'm': case 'M': // Minus
        SwitchControlLibrary().PressButtonMinus(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonMinus(); delay(delaytime);
      break;
      default:
      break;
    }
  }else if(strlen(keyname)>=2){
    switch(keyname[0]){
      case 'z': case 'Z': // ZR/ZL
        if(keyname[1]=='R'||keyname[1]=='r'){
          SwitchControlLibrary().PressButtonZR(); delay(holdtime);
          if(holdtime>0)SwitchControlLibrary().ReleaseButtonZR(); delay(delaytime);
        }
        if(keyname[1]=='L'||keyname[1]=='l'){
          SwitchControlLibrary().PressButtonZL(); delay(holdtime);
          if(holdtime>0)SwitchControlLibrary().ReleaseButtonZL(); delay(delaytime);
        }
      break;
      case 'r': case 'R': // right
        SwitchControlLibrary().MoveHat(2); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
      break;
      case 'l': case 'L': // left
        SwitchControlLibrary().MoveHat(6); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
      break;
      case 'u': case 'U': // up
        SwitchControlLibrary().MoveHat(0); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
      break;
      case 'd': case 'D': // down
        SwitchControlLibrary().MoveHat(4); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().MoveHat(8); delay(delaytime);
      break;
      case 'H': case 'h': // Home
        SwitchControlLibrary().PressButtonHome(); delay(holdtime);
        if(holdtime>0)SwitchControlLibrary().ReleaseButtonHome(); delay(delaytime);
      default:
      break;  
    }
  }else{
    return -1;
  }
  return strlen(keyname);
}

void TiltRightStick(int direction_deg, double power, int holdtime, int delaytime){
  double rad = (double)direction_deg*PI/180.0; // 弧度法(ラジアン)変換
  int x, y;
  x = (double)128*sin(rad)*power;
  y = (double)-128*cos(rad)*power;
  x += 128; y += 128;
  if(x >= 255) x=255; if(x <= 0) x=0;
  if(y >= 255) y=255; if(y <= 0) y=0;

  SwitchControlLibrary().MoveRightStick(x,y);
  if(holdtime> 0){ // holdtime=0のときは押しっぱなし。
    delay(holdtime);
    SwitchControlLibrary().MoveRightStick(128,128); // 傾きを直す
  }
  if(delaytime>0) delay(delaytime);
  return;
}

void NextDayInCheatMode(){
  // ★日付変更
  // Homeボタンを押して設定の画面へ移動
  PushKey("Home", HOLDTIME, 1000);

  // Home画面で「設定」を選ぶ
  PushKey("down", HOLDTIME, 105);
  PushKey("right", HOLDTIME, 105);
  PushKey("right", HOLDTIME, 105);
  PushKey("right", HOLDTIME, 105);
  PushKey("right", HOLDTIME, 105);
  PushKey("right", HOLDTIME, 105);
  PushKey("A", HOLDTIME, 1500);

  // 設定画面で「日付と時刻」を開く
  PushKey("down", 1500, 105); // 1.5秒「↓」長押し
  PushKey("right", HOLDTIME, 105); 


#if (SWITCH_VER >= 15)
  // Switchのver15アプデでBluetoothオーディオの設定が変わった?ので、微修正。
  // ※本体のバッテリー残量(%)にずれるようになったので。
  PushKey("down", 750, 55);
#elif (SWITCH_VER >= 13)
  // Switchのアプデで「ドックの更新」項目が追加されたので
  // 日付変更をする場合には「↓」キー長押しが必要に。
  PushKey("down", 735, 55); // 2021/10/16修正案。780→735 
#else
  // ver12まで(13アプデ前)は、1ページに収まるのでそのままでOK
  for(int i=0; i<4; i++){
    PushKey("down", HOLDTIME, 55);
  }
#endif

 
  PushKey("A", HOLDTIME, 500);

  // 時間設定(現在の日付と時刻を選ぶ)
  PushKey("down", HOLDTIME, 105);
  PushKey("down", HOLDTIME, 105);
  PushKey("A", HOLDTIME, 500);

  // 時刻設定(日付の部分のみ回していく
  // 時間の変更
  PushKey("right", HOLDTIME, 105);
  PushKey("right", HOLDTIME, 105);
  PushKey("up",    HOLDTIME, 105);
  PushKey("A", HOLDTIME, 105);
  PushKey("A", HOLDTIME, 105);
  PushKey("A", HOLDTIME, 105);
  PushKey("A", HOLDTIME, 105);
  PushKey("Home", HOLDTIME, 2000);
  PushKey("A", HOLDTIME, 1000);
  return;
}

 

あとがき

以上が本記事の内容となります!いやぁ~今回も盛りだくさんでしたね(←書いた本人)

ところで、「『ドロップアイテム回収の自動化』なんて何を今更」と思われた方もいらっしゃることかと思います。実際、私がハネ系アイテムの自動化をしたのも、2021年1月(10ヶ月前!)ですし、たしかに今更感は否めません。

ところが、剣盾発売から2年近く経った今でさえ、賑わう多くの自動化界隈で未だに「ミント回収自動化プログラム」として公開されたものは無く*6、実は、日本初の「ミント」回収自動化の成功例だったのではないかな?と思います(違ったらごめんなさい)。

そういう意味でも、今回の記事は、そういったニッチだけどパワフルな需要を兼ねるものになります。もし、皆様にご参考頂けたようであれば嬉しく思います。

もし、参考になったよ、という方がいらっしゃれば、是非ともコメントをいただければと思います。励みになります!

 

-- 

【おまけ】狙う性格補正ごとの「ミント」おすすめ入手場所

オススメのミント採取場所(ドロップしている場所)を表にまとめました!自動化する際はもちろん、手作業の周回でもご参考いただけると思います。本記事の真ん中に入れると読みにくそうだったのでここに入れました

 

狙う性格補正の「ミント」が拾える場所の一覧 ※ヨロイ島はすべて「ミント島」です

名前 効果 おすすめの場所

f:id:tangential_star:20211017125416p:plain「こうげき」が上がるミント

さみしがりミント 攻撃・防御

f:id:tangential_star:20211017151221g:plain

ミント島の最奥部に生えている木の根本
いじっぱりミント 攻撃・特攻
やんちゃミント 攻撃・特防
ゆうかんミント 攻撃・素早

f:id:tangential_star:20211017125418p:plain「ぼうぎょ」が上がるミント

ずぶといミント 防御・攻撃

f:id:tangential_star:20211017151247g:plain

ミント島できのみが採れる木のすぐ奥。
わんぱくミント 防御・特攻
のうてんきミント 防御・特防
のんきミント 防御・素早

f:id:tangential_star:20211017125420p:plain「とくこう」が上がるミント

ひかえめミント 特攻・攻撃

f:id:tangential_star:20211018000724g:plain

巨人の寝床(東)から道なり右手にある木の陰
(カンムリ雪原)【オススメ!】

f:id:tangential_star:20211017151320g:plain

ミント島中央の草むら奥側にある赤い草花
(ヨロイ島)
おっとりミント 特攻・防御
うっかりやミント 特攻・特防
れいせいミント 特攻・素早

f:id:tangential_star:20211017125422p:plain「とくぼう」が上がるミント

おだやかミント 特防・攻撃

f:id:tangential_star:20211017151352g:plain

ミント島中央の巣穴より右手側の原っぱ
おとなしいミント 特防・防御
しんちょうミント 特防・特攻
なまいきミント 特防・素早

f:id:tangential_star:20211017125425p:plain「すばやさ」が上がるミント

おくびょうミント 素早・攻撃

f:id:tangential_star:20211018114817g:plain

巨人の寝床(東)から道なりの丘を登って左手の藪
(カンムリ雪原)【オススメ!】

f:id:tangential_star:20211017151421g:plain

ミント島に上陸してすぐの原っぱ
せっかちミント 素早・防御
ようきミント 素早・特攻
むじゃきミント 素早・特防

f:id:tangential_star:20211017125414p:plain「能力補正」をなくすミント

まじめミント 性格補正無し 各ミント採取場所でランダムに入手可能

 

本当のあとがき

この自動化プログラムでは、「キャンプ」を開いて、その状態でしれっと日付変更をしています。これ、冷静に考えれば、もし時間変更ペナルティを受けていれば成り立たない自動化です。

言い換えると、いわゆる「ランクマバグ状態」や、「巣穴で『みんなで挑戦』を押している状態」と同様に、ポケモンキャンプを開いている間は一時的に日付変更のペナルティが解除されていることになります

実は「ポケモンキャンプ」を使って時間変更バグができた?

このプログラムを組む前の経験談なのですが、ミントの復活条件を検証中に偶然、キャンプを開いて日付を更新してしまったことがありました。

その時、特に何事も無く(=いわゆるペナルティが発生せず)ミントが復活したことを受けて、「あれ?巣穴バグを使わなくても日付変更できるのでは?」と気づき、色々と検証をして、今回の記事執筆に漕ぎ着けました。つまり、この発見により、従来、ミントの自動化でネックになっていた「日付変更」を、巣穴を使わず=場所を選ばず実現できるようになったのです。

そういう意味では、もしかしたら、「ミントの自動化ができたこと」よりも、こっち(=巣穴で「みんなで挑戦」をせずとも、キャンプでを開けばどこでも日付変更できる)のほうが大発見なのかもしれません。これ、発見したときはめちゃくちゃテンション上がりました。

全然見たことも聞いたこともない日付変更の方法だったので「このバグ自体、初出?もしそうだったら、すごいことなのでは?」と思いつつ、この気持ちを共感できる人もいないので、こういうカタチであとがきとしてまとめさせていただきした。

(このあたり、初出そうだったら、後日、記事としてまとめるかもです)【2021/10/18 11:52追記:初出ではなかったです…】

 

 

改めて、本ブログを引き続きよろしくお願いいたします。

もし、このブログが参考になったよ!いつも見ているよ!という方がいらっしゃれば、是非ともコメントをいただけると励みになります
(リクエストがあればコメントにいただければと思いますが、多忙&マイペース更新なのであしからず。ぜひ検討したいとは思います)

 

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

 

前回記事:【Arduino自動化20】Switch2台で「完全」自動!レイドバトル自動周回

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

関連記事:【Arduino自動化11】5番道路で全自動羽集め【DLC不要】

他のArduino自動化:ポケモン剣盾Arduino自動化 カテゴリーの記事一覧

YouTubeチャンネル:ますたーの忘備録 - YouTube 【NEW!!】

---

*1:いわゆるミント島で、1時間足らずでの検証結果です。場所によって入手効率は変わります

*2:剣盾で「ドロップアイテム」と言えば文字通り落ちているアイテムのことを指しますが、文字を入れ替えて「アイテムドロップ」だとレイドバトル報酬を指す場合が多いようです

*3:ランクマバグ:ランクマッチの直後にSwitchの日付変更を行ってもペナルティが発生しない状態のこと。Switchが2台あればローカル通信で対戦→機内モードで同様の状態にできる

*4:性格による能力補正:例えば「ようき」なら「すばやさ」が1.1倍・「とくこう」が0.9倍になります

*5:配布ポケモン、偶発的に出会った色違いのポケモン、孵化厳選ができないタマゴ未発見ポケモン・準伝説ポケモン、強制捕獲イベントがあるポケモン(ムゲンダイナ・ザシアン・ザマゼンタ)、作中で人からもらえるポケモン(キョダイマックスヒトカゲ・タイプ:ヌル)など

*6:2021/10/7現在。筆者調べ。Arduino Leonardo系列を用いたポケモン剣盾自動化において「ミント」系アイテムの自動回収を主題としたもの。あったらごめんなさい