2021/02/14

【ポケモン×Arduino_02】冠の雪原ワットショップ目玉商品の自動購入

 ※本記事は、ポケモン剣盾:冠の雪原のワットショップの目玉商品を自動で購入し続けるプログラムについて解説した記事です。ポケモン剣盾の操作をArduino Leonardoで自動化しております。「Arduinoって何?」って方は00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。

本記事では、このプログラム(スケッチ)でできることや原理を解説したうえで、スケッチを配布しています。とにかくスケッチが欲しいという方は下へと読み飛ばしてください。


 

きっかけ、動機

ポケモン剣盾DLC第2弾冠の雪原が解禁されたばかりの頃、ワットショップでドリームボール、ウルトラボールが低確率で出ることを知り、収集を目指しました。ドリームボールはデリバードのレイドバトル、ウルトラボールは大マックスアドベンチャーでマックス鉱石をかせぐことでも入手できますが、副産物としてぼんぐりやダイキノコなどの収集にも役立つことに気づき、目玉商品購入の自動化を試みました。

 

これで何ができるの?

冠の雪原の「雪中渓谷」(フリーズ村の東側の空を飛ぶ)には、ワットショップの人が立っています。W(ワット)を使って、ワイルドエリアでも買うことのできるボールや技レコードなどを売っている(普通の商品)のとは別に、「目玉商品」としてレアなアイテムを1日1回だけ売ってくれます。売ってくれる目玉商品で有用なものは、

ポイントアップ、マックス =PPを増やせる
不思議な飴 =LVアップ
金、銀の王冠 =すごい特訓で個体値MAX
ダイキノコ =キョダイマックス
・王者の印、エレキブースター、飴細工等の進化アイテム
各種ぼんぐり =ガンテツボール量産
ドリームボール、ウルトラボール =レアなボール量産
ヨロイ鉱石、マックス鉱石 =技教えや特性パッチ

などがあります。つまり、

対戦用のポケモンを育成するために必要なアイテムのうち非売品のものがおおよそ揃う

オシャボ勢が欲しがる非売品ボールが手に入る

これらのことがいつでも、寝てる間にも可能となります。非売品の消費アイテムの不足が一通り解決します。

執筆者のメインロムではポイントアップや不思議な飴、各種ぼんぐり、ヨロイ鉱石などが×999でカンストし、ドリボ、ウルボが17個ずつ、コンペボールが7個バッグに入っていました。対戦勢、オシャボ勢にはメリットが大きいと思います。にわか対戦勢かつにわかオシャボ勢の執筆者は伝説ポケモン解禁そっちのけで本スケッチを作成していました(ランクマッチには出遅れました)。



原理、おおまかな流れ

概要

本プログラムでは、1日1回しか買うことのできない目玉商品を、日付変更バグ(時渡り)を利用して何度も買うことができるようにしています。ワットショップ近くにちょうどいい巣穴があったので願いの塊を投げて利用することとしました。

流れとしては、

空を飛ぶで定位置へ>ワットショップまで走り、目玉商品購入>巣穴で時渡り

を繰り返しています。

冠の雪原でレイドバトルをしない限りは巣穴を解消しない(塊をなげっぱなし)ことで、好きな時にこのスケッチを回すことができます。消費されるワットの補充は、この巣穴でauto_gain_watt(ライブラリのサンプルスケッチ)を使う、あるいは過剰なヨロイ鉱石をワットの発掘に使うことで解決します。

 

誤動作への対策

上記の動作にあたり、以下の誤動作が考えられ、対策をしております。

・空を飛ぶ時に、カーソルが正しく選択できず、うまく飛べない

>空を飛ぶ位置の近くに他の選択肢はないため、全く違うところに飛ぶ可能性は極めて低いです。カーソルが空白に位置する、つまり選択できない場合の対策として、空を飛んだ直後にBボタンを連打させ、空を飛べなかった場合にはメニューを閉じるようにしました。巣穴の位置から空を飛ばずに走る操作をした場合は壁に衝突し続けるので、空を飛ぶを何度も失敗しない限りは初期位置に戻ることができます。

・ひと月の最終日(31日など)から1日ずらした場合に、同じ月の1日に戻るため日付が進まず、巣穴の光が戻らず、2000ワットを受け取るテキスト表示がなくなる分のずれが生じる

>巣穴ではテキスト送りにBボタンを挟むことで、巣穴が光っている/いないに関係なく同じように時渡りができます。

・ワットショップの目玉商品が既にカンスト(×999) している、あるいはワット不足で購入できない

 >ワットショップでは、目玉商品の購入に必要な回数だけAボタンを押し、その後はBボタンを連打するため、うまく買えなかった場合は普通の商品を買わずにキャンセルします。その後は買った/買わないに関係なく時渡りをします。

 

作成したスケッチ

作成したスケッチは以下のようになります。

スケッチのファイルはこちらからDLできます(Ver1.11)。

