2021/12/23

【BDSP×Arduino03】地下金策+ドーピング購入自動化(Ver1.1.2以下ならずらしバグ対応)

 ※本記事は、ポケモンBDSPの地下大洞窟でのタマ交換を利用した金策を自動化するプログラムについて解説した記事です。ポケモンBDSPの操作をArduino Leonardoで自動化しております。「Arduinoって何?」って方は剣盾の00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。

 

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


 

きっかけ、動機

第1回に孵化厳選、第2回に経験値稼ぎを自動化しました。孵化、レベルアップに続いて育成に必要なものとして、努力値振りが挙げられます。剣盾と同様、BDSPでもドーピングアイテムを252振りまで使用することができるのでありがたい!...のですが、やはりお金が足りなくなりますなぜお小遣い上限を100万に戻した?

というわけで、金策も自動化することとしました。トバリデパートで台座を購入し、地下大洞窟にいる山男にタマ、技マシンと順に交換してもらい、その技マシンを売ることで稼ぎます。

また、上限の100万円稼いで終わるだけではすぐに終わってしまうため、一定金額以上貯まった時に自動でドーピングアイテムを購入することにしました。

これで何ができるの?

地下大洞窟、トバリシティから潜った先の近くにいる山男は、グッズ(台座)→小さいタマや、小さいタマ→技マシンと交換してくれます。台座(Mサイズ)はトバリデパート4階で1000円で購入することができ、小さいタマ12個と交換できます。また、山男が交換してくれる技マシンの種類や交換レートは日替わりであり、運がいいと台座の購入金額以上で売ることが可能となります。これを利用して持っているお小遣いを増やします。

この交換レートはおそらく運任せとなるため、いつでも使用できるわけではありません。本プログラムは運良く高レートを引いた日に、まとめて貯蓄することを目的としています。ドーピングアイテムを貯めて使用するもよし、売ってお小遣い上限100万以上を疑似的に所持する目的で売っても良しです。育成での努力値振りや、ゴージャスロイヤルリボンの購入などにお役立てください。

また、本記事公開時点のBDSPのソフトバージョンはVer1.1.3となりますが、もし1.1.2以下であれば、ずらしバグと呼ばれるバグが使用可能です。1.1.2以下であれば、高い確率で高レートでの交換が可能となります。


原理、おおまかな流れ

概要

はじめに一連の動作についておおまかに解説した後、本プログラムを使用するための条件について解説します。

 

原理・動作について

本プログラムでは、

①トバリデパート入り口からスタート、デパートに入る
②交換対象とした技マシンをすべて売り、得たお小遣い全額で台座を購入する
③デパートを出たら探検セットを使い、地下大洞窟の山男まで移動する
④山男にて、[台座→小さいタマ][小さいタマ→技マシン]の交換を台座がなくなるまで繰り返す
⑤地上へ戻る

を繰り返します。ループするごとに、自身が所持しているお小遣いの金額を計算し、それが99万円(あるいは指定した金額)に達するまで行います。

 

そして、指定金額に達した場合に動作を分岐させます。具体的には、上記の②を

②' 交換対象とした技マシンをすべて売り、そのうち約50万円を使用してドーピングアイテムを買う(タウリンなどを順番に購入)。その後、残りのお小遣い全額で台座を購入する

のように変更します。これにより、上限に達したお小遣いを適度に消費しつつ、分岐前の通常ループへと戻ります。

以上のループと分岐によって、マイコンが誤作動しない限りは金策をし続けます。

(日付が変わると交換リストが変わるため、正しく動作できなくなります。) 


以下では、これらの金策のために必要な条件と、プログラムを書き込む際の準備について説明します。


地下金策を行う条件について(交換リスト)

今回の金策では、技マシンの交換レートと売値が重要となります。

例えば、 売値1500円の技マシン60を、小さい赤タマ15個で交換できる日があったとします。この時、

1000円台座→タマ12個(1タマあたり83円)の交換でお小遣いをタマに変換した後、

タマ15個→売値1500円の技マシン(1タマあたり100円)に交換、その後売却することで、
1ループあたり83円を100円、約1.2倍に変換することが可能となります。

この1.2倍の変換を繰り返すことで、最初の所持金を何倍にも増やすことが可能となります。

 

ここで必要となるのは、

ある程度の初期資金
より大きい交換レート(変換倍率)

