2021/04/22

【MHRise×Arduino01】闘技ラージャン突撃自動化(隠密隊、交易船、護石錬金)


※本記事は、モンスターハンターライズ(MHRise)の隠密隊、交易船、護石錬金などを進めるために闘技大会ラージャンに突撃してキルされる動作、ならびに隠密隊や交易船のアイテム回収を自動化するプログラムについて解説した記事です。MHRiseの操作をArduino Leonardoで自動化しております。「Arduinoって何?」って方はポケモン剣盾自動化の00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。


2021.04.29追記:2.0へのアップデートに伴い、執筆者環境でロード時間にずれが生じたため、修正しました。ロード時間の調整(パッケージ版)と、ラージャンに突撃する際の翔蟲の動作を変更をしました。(おそらく最初のプログラムを使用しても問題ありません。ほぼ気分です。)


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


 

きっかけ、動機

モンハンライズのラスボス(4/21時点)を終え、残すはエンドコンテンツの護石錬金となりました。素材を一気に集めて一気に錬金を行う場合、錬金を進める最速の方法は闘技大会のラージャンで1乙することと知り、この作業を自動化できるのではないか、と考えて自動化の制作に至りました。

製作途中で、ラージャン1乙で護石錬金だけでなく隠密隊や交易船の時間経過も可能ということに気づき、錬金を待つついでに隠密隊でモンスター素材を、交易船でハチミツなど便利アイテムも回収する工程も入れることとしました。

普段はポケモン剣盾について自動化プログラムを作成しておりますが、今回は同じノリでモンハンの自動化を行っております。Arduino(マイコン)やプログラムについて知りたい方は、ポケモン剣盾用の記事を参考にお願いします。

 

これで何ができるの?

集会所から闘技大会05のラージャンに挑み、キルされて集会所に戻るという動作を繰り返します。クエスト失敗でも成功時と同様に錬金や隠密隊、交易船の回数が進むため、自動かつ効率的に錬金などを進めることができます

加えて、隠密隊でのモンスター素材や交易船での便利アイテムも自動で回収します。錬金をしない場合も、放っておくだけでハチミツやマンドラゴラ、あるいは錬金用の素材を少しずつ回収します。

ついでに、少し弄るだけで隠密隊の使用のOFF(カムラポイントを消費しないため)、隠密や交易のアイテムの売却も設定可能としております。


原理、おおまかな流れ

概要

モンハンライズの 錬金や隠密隊、交易船はクエスト成功、失敗どちらでもクエスト1回ごとに進んでいきます。そして、闘技大会クエスト(教官から受けられるクエ)は1回やられるとクエスト失敗となります。つまり、闘技大会で1乙するだけで時間を進められます。

 

本プログラムでは基本的に、

「闘技大会ラージャンに挑み、1乙でクエスト失敗となる」

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

隠密隊が帰ってくるまでの5クエスト(5乙)ごとにルームサービスに話しかけ、隠密隊と交易船のアイテムを回収(or売却)します。


闘技大会ラージャンについて

本プログラムでは集会所からウツシ教官に話しかけ、闘技大会クエスト05のラージャンを選択、クエスト開始からラージャンに倒されるようにします。

集会所では、右上方向に進み続けて壁(縁側?)にぶつかった後、少し引き返す形で教官に話しかけます。クエストを選択し、クエストを開始します。

クエストを開始すると、闘技大会に挑むための装備を選択します。今回の目的は素早くラージャンに倒されることなので、防御の低い装備、つまりガンナーを選択します。

選択したら戦闘開始です。キャンプからラージャンのところに降りる際、体力やスタミナを最大まで上げてくれるヒトダマドリがいます。早く倒されるためには体力を増やしたくないため、ヒトダマドリを避けるために最初だけ少し左方向へ進みます。 

ラージャンに倒されるためには、攻撃を当ててもらう必要があります。そのため、狙いがずれないように動かないことが望ましいです。一方、1発目の攻撃を受けてダウンした際に、起き上がるためにはスティックを倒す必要があります。したがって、スティックを倒しつつも位置が変わらない状態、つまり壁にぶつかった状態を維持します

実際の動きは、

⓪集会所の教官に話しかけてクエスト選択、防御の低いガンナー装備でスタート
①キャンプから少し左に動いてヒトダマドリを避けつつ、ラージャンに向かって飛び降りる(時短のため翔蟲も使用)
②ラージャンにプレイヤーの体をぶつけて確実に発見される
③咆哮を受けると、ラージャンが攻撃モーションに入るまでに壁にたどり着かないため、咆哮を飛び込みで回避
④ラージャンが攻撃の狙いを定める時には壁にたどり着くため、攻撃があたりやすい
デスルーラ

