2022/07/16

【MHR:S×Arduino03】マカ錬金リセマラ半自動化(迅錬丹未来予知)

 ※本記事は、モンスターハンターライズ サンブレイク(MHR:S)のマカ錬金・神気にて強いお守り(神おま)を見つけるためのリセマラ操作を自動化するプログラムについて解説した記事です。モンハンライズサンブレイクの操作をArduino Leonardoで自動化しております。「Arduinoって何?」って方はポケモン剣盾の00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。

 

本記事で紹介するプログラムは、前回 02回目のプログラムをベースに、リセマラように改変しました。リセマラで当たりを見つけたら元のプログラムを使用する想定でいるため、合わせてご覧ください。

 

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


 

きっかけ、動機

サンブレイクにおいて、マカ錬金をクエスト無しで実行できるアイテムとして迅錬丹が登場しました。便利ですが、考えずに使うとすぐに底を尽きます。

それはそうと、旧ライズ時代、痛風テーブルなどがアプデで改善された後あたりから、オートセーブをせずに錬金を行い、目的のお守りが出なければリセットするといった、リセマラが行われていました。錬金素材の節約にはなりましたが、錬金ごとにクエストに向かう必要があったためお守り1個あたりにかかる時間は余計にかかってしまいます。当時から錬金素材拾いを自動化していたため、私がリセマラを行うメリットはあまりありませんでした。

ですが今回、迅錬丹が登場したことで話は変わりました。迅錬丹を使うことで、クエストを行うことなく出てくる予定のお守りを確認することができるようになりました。迅錬丹が尽きない限りは何個でもクエスト無しで確認でき、加えてリセットしてしまえば迅錬丹は消費しないため使い回しができます。

したがって、今回はこのリセマラを補助するためのプログラムを作成しました。ただし、いつものような寝ている間などに半永久的に行うプログラムではありません。10分程度の操作1周を行うと自動化が終了します。出てきたお守りの確認は人力で行う必要があります。1周が終わったらマイコンを抜いて目視確認、良いお守りがなければマイコンを挿してもう1周・・・を繰り返します。

これで何ができるの?

指定した個数だけお守りを迅錬丹使用で錬金する作業と、良いお守りが出なかった場合にリセットする作業を自動化します。良いお守りが出たかどうかはマイコンを外して目視で確認し、良いお守りがなければマイコンを挿しなおすことでリセット、お守りテーブル変更のための錬金1回を自動で行い、目視で確認するところまで進行します。

今回は、前回のように寝ている間などに使用するものではなく、1周ごとに人力での操作が必要となります。リセット等の場面でセーブしてしまうなどの誤った操作を防ぐために自動化しています(A連打で誤ってセーブn敗)

原理、おおまかな流れ

概要

マカ錬金について、セーブ&リセットした状態の後であれば、何度セーブせずリセットから錬金を予約しても同じお守りが出てくる仕様となっています。これがサンブレイクで新登場した迅錬丹使用時も同様であることを利用し、迅錬丹を使って出てくるお守りを確認し、欲しいお守りを見つけた時のみ迅錬丹を使用せずに回収します。

 

本プログラムでは、以下の作業を補助するものとなります。

①迅錬丹で大量のお守りをクエスト無しで作成する
②迅錬丹で作成したお守りを確認する(人力)

 →ここで良いお守りがあれば、リセットして迅錬丹を使わずに回収しなおす

③良いお守りがなければリセットし、お守り1個だけ迅錬丹なしで予約する
④闘技大会ラージャンで1乙する
⑤セーブ&リセットで再開する。これにより、①を繰り返したときに出てくるお守りが変化する

②のお守りの確認は目視確認がほぼ必須となります(画像認識でスキルを認識しつつ取捨選択するのは面倒)。

そのため、人力での確認が必要ない③→④→⑤→①の動作を自動化し、人力が必要な作業を②だけとすることで、片手間でのお守り厳選を可能とします。


マカ錬金の抽選の仕様について

詳しいことは、より詳しく解説している方がいるかと思うので探してみてください(私自身があまり理解していません)

マカ錬金により今後出てくるお守りは、入れる前からあらかじめ決まっています。以下では、既に決まっているお守りの順番を「テーブル」と表記します。

