【Arduino自動化15】ラテラルタウン掘り出し物自動購入

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

今回は、いわゆるランクマバグ状態で「掘り出し物」を買い続ける自動化記事です。

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

 

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

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

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

 

概要

本記事では、ランクマバグ状態による自動「ほりだしもの」購入を実装します。
※便宜上「ランクマバグ」と表記しますが、当ブログではランクマッチを使用しません。通信切断・初手降参の推奨もしません。

 

NintendoSwitch Ver.11.0アップデート対応済です。
★2021/9/20追記:NintendoSwitch Ver.13.0アップデート対応済です。
★2022/10/23追記:NintendoSwitch Ver.15.0アップデート対応済です。

f:id:tangential_star:20210211120145g:plain
f:id:tangential_star:20210211120226p:plain
ほりだしもの市で自動購入。「ぼうごパット」はここでしか手に入らない超レアアイテム

 

では、目次です。

相変わらず余談多めですので、ソースコードだけ欲しいという方は⇒読み飛ばす

 

ほりだしもの市でしか手に入らない「ぼうごパット」

余談を挟む余地もなく、最初に結論から話します。なぜ掘り出し物市を自動化するのか、その理由は、ここでしか買えないアイテム「ぼうごパット」があるからです。

また、ここでの入手が現実的なアイテムも複数あるのも魅力ですね。

f:id:tangential_star:20210211125124p:plain
f:id:tangential_star:20210211125118p:plain
「ぼうごパット」の他、野生のワンリキーがたまに(5%)持っている「きあいのハチマキ」なども買える

ここからはすこしだけ、余談をはさみます。

「『ぼうごパット』についてはいい、他のアイテムは何が手に入るんだ」という方は⇒読み飛ばす

どうぐ「ぼうごパット」の希少性

ガラル地方では本編(DLC含まず)において入手が困難なアイテムがいくつかあります。その中の筆頭として挙がるのはおそらく、「かえんだま」と「どくどくだま」※1、「マスターボール※2」「各種ガンテツボール※3」などでしょうか。なぜかは言わずもがな、これらは原則として「運」でしか手に入らないからです。

※1「かえんだま」「どくどくだま」はDLC・配布を除くと、トーナメントでの勝利報酬でしか入手できません
※2「マスターボール」はシナリオ内で1個+IDくじの特等で入手できます
※3「各種ガンテツボール」はシナリオ内で各1個+トーナメントでの勝利報酬で入手できます

さて、前述の通り「ぼうごパット」は、ラテラルタウンの「ほりだしもの市」でしか入手できない貴重なアイテムです。

しかも、上記「かえんだま」「どくどくだま」「ガンテツボール」などとは違い、剣盾発売から1年以上経った2021年2月11日現在において1度たりとも配布されたりレイド報酬になったりしたことがない「正真正銘」ここでしか手に入らないアイテムです。また、DLCで拾えたり作れたりするようになった「かえんだま」等とも違い、DLCを含めても入手方法がここだけです。如何に「ぼうごパット」がレアかがお分かりいただけたかと思います。

f:id:tangential_star:20210211144958p:plain
f:id:tangential_star:20210211144818g:plain
鎧の孤島では、ウッウロボで「たいようのいし」4つを合成すると「かえんだま」になる

どうぐ「ぼうごパット」の効果

そんな幻の超激レアアイテム「ぼうごパット」は、多少ピンポイントながら効果も優秀。その驚きの効果は「直接攻撃に対して発動するわざ・とくせい・どうぐの効果を受けない」というもの。

メジャーどころでは「せいでんき」「ほうし」「さめはだ」「てつのトゲ」など、直接攻撃した際に発動する特性をほぼシャットアウトできます。また、追加効果が非常に厄介な守備技「ブロッキング(防御2段階ダウン)」「トーチカ(どく状態付与)」「ニードルガード(最大HPの1/8ダメージ)」などの追加効果を無効化できます。

さらに、どうぐゴツゴツメット」の効果も無効にできるので、例えばナットレイには2重の意味で強く出られますし、ゴツメサンダー@夢(せいでんき)にも強く出られるかもしれませんね。