となります。

クエスト失敗で集会所に戻ったら、再び教官に話しかけに行きます。


隠密隊、交易船について

隠密隊は出発から帰ってくるまでに5クエストかかり、交易船では1クエストごとにアイテムが蓄積されます。本プログラムでは、隠密隊が帰ってきて、交易船アイテムがそこそこ溜まってる5クエストごとにアイテム回収を行います。

ラージャン5回の後、ループを中断して集会所準備エリアへマップ移動し、すぐ右にいるルームサービスに話しかけます。

隠密隊と交易船のうち、隠密隊のみカムラポイントを必要とします。カムラポイントが不足している等で隠密隊を使いたくない場合はキャンセルすることができます。スケッチの最初に固定値として設定しているommitsuGo = 1を0に変更することで隠密隊の使用をキャンセルできます。

話しかけたら、まず隠密隊の帰還と再出発です。はじめに帰還時のアイテムをすべて回収します。その後、再び隠密隊を出発させます。隠密隊の行き先はリスト1番下、つまりは溶岩洞あるいは百竜夜行となります。特に百竜夜行では錬金にも使える素材が多く手に入ります。隠密隊に行かせるオトモは、リストの上4匹のアイルーをA連打で選択します。

隠密隊の後は交易船です。交易船のアイテムをすべて回収します。アイテムや使用オトモの変更は行いません。

なお、隠密隊、交易船それぞれについて、スケッチの最初に固定値として設定しているommitsuUri = 0、koekiUri = 0をそれぞれ1にすることで、アイテムを受け取らずに売るようになります。

 

準備、必要なもの

本スケッチでは、特に以下の準備が必要となります。

・スケッチ最初の固定値を変更することで、隠密隊の使用やアイテムの売却を設定します

・設定をオートセーブ有、Rボタンをダッシュにします(執筆者設定、各自の設定に合わせてスケッチ上のボタンを変更してください(R⇔ZRなど))

・闘技大会クエストを1~5まですべて開放してください(していない場合は十字キーの押す回数などを要調整)

・オトモアイルーを、隠密隊に出発させる4匹がリスト一番上になるように並び替えてください

・マイコンを挿す前に、隠密隊を出発させ、交易船のアイテムとオトモを設定してください

・村の中でマップを開ける状態でマイコンを挿してスタートしてください

 

作成したスケッチ

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

(おまけとして、ルームサービスへ寄り道しない仮作成版こちら。)