となります。

①について、もし現在の所持金が1万円程度である場合、上記のループを1回したところで2000円程度の利益にしかなりません。野良トレーナー(ジェントルマンなど)と戦って最低でも10万くらいに増やしておくことをおすすめします。

 

 今回で重要なのは②となります。

 地下で交換してもらえる技マシンは、必ずしも売った時に利益が出るわけではありません。というよりも、適当に交換してしまうと高確率で損をしてしまいます

交換レートについて黒字となる(1倍以上)条件

A. 技マシンの売値に対して必要なタマの数が少ないこと(売値1000円なら11タマ以下)
B. 交換に用いる小さいタマの色が赤か青であること(2色のみ1000円→12タマの交換可能)

となります。まずは手動でトバリデパート前から地下へ降りてください。南南西方向にいる山男(詳しくは動画など参照)に話しかけ、「グッズをもらう」で本日の交換リストを確認してください。


日替わりで5種類の技マシンがあるため、そのうち赤か青タマで交換できるもののタマ個数と売値を確認してください(公開しているスケッチの設定項目の欄に売値をメモしてあります)。 

売値に対してタマ個数が一定以下、黒字となる個数以下であれば、その日については本プログラムが使用可能です。黒字となる技マシンが存在しない場合は諦めて次の日に確認しなおしてください

条件を満たした場合のみ、設定項目に従ってスケッチの数値を編集し、自動化が可能となります。

 

~~~以下、ソフトVer1.1.2以下でアプデしていない人向け~~~

Ver1.1.2以下のソフトの場合、ずらしバグと呼ばれるバグを使用することで、高レートでの交換ができる可能性があります。

ずらしバグとは、交換リストの画面でAボタンと↑入力を同時に行うことで起こる現象です。成功すると、同時入力を行う前にあったカーソルのタマの色と個数で、1つ上のリストの技マシン等を交換することが可能となります。

これを利用することで、技マシンとタマ個数の組み合わせが増えるため、黒字交換できる可能性が高くなります。さらには、リスト1番上の穴掘りドリルにカーソルを合わせれば、タマ8個でリスト1番下の技マシンを交換可能です。穴掘りドリルのタマの色が緑でない限り、ほぼ黒字交換できるかと思います。

本プログラムでは設定項目にて設定することでずらしバグを使用した交換も可能です。

 ~~~以上、ソフトVer1.1.2以下でアプデしていない人向け~~~

 

準備、必要なもの

本スケッチで行う準備は以下のようになります。

1.探検セットをプラスボタンの左に登録(あるいは任意の位置となるように下記プログラムを書き換え)

2.トバリシティから探検セットを使って地下へ潜り、南南西にいる小さい玉交換山男に話しかける
  玉(赤or青)と技マシンの交換レートが黒字となるものを見つけ、
  技マシンの売値、タマの色や個数、リスト何番目か、現在の所持金などを設定項目に設定
  また、技マシンを1個以上交換し、バッグを開いてお気に入りに設定、並び替えて1番上に配置する

 3.既に四角い台座か円形の台座を所持している場合、誤動作の原因となるため交換してゼロにする
  ただし、バッグ内の台座が空にならないように、それ以外の台座を数個程度は所持しておく(山男交換かデパート購入で入手)

4.トバリデパート前に立ち、マイコンを挿して自動化を開始する
 なお、日付が変わると交換リストが変わるため、日付をまたぐ前に使用をやめる

 

~~~以下、2の設定項目について~~~

・const int tmPrice ...黒字交換できる条件を満たす技マシンの売値を入力してください。

技マシン番号と売値はスケッチ上にもメモしてあるため参照してください。

・const int orbColor...技マシンに対して交換するタマの色を指定してください。

 赤なら0、青なら1を入力してください。これに従って、購入する台座が変わります。

・const int orbQuantity ...技マシンに対して交換するタマの個数を指定してください。

・const int tmList ...交換する技マシンがリストの上から何番目にあるかを指定してください。穴掘りドリルが1、1番下の技マシンが10となります。

 ずらしバグを使用する際は、同時押しする前のカーソルの位置(=タマの色個数の位置)に設定してください。

・int money_thousand ...自動化開始前に持っているお小遣いの金額÷1000を入力してください(○○千円、12万3千円なら123と入力、小数点以下切り捨て)。本プログラムでは1ループを終えるごとに所持金を計算し、目標額に達しているかの判定や、購入される台座の個数などの算出に用いられ、効率に関わりますので、極力正確な値を入力してください。

 