f:id:tangential_star:20210211145003p:plain
f:id:tangential_star:20210211143034g:plain
わざ「ブロッキング」の厄介な防御2段階ダウン効果を「ぼうごパット」で無効化できる
f:id:tangential_star:20210211144850g:plain
f:id:tangential_star:20210211143000g:plain
「ぼうごパット」があれば、相手の特性「てつのトゲ」「さめはだ」などを無効化できる

ただ、ここまで持ち上げておいてなんですが、皆様もよくご存知の通り対戦ではほとんど使われません。つまりは読まれにくい、ということだと思うので誰か使ってみてください。

 

ほりだしもの市で入手できる道具

さて、大きく話が逸れたので、一旦ラテラルタウンの話題に戻します。

ほりだしもの市では、1日に1回、露天商のお兄さんから3,000円でその日のほりだしものを購入することができます。また、前日に購入していなかった場合は、前日のほりだしものも5,000円で購入することができます。

目玉商品は前述の「ぼうごパット」ですが、有用なアイテムや他の入手方法が困難or現実的ではないアイテムも売られることがあるため、そちらも狙い目です。

いちおう、筆者的に狙い目のものには、黄色で網掛けしています。入手方法について特にコメントしていないものは、道中で拾えたり貰えたりするものです。

ラテラルタウンほりだしもの市で買えるもの一覧
店頭に並ぶ頻度 なまえ 用途 入手方法または筆者コメント
非常に多い われたポット ヤバチャ(がんさくフォルム)の進化用 実はガラル地方のどこにも落ちていない。DLC2弾「巨人の寝床」でドロップ報告あり。
多い するどいツメ 急所率が1段階上がる。夜にはニューラの進化にも 進化に使うが、ニューラは持っていない。ちなみにピントレンズと同じ効果。
多い プロテクター サイドンの通信進化用 第4世代では1個しか手に入らない貴重アイテムだったのに…
多い れいかいのぬの サマヨールの通信進化用 DPではギラティナ捕獲後、最奥の部屋にあるアイテムだった。でもギラティナは関係ない
ときどき せんせいのツメ 20%で先制攻撃できる ニューラが5%で持っている。ここで手に入れよう。
ときどき メタルコート はがねタイプのわざの威力が1.2倍に。イワーク等の通信進化にも。 穴掘り兄弟が掘り当ててくれるので結構余りがち。進化アイテムなのに効果がある。
まれ かけたポット ヤバチャ(しんさくフォルム)の進化用 ポケセンで売ると19,000円に化ける。まさに文字通りの掘り出し物。
まれ きあいのハチマキ ひんし相当の被ダメージ時、10%の確率でHP1で耐える ワンリキーが5%で持っている。ここで手に入れよう。
まれ きせきのタネ くさタイプのわざの威力が1.2倍になる 特にコメントが思いつかない。
まれ くろいヘドロ どくタイプは毎ターン1/16回復。それ以外は1/8ダメージ ドヒドイデのイメージが強いが、野生で持っているのはグレッグル系列とダストダス
まれ しめつけバンド わざ「しめつける」の毎ターンダメージが1/8⇒1/6になる かつては幻の超激レアアイテムだったDLC第2段冠の雪原で開放。
まれ しんぴのしずく みずタイプのわざの威力が1.2倍になる 実はラプラスが100%持っている。2番道路でランダムに会えるぞ。
まれ どくバリ どくタイプのわざの威力が1.2倍になる ハリーセンロゼリア系列・スコルピ系列が5%で持っている。
まれ ねらいのまと 相性無効タイプの被ダメージが等倍で当たるようになる DLC第1段ウッウロボ以外では入手不可。こいつも幻の超激レアアイテムだった
まれ のろいのおふだ ゴーストタイプのわざの威力が1.2倍になる ヨマワル系列が5%で持っている。ここで手に入れよう。
まれ ぼうごパット 直接攻撃に対して発動するわざ・とくせい・どうぐの効果を受けない 幻の超激レアアイテム。文字通りここでしか手に入らない!ちなみに「パッド」ではない
まれ まがったスプーン エスパータイプのわざの威力が1.2倍になる ケーシィが5%で持っている。ここで手に入れよう。
まれ メトロノーム 同じわざを繰り返し使うと威力アップ(+20%ずつ/最大+100%) かつては幻の超激レアアイテムだったDLC第2段冠の雪原で開放。
まれ もくたん ほのおタイプのわざの威力が1.2倍になる 金銀では9,800円で買えた=売価4,900円だったが、今作では500円にしかならない。
まれ りゅうのキバ ドラゴンタイプのわざの威力が1.2倍になる DLC第1段ウッウロボ以外では入手不可。こいつも幻の超激レアアイテムだった
ごくまれ ぎんのこな むしタイプのわざの威力が1.2倍になる コメント特になし。4番道路で拾えるそうです。
ごくまれ するどいくちばし ひこうタイプのわざの威力が1.2倍になる コメント特になし。これも4番道路で拾えるそうです。
ごくまれ くろいメガネ あくタイプのわざの威力が1.2倍になる RSEでカナシダトンネルを抜けたところで拾ったときのイベントが思い出です。
ごくまれ くろおび かくとうタイプのわざの威力が1.2倍になる 金銀ではいかりのみずうみで水曜にミズオから貰えたが、いあいぎり必須なので不便。
ごくまれ じしゃく でんきタイプのわざの威力が1.2倍になる 金銀では日曜日のニチオから貰えた。個人的に初めて出会った曜日兄弟でした。
ごくまれ シルクのスカーフ ノーマルタイプのわざの威力が1.2倍になる RSEではマッスグマにもたせていました。まさか今作であくタイプになるとは…
ごくまれ せいれいプレート フェアリータイプのわざの威力が1.2倍になる 唯一残ったプレート。アルセウスはノーマルかフェアリーの二者択一を迫られることに。
ごくまれ とけないこおり こおりタイプのわざの威力が1.2倍になる バイバニラが50%の確率で持っている。バニプッチは5%だ。

