2021/05/09

【MHRise×Arduino03】カムラポイント+錬金素材採取自動化(前回02より改良版)

※本記事は、モンスターハンターライズ(MHRise)の溶岩洞探索ツアーにて、カムラポイント+モンスター素材(=錬金素材)の回収を自動化するプログラムについて解説した記事です。MHRiseの操作をArduino Leonardoで自動化しております。「Arduinoって何?」って方はポケモン剣盾自動化の00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。


今回の記事は、前回の記事での特産品回収ツアーを改良し、特産品の回収に加えてモンスター素材(=錬金素材)の回収を自動化しました。カムラポイントのみ欲しい場合は、前回の記事の方が効率が良いのでそちらをご覧ください。


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


 

きっかけ、動機

前回の自動化では溶岩洞での特産品回収を自動化し、カムラポイントと金を稼ぐことが可能になりました。動作は安定させつつ、より効率的な収集を検討しながら溶岩洞をさまよっていたところ、ウロコモリトカゲを発見しました。ウロコモリトカゲからはモンスター素材を回収でき、錬金素材として利用が可能です。さらに、溶岩洞のトカゲは翔蟲を使わずとも会うことができ、自動化しやすそうだったのでやってみました。一応、前々回の自動化の隠密隊でもモンスター素材は手に入りますが、より効率的に入手を試みました。

 


これで何ができるの?

集会所上位の溶岩洞探索ツアーへ行き、前回同様に特産品を採取するのに加え、ウロコモリトカゲを攻撃してモンスター素材を3個まで入手するという動作を繰り返します。動かしてみたところ、1周約3分50秒で周回し、約30分で555ポイント稼げました。また、モンスター素材ついでにカムラポイントと金も稼げます。

 カムラポイントとモンスター素材を同時に稼ぐ際にどうぞ。

記事作成後に、「ウロコだけ欲しいならテオテスカトル行けばいいじゃん」って気づいた


原理、おおまかな流れ

概要

前回から比較した、今回の主な改良点は黄色で表示します。 

モンハンライズでは、強い装備を作るためにはマカ錬金で護石を入手する必要があり、そのためにモンスター素材などを必要とします。理想の装備を作るには何百何千とモンスターを狩ることになります。

 

本プログラムでは

集会所上位の溶岩洞探索ツアーへ行き、回収しやすい特産品とウロコモリトカゲを採取する

という動作を繰り返します。

メインやサブのキャンプ近くにある特産品を4か所、サブキャンプ2近くのウロコモリトカゲの落とし物を採取します。


プログラム開始前の準備について

①特産品の増殖について

本プログラムでは約3分50秒ごとに探索ツアーへと出発します。

5分以内にクエストを終える利点として、食事や環境情報などが更新されないというメリットがあります。

環境情報とは、探索クエストごとに「モンスターの大量発生」「採取アイテムの増殖」が設定されているものを指します(クエスト受注時2ページ目上段に表示)。環境情報は時間経過や他クエストのクリア(or失敗)とともに変更されますが、探索クエストを5分以内にクリアした場合はクエスト回数として数えられず、変更されません

アイテムの増殖は草や鉱石などの他、「特産品」の増殖があります。 この時には、通常1個の特産品が3個手に入るため、効率が約3倍となります。

本プログラムでは、自動化開始前に環境情報が「特産品の増殖」にしておくことをおすすめします。1度調整しておくことで、プログラム実行中何時間でも増殖した状態で採取ができます。環境情報は他のクエストを進めることで変化するので、自分でクエストに行くなり、前々回の自動化を利用するなりしてください。


②食事について

ウロコモリトカゲを安定して出現させるために食事をします

今回は、「お団子環境生物召喚」のスキルを発動させます。あらかじめマイセット32に「お団子環境生物召喚」を含むセットを設定してください。

1クエスト5分以内なので、クエスト終了後もお団子の日替わりや、発動するスキルは変わりません(○○%ではなく、前回に出たのとまったく同じスキルが発動します)

 

③装備について

装備について、必要なスキルは地質学Lv2以上です。これにより特産品の採取できる個数が増えます(1枠分追加)。2枠→3枠になるので、1.5倍の効率となります。