~~~以下、編集必須ではない、任意の設定項目~~~

・const int goal_money ...目標金額÷1000を設定してください。特殊な事情がない限り999で大丈夫です。

・int doping_num ...自動で購入するドーピングアイテムの種類を選択、変更するための数値です。0~5。デパート2階で売っているタウリン、ブロムヘキシンなどをそれぞれ指定します。

本プログラムでは、ドーピングアイテムを購入した後に数値を1ずつ変化させることで、6種類を順に購入させています。設定項目の数値(初期値)を変更することで、最初に購入するドーピングアイテムを変更します。また、プログラム下部にある

doping_num = (doping_num +1)%6; などを編集することで、購入するドーピングアイテムを指定できたり、購入回数をカウントしたりできるかと思いますのでご自由に。

・const int upAdouji ...ずらしバグを利用する場合のみ、値を1に設定してください。

Ver1.1.3現在、ずらしバグは対策されているため使用できません。旧バージョンのみ。

・int trade_orb_num ...1度にタマと交換する台座の個数を指定しています。通常は台座81個×12=タマ972個の交換を繰り返します。

ずらしバグを使用する場合、技マシンとの交換が失敗することがあり、その場合にタマ972個以上持った状態で次の972個を補充しようとして無駄になってしまいます。その対策として、ずらしバグを使用するときのみ数値を81から41に変更することをおすすめします。

これにより、1ループ中ずらしバグ1度までの失敗に対して問題なく動くようになる反面、交換する回数が約2倍に増えるため効率が落ちますので注意。

 

作成したスケッチ

作成したスケッチはこちら。ver1.0。

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


 
/**
* BDSP用、地下大洞窟での台座購入>タマ経由で交換>技マシン売却による金策を自動化。
* あらかじめ地下で交換レートを確認し、赤or青玉の交換で得するかを調べて設定し、
* (ソフトVer1.1.2まで、上A同時押しするずらしバグを使用することで1個上の技マシンを下の交換レートで交換することも可能)
* 技マシンと交換することによる金策をお小遣いカンストするまで繰り返す
* 以下にて、上A同時押しバグを使用するか、技マシンの交換に必要な玉の色、個数、売却価格、リスト上から何段目か、実行前のお小遣い金額を設定する
*
* ついでに、金がたまってきたらドーピングアイテムを自動購入する機能を追加、使用したくない(リボン用99万が欲しい場合など)場合は本スケッチ最下段のvoid loop内を編集
*
* 初期条件は以下の通り
* 1.探検セットをプラスボタンの左に登録(あるいは任意の位置となるように下記プログラムを書き換え)
* 2.トバリシティから探検セットを使って地下へ潜り、南南西にいる小さい玉交換山男に話しかける
*  玉(赤or青)と技マシンの交換レートが黒字となるものを見つけ、
*  技マシンの売値、タマの色や個数、リスト何番目か、現在の所持金などを以下の設定項目に設定
*  また、技マシンを1個以上交換し、バッグを開いてお気に入りに設定、並び替えて1番上に配置する
* 3.既に四角い台座か円形の台座を所持している場合、誤動作の原因となるため交換してゼロにする
*  ただし、バッグ内の台座が空にならないように、それ以外の台座を数個程度は所持しておく(山男交換かデパート購入で入手)
* 4.トバリデパート前に立ち、マイコンを挿して自動化を開始する
*  なお、日付が変わると交換リストが変わるため、日付をまたぐ前に使用をやめる
*/


#include <auto_command_util.h>

// 以下、設定項目

// あらかじめ手動で地下へ潜り、交換レートが黒字となる技マシンを選択し、以下に設定する

// 交換できる技マシンの売値を入力
/* なお、技マシンの売却価格は以下の通り、Ctrl+Fで検索推奨
 * 2750円>30玉以下なら黒字:14,15,25,38,50,52,64,68,92
 * 1500円>17玉:01,02,03,06,07,13,19,21,22,23,24,26,27,29,30,31,34,35,36,40,42,43,44,45,47,48,49,
 *   53,55,57,59,60,62,65,66,71,72,74,79,80,81,83,84,85,86,88,89,91   
 * 1250円>15玉:95,99
 * 1000円>11玉:09,11,16,17,18,20,28,33,37,39,46,51,54,56,58,61,63,73,76,90,93,94,96,97,98,100
 * これ以降は基本的に赤字
 */