※注:上記の「幻の超激レアアイテム」とは、このラテラルタウンでしか入手できないことを指します 

 

プログラムの使い方(ランクマバグの入り方)

前述の項目などを通して、ラテラルタウンの「ほりだしもの市」が如何に重要かがわかったと思います。特に、DLCを買っていない人には唯一の入手経路となるアイテムが5つもあるわけですから、無視するわけにもいきませんね。

さて、おまたせしました。肝心のプログラムの使い方です。

本稿でも、前回の【Arduino自動化14】ロトミIDくじ無限抽選と同じく、いわゆるランクマバグ状態でプログラムを動かします。やり方については、何も難しいことはなく、ランクマッチで1戦するだけなのですが、ランクマッチ以外の方法だと下記もあります。画像は過去記事の使いまわしです。あしからず。

  1. YY通信で「通信対戦」を行う(ローカル通信)
  2. もう一台のSwitch・剣盾を使ってその通信対戦に応じる
  3. 戦闘が始まったらHomeボタン長押し→「機内モード」をONに変更する
  4. エラーが発生するのでそれを閉じて、「にげる」選択
  5. フィールド画面に戻ってくる(ランクマバグ状態に移行完了)
f:id:tangential_star:20201122213022g:plain
f:id:tangential_star:20201122213037g:plain
YY通信でローカル対戦を募る。バトルが始まったらHomeボタン長押しで機内モード
f:id:tangential_star:20201122213148g:plain
f:id:tangential_star:20201122213205g:plain
エラーが出たら「にげる」で対戦終了。この状態で時刻変更すると一瞬画面が暗転する

 

ソースコード

使い方は、ラテラルタウンの露天商のお兄さんの前で、ランクマバグ状態でArduinoを挿し込むだけの簡単仕様です。1試行あたり25秒(実測値)でした。1回で3,000円取られるので、ちゃんと金額は準備しておきましょう。

なお、新規アイテム(初めて入手したアイテム)があっても、そのままループは破綻しませんので、そのまま放置でOKのはずです。

NintendoSwitch Ver.11.0アップデート対応済です。

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

