【Poke-Controller】純白の凍土の色違い探し自動化(テンプレートマッチング未使用版の改良版)【レジェンズアルセウス
レジェンズアルセウスで色違いのポケモンに会いたい!
そこで自動化プログラムを作りました。
※過去の記事で作ったプログラムの改良版です。動きはほぼ同じ。
画像のテンプレートマッチングを使わず、画面のBGR値で判断します。
BGR値の閾値はプログラムの初回実行時にその環境用に設定します。
何が出来るの?
フィールドを自動で周回して色違いを探します。
ゾロア、バスラオ、ワシボンなどヒスイの色違いを見つけられるかも。
注意事項
Poke-Controllerの環境設定が必要です。
(pyaudioというライブラリをインストールする必要があります)
事前準備
0.Poke-Controllerの環境設定(pyaudioのインストール)
過去の記事を参考にしてください。
(環境の違いが原因で、記載のやり方ではできないかもしれません)
1.プログラムの格納
(1)ダウンロードしたファイルを配置する
下記のリンクからプログラムをダウンロードします。
・Arceus_FieldShiny_nt_Junpaku.py
これを下記フォルダに格納してください
パス:Poke-Controller-master\SerialController\Commands\PythonCommands
※このプログラムは下記のファイルを作成します。
同名ファイルがあると上書きされますのでご注意ください!
パス:Poke-Controller-master\SerialController\
ファイル:LA_BGRmemo.txt
2.レジェンズアルセウスの設定
(1)オプション設定を下記の通り変更する
・「話の速さ」を「速い」にする(遅いと動作がズレる)
・「カメラ感度」を「2」にする(設定が違うと動作がズレる!)
・「おまかせレポート」を「使わない」にする(自動保存は危険)
・「BGM」と「鳴き声」を「0」にする(SEだけ鳴らす)
(2)「純白の凍土」の場合は「氷山ベース」へ移動してレポートを書く
自動化中にリセットすることがあります。
この場所から再開できるようにレポートします。
【※初回と2回目以降でプログラムの開始位置が違うため注意!】
(3-1)(初回のみ)ラベン博士に話しかけてからプログラムを開始する
ラベン博士から村に戻るか選択する画面でプログラムを開始します。
この画面をもとにBGR値を取得して、自動操作を行います。
(3-2)(2回目以降)「氷山ベース」移動直後の状態でプログラムを開始する
さきほどレポートした画面でプログラムを実行します。
動作の流れ
ウォーグルに乗って、下記のルートを自動で移動します。
ルートの移動⇒村に戻る⇒純白の凍土⇒ルートの移動を繰り返します。
色違いSEを検知するとCAPTUREボタンで動画を撮影、HOMEボタンを押してからプログラムが止まります。
プログラムが終了したら、撮影された動画を確認してください。
動画を見れば、色違いがどこに発生したのか分かります。
※動画に映っていない場所で色違いが発生することもあります!
(純白の凍土の場合、地下の洞窟でゾロアの色違いが出てたりします)
※たまに色違いSEを誤検知することもあります…
プログラムの中身の話
レジェンズアルセウス内の言語が変わっても動いてほしい。
キャプチャボードやパソコンが変わっても動いてほしい。
自動化の判定は画像のテンプレートマッチングではなくBGR値を使用、
また判定に使うBGR値の閾値を現地調達することで解決を図りました。
1.BGR値の現地調達
初回起動時に自動操作のための情報を3つ取得します。
取得する情報とその使い道を記載します。
(1)「村に戻る」を選択するための判定
コトブキ村に戻るため、博士の選択肢を認識する必要があります。
これは選択肢の一番上の右端あたりを取得します。(x, y)=(1055, 435)
選択肢左側のAボタンマークで判定すれば、後述する白色アイコンの判定を閾値に流用できるためこの情報を取得する必要はないです。
ただ、上記画像の通り、Aボタンマークの位置は言語によってズレます。
特定言語のみで使う場合は白色アイコン判定の方が楽です。
今回は汎用性のため選択肢の右端の色で判定します。
(2)白色アイコンの判定
画面の状態を白色アイコンで認識しています。
これはアルセウスフォンの中央あたりを取得します。(x, y)=(45, 535)
この白色は多用されていて、プログラムでは次の判定に使用します。
①マップ画面で移動できるかの判定
マップ画面で移動できるかどうかを、この白色で判定します。
ボタンアイコンの中央あたりを取得します。(x, y)=(940, 640)
②ライドポケモンがウォーグルかどうかの判定
ライドポケモンがウォーグルかどうかを、この白色で判定します。
アイコンを切り替えながら指定範囲(※)内の白色を集計します。
※指定範囲:(x, y)=(1175, 485)~(1230, 540)
白色が最小のアイコンを選べば、ウォーグルを選択できます。
なお、白色の集計は何回か計測した平均値を採用しています。
フィールドに雪が降っているとその影響で白色の数が変化するため、平均値をとることで影響を最小化しました。
(3)マップ画面の判定
マップ画面を黄色で認識します。
左端中央あたりの黄色を取得します。(x, y)=(10, 335)
マップ画面かどうかの判定に使用します。
またマップ画面に遷移できない=戦闘画面という判定にも使用します。
2.BGR値の書き出し
取得した3つの情報をもとに、BGR値の判定に用いる閾値を出力します。
パス:Poke-Controller-master\SerialController\
ファイル:LA_BGRmemo.txt
取得したBGR値にそれぞれ-25した下限値、+25した上限値が記録されます。
3.BGR値の読み込み
2回目以降は上記のファイルを読みます。
ここで読み込んだ値を判定に利用して自動化を行います。
ファイルがない場合はBGR値の設定をやり直します。
設定をやり直したいときはファイルを削除してください。
その他.フィールド移動マップの判定
コトブキムラにカーソルがあるかをBGR値の変化量で判定します。
フィールド移動する際、どのマップにカーソルがあるかを判断します。
コトブキムラの判定は上図の座標を取得します。(x, y)=(340, 378)
コトブキムラにカーソルがあると赤い札が移動するため、この座標のBGR値は変動します。
そのため、この座標のBGR値(RだけでOK)を何回か取得し、最大値と最小値の差が大きければコトブキムラにカーソルがあると判断できます。
色の変化量だけで判断できるためBGR値の事前取得は不要です。
あとがき
久しぶりに自動化をやってみたら自分のプログラムが動きませんでした。
色々環境が変わったせいで、事前に設定したBGR値が使えなかったみたい。
不便なのでBGR値を現地調達するよう修正しました。
これで使える人が増えるかもしれません。
自動化を推進してくださる方々、ありがとうございます。
このプログラムが何かの役に立てば嬉しいです。