const int tmPrice = 1500;
// 交換に必要な玉の色が赤なら0、青なら1を入力
const int orbColor = 1;
// 交換に必要な玉の個数を入力、黒字になるかは上を要確認
const int orbQuantity = 15;
// 交換する技マシンのタマ個数表示がリスト上から何段目かを入力(ドリルなら1、1~10)、ずらしバグを使用する場合は、ずらす前(下)にリストを合わせる
const int tmList = 10;
// 自動化開始前に持っているお小遣いの金額÷1000を入力、1万円なら10。MAX:999
// 以下に入力する以上を持っていれば正確に入力する必要は無し。ただしあまりに小さい金額だと効率に影響。
int money_thousand = 499;

// 以上の設定項目は、使用するごとに設定する
// 以下、任意の設定項目

// 行動を分岐させる基準となる金額を設定。~999。指定金額(○○千円)に届くまで金策を繰り返し、届いたらドーピングアイテムを購入
// 基本的には999あるいは900以上の設定を推奨

const int goal_money = 999;

// ドーピングアイテム売り場にて、購入するアイテムを0~5の範囲で選択
// 0から順にABCDSHのドーピング剤
// ループさせる際に数値を変化させることで、順に購入させることが可能

int doping_num = 0;

// Ver1.1.2以下限定、ずらしバグ
// 地下での交換リストについて、上Aを同時に押したときに、カーソルを合わせていた玉個数で1つ上のグッズと交換可能、ずらしバグ(ソフトVer1.1.2まで、1.1.3以上は不可)
// このバグを使う場合は1、使わない場合は0を選択

const int upAdouji = 0;

// 台座からタマへと1度にまとめて交換する個数、初期値は81個×12玉=972玉
// 1の位が1以外の場合は非対応、というか41 or 81のみ対応
// ずらしバグを使用する場合、稀に失敗することがあるため、失敗したときの計算ずれを軽減するために41×12=492に変更することを推奨

int trade_orb_num = 81;

// 以上、設定項目



// BDSP用、方向転換して指定歩数を正確に進むための汎用プログラム
// UP、LEFTなど方向と、進む歩数を指定

void turnAndSteps(Hat direc, int step_num){
    // 指定の方向へ方向転換
    SwitchController().pressHatButton(direc);
    delay(50);
    SwitchController().releaseHatButton();
    delay(200);
    // 指定歩数を進む
    pushHatButton(direc, 300, step_num);
}


// トバリデパートに入り、1Fエレベーターまで移動する
void enterDepart(){
    // デパートに入り、1Fエレベーターまで
    pushHatButtonContinuous(Hat::UP, 7000);
    //右に4歩
    turnAndSteps(Hat::RIGHT, 4);
    // エレベーターの左隣へ
    SwitchController().pressButton(Button::B);
    pushHatButtonContinuous(Hat::UP, 2000);
    SwitchController().releaseButton(Button::B);
    // 右へ方向転換、1歩
    turnAndSteps(Hat::RIGHT, 1);
    // エレベーターに入る
    pushHatButtonContinuous(Hat::UP, 500);
}


// エレベーターの中から開始、4Fへ行き、Mサイズ台座売り場まで移動
void startShoppingAt4F(){
    // 左のお姉さんに話しかけ、4F移動
    pushHatButtonContinuous(Hat::LEFT, 6000);
    pushButton(Button::A, 1000, 4);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 800, 3);
    pushButton(Button::B, 100, 25);
    // 右へ方向転換、1歩
    turnAndSteps(Hat::RIGHT, 1);
    // エレベーターを出る
    SwitchController().pressButton(Button::B);
    pushHatButtonContinuous(Hat::DOWN, 5000);
    // 左下の店員に話しかける
    pushHatButtonContinuous(Hat::LEFT, 200);
    pushHatButtonContinuous(Hat::DOWN, 1000);
    pushHatButtonContinuous(Hat::LEFT, 3000);
    pushHatButtonContinuous(Hat::UP, 1000);
    SwitchController().releaseButton(Button::B);
}