さらに、今回はスラッシュアックスを担ぐことを前提にしております。

スラッシュアックスの利点は、Aボタン連打で出せるぶんまわしで立ち位置が変わらずに円状(おうぎ形)の広い範囲を攻撃し続けられるためです。 

武器の攻撃力は関係ないため、好きな武器(スロット数や見た目など)を使ってください。


プログラムの流れについて

本プログラムでの実際の動きは、
①集会所のクエストカウンターに話しかけてクエスト選択(上位溶岩洞ツアー)
②メインキャンプから出てすぐの「竜骨の化石」を採取
③サブキャンプ1へファストトラベル
④サブキャンプ1からすぐの「虹色の鉱石」を採取
⑤その近くにある「焼けた鉱石」を採取
⑥サブキャンプ2へファストトラベル
⑦キャンプ裏側へ行き、「竜骨の化石」を採取(位置調整を兼ねて)
⑧化石採取後、崖下へ飛び降り、円柱の上へ
⑨柱上のウロコモリトカゲに対して、スラアクをブンブン振って攻撃
⑩足場から落ちないように、中から外へ渦巻き状に歩きつつ落とし物回収
⑥メニューから「クエストクリア」を選択し、集会所へ戻る

となります。


作成したスケッチ

作成したスケッチは以下のようになります。スケッチのファイルこちら


 なお、執筆者がスケッチを作成するにあたり使用した環境は以下のようになります。

・パッケージ版、日本語設定(DL版ではロード時間が違う可能性があります)

ロード時間などによる操作のずれが考えられますので、適宜調整してください。


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


  
/**
* モンハンライズ、溶岩洞特産品の採取でのカムラポイント回収+ウロコモリトカゲからモンスター素材回収の自動化
* サブキャンプ2近くのウロコモリトカゲを回収するため、前回のスケッチを改良
*
* 初期条件は以下の通り
* 1. 設定はオートセーブ有(執筆者環境のコンフィグ等で設定しているため、適宜スケッチ改変を推奨)
* 2. 可能であれば溶岩洞ツアー特産品の増殖であることを推奨。
* 3. 装備はスラッシュアックスを担ぐ。ポイント稼ぎのため地質学Lv2以上を推奨。
* 4. 食事のマイセット32(リストの最後)をあらかじめ設定し、「環境生物召喚」が発動できるようにする 
* 5. 集会所へ移動(オフライン)し、マップを開ける状態でマイコンを挿してスタート
* 6. もしマイコンをスタートさせた初回の食事で「環境生物召喚」が発動しなかった場合、
*   マイセットのお団子3個の順番を変えたり、別のクエストを消化したりしてスキルが発動するようにする
*/


#include <auto_command_util.h>

// 集会所~溶岩洞ツアー開始~竜骨の化石採取
void startTour(){
    // 集会所初期位置~受付話しかけ
    SwitchController().pressButton(Button::R);
    SwitchController().setStickTiltRatio(-100, -100, 0, 0);
    delay(1000);
    pushButton(Button::A, 100,2);
    pushButton(Button::A, 1000);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    SwitchController().releaseButton(Button::R);
    // 上位溶岩洞探索ツアー選択
    pushButton(Button::A, 300);
    pushHatButton(Hat::UP, 200);
    pushButton(Button::A, 1000);
    pushHatButton(Hat::UP, 200);
    pushButton(Button::A, 300, 2);
    pushButton(Button::A, 1700);
    // 団子食べる
    No32dango();
    // クエスト開始
    pushButton(Button::ZR, 300);
    pushButton(Button::A, 3000);
    pushButton(Button::B, 100, 5);
    // キャンプすぐの釣り場まで走る
    SwitchController().pressButton(Button::R);
    SwitchController().setStickTiltRatio(0, -100, 0, 0);
    delay(20500);
    // 虫移動
    SwitchController().pressButton(Button::ZL);
    pushButton(Button::A, 1500);
    pushButton(Button::A, 200, 2);
    SwitchController().releaseButton(Button::ZL);
    // 移動方向を少し左へ変更
    SwitchController().setStickTiltRatio(-20, -100, 0, 0);
    delay(9000);
    // 釣り場から後ろに動き、竜骨化石を採取
    SwitchController().setStickTiltRatio(-30, 100, 0, 0);
    delay(1000);
    pushButton(Button::A, 200, 10);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    SwitchController().releaseButton(Button::R);
    delay(4000);
}