このテーブルは、タイトル画面からセーブデータを起動したときに固定されます。その後は入れる錬金素材の種類や1回あたりの錬金で入手するお守りの個数に関係なく、同じ錬金(マカ錬金・神気など)であれば同じお守りが出現します。

そして、このテーブルが変化する条件は、1個以上のお守りを錬金してセーブ&リセットをすることとなります。したがって、

①タイトル画面から起動した状態から1度もセーブしなければ、リセットして錬金をやり直すと同じテーブルのままであり同じお守りが出てくる


②起動後に1個以上の錬金を行い、セーブしてからリセットすれば出てくるお守りテーブルは変化する


こととなります。この仕様は旧ライズの頃(痛風テーブルなどが改善された後)からの仕様であり、錬金素材を節約する方法としてリセマラが可能でした。ただし、出てくるお守りを確認するためのクエスト周回は必要であり、錬金素材を節約する以上のメリットは得られず、時間はリセマラした方がかかってしまいました。

 

そして今回、サンブレイクで登場したアイテムである迅錬丹を使用することで、クエスト周回なしで錬金を完了させることが可能となりました。迅錬丹の有無に関わらず、テーブルが変化しない限りは同じお守りが出るため、迅錬丹を使って即座に錬金を完了し、良いお守りがあればリセットして迅錬丹を使わずに回収することができます。


自動化における各工程について

上記のテーブルの仕様を利用し、マカ錬金のリセマラとして、以下の動作を行います。

①迅錬丹で大量のお守りをクエスト無しで作成する
②迅錬丹で作成したお守りを確認する(人力)

 →ここで良いお守りがあれば、リセットして迅錬丹を使わずに回収しなおす

③良いお守りがなければリセットし、お守り1個だけ迅錬丹なしで予約する
④闘技大会ラージャンで1乙する
⑤セーブ&リセットで再開する。これにより、①を繰り返したときに出てくるお守りが変化する

 

このうち、①と④については、前回の闘技ラージャン突撃自動化をベースとしており、同様の動作となります。マカ錬金に投入する素材の選択方法などは前回 02回目の記事をご覧ください。対して今回、③と⑤を新たに作成しました。

②はマイコン単体での動作は不可能(画像認識を導入したとしても、取捨選択のために「神おま」の定義をする必要があるので厄介)なため、人力、目視確認での操作となります。

したがって、今回のプログラムはマイコンを挿してから1周しか動作しません。1周当たりで確認するお守りを250個(お守り5個×錬金10回×5セット)に設定した場合、③~⑤、①までの動作を約10分で行い、目視確認を数分で行う、といった作業を繰り返すこととなります。


なお、選択する闘技大会クエストとして、MR50で解放される★6の激昂ラージャンに対応させました(上位ラージャンより少しだけ1乙の時間が早くなります)。MR50に達していない場合は、旧プログラムを参考にして元に戻してください。


マカ錬金に使用する素材の選択について

本プログラムでは10クエストごとにマカ錬金についての操作を行います。

前回の闘技ラージャン突撃自動化をベースとしており、スケッチ内の設定項目も基本的に同様となります。マカ錬金に投入する素材の選択方法などは前回 02回目の記事をご覧ください。

前回のプログラムでは、錬金に使用する素材の選択として、「renkinSelect()」の編集が必要でしたが、今回は「renkinSelectTen()」と「renkinSelectOne()」の2つの編集が必要となります。

基本的な設定方法は前回の「renkinSelect()」と同じです。

「renkinSelectTen()」は、迅錬丹を使用して大量(5個×10回×指定セット数)に錬金をするための関数です。リセットが前提のため、錬金ポイントに端数が出ても問題ありません。大量に投入しやすいように設定してください。

「renkinSelectOne()」は、テーブルを変更するために1周当たりお守り1個を迅錬丹なしで錬金する関数です。こちらは素材を実際に消費することになるため、200ptを無駄のないように投入することをおすすめします。

ご自身の所持しているモンスター素材の種類や個数の状況に合わせてスケッチを書き換えてください。

 

準備、必要なもの

本スケッチでは、マイコンを挿す前に以下の準備が必要となります。

初期条件は以下の通り