2021.04.29追記:2.0へのアップデートに伴い、執筆者環境でロード時間にずれが生じたため、修正しました。ロード時間の調整(パッケージ版)と、ラージャンに突撃する際の翔蟲の動作を変更をしました。(おそらく最初のプログラムを使用しても問題ありません。ほぼ気分です。)
(Ver1.12の旧スケッチはこちら。寄り道無し仮作成版こちら

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

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

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


本スケッチを実際に使用した動画はこちら↓旧スケッチのものですが大体同じ。


 
/**
* モンハンライズ、闘技大会ラージャンにキルされに行き、5周ごとに交易と隠密隊アイテムを回収or売却するプログラム
* 護石錬金のついでにアイテムを回収or売却
*
* 初期条件は以下の通り
* 0. 本スケッチのommitsuUri、koekiUri より、アイテムを回収するか売るかをそれぞれ指定 
*   (回収の場合は0を、売る場合は1を指定、回収の場合ボックスの空きに注意)
* 1. 設定はオートセーブ有、(執筆者環境のコンフィグ等で設定しているため、適宜スケッチ改変を推奨)
* 2. あらかじめ闘技大会クエストを1~5まで開放する
* 3. 隠密に行かせるオトモアイルー4匹をリストの1番上に並び替え
* 4. 隠密隊を出発、交易のアイテムやオトモを設定した後、集会所へ移動(オフライン)
* 5. マップを開ける状態でマイコンを挿してスタート
*/


#include <auto_command_util.h>
#include <avr/sleep.h>

int death_count = 0;
#define GOAL 5 // ルームサービスへ行くまでラージャンと出会う周回回数を入力,隠密隊が終わる5回を推奨
const int ommitsuGo = 1; // 隠密隊を出発させる場合は1を、させない場合(ポイント不足)は0を入力
const int ommitsuUri = 0; // 隠密のアイテムを売る場合は1を、回収する場合は0を入力
const int koekiUri = 0; // 交易のアイテムを売る場合は1を、回収する場合は0を入力


// 教官に話しかける~クエスト選択~ラージャンとの出会い~集会所に戻る
void kamiOmaKudasai(){
    //教官の後ろ~教官話しかけ~クエスト開始
    tiltJoystick(0, 100, 0, 0, 1300);
    pushButton(Button::A, 1300);
    pushButton(Button::A, 1200);
    pushHatButton(Hat::DOWN, 200, 4);
    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().pressButton(Button::ZL);
    pushButton(Button::ZR, 800);
    pushButton(Button::A, 800);
    pushButton(Button::B, 3500);
    SwitchController().releaseButton(Button::ZL);
    pushButton(Button::B, 200, 5);
SwitchController().pressButton(Button::ZL);
    pushButton(Button::ZR, 800);
    pushButton(Button::A, 800);
    pushButton(Button::B, 3500);
    SwitchController().releaseButton(Button::ZL);
    pushButton(Button::B, 200, 5);
    // リザルト画面
    pushButton(Button::B, 300, 3);
    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().releaseButton(Button::R);
}


// 指定回数(GOAL)周回後、隠密隊と交易船のアイテムを回収or売却
void giveMeHoney(){
    SwitchController().setStickTiltRatio(0, 0, 0, 0);
    // 集会所準備エリアへマップ移動
    SwitchController().pressButton(Button::MINUS);
    delay(800);
    SwitchController().releaseButton(Button::MINUS);
    pushHatButton(Hat::UP, 300, 2);
    pushButton(Button::A, 1300);
    // ルームサービス話しかけ
    tiltJoystick(100, -100, 0, 0, 1000);
    pushButton(Button::A, 1400);
    pushHatButton(Hat::DOWN, 200);
    // ポイント不足の場合はommitsuGo=0にすることで隠密隊の使用をキャンセル可能
    if (ommitsuGo == 1){
      // 隠密隊リザルト
      pushButton(Button::A, 200, 2);
      delay(2200);
      pushHatButton(Hat::UP, 300);
      // ommitsuUri=1の場合のみ売却、それ以外は受け取り
      if (ommitsuUri == 1) {
        pushHatButton(Hat::RIGHT, 300);
        pushButton(Button::A, 500);
      }
      pushButton(Button::A, 500,3);
      // 出発、一番下のエリア(溶岩洞or百流夜行)を選択
      // 行き先を指定したい場合は十字キーの押す回数を要調整

      pushHatButton(Hat::UP, 200);
      // 調査先、オトモ4匹を順にAボタンで選択、出発
      pushButton(Button::A, 200, 10);
      pushButton(Button::B, 300);
    }
    // 交易船を確認
    pushHatButton(Hat::DOWN, 200);
    pushButton(Button::A, 500);
    pushButton(Button::A, 200);
    pushHatButton(Hat::UP, 200);
    pushButton(Button::A, 300);
    pushHatButton(Hat::UP, 300);
    // koekiUri=1の場合のみ売却、それ以外は受け取り
    if (koekiUri == 1) {
      pushHatButton(Hat::RIGHT, 300);
      pushButton(Button::A, 500);
    }
    pushButton(Button::A, 300, 2);
    // ルームサービス終了
    pushButton(Button::B, 200, 5);
    // 集会所入り口へマップ移動のコマンド入力
    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);
}

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);
    // 集会所入り口から教官後ろまで移動

    SwitchController().setStickTiltRatio(30, -100, 0, 0);
    SwitchController().pressButton(Button::R);
    delay(5000);
    SwitchController().releaseButton(Button::R);
}

void loop(){
  // 周回回数に達したらルームサービスへ、それまで周回
  if (death_count >= GOAL) {
    giveMeHoney();
    death_count = 0; // ルームサービス後、カウントをリセット
  }
  else {
    kamiOmaKudasai();
    death_count++;
    //count増加
  }
}
 

 

最後に

本スケッチを使用することで、護石錬金の回数を進めたり、隠密隊や交易船のアイテム回収をしたりするといったことが自動でできます。作り始めはあまり利用価値がなさそうと思っておりましたが、交易でハチミツなどを増やせるのは意外に役立ちそうです他の人にハチミツくださいとチャットする必要がなくなります

個人で利用する分には改変自由ですので、使いやすいように設定、改良してみてください。(おそらくロード時間の調整が必要になります)


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


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

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



 

0 件のコメント:

コメントを投稿

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

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