// 出発前に団子(マイセット32)を食べる
void No32dango(){
    // 集会所でツアー受注後、食事
    SwitchController().pressButton(Button::R);
    SwitchController().setStickTiltRatio(100, -80, 0, 0);
    delay(2000);
    SwitchController().setStickTiltRatio(10, 100, 0, 0);
    delay(800);
    pushButton(Button::A, 100, 4);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    delay(2800);
    // 食事>お金で>いつもの>マイセット32
    pushButton(Button::A, 500);
    pushButton(Button::A, 300, 2);
    pushHatButton(Hat::LEFT, 200);
    pushHatButton(Hat::UP, 200);
    pushButton(Button::A, 300, 2);
    pushButton(Button::B, 100, 25);
    delay(500);
}

// 溶岩洞サブキャンプ1へ行き、特産品回収
void goSub1(){
    // サブキャンプ1へ移動
    SwitchController().pressButton(Button::MINUS);
    delay(800);
    SwitchController().releaseButton(Button::MINUS);
    pushButton(Button::A, 300);
    pushHatButton(Hat::DOWN, 300);
    pushButton(Button::A, 200);
    pushButton(Button::A, 8500);
    // 後ろへ走って虹色の鉱石採取
    SwitchController().pressButton(Button::R);
    SwitchController().setStickTiltRatio(0, 100, 0, 0);
    delay(1000);
    pushButton(Button::A, 200, 10);
    // 左前へ進み焼けた鉱石採取
    SwitchController().setStickTiltRatio(-100, -100, 0, 0);
    delay(7500);
    SwitchController().setStickTiltRatio(-10, 100, 0, 0);
    pushButton(Button::A, 200, 10);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    SwitchController().releaseButton(Button::R);
}

// 溶岩洞サブキャンプ2へ行き、ヨロイモリトカゲ回収
void goSub2(){
    // サブキャンプ2へ移動
    SwitchController().pressButton(Button::MINUS);
    delay(800);
    SwitchController().releaseButton(Button::MINUS);
    pushButton(Button::A, 300);
    pushHatButton(Hat::UP, 300);
    pushButton(Button::A, 200);
    pushButton(Button::A, 8500);
    // キャンプ右から回り込み、雷光虫を無視して竜骨の化石へ
    SwitchController().pressButton(Button::R);
    SwitchController().setStickTiltRatio(100, 0, 0, 0);
    delay(2000);
    SwitchController().setStickTiltRatio(0, -100, 0, 0);
    delay(3000);
    SwitchController().setStickTiltRatio(-60, -80, 0, 0);
    delay(8000);
    SwitchController().releaseButton(Button::R);
    pushButton(Button::A, 200, 10);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    delay(5000);
    // 採取後飛び降りてウロコモリトカゲのところへ
    SwitchController().setStickTiltRatio(82, -52, 0, 0);
    SwitchController().pressButton(Button::R);
    delay(2800);
    SwitchController().releaseButton(Button::R);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    delay(4000);
    SwitchController().setStickTiltRatio(-80, 80, 0, 0);
    delay(500);
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    delay(300);
    // 武器出しからA連打、スラアクぶん回し
    pushButton(Button::X, 500);
    pushButton(Button::A, 400, 22);
    delay(3000);
    // 納刀し、アイテムを回収
    pushButton(Button::Y, 600);
    pushButton(Button::A, 100, 7);
    // 中から外へと渦巻上に移動とA押しを繰り返し
    tiltJoystick(0, 70, 0, 0, 250);
    pushButton(Button::A, 100, 4);
    tiltJoystick(-70, -70, 0, 0, 100);
    pushButton(Button::A, 100, 4);
    tiltJoystick(70, -70, 0, 0, 100);
    pushButton(Button::A, 100, 4);
    tiltJoystick(70, 70, 0, 0, 100);
    pushButton(Button::A, 100, 4);
    tiltJoystick(-70, 70, 0, 0, 100);
    pushButton(Button::A, 100, 4);
    tiltJoystick(-70, 70, 0, 0, 130);
    pushButton(Button::A, 100, 4);
    for(int i = 0; i<2; i++){
      for(int l = 0; l< i+1; l++){
        tiltJoystick(-70, 0, 0, 0, 100);
        pushButton(Button::A, 100, 4);
      }
      tiltJoystick(-50, -50, 0, 0, 100);
      pushButton(Button::A, 100, 4);
      for(int u = 0; u< i+2; u++){
        tiltJoystick(0, -70, 0, 0, 150);
        pushButton(Button::A, 100, 4);
      }
      tiltJoystick(50, -50, 0, 0, 100);
      pushButton(Button::A, 100, 4);
      for(int r = 0; r< i+2 ; r++){
        tiltJoystick(70, 0, 0, 0, 100);
        pushButton(Button::A, 100, 4);
      }
      tiltJoystick(50, 50, 0, 0, 100);
      pushButton(Button::A, 100, 4);
      for(int d = 0; d< i+2 ; d++){
        tiltJoystick(0, 70, 0, 0, 150);
        pushButton(Button::A, 100, 4);
      }
      tiltJoystick(-50, 50, 0, 0, 100);
      pushButton(Button::A, 100, 4);
      tiltJoystick(-70, 70, 0, 0, 100);
      pushButton(Button::A, 100, 4);
    }
    
}