0. スケッチ内の注意事項などを必ず確認し、指定個所を編集する

1. あらかじめ、大量のお守りを作成できる程度の錬金素材と迅錬丹を集めておく。足りない場合は前回 02回目の記事などの自動化の利用を推奨。

2. あらかじめMR50の激昂ラージャンをクリアし、闘技大会MR6のラージャンに行けるようにする

3. 集会所のアイテムBOXにて、「装備の確認、売却」を開き、装備の整頓を行う(マイナスボタン)また、マカ錬金をすべて受け取り、何も預けていない状態にする

4. オートセーブをOFFに設定したうえでメニューよりセーブをしてゲームを終了し、再び開始する

5. 試しに上記①②を人力で行い、素材数や迅錬丹が不足しないかを確認する。この時点で神おまが出れば本プログラムに用はありません。

6. 神おまが出ていないことを確認したら、カムラの里の集会所にてマイコンを挿してスタート。上記③から①までを1周します

7. 自動化にて上記①を終えたら、マイコンを外して人力で操作。アイテムBOXにて、「装備の確認、売却」を開き、神おまがあるか確認してください。なければマイコンを挿し直し、本項6,7を繰り返し

 

作成したスケッチ

マカ錬金リセマラ半自動化のスケッチはこちら

 

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


/**
* モンハンライズ サンブレイク対応版、闘技大会ラージャンにキルされにいくプログラムVer1.1を改変し、
* マカ錬金のリセマラを補助するプログラムを作成
*
* セーブ、リセット、タイトルからセーブデータを再開した状態であれば、その後何度リセットしても同じお守りが出現することを利用し、
* ①迅錬丹でお守り50個×X回をクエスト無しですぐに作成
* ②50X個を人力で確認する。良いお守りがあれば、迅錬丹を消費したままセーブするも良し、セーブせずにリセットしてからラージャン周回をするも良し(周回中は目的物を入手するまでセーブリセットしない)
* ③良いお守りがなければ、セーブせずにゲームを終了し、お守り1個のみを迅錬丹を使用せずに予約
* ④闘技大会ラージャンで1乙し、お守りを受け取る
* ⑤セーブをしてゲームを終了し、再びデータを開く。これにより、次に①から実行した場合に、前回の①と異なるお守りが出現する。
* を繰り返します。③→④→⑤→①を本プログラムで自動化し、1周ごとに②でマイコンをはずして目視で神おまを探してください。
*
* 必ず注意事項をはじめ、すべて理解したうえで実行すること(必要なモンスター素材を失う恐れあり)
* 初期条件は以下の通り
*
* 0. 以下の注意事項などを必ず確認し、指定個所を編集する
* 1. あらかじめ、大量のお守りを作成できる程度の錬金素材と迅錬丹を集めておく。足りない場合は以下の記事などの自動化の利用を推奨。
*    https://kokenikki.blogspot.com/2022/07/mhrs01.html
* 2. あらかじめMR50の激昂ラージャンをクリアし、闘技大会MR6のラージャンに行けるようにする
* 3. 集会所のアイテムBOXにて、「装備の確認、売却」を開き、装備の整頓を行う(マイナスボタン)
*  また、マカ錬金をすべて受け取り、何も預けていない状態にする
* 4. オートセーブをOFFに設定したうえでメニューよりセーブをしてゲームを終了し、再び開始する
* 5. 試しに上記①②を人力で行い、素材数や迅錬丹が不足しないかを確認する。この時点で神おまが出れば本プログラムに用はありません。
* 6. 神おまが出ていないことを確認したら、カムラの里の集会所にてマイコンを挿してスタート。上記③から①までを1周します
* 7. 自動化にて上記①を終えたら、マイコンを外して人力で操作。
*  アイテムBOXにて、「装備の確認、売却」を開き、神おまがあるか確認してください。なければマイコンを挿し直し、本項6,7を繰り返し。
*/

