アルバ大剣ペア1分57秒を元に応用した知識や技術を雑にまとめた
今回の大剣ペア1分台を達成するにあたって、装備やチャートや動きなどの様々な知識や技術を応用したのでゆる~く書いていきます。今後TAをする方やチャートゲーを走る方たちの参考になればうれCかぎりです。
- 極意のオンパレード(装備について)
- 体力・防御調整面でも火事場極意が有利
- キィン!!!音爆弾の音ォ~!!!
- 漢は黙って壁ドン1回や!
- 大剣の横ペチは強い (⌒,_ゝ⌒)
- 龍活性化直後や角破壊後の起き攻め(かなり実用的)
- 粘着石強化撃ちスタン値がマジでKUSO
- 終わりに
記事の内容と照らし合わせながら確認するとわかりやすいので動画のリンク置いときます。
極意のオンパレード(装備について)
今回は定番の冰気錬成+猫火事場ではなく"火事場力・極意"を採用しました。目標タイムが爆速が故に、9割以上ハメのチャートゲーになり納刀する隙がほぼないのと、冰気ゲージ回復速度が遅いことから、火事場極意の方が恒常的に高火力を維持できると判断しました。実際に傷役は全て傷付けでゲージを消費しており、ぶっ飛ばし役も開幕のコンボですぐ消費しきってしまっていて、以降の強溜めや真溜めで1発あたり100ダメージ程度の差が出たりします。
見切りではなく力の解放で会心率を上げていることもかなり異質で、ヘビィボウガンでは主流ですが今回大剣でも力を解放しました。これは攻撃カスタム2つで攻撃力上限を底上げした時の会心率の補填的役割と、非怒り時の会心率を100%にすることを担っています。
挑戦者に関しては、攻撃4災禍1or攻撃6災禍3と回避バフで攻撃力上限に達するので必要なかったのですが、開幕しばらく回避バフをもらえないので上限に達しておらず、挑戦者抜きだと少し火力が物足らないような気がしたので結局採用することとなりました。細かい計算をしてないので挑戦なしの場合の攻撃盛り装備とどの程度変わるってくるかはあんまわかりませんが、大して変わらないと思います。
体力・防御調整面でも火事場極意が有利
猫火事場は体力を残り10以下にしないと発動しないので、食事スキルで防御力UP系を食べると飯リセの必要がでてくるのですが、火事場極意だと防御小メシを食べても高確率で火事場発動ラインまで被ダメを稼げます。ただ解放発動ラインに達しないことはときたまあります。
また、不動の装衣に体力珠を1ついれることで残り体力に少し余裕をもって調整できるため、クラッチ怯み時に地形の起伏や壁などに干渉して万が一かすり傷を受けても1回は耐えられ、リセットせずに続行できるというメリットがあります。これがほんとにほんとにほんとにほんとに🦁心強く、体感ではリセマラ効率が倍以上になっている気がします。
キィン!!!音爆弾の音ォ~!!!
アイスボーンの大剣といえば脱糞真溜め(こやし玉強化撃ちからの真溜め)が主流ですが、ではなぜ今回音爆弾を使用したかというと、かっこいいからです。まあそれよりも非常に重要なことが実際にありまして、"クラッチ怯み直後にキョロキョロさせる"という挙動をさせたいからです。こやし玉の場合、強化撃ちを発射してからアルバに着弾するまで数フレームあり、クラッチ怯み中にこやし玉の着弾判定をいれるのが間に合わなくなることがあります。その場合、キョロキョロせずこちらが真溜めを振る前に即座にこちらに向かって走ってきてひき殺されるリスクが高いことに加え、走ってくる方向が左右にずれやすく真溜め自体当たらないことも多々あります。
漢は黙って壁ドン1回や!
非怒り時間とクラッチに要する時間の削減によるDPS(1秒当たりのダメージ)の向上を理由に、今回のTAにおける壁ドン回数は1回が最適だと判断しました。
傷付けや武器固有の下準備、怯み値をダウン中に超過させるか否かということを考えると、壁ドン回数は1回が強いとは一概には言えないのでご留意ください。
大剣の横ペチは強い (⌒,_ゝ⌒)
次はコンボについてです。壁ドン後に、
抜刀溜め1→強溜め2→(ノ∀`*)ペチ→強溜め2→真溜め3
という見慣れないコンボをしていますが、抜刀3強溜め3真溜め3という定番コンボのDPSを上回ります。動画では2回目の強溜めが2ですが、傷付け後の着地位置とアルバの頭の位置関係やアルバの壁にあたるまでの時間(開幕火ブレス直後モーションに大きく依存)によっては強溜め3になることもあり、めちゃくちゃ強力です。あと(ノ∀`*)ペチもスタン値に貢献してくれています多分。
龍活性化直後や角破壊後の起き攻め(かなり実用的)
多分本記事でいっちゃん実用性あることです。ここまで読んでくださってる方には必要ないかもですが、起き攻めという技術はダウンからの起き上がり直後のみに使えるわけではなく、麻痺やスタンなどの状態異常、各種怯みや特定のモーションなどに付与されるSA(スーパーアーマー)が切れた直後の次のモーションが始まる瞬間でも使えます。
例えばアルバトリオンにおける戦術的優位性の高い起き攻めポイントは、壁ドン起き上がり直後、スタン起き上がり直後、麻痺解除直後、クラッチ怯み終わり、角破壊怯み終わり、龍活性化モーション終わりなどが挙げられます。狙いどころはかなり限定的ですが、クラッチ怯みおわりに起き攻めを狙えば2連続クラッチも理論上可能ということです。筆者自身はグリッチ竜杭砲で何度か2連続クラッチ怯みは成功しましたが、ペアやフルパで完璧な怯み値管理をすれば片手剣や大剣では再現できるのではないかと思います。
ただ部位怯みがクラッチ怯みに置換されるという性質上、いつでも起き攻めを狙えば良いというわけではないのですが、大抵の場合は起き攻めを狙うことで有利に働きます。
だいぶ根本的なことから書きましたが、今回の起き攻めポイントは龍活性直後の角破壊強溜めと、角破壊怯みおわりの真溜めです。前者は龍活性化モーション中に顔面前の安置に立ってSA中に真溜めをいれるという方法もありましたが、起き攻めができなくなる(しようと思えばできる)ので角破壊までにモーションを挟むこととなり、運ゲーを増やしてしまうので咆哮で抜刀2→強溜め2→即コロリン納刀→フレーム回避→抜刀1→強溜め2という動きでモーション厳選せずに真溜めに近い火力を叩きだしつつ起き攻め角破壊をしています。こうすることで角破壊おわりの起き攻め真溜めにも繋げられ、間髪入れずにクラッチ怯みを誘発させることを実現しています。
粘着石強化撃ちスタン値がマジでKUSO
粘着石強化撃ち1発分のスタン値って毎回固定じゃないんですよ(ゴミ)。攻撃が入る直前に強化撃ちすることで着弾数が倍増する?っぽくて強化撃ちを複数回すると全然安定しなかったので、今回はスタン値蓄積の強化撃ちは1発に留め、かつディレイをかけて炸裂してバグり得る回数の削減とバグ回避を意識しました。強化撃ちスタン値が毎回安定すればスタンを最大限に有効活用したチャートも考える余地はありましたが、不安定なせいで半月は大沼にはまってたので、途中でスタンのタイミングを最後に変更し、それまでに着実に抜刀でスタン値を稼ぎ、強化撃ちに頼りすぎないようにしました。
さて今回のスタン値調整についてですが、粘着石強化撃ち1発+抜刀術【力】(14本)でぎりスタンしないように調整して、強化撃ち2発目直後に相方に15本目の抜刀を入れてもらってスタンさせるという方法をとりました。なぜ抜刀14本でスタンしないギリ調整にしたかというと、壁ドン後の咆哮2回目直後に理想個体であるランダム雷を引いた際にチャート上抜刀回数が最低本数となり、クラッチ怯み2回目後の咆哮時点で13本入るので、最後の咆哮時に筆者の14本目の抜刀でスタンさせず、強化撃ちを含めた相方の15本目の抜刀でスタンさせたいためです。
強化撃ちをせず14本目と15本目の抜刀を同時に入れてスタンさせる調整でよいのでは?という疑問が生まれるかもしれませんが、先述の通り粘着石強化撃ちスタン値があまりにもブラックボックスで抜刀の微弱なスタン値で正確な調整をするのは非現実的だったので、追加の強化撃ちを入れて相方に着弾した粘着石を1回炸裂させてもらって瞬間的に高いスタン値を稼ぎ、安定スタンを実現させるようにしています。
ちなみに我々の検証の結果、抜刀術【力】は傷付けにも乗り、スタン値は溜め段階の影響を受けず、KO術の効果は乗りました。
終わりに
いかがだったでしょうか。チャートゲー好きには至極当たり前の内容だったかもしれませんが、ある程度は書ききれたと思います。更に細分化すれば無限に書くことが出てきますが、あまりにも長くなるので気が向いたときにまた別で記事にするかもです。ほなまた~
MHRiseやってたときの全自動カムラポイント荒稼ぎ機のソースコードを今更公開する(アルバトリオンとは関係なくてすみません)
2021年5月時点での動作確認はしていますが、それ以降のバージョン及びサンブレイクでの動作は未確認です
サンプル動画
おおまかな周回ルートやハンターの操作などのベースは出来上がっていると思うので、ハンターがサンプル動画通りの挙動をしなければスティックのベクトルや入力時間の微調整をしてください。また、自分で何かハンターの操作をマイコンに書き込みたいという方も、本ソースコード上部にハンターの主要な動作の関数を記載しているので参考程度にご活用ください。
マイコンへの書き込み方などがわからない場合は、過去の記事に大雑把に書いた(というか有志の方のリンク載せてるだけ)のでそちらから確認お願いします。
ソースコード
#include <NintendoSwitchControlLibrary.h> /***************** 初期状態に関して *****************/ /* 操作に関する設定について */ // 1.すべてデフォルトにしておくこと. /* カメラに関する設定について */ // 1.照準の移動速度をとても速いにしておくこと. // 2.1以外をデフォルトにしておくこと. /* その他 */ // 1.カムラの里にいる(取り込み中でない)こと. // 2.必須スキル「耳栓Lv.5」,「翔蟲使いLv.3」,「地質学Lv.2」を付けておくこと. /***************** 基本操作の関数 *****************/ /* ゆっくり走行(lx,ly,ms) */ void jog(int jog_lx,int jog_ly,int jog_ms){ SwitchControlLibrary().moveLeftStick(jog_lx, jog_ly); SwitchControlLibrary().sendReport(); delay(jog_ms); SwitchControlLibrary().moveLeftStick(128,128); SwitchControlLibrary().sendReport(); } /* ゆっくり走行,前方(ms) */ void jog_forward(int jog_forward_ms){ SwitchControlLibrary().moveLeftStick(128,0); SwitchControlLibrary().sendReport(); delay(jog_forward_ms); SwitchControlLibrary().moveLeftStick(128,128); SwitchControlLibrary().sendReport(); } /* ゆくっり走行,A連打(lx,ly,ms) */ void jogA(int jogA_lx,int jogA_ly,int jogA_ms){ for(int i_jog_A = 0; i_jog_A < jogA_ms / 200; i_jog_A++){ SwitchControlLibrary().moveLeftStick(jogA_lx,jogA_ly); SwitchControlLibrary().pressButton(Button::A); SwitchControlLibrary().sendReport(); delay(100); SwitchControlLibrary().moveLeftStick(jogA_lx,jogA_ly); SwitchControlLibrary().releaseButton(Button::A); SwitchControlLibrary().sendReport(); delay(100); } SwitchControlLibrary().moveLeftStick(128,128); SwitchControlLibrary().sendReport(); } /* ゆくっり走行,前方,A連打(ms) */ void jogA_forward(int jogA_forward_ms){ for(int i_jogA_forward = 0; i_jogA_forward < jogA_forward_ms / 200; i_jogA_forward++){ SwitchControlLibrary().moveLeftStick(128,0); SwitchControlLibrary().pressButton(Button::A); SwitchControlLibrary().sendReport(); delay(100); SwitchControlLibrary().moveLeftStick(128,0); SwitchControlLibrary().releaseButton(Button::A); SwitchControlLibrary().sendReport(); delay(100); } SwitchControlLibrary().moveLeftStick(128,128); SwitchControlLibrary().sendReport(); } /* 走行(lx,ly,ms) */ void dash(int dash_lx,int dash_ly,int dash_ms){ SwitchControlLibrary().moveLeftStick(dash_lx,dash_ly); SwitchControlLibrary().pressButton(Button::R); SwitchControlLibrary().sendReport(); delay(dash_ms); SwitchControlLibrary().moveLeftStick(128,128); SwitchControlLibrary().releaseButton(Button::R); SwitchControlLibrary().sendReport(); } /* 走行(前方) */ void dash_forward(int dash_forward_ms){ SwitchControlLibrary().moveLeftStick(128,0); SwitchControlLibrary().pressButton(Button::R); SwitchControlLibrary().sendReport(); delay(dash_forward_ms); SwitchControlLibrary().moveLeftStick(128,128); SwitchControlLibrary().releaseButton(Button::R); SwitchControlLibrary().sendReport(); } /* 走行,A連打(lx,ly,,ms) */ void dashA(int dashA_lx,int dashA_ly,int dashA_ms){ for(int i_dashA = 0; i_dashA < dashA_ms / 200; i_dashA++){ SwitchControlLibrary().moveLeftStick(dashA_lx,dashA_ly); SwitchControlLibrary().pressButton(Button::A); SwitchControlLibrary().pressButton(Button::R); SwitchControlLibrary().sendReport(); delay(100); SwitchControlLibrary().moveLeftStick(dashA_lx,dashA_ly); SwitchControlLibrary().releaseButton(Button::A); SwitchControlLibrary().pressButton(Button::R); SwitchControlLibrary().sendReport(); delay(100); } SwitchControlLibrary().moveLeftStick(128,128); SwitchControlLibrary().releaseButton(Button::R); SwitchControlLibrary().sendReport(); } /* 走行(前方,A連打) */ void dashA_forward(int dashA_forward_ms){ for(int i_dashA_forward = 0; i_dashA_forward < dashA_forward_ms / 200; i_dashA_forward++){ SwitchControlLibrary().moveLeftStick(128,0); SwitchControlLibrary().pressButton(Button::A); SwitchControlLibrary().pressButton(Button::R); SwitchControlLibrary().sendReport(); delay(100); SwitchControlLibrary().moveLeftStick(128,0); SwitchControlLibrary().releaseButton(Button::A); SwitchControlLibrary().pressButton(Button::R); SwitchControlLibrary().sendReport(); delay(100); } SwitchControlLibrary().moveLeftStick(128,128); SwitchControlLibrary().releaseButton(Button::R); SwitchControlLibrary().sendReport(); } /* 疾翔け(R2) */ void wiredash_R2(){ SwitchControlLibrary().pressButton(Button::ZL); SwitchControlLibrary().pressButton(Button::ZR); SwitchControlLibrary().sendReport(); delay(200); SwitchControlLibrary().releaseButton(Button::ZL); SwitchControlLibrary().releaseButton(Button::ZR); SwitchControlLibrary().sendReport(); //硬直時間delay(1000) } /* 疾翔け(X) */ void wiredash_X(){ SwitchControlLibrary().pressButton(Button::ZL); SwitchControlLibrary().pressButton(Button::X); SwitchControlLibrary().sendReport(); delay(200); SwitchControlLibrary().releaseButton(Button::ZL); SwitchControlLibrary().releaseButton(Button::X); SwitchControlLibrary().sendReport(); delay(200); } /* 疾翔け(A) */ void wiredash_A(){ SwitchControlLibrary().pressButton(Button::ZL); SwitchControlLibrary().pressButton(Button::A); SwitchControlLibrary().sendReport(); delay(200); SwitchControlLibrary().releaseButton(Button::ZL); SwitchControlLibrary().releaseButton(Button::A); SwitchControlLibrary().sendReport(); delay(800); } /* 疾翔け(X,2連) */ void wiredash_2(){ int i; for(i=0;i<2;i++){ SwitchControlLibrary().pressButton(Button::ZL); SwitchControlLibrary().pressButton(Button::X); SwitchControlLibrary().sendReport(); delay(200); SwitchControlLibrary().releaseButton(Button::ZL); SwitchControlLibrary().releaseButton(Button::X); SwitchControlLibrary().sendReport(); delay(800); } } /* 疾翔け延長 */ void wiredash_AB(){ pushButton(Button::A); delay(100); SwitchControlLibrary().pressButton(Button::B); SwitchControlLibrary().moveLeftStick(128,0); SwitchControlLibrary().sendReport(); delay(100); SwitchControlLibrary().releaseButton(Button::B); SwitchControlLibrary().moveLeftStick(128,128); SwitchControlLibrary().sendReport(); delay(100); } /* 疾翔け延長(進行方向に視点切り替え) */ void wiredash_ABL(){ pushButton(Button::A); delay(100); pushButton(Button::L); delay(200); SwitchControlLibrary().pressButton(Button::B); SwitchControlLibrary().moveLeftStick(128,0); SwitchControlLibrary().sendReport(); delay(100); SwitchControlLibrary().releaseButton(Button::B); SwitchControlLibrary().moveLeftStick(128,128); SwitchControlLibrary().sendReport(); delay(200); } /***************** カムラの里内の関数 *****************/ /* カムラの里内移動 */ void Kamura(int place){ holdButton(Button::MINUS,500); delay(100); switch(place){ case 2: //オトモ広場 pushHat(Hat::DOWN); break; case 8: //集会所 pushHat(Hat::UP); break; } delay(100); pushButton(Button::A); delay(500); } /* ミノトに話しかける */ void Minoto(){ dash(0,20,1200); delay(100); pushButton(Button::A); delay(800); } /* クエスト受注・出発 */ void quest(){ pushButton(Button::A); delay(200); pushHat(Hat::UP); delay(200); pushButton(Button::A); delay(700); pushHat(Hat::UP); delay(200); pushButton(Button::A,150,3); delay(1600); pushButton(Button::ZR); delay(200); pushButton(Button::A); delay(19000); } /***************** クエスト内の関数 *****************/ /* サブキャンプへファストトラベル */ void camp(int camp_num){ holdButton(Button::MINUS,1000); pushButton(Button::A); switch(camp_num){ case 1: pushHat(Hat::DOWN); break; case 2: pushHat(Hat::UP); break; } pushButton(Button::A,100,2); delay(7500); } /* 1.虹色の鉱石 */ void point1_bismuth1(){ camp(1); dashA(90,255,2000); //pushButton(Button::A,100,5); delay(2000); } /* 2.焼けた鉱石 */ void point2_coal1(){ dash(0,16,500); wiredash_A(); delay(500); jogA(124,255,1200); delay(2500); } /* 3.焼けた鉱石 */ void point3_coal2(){ dash(124,255,1360); wiredash_X(); delay(800); wiredash_ABL(); delay(400); wiredash_R2(); delay(1000); wiredash_AB(); delay(300); pushButton(Button::A,100,5); delay(1000); pushButton(Button::L); tiltRightStick(162,135,1000); delay(1200); wiredash_R2(); delay(1000); wiredash_ABL(); wiredash_A(); delay(200); jog(0,0,100); pushButton(Button::A,100,4); delay(2000); } /* 4.竜骨の化石 */ void point4_bone1(){ dash(0,202,1000); wiredash_X(); tiltRightStick(66,170,500); delay(400); wiredash_R2(); delay(1200); jog_forward(600); jogA(128,0,1600); delay(4800); } /* 5.虹色の鉱石 */ void point5_bismuth2(){ dash(0,128,1300); delay(200); tiltRightStick(85,125,400); //tiltRightStick(86,125,400); wiredash_AB(); tiltRightStick(156,92,500); //tiltRightStick(155,90,500); wiredash_R2(); delay(1000); wiredash_AB(); delay(400); wiredash_R2(); delay(1400); jogA(128,255,1500); delay(1700); //delay(2000); } /* 6.竜骨の化石 */ void point6_bone2(){ camp(2); dash(165,255,1400); wiredash_2(); delay(1700); jog(196,255,500); delay(1300); jogA(196,255,1400); delay(3600); } /* 7.竜骨の化石 */ void point7_bone3(){ dash(0,170,1500); wiredash_ABL(); wiredash_R2(); delay(800); wiredash_AB(); tiltRightStick(64,64,400); wiredash_R2(); delay(1200); wiredash_AB(); delay(900); dash(196,0,3000); wiredash_X(); delay(600); dash(255,64,3500); dashA(255,64,400); delay(5000); } /* 8.虹色の鉱石 */ void point8_bismuth3(){ dash(255,166,1200); wiredash_X(); delay(300); pushButton(Button::A); delay(300); wiredash_X(); delay(400); wiredash_ABL(); jog(145,0,3600); wiredash_A(); delay(1300); //delay(100); jog(255,128,300); jogA(255,128,1000); delay(2000); //delay(1500); } /* 9.虹色の鉱石 */ void point9_bismuth4(){ dash(215,248,1500); jog(215,248,1000); dashA(128,15,2000); tiltRightStick(104,56,1000); delay(200); SwitchControlLibrary().pressButton(Button::B); SwitchControlLibrary().moveLeftStick(128,0); SwitchControlLibrary().sendReport(); delay(200); SwitchControlLibrary().releaseButton(Button::B); SwitchControlLibrary().moveLeftStick(128,128); SwitchControlLibrary().sendReport(); delay(1600); wiredash_R2(); delay(1000); wiredash_AB(); delay(500); wiredash_R2(); dash_forward(1500); dashA_forward(2500); delay(1500); } /* 10.竜骨の化石 */ void point10_bone4(){ jog(254,235,400); wiredash_X(); delay(600); pushButton(Button::L); delay(200); wiredash_X(); delay(1000); pushButton(Button::B); delay(100); jogA_forward(3500); delay(2000); tiltRightStick(97,128,1000); delay(700); } /* 11.竜骨の化石 */ void point11_bone5(){ dash(180,61,2000); dash_forward(2000); wiredash_X(); delay(500); dash_forward(1000); dashA_forward(3000); delay(3200); } /* 12.焼けた鉱石 */ void point12_coal3(){ camp(1); dash(128,255,3000); jog(255,255,1000); dash(255,100,5500); dash(96,0,2000); delay(700); tiltRightStick(78,128,500); wiredash_AB(); delay(1000); wiredash_R2(); tiltRightStick(174,128,500); delay(500); wiredash_AB(); delay(1100); wiredash_R2(); delay(1300); wiredash_AB(); delay(100); dash(115,0,3500); dashA(85,60,1000); delay(100); tiltRightStick(96,70,1000); delay(1800); } /* 13.焼けた鉱石 */ void point13_coal4(){ wiredash_R2(); delay(700); wiredash_AB(); delay(400); wiredash_X(); delay(500); dash_forward(2500); dash(255,0,2000); dash_forward(3500); dash(255,211,500); wiredash_X(); delay(100); pushButton(Button::L); delay(200); dash_forward(3700); dash(50,128,3700); dash(50,200,900); jog(32,32,500); wiredash_X(); delay(100); pushButton(Button::L); delay(200); dash_forward(2000); dashA(160,0,2000); delay(1300); } /* 14.焼けた鉱石 */ void point14_coal5(){ dash(64,32,1300); jog(64,32,1100); dash(64,32,700); dashA_forward(1000); delay(2000); } /* 15.焼けた鉱石 */ void point15_coal6(){ camp(1); dash(80,255,600); dash(114,255,9500); dashA(114,255,1500); delay(2500); } /* 探索順路 */ void collect(){ point1_bismuth1(); point2_coal1(); point3_coal2(); point4_bone1(); point5_bismuth2(); point6_bone2(); point7_bone3(); point8_bismuth3(); point9_bismuth4(); point10_bone4(); point11_bone5(); point12_coal3(); point13_coal4(); point14_coal5(); point15_coal6(); point1_bismuth1(); point2_coal1(); point3_coal2(); point4_bone1(); } /* 帰還 */ void return_Kamura(){ pushButton(Button::PLUS); delay(100); pushHat(Hat::RIGHT); delay(100); pushHat(Hat::UP,100,3); pushButton(Button::A); delay(100); pushHat(Hat::LEFT); delay(100); pushButton(Button::A); delay(15000); pushHat(Hat::UP); delay(100); pushButton(Button::A,100,10); delay(14000); } /***************** 初期設定 *****************/ void setup() { pushButton(Button::B,100,10); Kamura(8); } /***************** 繰り返し実行 *****************/ void loop() { Minoto(); quest(); collect(); return_Kamura(); }
全自動カムラポイント回収機作ってみた