// お気に入り登録して1番上にある技マシンをすべて売る
void sellTM(){
    // 会話を開始、売る
    pushButton(Button::A, 1000, 2);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 2000);
    // 技マシンポケット1番上のお気に入り技マシンをすべて売る
    pushHatButton(Hat::LEFT, 300, 3);
    pushButton(Button::A, 800);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 800, 3);
    // 売りを終了、会話も終了
    pushButton(Button::B, 100, 30);

}

// 指定された色のタマに対応する台座Mを可能な限り購入する
void buyStandAt4F(){
    // 会話を開始、買う
    pushButton(Button::A, 800, 3);
    // 台座Mを購入、必要な玉が赤であれば四角、青であれば円形を可能な限り購入する
    if (orbColor == 1){
      pushHatButton(Hat::DOWN, 300);
    }
    pushButton(Button::A, 800);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 800, 3);
    // 買い物を終了する
    pushButton(Button::B, 100, 30);
}

// 4Fでの買い物を終え、エレベーターまで向かう
void finishShoppingAt4F(){
    // 右へ方向転換、4歩
    turnAndSteps(Hat::RIGHT, 4);
    // 4Fエレベーターまで移動
    SwitchController().pressButton(Button::B);
    pushHatButtonContinuous(Hat::UP, 2000);
    SwitchController().releaseButton(Button::B);
    // 右へ方向転換、9歩
    turnAndSteps(Hat::RIGHT, 9);
    // エレベーターに入る
    pushHatButtonContinuous(Hat::UP, 500);
}

// エレベーターの中から開始、2Fへ行き、ドーピング売り場まで移動
void startShoppingAt2F(){
    // 左のお姉さんに話しかけ、2F移動
    pushHatButtonContinuous(Hat::LEFT, 6000);
    pushButton(Button::A, 800, 4);
    pushHatButton(Hat::DOWN, 300, 3);
    pushButton(Button::A, 800, 3);
    pushButton(Button::B, 100, 25);
    // 右へ方向転換、1歩
    turnAndSteps(Hat::RIGHT, 1);
    // エレベーターを出る
    pushHatButtonContinuous(Hat::DOWN, 500);
    delay(4000);
    // 左へ2秒、下へ1秒、左へ1秒走る
    SwitchController().pressButton(Button::B);
    pushHatButtonContinuous(Hat::LEFT, 2000);
    pushHatButtonContinuous(Hat::DOWN, 1000);
    pushHatButtonContinuous(Hat::LEFT, 1000);
    SwitchController().releaseButton(Button::B);
}

// ドーピングアイテムを51個(≒50万円分)購入する
// 購入するアイテムはdoping_numにより0~5の範囲で指定(ABCDSH)

void buyDopingAt2F(){
    // 会話を開始、買う
    pushButton(Button::A, 800, 3);
    // 指定されたアイテムを51個購入
    pushHatButton(Hat::DOWN, 300, doping_num);
    pushButton(Button::A, 800);
    pushHatButton(Hat::RIGHT, 200, 5);
    pushButton(Button::A, 800, 3);
    // 買い物を終了する
    pushButton(Button::B, 100, 30);
    // 購入した金額だけ、所持金を減らす
    money_thousand = money_thousand - 500;
}

// 2Fでの買い物を終え、エレベーターまで向かう
void finishShoppingAt2F(){
    // 右へ1秒、上へ1秒、左へ1秒走る
    SwitchController().pressButton(Button::B);
    pushHatButtonContinuous(Hat::RIGHT, 2000);
    pushHatButtonContinuous(Hat::UP, 1000);
    SwitchController().releaseButton(Button::B);
    // 左へ方向転換、7歩
    turnAndSteps(Hat::RIGHT, 7);
    // エレベーターに入る
    pushHatButtonContinuous(Hat::UP, 500);
}

//  エレベーターの中から開始、1Fへ行き、デパートを出るまで
void leaveDepart(){
    // 左のお姉さんに話しかける
    pushHatButtonContinuous(Hat::LEFT, 6000);
    pushButton(Button::A, 1000, 4);
    pushHatButton(Hat::DOWN, 300, 4);
    pushButton(Button::A, 800, 3);
    pushButton(Button::B, 100, 25);
    // 右へ方向転換、1歩
    turnAndSteps(Hat::RIGHT, 1);
    // エレベーターを出る
    pushHatButtonContinuous(Hat::DOWN, 5000);
    // 左へ方向転換、1歩
    turnAndSteps(Hat::LEFT, 1);
    SwitchController().pressButton(Button::B);
    pushHatButtonContinuous(Hat::DOWN, 2000);
    SwitchController().releaseButton(Button::B);
    // 左へ方向転換、4歩
    turnAndSteps(Hat::LEFT, 4);
    pushHatButtonContinuous(Hat::DOWN, 1000);
    delay(4000);
}