// 注意事項!
/**
 * 必ず自己責任の上で実行してください。必要なアイテムを失う等の責任は負いかねます。
 * 注意事項や編集が必要な箇所は「!」(全角びっくり)を付けてあるので、すべて確認すること。
 * 本スケッチをマイコンに書き込む前に必ず、交易や隠密隊のON/OFFや錬金素材に使うアイテムを設定すること。
 * 交易や隠密隊のON/OFFはすぐ下の「const int」付近を、錬金素材に使うアイテムは「void renkinSelect()」を参照。
 * 隠密隊によるアイテムの取得により、錬金に投入する素材リストの評価値順や所持数順が変わる恐れあり。確証が持てなければOFF推奨。「const int」付近参照
 * 自身の環境、もっている素材にあわせて、「void renkinSelect()」を必ず編集すること。
 * とりあえずスケッチ全体を理解したうえで実行してください。
 */


#include <auto_command_util.h>


// ----------以下、設定項目----------
// お守り5個×10回錬金=50個を1セットとし、何セットおこなうかを選択
// 指定した数字×50個以上のお守り作成に必要な錬金素材と、指定した数字×10個以上の迅錬丹があらかじめ必要
const int renkin_sets = 5;


// 必ずfor文内を、投入したい素材となるように編集すること!
// 上記①、お守りを5個ずつ、10回錬金する際に使用する素材の指定。以下を編集し、大量にあるアイテムを迅錬丹と共に使用する
// リセットすることになるのでptを過剰に入れてもOK
// 「神気」にカーソルをあわせた状態から、錬金予約時、素材を選択して決定する動作を10回繰り返す。迅錬丹を使用。
void renkinSelectTen(){
    for (int i = 0; i < 10; i++){

      // 錬金術・神気を選択
      pushButton(Button::A, 500);
      // 素材のページ、行数(上から何段目)、投入個数(最大値を入れる場合はマイナスの値を設定)を設定!
      // ソフトを起動している間は所持数順/評価値順をRCLICKで最後に選択したものが保持されるようにアプデされた模様。
      materialList(1, 5, -10);
      // もし1回の錬金に複数種類の素材を投入する場合、以下のように追加で記述!
      /*
       * // 「目的のページ数 - 現在のページ数 +1」, 行数、投入個数。
       * 以下の例では「4ページ先」の「上から7行目」を「2個」投入し、続けて12ページ(12-4+1=9)、5行目を最大数投入
       * materialList(4, 7, 2);
       * materialList(9, 5, -10);
       */
      // カーソルを決定に移動
      pushHatButton(Hat::UP, 200);
      pushButton(Button::A, 300);
      pushHatButton(Hat::LEFT, 200);
      pushButton(Button::A, 300);

      // 迅錬丹を使用する
      pushButton(Button::A, 500);
    }
}


// 必ずfor文内を、投入したい素材となるように編集すること!
// 上記③、お守りを1個だけ、1回錬金する際に使用する素材の指定。以下を編集し、マイコン差し込み1回ごとに消費するアイテムを選択
// セーブするため、無駄なく200ptを入れることを推奨
// 「神気」にカーソルをあわせた状態から、錬金予約時、素材を選択して決定する動作を1回おこなう
void renkinSelectOne(){
    // 錬金術・神気を選択
    pushButton(Button::A, 500);
    // 素材のページ、行数(上から何段目)、投入個数(最大値を入れる場合はマイナスの値を設定)を設定!
    // ソフトを起動している間は所持数順/評価値順をRCLICKで最後に選択したものが保持されるようにアプデされた模様。
    materialList(1, 5, 2);
    // もし1回の錬金に複数種類の素材を投入する場合、以下のように追加で記述!
    /*
     * // 「目的のページ数 - 現在のページ数 +1」, 行数、投入個数。
     * 以下の例では「4ページ先」の「上から7行目」を「2個」投入し、続けて12ページ(12-4+1=9)、5行目を最大数投入
     * materialList(4, 7, 2);
     * materialList(9, 5, -10);
     */
    // カーソルを決定に移動
    pushHatButton(Hat::UP, 200);
    pushButton(Button::A, 300);
    pushHatButton(Hat::LEFT, 200);
    pushButton(Button::A, 300);

    // 迅錬丹を使わずに予約
    pushHatButton(Hat::DOWN, 200);
    pushButton(Button::A, 500);
 
}

// ----------以上、設定項目----------


