見出し画像

【Poke-Controller】レッツゴーで色違いワッカネズミ探し自動化【ポケモンSV】

色違いのワッカネズミがほしい!
でも色違いを探していると画面酔いしてしまう!
そんな思いから、Poke-Controllerを使ったポケモンSVのレッツゴー色違い探し自動化プログラムを作成しました。
プログラムは下記に格納しています。


何が出来るの?

ボウルタウンのワッカネズミ大量発生で色違いを探します。
サンドイッチ作成→30分間レッツゴー→ゲーム再起動の自動化です。
色違いチェックを含む全ての動作は、画像処理で判定しているため、ご利用の環境によっては上手く動作しないかもしれません。
捕獲は手動です!


事前準備

プログラムの格納

1. ダウンロードしたファイル「SV_LetsGoRoundNezumi.py」を格納する
下記フォルダに格納してください
パス:Poke-Controller-master\SerialController\Commands\PythonCommands

「SV_LetsGoRoundNezumi.py」の格納場所

その他の作業

1.手持ちをブロロン1匹だけにする
ブロロン以外のポケモンでは動作しません!

レッツゴーで広範囲のポケモンを倒せるブロロンを使います。
また、一番上の技は攻撃技にしてください。戦闘時に使うことがあります。
一撃で倒せるようLv. 100を想定しています。

2.サンドイッチの具材を用意する
ライス、しおスパイス、からスパイスを用意します。
色違いが出なければリセットするので、1つずつあれば大丈夫です。

3.サンドイッチ作成時の具材の位置を確認する
デフォルトのプログラムでは下記の位置にあることを想定しています。
 「ライス」:上から24番目
 「ひでん:からスパイス」:下から1番目(一番下)
 「ひでん:しおスパイス」:下から4番目

ライス、からスパイス、しおスパイスを一つずつ
ライスはスティックを→に2回、↓に3回押した位置がデフォルト

実際にご自身の環境でサンドイッチ作成して同じ位置か数えてみましょう。
上の画像と具材の位置が違う場合、プログラムを修正してください。
プログラムの17行目~19行目で、下から何番目にあるかを設定しています。

★プログラムの1719行目:
self.myrice = 24	#★上から何番目に「ライス」があるか。デフォルトは上から24番目を想定
self.mykara = 1		#★下から何番目に「ひでん:からスパイス」があるか。デフォルトは一番下を想定
self.myshio = 4		#★下から何番目に「ひでん:しおスパイス」があるか。デフォルトは下から4番目を想定

たとえば、「ライス」が一番上にある場合は、
「 self.myrice = 24」の「24」の部分を「1」に修正します。
つまり、「self.myrice = 1」に直せばOKです。

4.ボウルタウン付近のワッカネズミ大量発生場所に移動する
大量発生場所の近くに壁があると正常に動作しません。
(レッツゴー時の汗マークで色違いを判定します。壁にぶつかると汗マークが出てしまうため色違いと誤検知してしまう)
大量発生のワッカネズミを探すプログラムは下の記事です。

5.準備が出来たらレポートを書いてリセットする
リセット後にワッカネズミの大量発生近くで始まることを確認しましょう。
自動化中にリセットをするため、念のため確認してください。
カメラワークやカーソル位置なども初期状態に戻るので動作も安定します。

動作の流れ

「SV_レッツゴー自動化(ワッカネズミ)_v1.0」を実行です。
動作の流れは下記のとおりです。

1.サンドイッチ作成(かがやきパワーLv3:ノーマル)
2.画像処理で自動レッツゴー
3.レッツゴー時に汗マークが出たら色違いと判断して終了
4.サンドイッチ作成から30分後、効果が切れたらゲーム再起動

動作の様子は下記の動画を参照ください。


処理の補足

ここはプログラム中身の紹介なので、興味ない方は読み飛ばしてください。
レッツゴー自動化でやっていることを補足します。

1.ワッカネズミの判定
(1)草むらの色を除去
(2)大きな輪郭を除去
(3)指定した色で輪郭が最大箇所の位置を判定
(4)判定した位置にカーソルを向けてレッツゴー

(1)草むらの色を除去
前処理として不要な色を削除します。草むらの色が対象です。

上:修正前、下:修正後
草むらの色を除去するとだいぶすっきりします

