※本記事にはプログラム等の公開はありません。ポケモン剣盾の自動化について今後の予定をメモした記事です。「Arduinoって何?」って方は00回目の記事を、Arduinoの環境構築(ライブラリ含む)は01回目の記事をご覧ください。
本記事では、Arduino Leonardoを使用したポケモン剣盾の自動化について、今後やろうと考えていることのメモです。
概ね完成済みのプログラム(今後記事予定)
・自動孵化、サンプルスケッチ改変による効率化
作ろうと思うプログラム(予定は未定)
・木の実の自動収集(特定の木に話しかける)(済)
・ワイルドエリア等固定シンボルのポケモンの色違い厳選(色証狙い)
・キャンプを利用したテラキオン等の三闘(+ケルディオ、ミカルゲ)色違い厳選
・レイドバトルの自動配布
・自動配布されるレイドバトルの自動参加~捕獲(Switch2台で↑と連動)
やってみたいけど挫折しそう
・ポケモン剣盾ストーリーの自動進行(レベル100ポケモンで無双してエンディング、スタッフロール、あるいはDLCの内容まで。すべてマイコンで完結が理想だが、人の手が必要なところ以外をいくつかに区切って実行させるのが現実的か。)
自動化についてプログラムのアイデアが欲しいので、上記以外にできそうなことがあればコメント等で教えていただけますと幸いです(作るかは気分次第です)。また、上記の中で見たいものがありましたらコメント等で教えてください(記事の優先順位が上がるかもしれません)。
画像認識等を導入するつもりはない一応環境は導入しましたが、PC、キャプボ等が貧弱なので、基本的には画像認識無しで自動化していきます。その場合、自動化できるのは画面や音の情報を判断しなくても操作できる内容のみとなります。
Arduino Arduino Leonardo (ピンソケット・ピンヘッダ実装済) 【A000057】 | ||||
|
三闘の色違い厳選用のコードを思いつきました。そのコードは以下の通りです。
返信削除/**
初期条件は以下の通り
1. 殿堂入り後のストーリーをすべて終わらせていること。
2. フィールドに点在する三闘の足跡を五十個ずつ集め終わり、ソニアに話しかけて三闘の居場所を教えてもらっていること。
3. キャンプを開いて閉じるとすぐに三闘とバトルできるように位置を調整していること。
4. 先頭を、自爆技を1番上の技に持つポケモン(癒しの願い推奨)にし、確実に逃げるためにけむり玉を持たせていること。
5.その他、捕獲要員やボールを用意していること。
6. ポケモンのなつき度を下げていること。
*/
//ライブラリを読み込むためのコード
#include
void StartCanp() {
// Xボタンを押してメニューを開く
pushButton(Button::X, 1000);
// Aボタンを押してキャンプを始める
pushButton(Button::A, 1000);
}
void FinishCanp() {
// キャンプを開いてすぐにボタンを押しても反応しないため、3秒待機させる
delay(3000);
// キャンプを終了する
pushButton(Button::B, 100);
pushButton(Button::A, 100);
}
void Battle() {
// 戦闘画面に入ってすぐにボタンを押しても反応しないため、17秒待機させる
pushButton(Button::A, 15000);
// 戦闘開始、色違い光モーションなければ十字上>逃げる
// 色違いならば、1つ目の上入力が間に合わないため戦闘>自爆技で自分側瀕死
pushHatButton(Hat::UP, 1000);
pushButton(Button::A, 800);
pushButton(Button::B, 400, 2);
pushHatButtonContinuous(Hat::UP, 1500);
pushButton(Button::A, 1000);
}
void Santou() {
// Xボタンを押してメニューを開く
pushButton(Button::X, 1000);
// メニューのカーソルをメニューの左上の位置に合わせる
pushHatButtonContinuous(Hat::LEFT, 2000);
pushHatButtonContinuous(Hat::UP, 1000);
// メニューのカーソルをキャンプの位置に合わせる
pushHatButtonContinuous(Hat::RIGHT, 100);
pushHatButtonContinuous(Hat::DOWN, 100);
// Aボタンを押してキャンプを開く
pushButton(Button::A, 1000);
// キャンプを開いてすぐにボタンを押しても反応しないため、3秒待機させる
delay(3000);
// キャンプを終了する
pushButton(Button::B, 100);
pushButton(Button::A, 100);
// キャンプを終了する前に、(色違いが出た時のハマりを継続するために)B連打から上長押しでカーソル1番上を選択
pushButton(Button::B, 400, 2);
pushHatButtonContinuous(Hat::UP, 1500);
// 戦闘画面に入ってすぐにボタンを押しても反応しないため、17秒待機させる
pushButton(Button::A, 15000);
// 戦闘開始、色違い光モーションなければ十字上>逃げる
// 色違いならば、1つ目の上入力が間に合わないため戦闘>自爆技で自分側瀕死
pushHatButton(Hat::UP, 1000);
pushButton(Button::A, 1000);
}
void setup() {
pushButton(Button::B, 100, 5);
Santou();
}
void loop() {
StartCanp();
FinishCanp();
Battle();
}
ご提案ありがとうございます。おそらくこのようなコードで厳選可能かと思います。
削除レジ系の色違い判定と同じようなやり方で3闘やミカルゲの色違い厳選も可能と考えており、いずれ似たようなコードを作成、公開しようと考えております。(作っていない理由は、単に足跡集めを渋っているだけです。気まぐれに作っていきます。)
確かに、三頭の足跡集めはかなりしんどいですからね。足跡集め頑張ってください。
削除三闘の色違い厳選を自動でできるプログラムが完成したのでいかに貼り付けておきます。
返信削除/**
初期条件は以下の通り
1. 殿堂入り後のストーリーをすべて終わらせていること。
2. フィールドに点在する三闘の足跡を五十個ずつ集め終わり、ソニアに話しかけて三闘の居場所を教えてもらっていること。
3. キャンプを開いて閉じるとすぐに三闘とバトルできるように位置を調整していること。
4. 先頭を、自爆技を1番上の技に持つポケモン(癒しの願い推奨)にし、確実に逃げるためにけむり玉を持たせていること。
5.その他、捕獲要員やボールを用意していること。
6. ポケモンのなつき度を下げていること。(なつき度は、漢方薬を使うことで下げることができる。また、漢方薬はバウタウンの漢方薬ショップで購入可能。)
*/
//ライブラリを読み込むためのコード
#include
void StartCanp() {
// Xボタンを押してメニューを開く
pushButton(Button::X, 100);
delay(1000);
// Aボタンを押してキャンプを始める
pushButton(Button::A, 100);
}
void FinishCanp() {
// キャンプを開いてすぐにボタンを押しても反応しないため、3秒待機させる
delay(8000);
// キャンプを終了する
pushButton(Button::B, 100);
pushButton(Button::A, 100);
}
void Battle() {
// 戦闘画面に入ってすぐにボタンを押しても反応しないため、15秒待機させる
pushButton(Button::A, 16500);
// 戦闘開始、色違い光モーションなければ十字上>逃げる
// 色違いならば、1つ目の上入力が間に合わないため戦闘>自爆技で自分側瀕死
pushHatButton(Hat::UP, 1000);
pushButton(Button::A, 800);
pushButton(Button::B, 400, 2);
pushHatButtonContinuous(Hat::UP, 1500);
pushButton(Button::A, 1000);
}
void Santou() {
// 一回目のキャンプは、メニューのカーソルを「キャンプ」に合わせる必要があるが、二回目以降のキャンプは、メニューを開くとすぐにキャンプをできるようになっているため、一回目と二回目以降を分けてプログラムを書いた
// Xボタンを押してメニューを開く
pushButton(Button::X, 100);
// メニューのカーソルをメニューの左上の位置に合わせる
pushHatButtonContinuous(Hat::LEFT, 1000);
pushHatButtonContinuous(Hat::UP, 100);
// メニューのカーソルをキャンプの位置に合わせる
pushHatButtonContinuous(Hat::RIGHT, 100);
pushHatButtonContinuous(Hat::DOWN, 100);
// Aボタンを押してキャンプを開く
pushButton(Button::A, 100);
// キャンプを開いてすぐにボタンを押しても反応しないため、3秒待機させる
delay(5000);
// キャンプを終了する前に、(色違いが出た時のハマりを継続するために)B連打から上長押しでカーソル1番上を選択
pushButton(Button::B, 400, 2);
pushHatButtonContinuous(Hat::UP, 1500);
// キャンプを終了する
pushButton(Button::B, 100);
pushButton(Button::A, 100);
// 戦闘画面に入ってすぐにボタンを押しても反応しないため、15秒待機させる
pushButton(Button::A, 16500);
// 戦闘開始、色違い光モーションなければ十字上>逃げる
// 色違いならば、1つ目の上入力が間に合わないため戦闘>自爆技で自分側瀕死
pushHatButton(Hat::UP, 1000);
pushButton(Button::A, 800);
}
void setup() {
pushButton(Button::B, 100, 5);
Santou();
}
void loop() {
delay(5000);
StartCanp();
FinishCanp();
Battle();
}
過去にコメントで書いたコードでは、フィールドの天候によるロード時間の差が原因でループが途切れることがありました。なので、フィールドの天候に左右されないで安定してループを継続できるコードを作ったので以下に貼り付けておきます。
返信削除/**
初期条件は以下の通り
1. 殿堂入り後のストーリーをすべて終わらせていること。
2. フィールドに点在する三闘の足跡を五十個ずつ集め終わり、ソニアに話しかけて三闘の居場所を教えてもらっていること。
3. キャンプを開いて閉じるとすぐに三闘とバトルできるように位置を調整していること。
4. 先頭を、自爆技を1番上の技に持つポケモン(癒しの願い推奨)にし、確実に逃げるためにけむり玉を持たせていること。
5.その他、捕獲要員やボールを用意していること。
6. ポケモンのなつき度を下げていること。(なつき度は、漢方薬を使うことで下げることができる。また、漢方薬はバウタウンの漢方薬ショップで購入可能。)
*/
//ライブラリを読み込むためのコード
#include
void StartCanp() {
// Xボタンを押してメニューを開く
pushButton(Button::X, 100);
delay(500);
// Aボタンを押してキャンプを始める
pushButton(Button::A, 100);
}
void FinishCanp() {
// キャンプを開いてすぐにボタンを押しても反応しないため、9秒待機させる
delay(9000);
// キャンプを終了する
pushButton(Button::B, 100);
pushButton(Button::A, 100);
}
void Battle() {
// 戦闘画面に入ってすぐにボタンを押しても反応しないため、15秒待機させる
pushButton(Button::A, 15500);
// 戦闘開始、色違い光モーションなければ十字上>逃げる
// 色違いならば、1つ目の上入力が間に合わないため戦闘>自爆技で自分側瀕死
pushHatButton(Hat::UP, 100);
pushButton(Button::A, 100);
pushButton(Button::B, 100, 2);
pushHatButtonContinuous(Hat::UP, 1500);
pushButton(Button::A, 100, 5);
}
void Santou() {
// 一回目のキャンプは、メニューのカーソルを「キャンプ」に合わせる必要があるが、二回目以降のキャンプは、メニューを開くとすぐにキャンプをできるようになっているため、一回目と二回目以降を分けてプログラムを書いた
// Xボタンを押してメニューを開く
pushButton(Button::X, 100);
// メニューのカーソルをメニューの左上の位置に合わせる
pushHatButtonContinuous(Hat::LEFT, 700);
pushHatButtonContinuous(Hat::UP, 100);
// メニューのカーソルをキャンプの位置に合わせる
pushHatButtonContinuous(Hat::RIGHT, 100);
pushHatButtonContinuous(Hat::DOWN, 100);
// Aボタンを押してキャンプを開く
pushButton(Button::A, 100);
// キャンプを開いてすぐにボタンを押しても反応しないため、9秒待機させる
delay(9000);
// キャンプを終了する前に、(色違いが出た時のハマりを継続するために)B連打から上長押しでカーソル1番上を選択
pushButton(Button::B, 400, 2);
pushHatButtonContinuous(Hat::UP, 1500);
// キャンプを終了する
pushButton(Button::B, 100);
pushButton(Button::A, 100);
// 戦闘画面に入ってすぐにボタンを押しても反応しないため、15秒待機させる
pushButton(Button::A, 15500);
// 戦闘開始、色違い光モーションなければ十字上>逃げる
// 色違いならば、1つ目の上入力が間に合わないため戦闘>自爆技で自分側瀕死
pushHatButton(Hat::UP, 100);
pushButton(Button::A, 100, 5);
}
void setup() {
pushButton(Button::B, 100, 5);
Santou();
}
void loop() {
delay(4800);
StartCanp();
FinishCanp();
Battle();
}
このコメントは投稿者によって削除されました。
削除試しに動かしてみましたが、色違いがでても逃げてしまうのでうまく動作していませんね。
削除シュートシティのトーナメントの自動周回などはどうでしょうか。
返信削除また、かなり需要が少ないと思いますが、特性「ものひろい」で回収できる道具を自動で集めるプログラムはどうでしょうか。
まず、「ものひろい」については、下級PP回復アイテムを除いた大半のアイテムがお金、ワット、BPで購入、あるいは雪原ワットショップの目玉商品で入手でき、また目的のアイテム入手に対する効率面も良くなさそうなので、自動化は考えておりません。
返信削除BPアイテムについてはいずれバトルタワー自動化で稼ぐ可能性はあります。(ただし毎月のランクマッチでBPカンストしているので個人的な優先度は低いです)
シュートシティのトーナメントについては、ガンテツボールであれば目玉商品のぼんぐりを集める方が、お金であればワットをゴジャボで換金する方が単一目的での効率は高いと考えております。ボール、お金、リボン付け、経験値なつき度等複数の目的を同時に行う分には有効かと思います。
トーナメント周回するだけなら(冠の雪原クリア前?)マクロコントローラーでの簡単な自動化で可能なようです。作るとすれば巨大ニャースも利用してボールとお金を同時に狙うようにしようかと思います。
返信ありがとうございます。確かに、「ものひろい」で入手できるアイテムのほとんどが別の方法で入手できますし、その方法を使った方が簡単ですね。それに、トーナメントを自動周回するメリットは、ボールが稀に入手できることぐらいですもんね。やっぱり自動化するなら、自動化する価値がないとダメですよね。
削除はじめまして。
返信削除いつも素敵なコードを無償公開していただきありがとうございます。
貴サイトのコードを参考に自分でも他ゲームの金策自動化などを考えるようになり、一味違ったゲームの楽しみ方を知ることができました。
>・ワイルドエリア等固定シンボルのポケモンの色違い厳選(色証狙い)
候補に挙げてらっしゃるこちらなのですが、これが画像認識なしでできるのなら実に魅力的で相当需要があると思います。
自分でも冠雪原のメタグロスを相手に開発を試みたのですが、どうしてもシーケンシャルな動作にならず、戦闘回数を稼ぐコードすら書けなかった苦い思い出があります……。
もし開発のご予定があったら原理だけでもご教授いただけると嬉しいです。
ぜひよろしくお願いいたします。
固定シンボルの色違い厳選について画像認識無しで行う場合、
削除固定シンボルと戦闘→日付変更(ランクマ利用バグ)→空を飛ぶで移動してシンボル復活→固定シンボルまで移動→・・・
という流れで行うことでソフトリセット等なく周回できます。
光るエフェクトによる約2秒間のラグの有無で操作を分岐することで、色違いの判定ができます(過去の記事04_レジ系と同様です)。
空を飛んだところからシンボルまで他のポケモンと遭遇しないように移動し、誤差2秒の範囲内でエンカウントする必要があるため、移動距離やシンボルの動きによって効率が大きく変わります。画像認識有りの場合と比べると汎用性は劣ります。
メタグロスの場合は氷山の遺跡近くに出現すること、シンボルの動きも遅いことから、比較的容易にできるかと思います。
こちらもメタグロスの色証厳選をしてみたくなったので、コードを作成してみようと思います。
メタグロスの固定シンボル色違い厳選について、一通り動作確認ができたのでプログラムを公開しました。ご確認ください。
削除https://kokenikki.blogspot.com/2021/07/arduinopoke09.html
興味本位で聞かせていただくんですけど、釣りでの色違い厳選の自動化ってできるのでしょうか。もしできるのなら原理を教えていただけないでしょうか。
返信削除釣り厳選はやってみたいと思っているのですが、マイコン単体となると難しいかと思います。
削除理論上は、本体からコントローラーを振動させるための信号が送られているはずなので、それを検知してボタン入力することが可能であればマイコン単体で可能かと思います。が、そのあたりの知識はさっぱりなので厳しいです。
現実的に考えるのであれば、
①画像認識で釣り時の「!」を判別して釣る
②マイコン単体、当てずっぽうのタイミングでAを押し、低確率で釣れたものだけを色違い判定する
のどちらかだと思います。①であれば、ネット上を探せばPoke-Controllerなどで作っている方がいるかと思います。②は確率が低すぎるので、釣りの証を狙う以外は草むら厳選自動化を改変して水上の野生ポケモンを狙った方が効率的かと思います。
はじめまして。ミドリカワセミ様のブログを見てマイコンに挑戦してみました!
返信削除何とかboards.txtの書き換えまではできたはずなのですが、コードをコピペして検証や書き込みをしても‘’Button‘’ has not been declared‘’と出て‘’Joystick‘’の文字なんかも同様にエラーメッセージが出てしまいます。どうしたらいいのか教えていただけると幸いです。
おそらくライブラリにて定義されているButtonなどが正しく認識していないのかと思います。
削除ライブラリを正しく導入できているか、あるいはスケッチ内の
#include
が消えていないかを確認してください。
かなり前に三闘の色粘りのプログラムを提案した者です。今回、残すは時間調整のみとなりましたので、再びコメントさせていただきます。プログラム中の注釈文でも書いておりますが、「#define run_time 16500」の16500の部分を調整することで時間調整ができるようになっております。以下はコードです。
返信削除/**
初期条件は以下の通り
1. 殿堂入り後のストーリーをすべて終わらせていること。
2. フィールドに点在する三闘の足跡を五十個ずつ集め終わり、ソニアに話しかけて三闘の居場所を教えてもらっていること。
3. キャンプを開いて閉じるとすぐに三闘とバトルできるように位置を調整していること。
4. 先頭を、自爆技を1番上の技に持つポケモン(癒しの願い推奨)にし、確実に逃げるためにけむり玉を持たせていること。
5.その他、捕獲要員やボールを用意していること。
6. ポケモンのなつき度を下げていること。(なつき度は、漢方薬を使うことで下げることができる。また、漢方薬はバウタウンの漢方薬ショップで購入可能。)
*/
//ライブラリを読み込むためのコード
#include
//三闘から逃げる動きのAボタンを押す時間です。通常色なのに逃げてしまったら増やして、色違いなのに逃げてまったら減らしてください。ここは本当に各自で調整お願いします。
#define run_time 16500
void StartCanp() {
// Xボタンを押してメニューを開く
pushButton(Button::X, 100);
delay(500);
// Aボタンを押してキャンプを始める
pushButton(Button::A, 100);
}
void FinishCanp() {
// キャンプを開いてすぐにボタンを押しても反応しないため、9秒待機させる
delay(9000);
// キャンプを終了する
pushButton(Button::B, 100);
pushButton(Button::A, 100);
}
void Battle() {
// 戦闘画面に入ってすぐにボタンを押しても反応しないため、15秒待機させる
pushButton(Button::A, run_time);
// 戦闘開始、色違い光モーションなければ十字上>逃げる
// 色違いならば、1つ目の上入力が間に合わないため戦闘>自爆技で自分側瀕死
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, 1000, 5);
}
void Santou() {
// 一回目のキャンプは、メニューのカーソルを「キャンプ」に合わせる必要があるが、二回目以降のキャンプは、メニューを開くとすぐにキャンプをできるようになっているため、一回目と二回目以降を分けてプログラムを書いた
// Xボタンを押してメニューを開く
pushButton(Button::X, 100);
// メニューのカーソルをメニューの左上の位置に合わせる
pushHatButtonContinuous(Hat::LEFT, 700);
pushHatButtonContinuous(Hat::UP, 100);
// メニューのカーソルをキャンプの位置に合わせる
pushHatButtonContinuous(Hat::RIGHT, 100);
pushHatButtonContinuous(Hat::DOWN, 100);
// Aボタンを押してキャンプを開く
pushButton(Button::A, 100);
// キャンプを開いてすぐにボタンを押しても反応しないため、9秒待機させる
delay(9000);
// キャンプを終了する前に、(色違いが出た時のハマりを継続するために)B連打から上長押しでカーソル1番上を選択
pushButton(Button::B, 400, 2);
pushHatButtonContinuous(Hat::UP, 1500);
// キャンプを終了する
pushButton(Button::B, 100);
pushButton(Button::A, 100);
// 戦闘画面に入ってすぐにボタンを押しても反応しないため、16秒待機させる
pushButton(Button::A, run_time);
// 戦闘開始、色違い光モーションなければ十字上>逃げる
// 色違いならば、1つ目の上入力が間に合わないため戦闘>自爆技で自分側瀕死
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, 1000, 5);
}
void setup() {
pushButton(Button::B, 100, 5);
Santou();
}
void loop() {
delay(4800);
StartCanp();
FinishCanp();
Battle();
}
三闘色粘りの提案、プログラム公開ありがとうございます。
削除こちら、未だに足跡集めを渋っている状態のため、足跡を集めた際に試してみたいと思います。