// 錬金予約時、素材リストのページ数、行数、投入個数を指定する。投入個数がマイナスの場合は1回に入れられる最大量をまとめて入れる
// pageは1以上、行数は1~7の範囲で設定
void materialList(int page, int line, int piece){
    // Rボタンにてページ移動
    pushButton(Button::R, 150, page - 1);
    // 上下ボタンにて指定行まで移動し、Aボタン
    if (line < 5){
      pushHatButton(Hat::DOWN, 150, line - 1);
    } else {
      pushHatButton(Hat::UP, 150, 9 - line);
    }
    pushButton(Button::A, 200);

    // 上ボタンにて投入個数を決定してAボタン。ただしpieceの値が0以下なら、代わりに下ボタンを1回おして最大数を投入する。
    while (piece > 9){
      pushHatButton(Hat::RIGHT, 150);
      piece = piece - 10;
    }
    if (piece >= 0){
      pushHatButton(Hat::UP, 150, piece);
    } else {
      pushHatButton(Hat::DOWN, 150);
    }
    pushButton(Button::A, 200);

    // 上下ボタンでリスト1番上まで移動
    if (line < 5){
      pushHatButton(Hat::UP, 150, line - 1);
    } else {
      pushHatButton(Hat::DOWN, 150, 9 - line);
    }
    
}



// カムラ集会所のギルドストア(猫)に話しかけ、マカ錬金を開く
void goToStore(){
    SwitchController().setStickTiltRatio(0, 0, 0, 0);

    // 集会所入り口へマップ移動のコマンド入力
    SwitchController().pressButton(Button::MINUS);
    delay(800);
    SwitchController().releaseButton(Button::MINUS);
    pushHatButton(Hat::UP, 300);
    pushButton(Button::A, 300);

    // ギルドストアへ話しかけ
    SwitchController().pressButton(Button::R);
    tiltJoystick(-100, 0, 0, 0, 2000);
    SwitchController().releaseButton(Button::R);
    pushButton(Button::A, 1400);

    // 下から3番目、「マカ錬金」選択
    pushHatButton(Hat::UP, 200, 3);
    pushButton(Button::A, 300);
    
}

// 上記「goToStore」でマカ錬金を開いた後、預けていた錬金結果を回収する
void receiveGoseki(){
    // 「マカ錬金」選択したところから開始
    // 1番下、受け取り(一括)
    pushButton(Button::A, 300);
    pushHatButton(Hat::UP, 200);
    pushButton(Button::A, 300);

}


// 上記③、セーブをせずにゲームを終了し、再びデータを開く。その後、お守り1個分だけを迅錬丹を使用せず予約する。
void resetWithOutSave(){
    // メニューよりゲーム終了
    pushButton(Button::PLUS, 300);
    pushHatButton(Hat::LEFT, 200);
    pushHatButton(Hat::UP, 200);
    pushButton(Button::A, 300);

    // セーブをしますか?いいえ>しないの?はい
    pushHatButton(Hat::RIGHT, 200);
    pushButton(Button::A, 300, 2);
    delay(7000);

    // タイトル画面、続きから
    pushButton(Button::A, 300, 3);
    delay(3500);

    // ゲームデータの選択
    pushButton(Button::A, 25000);
    // 集会所入り口へマップ移動のコマンド入力
    SwitchController().pressButton(Button::MINUS);
    delay(800);
    SwitchController().releaseButton(Button::MINUS);
    pushHatButton(Hat::UP, 300);
    pushButton(Button::A, 300);
    delay(700);

    // 集会所のギルドストアへ向かう
    goToStore();
    // マカ錬金を選択した後、1番上の神気を選択
    // お守り1個分だけを迅錬丹を使用せず予約する
    renkinSelectOne();
    // Bボタン連打で錬金予約を終了する
    pushButton(Button::B, 100, 12);
    // 集会所入り口へマップ移動のコマンド入力
    SwitchController().pressButton(Button::MINUS);
    delay(800);
    SwitchController().releaseButton(Button::MINUS);
    pushHatButton(Hat::UP, 300);
    pushButton(Button::A, 300);

    // 集会所入り口から教官後ろまで移動
    SwitchController().setStickTiltRatio(30, -100, 0, 0);
    SwitchController().pressButton(Button::R);
    delay(5000);
    SwitchController().releaseButton(Button::R);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
}