(2)大きな輪郭を除去
前処理として不要な輪郭を除去します。ミニマップや岩などが対象です。
特に岩はワッカネズミと同じ灰色なので除去しないと誤検知します。

ミニマップや岩など、大きな輪郭を除去

(3)指定した色で輪郭が最大箇所の位置を判定
前処理した画像に対して、ワッカネズミっぽい色を検知します。
色検知の都合上、白い花をワッカネズミと間違えやすいですが、輪郭が最大箇所を選ぶことで、ワッカネズミが優先されるようにします。

事前に指定した色範囲に限定して輪郭抽出
抽出した輪郭で面積が最大の箇所がレッツゴーの対象
※主人公が選ばれないよう、主人公がいる領域は除外対象
(この画像では右上の青い枠線がレッツゴーの対象みたい)

(4)判定した位置にカーソルを向けてレッツゴー
対象の座標(重心)と、主人公の位置から方向と距離を計算してレッツゴーします。距離が近ければ向きだけ変えて、遠ければその方向へ少し移動してからレッツゴーします。

中央の赤丸が主人公の座標、右上の青丸が目標の座標
後は角度と距離を計算してレッツゴー

2.その他の処理
(1)ワッカネズミを検知できない場合、右下ミニマップのアイコンでワッカネズミの大量発生アイコンに近いところへ移動する
(2)戦闘中やレッツゴーを認識する

(1)ワッカネズミを検知できない場合、右下ミニマップのアイコンでワッカネズミの大量発生アイコンに近いところへ移動する
大量発生の場所から離れすぎないための処理です。
ワッカネズミがいない場合は、大量発生アイコンに近い場所へ移動したい。
ただ、大量発生と通常のアイコンの2種類がミニマップに表示されるため、このままでは目印にしにくいです。
そこで、大量発生にだけ表示される赤い点滅を目印にします。
(ただし、この処理があるせいで大量発生時しか動作しません)

主人公のアイコン(オレンジ色)の中央の座標と、
赤く点滅した領域の重心の座標から、
次に移動する方向を計算します

(2)戦闘中やレッツゴーを認識する
画面上に指定した色があるかどうかで状況を認識します。
文章力がないため画像を参考にしてください。

色を認識して状況判断している箇所
「ワッカネズミに勝った!」の部分は説明のために合成しました

ブロロンのアイコン:
ある場合はレッツゴー中だと判断します。
ない場合はワッカネズミを探す処理を行います。
レッツゴー直後にアイコンがない場合は、進行方向に少し移動します。
(斜面にいるとレッツゴーできないため、斜面を登る必要がある)

モンスターボールのアイコン(勝利メッセージ):
ある場合はレッツゴーでポケモンを倒したと判断します。
だいたいの勝利数をカウントします。

汗マークのアイコン:
色違いがでたと判断します。
壁にレッツゴーしても起こるため、大量発生の場所によって誤検知します。

ミニマップの主人公アイコン:
フィールド画面にいると判断します。
ない場合は戦闘画面に移ったと判断して逃げる動作を行います。
逃げた後、またすぐに戦闘画面に移った場合、一番上の技で倒します。
(好戦的なポケモンや特定の状況で起こる無限ループを回避するため)


あとがき

イッカネズミの色違いが欲しくて実現できそうなやり方を試してみました。
時間が取れず妥協していますが、ひとまず動いたので良しとしました。
また汎用性を考えた作りではないため、応用しにくいと思います。
草むらとワッカネズミの色を変えれば他のポケモンにも使えるかも。

改変できる方はぜひ試してみてください。
私も使ってみたいです…!

自動化を推進してくださる方々、ありがとうございます。
このプログラムが何かの役に立てば嬉しいです。

ご意見はこちら

プログラムが無事に動いたこと、上手く動かなかったこと、
記事の内容でわかりにくいことなど、情報があれば参考にしたいです。
とはいえ、名前を出して発言するのは勇気がいるかもしれません。
そこで、匿名でも意見ができるよう、マシュマロを開放しました。

動作報告やプログラム/記事についてのご意見などを募集したいです。
記事やプログラムの分かりにくい場所を補足するなどの参考にします。
ただ、情報収集が目的のため、個別の返信は予定していません。
個別に返信が必要な場合はマシュマロではなくDMでお願いします。

この記事が気に入ったらサポートをしてみませんか?