「強走薬とお食事券いっぱいほち~~~~~!!!!」
全自動カムラポイント回収機を作るきっかけとなったのはつまりそういうことです。
特にマイコンをいじってた経験もなく、C言語やPythonなどがが多少わかる程度の一般人ですが、自動化でメジャーなポケ〇ン自動孵化や自動ワット稼ぎについてググったら案外簡単かつ安価で作れそうだったので
「モンハンの作業ゲーも自動化してやろう!」
と思い切って作ることを決めました。後ほど作り方説明しますが、まずはどんな感じか動画をご覧ください。
どうでしょうか?
人間が操作しなくてもこのような動きが簡単に行えるのです。ではこれから何が必要で、どのようにして作っているのかをざっくりと解説していきたいと思います。
準備するもの
- PC
- Arduino IDE(無料でインストールできます)https://www.arduino.cc/en/software
- Arduino Leonardo
- USBケーブル(タイプA - マイクロB) ※テレビ出力の場合
- USBケーブル(タイプC - マイクロB) ※携帯機として使う場合,Liteの場合
必要なものは以上です。めちゃめちゃ古いPCや、リンクで貼り付けたようなPCでなければ多分大丈夫です。
Arduino Leonardoというやつが今回使っていくマイクロコンピュータ、いわゆるマイコンです。他にもArduino UNOなどありますが、マイコン経験ゼロでよくわかんないのでポケモン自動孵化関連のサイトで紹介されたたものと同じものを購入しました。リンク貼り付けたのは3つセットなので単体で買えばもっと安く済むと思います。
秋葉原とか難波にも売ってそう。知らんけど。
テレビ接続時に使うUSBケーブルは、昔のアンドロイドとかPS4コントローラーの充電ケーブルとして使っているものと同じタイプなので流用しても構いません。
予備知識
プログラミングに関する知識が多少必要ですが、初心者でも簡単に書けるほどのレベルなので諦めないでください。本当に簡単です。
全自動カムラポイント回収機を作るにあたって最低限知っておいたほう方がよいプログラミング言語・基本文法はC言語のfor文、自作関数程度です。ボタン操作に関する関数は、有志によって作られたNintendoSwitchControlLibraryというライブラリをインクルードすることによって簡単に書くことができます。具体的な記述方法はダウンロードページに記載されています。
github.com
メルカリで許可なく売られる可能性があるので、ここでは自分の書いたコードを全部載せることはしませんが、今後不定期で簡単な操作の記述方法や、作っておくと楽な関数について解説していこうかなぁと思っております。
環境の導入
Arduino IDEというソフトをインストールして実際に書いていくのですが、書く前に先程紹介したNintendoSwicthControlLibraryをインストールし、Arduino IDEに追加しましょう。Switchを動かすためのArduino IDEの設定や、ライブラリの追加方法などは、詳しく書いていただいている方がいらっしゃるので、以下のリンクから飛んで参考にしてください。ポケモンでもモンハンでも同じSwitchのソフトなので同様の作業をすれば大丈夫です。
雑ですみません。
マイコンを導入して、ポケモン剣盾を自動化しよう!【Mac・Windows】|ポケモニット
作業の流れ
準備物を調える
↓
開発環境を調える
↓
コード書く
↓
実機で検証
↓
コード書く
↓
実機で検証
↓
コード書く
↓
\^o^/
って感じです。雑ですみません。長い操作をしようと思うと無限にこれの繰り返しです。これを楽しいと思うか楽しくないと思うかはあなた次第と言いたいところですが実際楽しいです。思った通りに動いてくれた時の快感はたまりません。気付いたら20時間溶けますから。
コードを書くにあたって意識したこと
時間指定で操作を書き込むので、フレームレートの不安定性の影響で特にLスティックの視点操作に若干の差が出てきます。対処法としては、そもそも視点操作をせずにキャラを動かすか、Lスティックを使わずLボタンのみの視点移動(正面向き)に縛るくらいです。ただ、Lスティック操作によるズレが生じても自分の調整次第によっては思い通りに動いてくれます。
しかしそのようなずれが生じた場合でも、壁の角に挟まるように走って位置を固定(動画では3:43あたり)したり、崖飛び降り時に壁に沿ってAボタン連打ダッシュすることで必ず決まった位置で宙吊り状態(動画では2:20あたり)を作ることができます。
また、翔蟲使用したときや飛び降りた時の着地硬直時間をカットすると割と時間短縮に繋がるのでおすすめです。
最後に
かなりざっくりとした全体的な流れとコーディングに当たっての留意点を述べました。これだけではまだ
「どんなもん書いとるんじゃあああ!!!」
という方がほとんどだと思います。ということで実際にどのようなコードを書いているのかを次回以降で説明していきたいと思います。



