※本記事は、ポケモン剣盾のワイルドエリア等に出現するに固定シンボル(1日1回、決まった場所に固定でシンボルエンカウントするポケモン)ついて、色違いが出現するまでの周回を自動化するプログラムについて解説した記事です。ポケモン剣盾の操作をArduino Leonardoで自動化しております。「Arduinoって何?」って方は00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。
本記事では、 画像認識等は行わず、マイコン単体(Leonardo)での自動化となります。厳選する固定シンボルごとに個別に設定が必要であり、また画像認識よりも効率は落ちるのでご了承ください。
今回は、設定例として「メタグロス」の厳選を作成しました。
2021/09/16追記:「準備、必要なもの」の項目にて、先頭のポケモンのなつき度に関する記述を修正しました。先頭のポケモンのなつき度を下げ、連れ歩きをOFFにすることを推奨します。
2021/10/06追記:色証厳選プログラムとして他に、「草むらシンボル」の厳選プログラムも公開しております。欲しいポケモン(+その進化前)の出現場所を確認し、「固定シンボル」と「草むらシンボル」のうち厳選しやすい方法を選んでください。
本記事では、このプログラム(スケッチ)でできることや原理を解説したうえで、スケッチを配布しています。とにかくスケッチが欲しいという方は下へと読み飛ばしてください。
2021/09/17追記:メタグロス以外にも、各種ポケモン用に作成したプログラムを公開します。以下プログラム置き場↓
きっかけ、動機
おそらく剣盾で最も難易度、レア度の高いポケモンの1つとして、色証のポケモンが挙げられます。通常の色違いの厳選であれば、大半のポケモンはタマゴ孵化(国際孵化)が最も効率的となります(前回の記事)。しかし剣盾の新規要素である「あかし」は、ポケモン剣盾の野生で出てくるポケモン(あるいはキャンプのカレー作り)にのみ低確率でしか付かないため、色違いかつ証をもつポケモンは低確率×低確率=超低確率となります。
(ざっと3/4096×20%=0.0146%くらい?)
コレクション要素として以前から欲しいとは思っておりました。戦闘民族方面の熱が冷めてきたこと(次のシーズンに不満しかない)、またリクエストもあったことから、今回試してみることにしました。
画像認識を用いた色違い厳選の方が効率的なのでしょうが、我が家のPC、キャプボでは何百時間もの酷使には耐えられなさそうなので、今回は画像認識を使用せず、決まったパターンの動作のみで完結させます。
シンボルとの接触難易度(空を飛ぶの位置からの距離、シンボルの移動パターン)が低いことから、今回はメタグロスを例に実行してみました。
これで何ができるの?
特定の位置に1日1回確定で出現する固定シンボルのポケモン(今回はメタグロス)に対して、
を繰り返します。そして戦闘時は、色違いの光るエフェクトが発生した場合のラグ(約2秒)を利用して動作を分岐させ、自爆技等(癒しの願い)で瀕死になることで次のポケモンの選択画面に移動し、ループが途切れるようにしています(第04回の記事のレジ系などと同様)。
メタグロスの場合、1周1分程度で周回します。画像認識等を使っていないため効率は劣りますが、マイコン単体で自動化するため、自動化中のPCの起動などが必要ありません。
原理、おおまかな流れ
概要
本プログラムでは、
を繰り返し、特定の位置にいる固定シンボルとの戦闘を繰り返し行います。戦闘で色違いが出現した場合にループが途切れるようにしました。
以下では、「移動パート(非戦闘時)」、「戦闘パート(戦闘時)」、「待機パート(色違い出現時に分岐)」、「日付変更パート」に分けて説明します。
移動パート (非戦闘時)
移動パートでは、始めに空を飛ぶで初期位置へ移動し、そこから固定シンボルまで自転車で移動します。自転車で決まった方向に、決まった秒数ずつ移動していき、最後はシンボルに衝突する、あるいは空振った時に誰とも衝突しないようにします。
移動において考慮すべきことは以下のようになります。
①初期位置からシンボルまでの道中、他の野生ポケモンと接触することがないように、草むらやシンボル出現個所を避けて移動ルートを作成する
②特定の固定シンボルに接触する時間を、色違いの光るエフェクトのかかる時間(約2秒)よりも小さい誤差となるように接触時の移動を調整する(場合によっては直進ではなくカーブするなど)
上記の①②を考慮することで効率や精度の向上が見込まれます。
今回のメタグロス厳選では、以下の点を考えたうえで
雪中渓谷の固定シンボル_マップ8(曇り)(ポケモン徹底攻略様のマップ画像を参照)
で厳選を行うこととしました。
①今回ターゲットとするメタグロスとその進化前の固定シンボルの位置について、
となります。このうち、移動ルートが短い位置の候補として挙げられるのは
となります。
②上記A.B.の2つを候補としつつ、シンボルの接触時間について検討します。
候補としたメタング、メタグロスについて、以下のような特徴があります。
・捕捉率(ゲットのしやすさ)はどちらも3と低く、進化前後で変わらない。ただしヘビーボールで捕獲する場合、体重の違いからメタングは+20、メタグロスは+30加算されるため、メタグロスの方が捕獲しやすい。
・戦闘面は進化後の方が強いが、自傷、自爆技などの考慮はどちらも不要。
・フィールド上でのシンボルの動きについて、プレイヤーを追いかけていないときはメタングの方が足が速い。 メタングの方が動き回るため、接触する位置がずれていき、時間誤差が大きくなったり空振りしたりする可能性が高い。
以上の点を総合的に考慮した結果、最終的にはマップ8のメタグロスを固定シンボルとして選択しました。
また、移動終盤、衝突直前にはLスティック押し込みによる自転車ベル鳴らしを行っています。これにより、衝突直前にプレイヤーに気づくことでシンボルの動きが止まり、予期せぬ位置までの移動を防ぐことができます。
戦闘パート(戦闘時)
だいたい第04回の記事のレジ系などと同様、もといコピペです。
戦闘パートでは、基本的には「たたかう」「ポケモン」「バッグ」「にげる」の選択画面で「にげる」を選択して戦闘を終了します。
「にげる」を選択する操作は簡単です。「たたかう」などのコマンド画面で、
1. 十字ボタン上↑を1回押し、カーソルを「たたかう」から「にげる」に動かす
2. Aボタンを押す(うまくにげきれた!)
これだけです。
問題は、「色違いが出たときに逃げるを押してはならない」ということです。
戦闘時における、色違いと通常色とで異なる点は色違いの出現時に「キランッ★」と光るエフェクトが入る点です。
この光るエフェクトによって通常色と比較して約2秒ほど演出が長くなり、つまりは「たたかう」コマンドが表示されるまでの時間が2秒ほど長くなります。 この約2秒間のあいだにボタン入力を入れることで、色違い出現時の操作を通常時と分岐させることができます。つまり、約2秒間のあいだに入力された十字ボタン上↑が反応せずに戦闘を開始させることができます。色違い出現時の分岐した行動を待機パートとし、引き続き説明します。
待機パート(色違い出現時に分岐)
ここも概ね第04回の記事のコピペです(労力削減)。
色違いが出現した場合に、戦闘パートから分岐させることが可能となりました。分岐させた後には、ボールを投げて捕獲する必要があります。ただし、マスターボール以外のボールで捕獲できる確率は低く、画像認識等なしに全自動で捕獲するのは現実的でないと判断しました。
そこで必要となるのは、
人間が色違いの出現に気づくまで倒したり逃げたりしない
ということです。
ただし、マイコン自体は色違いの出現を判断できないので、移動パートと戦闘パートを繰り返します。その中で、左スティックやA、Bボタンの入力は必須となります。
戦闘時において、Bボタンを連打しても画面が切り替わらず、「たたかう」コマンド画面に移ることがない状況として、戦闘ポケモンが瀕死になり、「次のポケモンを選択」する状況を利用します。
手持ちポケモンの選択画面で唯一、先頭が瀕死した直後の状態ではBボタンを連打して画面をキャンセルすることができません。また、カーソルが瀕死ポケモン(一番上)にある場合はAボタンを連打しても選出できず、画面が切り替わりません。
つまり、戦闘ポケモンが瀕死になり、次のポケモンを選択する画面に移動することができれば、次のポケモンが選択されずにハマり続けるといった状況を作り出すことが可能となります。
このハマりが解消されないように上記の「戦闘パート」「移動パート」を調節します。
他の固定シンボル用にプログラムを改変する場合は、「次のポケモンを選択」する画面で2番目以降のポケモンが繰り出されないことを確認してください。
日付変更パート
ランクマッチで1戦以上バトルした直後であれば日付変更によるペナルティを受けないという仕様を利用し、日付の変更を行います。ランクマッチで対戦を行い、その後通信をインターネットからローカルに変更してください。
同じ天候を維持するため、今回は
日付を1日進める→日付を1日戻す
という動作を行うことで、同じ日付で固定シンボルを復活させます。今回のメタグロスでは、2021/06/03に設定することで雪中渓谷の天候を曇り(戦闘中の天候やフィールドの影響なし、晴れと異なり天候の証が付くため)にしました。他の天候の証が欲しい場合は適宜日付を変更してください(天候ダメージやフィールドによる状態異常無効に注意)。
準備、必要なもの
本スケッチでは、特に以下の準備が必要となります。
・自爆技(自分が瀕死になる技)を1番上の技に持つポケモンを先頭に置き、けむり玉をもたせる。
(今回の場合、自爆技のうち、置き土産はクリアボディに効かないため不可。癒しの願い、自爆など)
なお、なつき度は上げておくことを推奨。なつき度によりモーションやテキストが増えるが、移動でなつき度が上がりやすく戦闘時間が変化するため。
(懐いていない場合は、時間を調整してしばらく周回させ、懐いてループが途切れた頃に調整しなおしてください)
2021/09/16追記:DLCエリアでの連れ歩きをOFFにしておけば、なつき度がピョンピョンモーションなどをおこすところまで上がらないようです。なつき度を低くし、連れ歩きをOFFにすることを推奨します。なつきモーション無しの方が安定するかと思います。
公開しているプログラムはなつき度が高い状態を前提としたままとなっております。そのため、1秒程度短縮するように調整してください。
・その他に捕獲用のポケモンやボールを用意
・目的の固定シンボルのいるフィールド上で、自転車に乗った状態にする。また、目的のシンボルが出現する天候になるように日付を調整する。
・Xボタンを押した後のメニューについて、「左上」を「タウンマップ」になるように並び替える(上方向に入力させることで自爆技使用後の操作を安定化)。
・ゲームを起動してからマイコンを挿して開始する前に、ランクマッチを利用した日付変更バグを利用。
あらかじめランクマッチを1戦以上行い、その後通信をローカルに変更する。Switch本体の設定>本体>日付と時刻>インターネットで時間を合わせる をOFFにして、時間変更バグが適用される状態にする。
作成したスケッチ
今回は雪中渓谷の固定シンボル_マップ8(曇り)のメタグロス を対象としました。
作成したスケッチは以下のようになります。
スケッチのファイルはこちら(メタグロスVer1.11)
Switch本体13.0.0アップデートに伴いVer1.1に更新しました。変更箇所について詳しい解説はこちら。
なお、執筆者がスケッチを作成するにあたり使用した環境は以下のようになります。
・データは日本語のシールド(パッケージ版+DLCあり)
・手持ち最初のポケモンはイエッサン♀(二つ名無し、特性シンクロ)、1番上の技はいやしのねがい
使用する言語やポケモン、あるいは本体やソフトの動作環境などによって「たたかう」が表示されるまでの時間が前後する可能性があります。
その場合はスケッチ赤字のdelayを調節してください。通常色が出現したときに、「たたかう」コマンドが表示されてから2秒以内にカーソルが「逃げる」に動く(=十字上ボタンを入力する)ようにしてください。
なつき度によって、「キャンプがしたい」などのフレーバーテキストが表示されたりされなかったりします。どちらの場合でも2秒以内に収まるようにするか、なつき度をこまめに下げて表示されないようにしてください。
本スケッチを実際に使用した動画はこちら↓
(Ver1.0)
* 冠の雪原、雪中渓谷の固定シンボル6(ポケモン徹底攻略 様のマップ画像より)のメタグロスを厳選。
* 色違いが出るまでのエンカウントを自動化。
* 画像認識等は用いず、遭遇して光るエフェクトが出る約2秒の時間差で色違いを判定。
* ランクマッチを使用した時間変更バグを使用。
*
* なお、雪中渓谷の固定シンボル8に出現するポケモンはメタグロス(全天候)
* 今回は曇りを想定して2021/06/03に実行。天候証として雪や霧などを行う場合は天候ダメージやフィールドの状態異常無効に注意。
* また、天候やフィールドによって戦闘時のテキストが変化するため要時間調整
*
* 初期条件は以下の通り
* 1. 先頭を、自爆技を1番上の技に持つポケモン(癒しの願い推奨、置き土産はクリアボディのため不可)、確実に逃げるためにけむり玉を持たせる
* また、なつき度は上げておくことを推奨(なつき度によりモーションやテキストが増えるが、移動でなつき度が上がりやすく戦闘時間が変化するため)
* 2. その他、捕獲要因やボールを用意
* 3. あらかじめランクマッチを1戦以上行い、その後通信をローカルに変更する。
* Switch本体の設定>本体>日付と時刻>インターネットで時間を合わせる をOFFにして、
* 時間変更バグが適用される状態にする。
* 4. 雪中渓谷が曇りになるように日付を変更する(2021/06/03で実行)
* 5. Xボタンを押した後のメニューについて、「左上」を「タウンマップ」になるように並び替える
* (上方向に入力させることで自爆技使用後の操作を安定化)
* 6. 雪中渓谷で自転車に乗る
* 7. マイコンを挿して周回スタート、ソフトリセットした場合は3からやり直し
*/
#include <auto_command_util.h>
// 移動パート①
// 空飛ぶタクシーで雪中渓谷、氷山の遺跡に移動
// 「次のポケモン選択画面」を考慮し、メニューのタウンマップは「左上」に配置する。
void moveToInitialPlayerPosition(){
//タウンマップ開く
pushButton(Button::X, 1000);
pushHatButtonContinuous(Hat::LEFT_UP, 1000);
pushButton(Button::A, 2500);
//カーソルを飛ぶ場所に合わせる
pushHatButton(Hat::LEFT_UP, 100);
delay(200);
pushButton(Button::A, 1100);
// 選択画面対策として下入力2回
pushHatButton(Hat::DOWN, 100, 2);
pushButton(Button::A, 1500);
pushButton(Button::B, 500, 5);
}
// 移動パート②~戦闘パート
// レジアイス遺跡前の初期位置から固定シンボルのメタグロスへ移動、戦闘を行う
void symbolEncount(){
//固定シンボル6へ向かう。
tiltJoystick(0, -100, 0, 0, 1000);
//カメラを少し右へ動かす
tiltJoystick(0, -100, 100, 0, 400);
// 直進してエンカウント。万が一エンカウントしない時、関係ないポケモンと戦闘にならないように動く。
tiltJoystick(0, -100, 0, 0, 1500);
SwitchController().pressButton(Button::B);
tiltJoystick(0, -100, 0, 0, 3500);
SwitchController().releaseButton(Button::B);
tiltJoystick(30, -90, 0, 0, 1000);
// 自転車のベルを鳴らしながら接近、固定シンボルに気付かせて動きを止める
// 万が一接触できなかった場合、野生ポケモンが接近してこないところまで移動
SwitchController().setStickTiltRatio(-10, -100, 0, 0);
pushButton(Button::LCLICK, 100, 15);
delay(3000);
SwitchController().setStickTiltRatio(0, 0, 0, 0);
// 戦闘開始~「たたかう」が表示されるまで待機。
// 下の時間は、使用する言語、ポケモン等で多少ずれる可能性があり、delay要調整
// 色違いのエフェクトが約2秒のため、「たたかう」が表示されて2秒以内に次の十字上↑入力がされるようにする
pushButton(Button::A, 200, 2);
pushButton(Button::B, 200, 5);
// 「たたかう」表示までの時間は以下のdelay(xxx)を調整。
delay(3600);
pushButton(Button::B, 200, 5);
// 戦闘開始、色違い光モーションなければ十字上>逃げる
// 色違いならば、1つめの上入力間に合わないため戦闘>自爆技で自分側瀕死
// Aボタンを2回以上連続して押す場合は、次のポケモン選択画面で一番上以外のポケモンを繰り出さないようにする
pushHatButton(Hat::UP, 1000);
pushButton(Button::A, 800);
pushButton(Button::B, 400, 2);
pushHatButtonContinuous(Hat::UP, 1500);
pushButton(Button::A, 800,2);
pushButton(Button::B, 100,5);
}
// 日付変更する(事前にランクマッチ使用した後の時渡り)
void execTimeLeep(){
// ホーム画面 > 設定
pushButton(Button::HOME, 1000);
pushHatButton(Hat::DOWN, 100);
pushHatButton(Hat::RIGHT, 100, 5);
pushButton(Button::A, 1000);
// 設定 > 本体 > 日付と時刻
pushHatButtonContinuous(Hat::DOWN, 2000);
pushHatButton(Hat::RIGHT, 100);
pushHatButton(Hat::DOWN, 100, 4);
pushButton(Button::A, 500);
// 日付と時刻 > 現在の日付と時刻 にて、1日進めてOK
pushHatButton(Hat::DOWN, 100, 2);
pushButton(Button::A, 500);
pushHatButton(Hat::RIGHT, 100, 2);
pushHatButton(Hat::UP, 100);
pushHatButtonContinuous(Hat::RIGHT, 1000);
pushButton(Button::A, 500);
// 1日戻してOK
pushButton(Button::A, 500);
pushHatButton(Hat::LEFT, 100, 3);
pushHatButton(Hat::DOWN, 100);
pushHatButtonContinuous(Hat::RIGHT, 1000);
pushButton(Button::A, 500);
// ホーム画面 > ゲーム画面
pushButton(Button::HOME, 1000);
pushButton(Button::A, 500);
}
void setup(){
pushButton(Button::B, 500, 13);
// 最初の数回の入力はswitchが認識しない場合があるので、無駄打ちをしておく
}
void loop(){
moveToInitialPlayerPosition();
symbolEncount();
execTimeLeep();
}
最後に
本スケッチを使用することで、色証厳選をマイコン単体、画像認識無しで行うことができます。おそらく画像認識を利用した自動化の方が時間当たりの周回効率が良いと思われますが、こちらは画像認識のためにPCなどを長時間稼働させる必要がなくなります。
今回はメタグロスを例に行いましたが、主に「移動パート」を改変することで他の固定シンボルに対しても応用することができます。
他の固定シンボル用に編集して厳選したときには再び公開するかと思います。
プログラムの不備、改善点などありましたらコメントやお問い合わせからお願いいたします。
Arduino Arduino Leonardo (ピンソケット・ピンヘッダ実装済) 【A000057】 | ||||
|
いつも貴ブログを拝見しております。
返信削除素晴らしいスケッチをありがとうございます。
空飛ぶタクシーの着地点からシーケンシャルに到達でき、
間に草むらや別のシンボルがない固定シンボルであればいくらでも応用が利きそうな素晴らしいスケッチですね。
さっそく、三つ又が原のドラパルト用にスケッチを改造させて使用させていただきました。
間に何もなく、直進←左折だけで100%エンカウントするので非常に簡単ですね。
証持ちと出会えるのが楽しみです。
いろいろ試しているのですが、追跡型のシンボルが途中に沸くようなコースだと事故を避けられないのが少しもどかしいですね。
今シーズン強いコジョンドのシンボルにどうにか応用したく頑張っているのですが、コジョフーやヤトウモリのシンボルが突っ込んでくる事故が無視できない頻度で発生するのが難しい……。
もしメタグロス以外のポケモンでも試されてるようでしたら、こういったイレギュラーにどう対処されてるのか教えていただけると幸いです。
こちらではボールレイクの湖畔21でツボツボを厳選しようとしたところ、草むらのパルスワンが突っ込んでくるということが起こりました。その際は、極力草むらに近づかない、固定シンボルと接触できなかった場合はパルスワンが追いかけてこない水上まで移動するといった方法で事故を避けることができました。
削除一方で、チャレンジロード10のコジョンドとなると、草むらが近い、かつ行き止まりなため、対策が難しいように思います。
ループを途切れさせないために思いつく方法としては
①コジョンドよりも早いタイミングで事故るのであれば、コジョンド同様逃げるコマンドを入力させる(早いタイミングで「たたかう」が表示されてもコジョンドと同じタイミングで「逃げる」)
②コジョンドと接触できなかった後に事故るのであれば、戦闘開始~「たたかう」表示までの時間に『「Xボタン」でメニューを開く→空を飛ぶ』をすることで草むらから離れる
③コジョンドから逃げた直後に事故る場合は、Xボタンの入力を早くしたり数回連打したりすることで素早く画面を切り替える
とすることが有効かと思います。ただしXボタンで戦闘中にボールを投げてしまうことがないように調整してください。
その他、事故る確率を減らすための方法としては、
④特性「じりょく」のコイルなどを先頭(瀕死)におくことでエアームドのシンボル出現が増え、相対的にヤトウモリ等の出現率を減らすことができる(悪臭や清めのお札、スプレーなどはランダムエンカウントにしか効果なし)
⑤できるだけ草むらから離れて移動し、自転車のベルを鳴らさないようにすることで、ヤトウモリ等に気づかれにくくする
以上、思い付きの範囲でありどこまで効果があるか分かりませんが回答とさせていただきます。
ハシノマ原っぱにいるオンバーンの固定シンボルの色証を自動で粘りたいのですが、オンバーンが空を飛んでいるためうまくエンカウントできませんでした。どうしたらいいのか教えてもらえると助かります。
返信削除返信遅くなり申し訳ありません。
削除空を飛んでいるポケモンの場合、下りてくるまでの時間がずれるためあまり安定せず非効率かと思います。
オンバーンの場合、逆鱗の湖の草むらシンボル(雷雨)であれば確率高め、地上に出現するため、草むらでの厳選をおすすめします。以下の第12回を参考に、雷雨に合わせて時間調節してください。
https://kokenikki.blogspot.com/2021/09/poke12.html
返信ありがとうございます。草むら厳選のプログラムの時間調整頑張ってみます。
削除初めまして。この素晴らしいプログラムに感銘を受け使用しようとしたのですが、東方プログラム初心者のため移動ルートをどのように書き換えたら目的の動きをするのかがわかりません。ご教授いただければ幸いです。
返信削除プログラムの記述方法についてであれば、はじめに以下をご覧ください。「前に3秒」「Aボタンを押す」のような指示を、ライブラリの関数にて行います。
削除https://kokenikki.blogspot.com/2021/02/arduino011.html
なお、書き忘れている内容として、
SwitchController().setStickTiltRatio(LX, LY, RX, RY);
という関数を用いることで、スティックを倒し続けた状態となります。
これらの関数を用いて、移動パート①、②~戦闘パートを書き換えてください。あとは、目的のポケモンの出現箇所、空を飛ぶで行くことのできる位置からの道のりを確認し、そこまでの移動ルートを作成し、最後に待機パートに支障がないかを確認してください。
以下に、過去に作った移動ルートの例が上がっているので参考にしてください。
https://kokenikki.blogspot.com/2021/09/poke09extra.html