// デパート入り口付近から探検セット(左に登録)を使い、地下の小タマ交換山男のところまで
void meetTamaOyaji(){
    // 探検セット起動、地下へ行く
    pushButton(Button::PLUS, 1500);
    pushHatButton(Hat::LEFT, 1500);
    pushButton(Button::B, 500);
    pushHatButton(Hat::DOWN, 300, 2);
    pushButton(Button::A, 8000);
    // 下5秒、右5歩、下4秒
    SwitchController().pressButton(Button::B);
    pushHatButtonContinuous(Hat::DOWN, 5000);
    SwitchController().releaseButton(Button::B);
    turnAndSteps(Hat::RIGHT, 5);
    SwitchController().pressButton(Button::B);
    pushHatButtonContinuous(Hat::DOWN, 4000);
    // 左下5秒で左に曲がり。左4秒で山男近くの左下曲がり角へ
    tiltJoystick(-90, 90, 0, 0, 5000);
    pushHatButtonContinuous(Hat::LEFT, 4000);
    SwitchController().releaseButton(Button::B);
    // 山男に話しかける
    SwitchController().setStickTiltRatio(90, -90, 0, 0);
    delay(200);
    pushButton(Button::A, 100, 2);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    delay(1000);
    // もらうあげるの選択肢
    pushButton(Button::B, 500);
    // ここで、持っている台座の数(=所持していた金額÷1000)を記録し、41or81ずつ消費する
    // 上A同時押しバグを使用する場合、ときどき技マシン交換のミスがあるため、対策として台座81(タマ972)ではなく41(500)

    int daiza_num = money_thousand;
    while(daiza_num > 0){
      // グッズをあげるを選択
      pushHatButton(Hat::DOWN, 300);
      pushButton(Button::A, 1500);
      // リスト1番上の台座Mを選択、41個×12=タマ492個と交換
      // 台座が残り81個以下の場合は、一括ですべて交換する

      pushButton(Button::A, 800);
      if(daiza_num > trade_orb_num){
        pushHatButton(Hat::RIGHT, 200, trade_orb_num/10);
      }else{
        pushHatButton(Hat::DOWN, 300);
      }
      pushButton(Button::A, 800);
      pushButton(Button::B, 800);
      pushButton(Button::A, 800);
      pushButton(Button::B, 800);
      pushButton(Button::A, 800);
      // もらうあげるの選択肢まで戻る
      pushButton(Button::B, 50, 2);
      delay(700);
      pushButton(Button::A, 800);
      // グッズをもらうを選択
      pushButton(Button::A, 1500);
      // あらかじめ指定した、交換する技マシンのタマ個数表示までカーソルを合わせる
      pushHatButton(Hat::DOWN, 300, tmList-1);
      // 上A同時押しバグを使用する場合は同時押し、そうでなければAボタンのみを押して決定
      if(upAdouji == 1){
        SwitchController().pressHatButton(Hat::UP);
        SwitchController().pressButton(Button::A);
        delay(300);
        SwitchController().releaseHatButton();
        SwitchController().releaseButton(Button::A);
      }else{
        pushButton(Button::A, 100);
      }
      delay(500);
      // 個数いっぱいまで技マシンを交換
      pushHatButton(Hat::DOWN, 300);
      pushButton(Button::A, 800);
      pushButton(Button::B, 800);
      pushButton(Button::A, 800);
      pushButton(Button::B, 800, 2);
      // もらうあげるの選択肢まで戻る
      pushButton(Button::B, 800);
      pushButton(Button::A, 800);
      // 台座所持数を-81
      daiza_num = daiza_num - trade_orb_num;
    }
    // 台座がなくなったら、会話を終了する
    pushButton(Button::B, 100, 15);
    // 地上へ戻る

    pushButton(Button::Y, 500);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 1000, 5);
    // 交換した技マシンの個数を計算し、すべて売ることで得られる金額を算出する
    // 32767で算術オーバーフロー、オーバーフローを避けつつ正しい値を出すために計算を分ける

    money_thousand = money_thousand/50*(tmPrice/50)*6/orbQuantity*5 + money_thousand%50*(tmPrice/50)*6/orbQuantity/10;
    // すべて売った時にお小遣いカンストするなら、最大値999に補正する
    if(money_thousand > 999){
      money_thousand = 999;
    }
    delay(5000);  
}