// 上記④-1、闘技大会ラージャンで1乙する。
// MR50以上仕様のため、MR50未満の場合は周回プログラムVer1.0の関数に書き換えること。
// 教官に話しかける~クエスト選択~ラージャンとの出会い~集会所に戻る
void rajangKorokoro(){
    //教官の後ろ~教官話しかけ~クエスト開始
    tiltJoystick(-20, 100, 0, 0, 1300);
    // 闘技大会MR6のラージャン選択。
    // MR50の緊急クエストまで解禁されないので、その場合はVer1.0の関数に書き換えること
    // 話しかけ、闘技大会>マスター
    pushButton(Button::A, 1300);
    pushButton(Button::A, 500);
    pushButton(Button::A, 1200);

    // 1番下のラージャンを選択
    pushHatButton(Hat::UP, 200);
    pushButton(Button::A, 300);
    pushButton(Button::A, 2000);

    // クエスト開始
    pushButton(Button::ZR, 300);
    pushButton(Button::A, 2000);

    // 防御の低いガンナーを選択
    pushButton(Button::L, 500);
    pushHatButton(Hat::DOWN, 200, 3);
    pushButton(Button::A, 300);
    pushButton(Button::A, 1000);

    // ラージャンに向かって走りだす。ヒトタマドリ取らないように最初だけ左方向へ
    SwitchController().setStickTiltRatio(-20, -100, 0, 0);
    SwitchController().pressButton(Button::R);
    delay(15000);
    SwitchController().setStickTiltRatio(0, -100, 0, 0);
    delay(1000);

    // 虫移動、少しだけ右寄りに動き、ラージャンにぶつかる
    SwitchController().setStickTiltRatio(5, -100, 0, 0);
    SwitchController().pressButton(Button::ZL);
    pushButton(Button::ZR, 800);
    pushButton(Button::A, 800);
    pushButton(Button::B, 3500);
    SwitchController().releaseButton(Button::ZL);
    SwitchController().setStickTiltRatio(0, -100, 0, 0);
    delay(2000);

    // 立ち止まり、起き上がるために1秒ごとに壁に向かって歩く
    SwitchController().releaseButton(Button::R);
    for(int i=0; i<20; i++){
      SwitchController().setStickTiltRatio(0, -100, 0, 0);
      delay(50);
      SwitchController().setStickTiltRatio(0, 0, 0, 0);
      delay(950);
    }
    delay(21000);

    // リザルト画面
    pushButton(Button::B, 100, 8);
    SwitchController().pressButton(Button::R);
    SwitchController().setStickTiltRatio(30, -100, 0, 0);

    // ロード中に、ハマり防止のため集会所入り口へマップ移動のコマンド入力
    SwitchController().pressButton(Button::MINUS);
    delay(800);
    SwitchController().releaseButton(Button::MINUS);
    pushHatButton(Hat::UP, 300);
    pushButton(Button::A, 300);

    // ロード~教官後ろの壁にぶつかる
    delay(19000);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    SwitchController().releaseButton(Button::R);
    
}


// 上記④-2、1個だけ預けたお守りを受け取る
void getOnlyOne(){
    // 集会所のギルドストアへ向かう
    goToStore();
    // お守り1個を受け取る
    receiveGoseki();
    // Bボタン連打で錬金予約を終了する
    pushButton(Button::B, 100, 12);
}


// 上記⑤、セーブをしてゲームを終了し、再びデータを開く。
void resetWithSave(){
    // メニューよりゲーム終了
    pushButton(Button::PLUS, 300);
    pushHatButton(Hat::LEFT, 200);
    pushHatButton(Hat::UP, 200);
    pushButton(Button::A, 300);

    // セーブをしますか?はい
    pushButton(Button::A, 300, 2);
    delay(9000);

    // タイトル画面、続きから
    pushButton(Button::A, 300, 3);
    delay(3500);

    // ゲームデータの選択
    pushButton(Button::A, 300, 2);
    delay(24000);
    // 集会所入り口へマップ移動のコマンド入力
    SwitchController().pressButton(Button::MINUS);
    delay(800);
    SwitchController().releaseButton(Button::MINUS);
    pushHatButton(Hat::UP, 300);
    pushButton(Button::A, 300);
    delay(700);
    
}