/* ★NintendoSwitchのファームウェアVer13に対応版(2021/9/20)★
 * ★NintendoSwitchのファームウェアVer15に対応版(2022/10/23)★ 
 *  
 *  ラテラルタウン掘り出し物市 自動購入
 *  
 *  【ランクマバグ】状態で使うこと!
 *  掘り出し物市の前でArduino差し込むだけ!
 *  (c) 2021 ますたーの忘備録
 *  https://tangential-star.hatenablog.jp/
*/

#include <SwitchControlLibrary.h>

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

#define SWITCH_VER (15)
// 2021/9/20、SwitchのVer13アップデートに伴う追記
// Switchのバージョンを整数で入力(例:12.2.1⇒12, 13.0.0⇒13, 15.0.0→15)


void PushRL(int delay_time_ms);
int PushKey(char* keyname, int holdtime, int delaytime);
void NextDayInCheatMode(void);

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


void loop() {

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

  PushKey("A", HOLDTIME, 700);  // いらっしゃい… ほりだしもの みていくかい? 
  PushKey("A", HOLDTIME, 1500); // ⇒本日の ほりだし (※シークタイムあり)
  PushKey("A", HOLDTIME, 700);  // 本日の ほりだしものは ○○ だな…… ▼
  PushKey("A", HOLDTIME, 700);  // ○○円だが 買っていくかい? ⇒はい
  PushKey("B", HOLDTIME, 2100); // まいど どうも ▼ (※SEチャリーン音あり)
  PushKey("B", HOLDTIME, 3000); // ○○は ○○を 手に入れた! ▼
  PushKey("B", HOLDTIME, 700);  // ○○は ○○を ○○ポケットに しまった ▼
  PushKey("B", HOLDTIME, 700);  // ほかに 用は あるかい? ▼
  PushKey("B", HOLDTIME, 700);  // 気が 変わったら また 来な…… ▼
  PushKey("B", HOLDTIME, 700);  // 
  
  PushKey("B", HOLDTIME, 300); // 予備
  PushKey("B", HOLDTIME, 300);

  //// 以下、新規購入のダイアログ出現時に効率よく回せるようになるので、「きあいのハチマキ」「ぼうごパッド」など新規が多い人はつけよう
  // PushKey("B", HOLDTIME, 300);
  // PushKey("B", HOLDTIME, 300);
  // PushKey("B", HOLDTIME, 300);

}

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 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", 780, 55); 
#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;
}

一応、ループが破綻せずに2周目でズレを吸収する様子を↓下記GIF画像にて。

f:id:tangential_star:20210211170119g:plain
f:id:tangential_star:20210211125124p:plain
新規アイテム入手時のダイアログで動作がズレても、次の試行で吸収する設計

 

あとがき

今回で、Arduino自動化記事も15本目となります。

皆様に支えられ、本ブログも開設から3ヶ月が経過し、月間PV数も平均で2,537PV/月にまで成長しました(2021/2/8 0:00計算)。引き続きよろしくお願いいたします。

 

さて、DLCも第2弾まで出ているのに「なんで今更ラテラルタウンの記事?」と思った方も、ここまで読んでいただいて、「ここでしか入手できないアイテムなんてあったのか!」と驚いた方も多いのでは無いでしょうか。また、「『ぼうごパット』というアイテムなんて存在すら知らなかった!」という方もいらっしゃると思います。

 

f:id:tangential_star:20210211174915p:plain

落書き:パッチルドン@ぼうごパット

上述しましたが、超激レアアイテムの「ぼうごパット」は、メタとしては強力な一方、汎用性には乏しくかなりピンポイントな運用になると思います。が、それ故にきっと意表を突けるアイテム枠として採用できるポテンシャルは充分にあると思います。

本ブログ記事が、皆様にとって「ぼうごパット」を今一度認識する機会となったり、Arduino自動化の一助となったりすれば幸いです。

 

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

 

前記事:【Arduino自動化14】ロトミIDくじ無限抽選

次の記事:【Arduino自動化16】自動ミラクル交換(ID集めほか)

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