Switch本体13.0.0アップデートに伴いVer1.1に更新しました。変更箇所について詳しい解説はこちら

本スケッチを実際に使用した動画はこちら↓。

 

(Ver1.0) 

 
/**
* 冠の雪原、雪中渓谷ワットショップ目玉商品を時渡りにて買い続ける
*
* 初期条件は以下の通り
* 1. ワットショップ近くの巣穴(ワットショップの人から向かって左)に願いの塊を投げる(自然湧きの柱は不可)
* 2. あらかじめワットを十分に用意しておく。auto_gain_wattの使用、ヨロイ鉱石でのワット発掘など。
* 3. Xボタンを押した後のメニューについて、左下を「タウンマップ」になるように並び替える
* 4. インターネット接続はせず、ローカル
* 5. Switch本体の設定>本体>日付と時刻>インターネットで時間を合わせる をOFFにする
* 6. 主人公を雪中渓谷(ワットショップ近く)に自転車に乗った状態で立たせて、マイコンを挿してスタート
*/



#include <auto_command_util.h>


// 空飛ぶタクシーで雪中渓谷、ワットショップ近くに移動
void moveToInitialPlayerPosition(){
    //タウンマップ開く
    pushButton(Button::X, 1000);
    pushHatButtonContinuous(Hat::DOWN_LEFT, 1000);
    pushButton(Button::A, 2500);
    //カーソルを飛ぶ場所に合わせる
    tiltJoystick(0, 0, 50, 100, 200);
    delay(200);
    pushButton(Button::A, 1500, 2);
    pushButton(Button::B, 500, 5);
}

//ワットショップへと移動、目玉商品を買い、巣穴へと移動
void buyFavoriteItem(){
    //ワットショップへ向かう
    tiltJoystick(100, -100, 0, 0, 800);
    delay(200);
    //話しかけ、買う
    pushButton(Button::A, 800, 2);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 1000, 4);
    pushButton(Button::B, 1000, 10);
    //巣穴へ移動
    tiltJoystick(0, -100, 0, 0, 2000);
    tiltJoystick(-100, 0, 0, 0, 200);
    delay(300);
}


// ワット回収~日付変更
void execTimeLeep()
{
    // 柱に話しかけ、2000Wもらう
    pushButton(Button::A, 1000);
    pushButton(Button::B, 1000);
    pushButton(Button::A, 1000);
    // 募集開始
    pushButton(Button::A, 3000);
    // ホーム画面 > 設定
    pushButton(Button::HOME, 1000);
    pushHatButton(Hat::DOWN, 100);
    pushHatButton(Hat::RIGHT, 100, 5);
    pushButton(Button::A, 1000);
    // 設定 > 本体 > 日付と時刻
    pushHatButtonContinuous(Hat::DOWN, 2000);
    pushHatButton(Hat::RIGHT, 100);
    pushHatButton(Hat::DOWN, 100, 4);
    pushButton(Button::A, 500);
    // 日付と時刻 > 現在の日付と時刻
    pushHatButton(Hat::DOWN, 100, 2);
    pushButton(Button::A, 500);
    pushHatButton(Hat::RIGHT, 100, 2);
    pushHatButton(Hat::UP, 100);
    pushHatButtonContinuous(Hat::RIGHT, 1000);
    pushButton(Button::A, 500);
    // ホーム画面 > ゲーム画面
    pushButton(Button::HOME, 1000);
    pushButton(Button::A, 500);
    // レイド募集中止
    pushButton(Button::B, 1000);
    pushButton(Button::A, 4000);
    pushButton(Button::B, 1000);
    
}


void setup(){
    pushButton(Button::B, 500, 13);  // 最初の数回の入力はswitchが認識しない場合があるので、無駄打ちをしておく
    
}

void loop(){
    moveToInitialPlayerPosition();
    buyFavoriteItem();
    execTimeLeep();
}

 

最後に

本スケッチを使用することで対戦勢、オシャボ勢が欲しいであろう消費アイテムを一通り稼ぐことができます。面倒な準備はなく、1度準備をした後は雪中渓谷に移動していつでも開始できます。

Arduinoでのポケモン剣盾の自動化を行う中で、本スケッチは特に有用な用途の1つだと思っております。そのため、他にも紹介できる内容がある中で本スケッチを優先しました。お役に立てていただければ幸いです。

プログラムの不備、改善点などありましたらコメントやお問い合わせからお願いいたします。

Arduino Arduino Leonardo (ピンソケット・ピンヘッダ実装済) 【A000057】
by カエレバ



0 件のコメント:

コメントを投稿

【ポケモンSV×arduino06】道具プリンター乱数自動化(藍の円盤)

 ※本記事は、ポケモンSVの藍の円盤(DLC)にて、 道具プリンター を決まった日時に起動することで 特定のアイテム、ボールを狙って量産する操作を自動化 するプログラムについて解説した記事です。ポケモンSVの操作をArduino Leonardoで自動化しております。 本記事の内...