// 上記①、お守りを指定した個数(50×X)だけ、迅錬丹を使って一気に作成、回収
void getManyGoseki(){
    // 集会所のギルドストアへ向かう
    goToStore();
    // 錬金5個×10回の予約を迅錬丹を使用して行い、即座に回収。これを指定セット数だけ実行する。
    for(int j=0; j < renkin_sets; j++){
      // 錬金10回を予約、迅錬丹を使用
      renkinSelectTen();
      // カーソルを受け取るに合わせる
      pushHatButton(Hat::UP, 200);
      // 10回分を受け取る
      receiveGoseki();
      // 1番上、神気にカーソルをあわせる
      pushHatButton(Hat::DOWN, 200);
    }

    // Bボタン連打で錬金予約を終了する
    pushButton(Button::B, 100, 12);
    // この後手動で受け取るために、上方向、アイテムBOX前に移動する
    tiltJoystick(0, -100, 0, 0, 5000);
}



void setup(){
    pushButton(Button::B, 300, 13); 
// 最初の数回の入力はswitchが認識しない場合があるので、無駄打ちをしておく
    pushButton(Button::A, 500);  // USBコントローラーとして決定
    delay(1300);
    // 上記③, ④-1,2,⑤,①を順に行う。そのあとは何も動かないので、マイコンを外して人力でアイテムBOX内のお守りを探し、神おまが見つからなかったらマイコンを挿しなおす
    resetWithOutSave();
    rajangKorokoro();
    getOnlyOne();
    resetWithSave();
    getManyGoseki();
}

void loop(){
  delay(30000);
}

 

最後に

サンブレイクでのお守り厳選のリセマラは、迅錬丹が登場したおかげで相当便利になったかと思います。便利になったリセマラの大半を自動化することで、体感8割くらい作業が楽になります。そして、誤ってセーブしてはいけない場面でセーブしてしまう事故が無くなります。これ、意外と大事。

 神おまマラソン頑張りましょう!

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

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

7 件のコメント:

  1. ブログが作成されてからだいぶ時間が空いているのですが、質問よろしいでしょうか。
    本記事はリセマラ用にプログラムされているようですが、リセマラせずに、「錬金術・極光を延々と、迅錬丹と特濃マカ油を消費して回す場合」と、「錬金術・転生を延々と、迅錬丹と護石を消費して回す場合」、どのようなプログラムをすればいいのでしょうか。

    返信削除
    返信
    1. 本記事の1つ前の記事がリセマラをせずに闘技場周回で錬金を進める(=迅錬丹を使わない)場合の自動化となります。こちらを参考にした方が分かりやすいかと思います。
      https://kokenikki.blogspot.com/2022/07/mhrs02.html
      迅錬丹を使う場合、闘技場周回などの動きが不要となるため、主にrenkinSelect()の部分に注目すれば良いかと思います。そのうえで、極光あるいは転生を選択するように編集してください。
      まずは自身で極光あるいは転生に素材を投入する操作をおこない、Aボタンや十字キーなどの入力の順番を確認してください。そして、その通りにpushButton(~)などの命令を並べてみてください。

      削除
    2. 再度質問失礼します。
      自分の環境に合わせてプログラムを書き換えているのですが、マカ錬金を1000回分獲得した後にプログラムを止める場合、どういうプログラムにすればいいのでしょうか。

      削除
    3. 現在、投入10回分(for文)と回収を1セットとしているので、それをさらにfor文で囲えばいいのでしょうか。

      削除
    4. void setup()内に記述していてvoid loopに何も書いていないのであれば、for文で囲えば良いと思います。
      void loop内に記述している場合は、上記の02の記事のプログラムを参考にしてください。あらかじめ回数カウント用のint型を指定し、loop1周ごとに値が増えていくように設定しています。その値が一定値(1000回)を超えた場合に別の動作(動かなくする)へと分岐するようにしています。

      削除
    5. void loop自体ループしていることに気づいてませんでした。
      02の記事を参考にして無事にプログラムが完成しました。
      ありがとうございます。

      削除
  2. このコメントは投稿者によって削除されました。

    返信削除

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

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