// 溶岩洞ツアー終了、集会所へ戻る
void finishTour(){
    // クエストクリアで帰還
    pushButton(Button::PLUS, 200);
    pushHatButton(Hat::RIGHT, 200);
    pushHatButton(Hat::DOWN, 200, 4);
    pushButton(Button::A, 300);
    pushHatButton(Hat::LEFT, 200);
    pushButton(Button::A, 14500);
    // オトモのアイテムがあれば売却
    pushHatButton(Hat::UP, 200);
    pushHatButton(Hat::RIGHT, 200);
    pushButton(Button::A, 300);
    pushHatButton(Hat::LEFT, 200);
    pushButton(Button::A, 300,5);
    // 集会所へ帰還(集会所でつっかえた場合のみ、ここでマップ移動コマンド)
    pushButton(Button::B, 100, 10);
    pushButton(Button::RCLICK, 300);
    pushButton(Button::A, 300,2);
    pushButton(Button::B, 100, 5);
    SwitchController().pressButton(Button::MINUS);
    delay(800);
    SwitchController().releaseButton(Button::MINUS);
    pushHatButton(Hat::UP, 300);
    pushButton(Button::A, 1000);
    // 移動コマンドに約6.5sec,しばらく待機
    delay(11000);
}


// 開始直後のみ、はじめに集会所入り口へ移動する
void setup(){
    pushButton(Button::B, 500, 8);  // 最初の数回の入力はswitchが認識しない場合があるので、無駄打ちをしておく
    pushButton(Button::A, 500);  // USBコントローラーとして決定
    delay(1300);
    // 集会所入り口へマップ移動のコマンド入力
    SwitchController().pressButton(Button::MINUS);
    delay(800);
    SwitchController().releaseButton(Button::MINUS);
    pushHatButton(Hat::UP, 300);
    pushButton(Button::A, 300);
    pushButton(Button::B, 100, 3);
}

// ループについて、サブキャンプ1(2)での行動を省略したい場合は「goSub1(2)」を削除
void loop(){
  startTour();
  goSub1();
  goSub2();
  finishTour();
}


 

 

最後に

本スケッチを使用することで、カムラポイントの収集に加えてモンスター素材の収集が自動でできます。このプログラム1つで交易品の交換用ポイントとマカ錬金用素材が同時に手に入ります。

このプログラムを書き終わり、本記事をほぼ作成し終えた頃に、ウロコモリトカゲ素材が欲しいならテオテスカトルのクエストに行けばいいことに気が付きました。近いうちに、テオテスカトル素材の収集に特化した自動化を作成しようと思います。


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


念のため書きますが、使用マイコンはArduino Leonardoです。最もメジャーなUnoなどでは本プログラムは使えませんのでご注意を。

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

 

0 件のコメント:

コメントを投稿

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

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