【Poke-Controller】レッツゴーで色違いチャデス探し自動化したい【ポケモンSV】
色違いのチャデスがほしい!
でも小さくて探すのが大変!
そこで、Poke-Controllerを使って色違い探しを自動化しました。
プログラムは下記に格納しています。
何が出来るの?
チャデス大量発生で色違いを探します。
サンドイッチ作成→30分間レッツゴー→ゲーム再起動の自動化です。
画像処理の判定が多いため、環境によっては上手く動かないかも。
※Poke-Controller-Modifiedでのみ動作します。
(スティックを傾ける角度の指定ができないため、
通常のPoke-Controllerでは動作しません)
事前準備
1.プログラムの格納
(1)ダウンロードしたファイル「SV_LetsGoRoundCha.py」を格納する
下記フォルダに格納する
・Poke-Controller-Modified-master\SerialController\Commands\PythonCommands
(2)ダウンロードしたフォルダ「imgCgk」を格納する
下記フォルダに格納する
・Poke-Controller-Modified-master\SerialController\Template
2.事前準備
(1) ポケモンの準備
①手持ち先頭をブロロン(Lv100)にする
②ブロロンに「けむりだま」を持たせる
⇒レッツゴーの移動が速いブロロンを使います。
戦闘から逃げる「けむりだま」推奨ですが、逃げられないときはA連打で倒します。命中安定かつPPの多い攻撃技を覚えさせよう。
③チャデスを図鑑に登録する
⇒フィールドでZL押下時に表示される捕獲マークで判定します。
図鑑に登録していないと効率が下がります。
(周辺のポケモンも図鑑登録すると効率良いです)
(2)道具の準備
①きずぐすりを大量に用意する
⇒ブロロンが傷ついた際、マイナスボタンでオート回復します。
②サンドイッチの具材を用意、表示位置を確認する
・レタス×1(上から1番目)
・マヨネーズ×2(上から1番目)
・ひでん:すぱスパイス×2(下から3番目)
具材の表示位置は環境によって異なります。
上の画像と違う位置にある場合は、プログラムの21~23行目を修正します。
#★自分の環境に合わせて変更してください★
self.guzai = 1 #★上から何番目に「レタス」があるか。デフォルトは上から1番目を想定
self.mayo = 1 #★上から何番目に「マヨネーズ」があるか。デフォルトは上から1番目を想定
self.spice = 3 #★下から何番目に「ひでん:すぱスパイス」があるか。デフォルトは下から3番目を想定
#★自分の環境に合わせて変更してください★
たとえば「ひでん:すぱスパイス」が一番下にある場合は、
「self.spice = 3」の「3」を「1」に修正します。
(3)その他の設定
①ミニマップの北固定を解除する
(ミニマップの相対座標で移動判定するため)
②Switchを「いつも遊ぶ本体」かつ「機内モード」にする
(誤操作によるインターネット接続&レポートを回避するため)
③チャデスの大量発生が出るまで日付変更する
⇒草またはゴーストのそうぐうパワーをつけて、キタカミセンター東の竹林エリアで日付変更すると出やすいかも
参考に、自動化プログラムのリンクも貼ります。
④大量発生付近の光るチャデス(テラスタイプ水)を倒す
⇒レッツゴーで倒せず、色違いと誤検知しちゃうため必ず倒します。
日付が変わると復活するので、何時間も自動化するなら本体時間を0時にすると良いかも。
(大量発生が終わらないよう、ゲームを終了してから時間変更しよう)
動作の流れ
「SV_レッツゴー自動化(チャデス)_v_v2.0」を実行です。
動作の流れは下記のとおりです。
1.サンドイッチ作成(かがやきパワーLv3:くさ)
2.画像処理で自動レッツゴー
3.ZLでボールマークを確認、かつレッツゴー時に汗マークが出たら色違いと判断して終了
4.サンドイッチ作成から30分後、効果が切れたらゲーム再起動
処理の補足
プログラム中身の補足です。
改変する際の参考にしてください。
◆プログラムでやりたいこと:
1ー1.ZLを押しながら適当に移動する
1-2.ZLを押しながら周囲を見回す
2.チャデスをロックオンしたらレッツゴーで倒す
1ー1.ZLを押しながら適当に移動する
大量発生の付近で適当に移動します。
大量発生の付近かどうかはミニマップで判定します。
主人公のアイコン(黄色)の位置と、
赤く点滅した領域の重心の位置を比較します。
2点を結ぶ距離の大きさで、移動する向きを決めます。
(距離が大きければ近づく方向、小さければ離れる方向へ移動)
1-2.ZLを押しながら周囲を見回す
周囲を見回すと、近くのチャデスを見つけられます。
判定しやすいよう、右スティックを優しく傾けます。
#右スティックを右方向に優しく傾ける
self.press(Direction(stick=Stick.RIGHT, angle=0, magnification=0.2), duration=4.0, wait=0.01)
Poke-Controllerではスティックを傾ける角度は指定できずエラーになります。
Poke-Controller-Modifiedの便利な機能です。大感謝。。。
2.チャデスをロックオンしたらレッツゴーで倒す
チャデス本体を画面上から見つけるのは肉眼でも難しい…!
今回は、ZL押下時のボールマークを使います。
レベルや名前は言語によって違うため、ボールマークで判定します。
(「6」の数字で判定するのも良いかも)
簡易的にテンプレートマッチングで判定します。
色のマスキングで判定したいけれど、白色や赤色は主人公の服装も検知するので、調整に時間がかかりそう。
上手く動かないときは
キャプチャボードやPCなど、機材の違いで動作が変わる可能性があります。
色や画像で判定している箇所が上手く動いているか確認してください。
1.モンスターボールマークのチェック
実行時、定期的に下記のようなメッセージが出てきます。
・imgChk/pokeball.png ZNCC value: 0.7277398109436035
これは、画面上にモンスターボールマークがあるかをチェックしています。
valueが0.80より大きい場合、モンスターボールマークがあると判断します。
実行時、モンスターボールマークがある場合にvalueが0.80より大きい値になっているか確認してください。
valueが0.80より小さい値になっている場合は正しく動いていません。
(モンスターボールマークがないときは0.80より小さくて大丈夫です)
正しく動いていない場合は、「imgCgk」フォルダの「monsterball.png」を自分の環境で取得した画像に差し替えてください。
Poke-Controllerの「Capture」ボタンで画像をキャプチャ、モンスターボールマークだけが写るようにトリミングしましょう。
2.ミニマップのチェック(fieldCheck)
実行時、定期的に下記のようなメッセージが出てきます。
・マップ画面でない
これは、フィールド画面でないか(戦闘画面にいるか)をチェックしています。
フィールド画面にいるときは何も表示されませんが、
戦闘画面に入ったときは「マップ画面でない」と表示されます。
BGR値が(0,160,190)~(50,230,255)の範囲内ならTrue=フィールド画面、
それ以外ならFalse=戦闘画面と判断します。
フィールド画面にいるのに「マップ画面でない」と表示される場合は、この閾値を見直す必要があります。
ペイントソフトを使ってスポイトで色を取り、値を確認するのが簡単そう。
ここで確認した値を参考に、fieldCheckの定義値を修正します。
#フィールドチェック(戦闘画面でないか)
def fieldCheck(self):
rvalue = False
#ミニマップ中央のオレンジアイコン用定義(BGR)
x = 1160
y = 600
lower = np.array([0,160,190])
upper = np.array([50,230,255])
上記のlower, upperにある数字を修正します。(489, 490行目あたり)
ペイントで確認した青(U)の値が60なら、upperの一つ目の50を70にします。
(60でも良いが、少し余裕を持った数字に修正した方が良いです)
ペイントで確認した緑(G)の値が155なら、lowerの二つ目の160を145にします。(155でも良いが、以下略)
ペイントで取得した値が、このlower~upperの値の範囲内に入ればOKです。
3.進む先が草むらかのチェック(fieldChkEsy)
実行時、定期的に下記のようなメッセージが出てきます。
・進行方向が草むらかチェック True 99
これは、進む先が草むらか(湖や崖でないか)をチェックしています。
右スティック下で俯瞰視点にした後、主人公の進む方向の色を取得。
HLSのHの値が緑色(60≦H≦120)ならTrue(移動OK)、
それ以外ならFalse(移動NG)と判断します。
進行方向が草むらなのにFalseと表示される場合は閾値の見直しが必要です。
下記のサンプルプログラムでHLSのHの値を確認してください。
ここで確認した値を参考に、fieldChkEsyの定義値を修正します。
#簡易陸チェック
def fieldChkEsy(self):
#チェック座標定義1
c1_x = 635
c1_y = 5
#ゲーム画面の画像を取得
src = self.camera.readFrame()
#cv2.imwrite("fieldchkesy.png", src) #ゲーム画像出力処理(デバッグ用)
#HLSを取得
hls = cv2.cvtColor(src, cv2.COLOR_BGR2HLS_FULL)
#指定した座標の色を取得
c1h,c1l,c1s = hls[c1_y, c1_x,:]
#色チェック(緑色系ならTrue、その他の色ならFalse)(HLSのHで判定)
if 60 <= c1h and c1h <= 120:
「if 60 <= c1h and c1h <= 120」の数字(60, 120)を修正します。(381行目あたり)
確認したHの値が122なら、120を130に修正します。
(範囲内におさまれば良いので122でも良いですが、余裕を持った値にした方が良いかも。)
改良点
効率良くチャデスを見つけるための処理は改善の余地がありそう。
改変できる方はぜひ試してみてください。
・移動ロジック変更:
-ZLを押しながら移動すれば自動で近くのポケモンに追従するので、主人公の移動量は大きいほうが良いかも
-チャデスが出やすい位置は決まってそうなので、ミニマップを北固定にして、移動する領域を厳密に制御する方が良いかも
あとがき
イッカネズミのときは画像処理を試したい気分でしたが、
今回は動けば良いやの気分でした。
前回より汎用性はあるかも。
自動化を推進してくださる方々、ありがとうございます。
このプログラムが何かの役に立てば嬉しいです。
ご意見はこちら
プログラムが無事に動いたこと、上手く動かなかったこと、
記事の内容でわかりにくいことなど、情報があれば参考にしたいです。
とはいえ、名前を出して発言するのは勇気がいるかもしれません。
そこで、匿名でも意見ができるよう、マシュマロを開放しました。
動作報告やプログラム/記事についてのご意見などを募集したいです。
記事やプログラムの分かりにくい場所を補足するなどの参考にします。
ただ、情報収集が目的のため、個別の返信は予定していません。
個別に返信が必要な場合はマシュマロではなくDMでお願いします。