void sleepNow()
{
  SwitchController().pressButton(Button::HOME);
  delay(1500);
  SwitchController().releaseButton(Button::HOME);
  pushButton(Button::A, 1000);
  while(true){
    delay(60000);
  }
}

void setup(){
    //画面起動    
    pushButton(Button::B, 300, 12);
    // 始めに、上A同時押しバグを使用するかを判定
    // 使用する場合のみ、安定のため1回あたりにまとめて交換するタマ個数を減らす

    if(upAdouji == 1){
      trade_orb_num = 41;
    }
    // デパートで台座購入、初回は技マシンを売却しない
    enterDepart();
    startShoppingAt4F();
    buyStandAt4F();
    finishShoppingAt4F();
    leaveDepart();
    // 地下へ潜り、台座を技マシンに交換する
    meetTamaOyaji();
}

void loop(){
    // 所持している技マシンを売った時の金額が指定した額を超えるなら、ドーピングアイテムを買って所持金を減らしつつ台座購入
    // それ以外は、技マシン売却、台座購入、玉経由で技マシンに交換を繰り返す

    if (money_thousand >= goal_money) {
      // もしドーピングアイテムを買わずに終了させたい場合、このif内をすべてコメントアウトし、代わりにスリープ関数を使用する
      //sleepNow();
      
      // 以下、ドーピングアイテムを51個購入し、そのまま残った金で台座購入、交換

      enterDepart();
      // 4Fで台座を買う前に2Fで技マシンを売り、ドーピングアイテムを買う
      startShoppingAt2F();
      sellTM();
      buyDopingAt2F();
      finishShoppingAt2F();
      // 4Fへ、技マシンは売却済み
      startShoppingAt4F();
      buyStandAt4F();
      finishShoppingAt4F();
      leaveDepart();
      // 通常通り交換
      meetTamaOyaji();
      // 次に購入するドーピングアイテムを変えるために、doping_numを0~5の範囲で変動させる
      // 1種類のみを購入したい場合や指定回数でスリープさせるなどの場合は、適当に編集してください

      doping_num = (doping_num +1)%6;
    }
    else {
      // 指定金額に届くまでは、デパートと地下を行き来して金策を繰り返す
      enterDepart();
      startShoppingAt4F();
      sellTM();
      buyStandAt4F();
      finishShoppingAt4F();
      leaveDepart();
      meetTamaOyaji();
    }
    
}

 

最後に

本スケッチを使用することで、寝ている間や外出中などに金策が可能となります。日替わりで技マシンの交換リストが変わるため、その日にできるかは運任せとなりますが、使えそうなときにお役立てください。

本プログラムはVer1.1.2の時に作成していたため、一応ずらしバグ機能に対応しております。金策効率が向上するため、1.1.3にアプデすべきか悩んでいます。


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

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


3 件のコメント:

  1. 可能でしたらアルセウスの訓練場で力技と早技のタスク埋めながらレベル上げできるプログラムのご教授をお願いします

    返信削除
  2. まず、ノボリの前でA連打することで戦闘を繰り返し、経験値稼ぎすることが可能です。これを応用して力技or早技を使わせるのであれば、Aと十字右or左を交互に入力させれば良いかと思います。
    加えて今作の仕様として、手持ち(ポーチ)先頭のポケモンと、最初に投げるポケモンを別にすることができます。強いポケモンを手持ち1番上、力技or早技を使うポケモンを投げるボールに合わせることで、戦闘序盤でタスク埋め、瀕死になったら強いポケモンを出して戦闘終了まで進めることができます。戦闘不能の際、右を押すと技にカーソルが移動してしまうため、力技を使いたい場合は「A左左」を、早技は「A左」を繰り返せば良いかと思います。

    返信削除
    返信
    1. ありがとうございます。
      Rボタンを押して切り替えのプログラムを組んだもののなぜかR1回の設定でR2回押して早業になってしまっていたので十字ボタンでの切り替えで再挑戦してみます。

      削除

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

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