ポリクローム攻略 @ ウィキ
自動戦闘マクロ
最終更新:
Bot(ページ名リンク)
-
view
自動戦闘マクロ
※注意
オンラインゲームとかでは絶対やっちゃいけないやつです
プログラムの知識がある程度ないと結構大変だと思います
プログラムの知識がある程度ないと結構大変だと思います
何がしたかったか
とりあえず星系の装備を集めるのが流石にしんどすぎたので、自動化できないかなと考えたわけです。
条件は
- フィールドをオートで走る
- 戦闘を自動で行える
- HPを自動で回復する
- MPを自動で回復する
- アイテムを入手した際にはキャプチャを取る
※どの敵からアイテムをドロップしたかを確認するため
です。
今回、pyautoguiを導入しました。
今回、pyautoguiを導入しました。
導入方法
導入方法はネットに一通りありますが簡単に
- https://www.python.org/downloads/ よりpythonをインストール
- コマンドプロンプトを起動
- py -m pip install pyautogui
- py -m pip install pywin32
- sample.pyを作成
- py sample.pyで実行
※エラーができるときはコマンドプロンプトを管理者権限で実行してみてください
コード例
※サンプルファイルそのままだとまず動きません。
コード説明
# まずは前面に hwnd = win32gui.FindWindow(None, 'ポリクローム') win32gui.SetWindowPos(hwnd, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)
こちら、まずはコマンド実行時にもポリクロームが前面に出てこないと動作しないため必須の記述です。
# 戦闘 b_rgb = pyautogui.pixel(802 + x_hosei,273 + y_hosei) # 戦闘終了メッセージ e_rgb = pyautogui.pixel(699 + x_hosei,364 + y_hosei) # パーティ p_rgb = pyautogui.pixel(1103 + x_hosei,97 + y_hosei)
現在の状態が
- マップ移動中
- 戦闘のコマンド選択
- 戦闘完了後の経験値やお金の獲得情報
- 待機
のどの状態かを判別することが必要です。
そのためには
- 「コマンド」のウインドウが開かれているか
- 「メッセージ」のウインドウが開かれているか
- 「パーティー」のウインドウが開かれているか
を判別する必要があります。
しかし、pythonのライブラリの範囲でウインドウが開かれているかを判別することは基本的にできなかったので、特定のピクセルの色(RBG)を確認して、ウインドウが開かれているかどうかを判別します。
# パーティ p_rgb = pyautogui.pixel(1103 + x_hosei,97 + y_hosei) # コマンドがセスかどうか cmd_rgb = pyautogui.pixel(744 + x_hosei,313 + y_hosei) # 各人HPチェック p1_hp_rgb = pyautogui.pixel(130 + x_hosei,802 + y_hosei) p2_hp_rgb = pyautogui.pixel(379 + x_hosei,801 + y_hosei) p3_hp_rgb = pyautogui.pixel(623 + x_hosei,802 + y_hosei) p3_mp_reb = pyautogui.pixel(641 + x_hosei,824 + y_hosei) p4_hp_rgb = pyautogui.pixel(871 + x_hosei,802 + y_hosei) p4_mp_rgb = pyautogui.pixel(869 + x_hosei,824 + y_hosei)
戦闘コマンドが誰のコマンドなのか、現在のパーティのHPやMPはどういう状態なのかを判別するために色のチェックをしています。
## HPがピンチの時 if p1_hp_rgb == (255, 0, 0) or p2_hp_rgb == (255, 0, 0) or p3_hp_rgb == (255, 0, 0) or p4_hp_rgb == (255, 0, 0) : pyautogui.moveTo(900,323) pyautogui.click() pyautogui.moveTo(1053,489) pyautogui.click() pyautogui.moveTo(1072,316) pyautogui.click() pyautogui.click() pyautogui.moveTo(923,377) pyautogui.click() pyautogui.moveTo(1053,489) pyautogui.click() pyautogui.click()
パーティのいずれかのメンバーのHPが規定値以下の場合にスターライトシャワーを実行しています。
上から順に
上から順に
- マウスを魔法の上に移動
- クリック
- マウスを次への上に移動
- クリック
- スクロールを一番上に移動
- マウスを上から4番目の魔法(スターライトシャワー)の上に移動
- クリック
- マウスを次への上に移動
- クリック
- クリック
という感じです。
そこ以下のコードも基本的には同じ感じです。
そこ以下のコードも基本的には同じ感じです。
if ms_ss_rgb == (152, 192, 80) : ss_count += 1 ## 2回目以降+Gの手に入れたテキストでないときのみキャプチャ if ss_count > 1 and ( ( ms_check1_rgb != (0, 0, 0) or ms_check2_rgb != (0, 0, 0) or ms_check3_rgb != (0, 0, 0) ) and ( ms_check4_rgb != (0, 0, 0) or ms_check5_rgb != (0, 0, 0) or ms_check6_rgb != (0, 0, 0) ) ): t_delta = datetime.timedelta(hours=9) JST = datetime.timezone(t_delta, 'JST') now = datetime.datetime.now(JST) screenshot = pyautogui.screenshot(region=(514, 353, 350, 130)) screenshot.save("screenshots\\" + now.strftime('%Y%m%d%H%M%S') + ".png") pyautogui.sleep(1) pyautogui.moveTo(699,394) pyautogui.click()
戦闘終了後は基本的には、クリックをするだけです。
ただし、最後のメンバー(私の場合セス)のイラストでお金やアイテム入手のメッセージが出るので、アイコンがセスで2回目のときにキャプチャを取ります。
+アイテム入手がない時はキャプチャを取りたくないので、4桁G・5桁Gのピクセルパターンを適当に抽出して、キャプチャを取らないように回避しています。
ただし、最後のメンバー(私の場合セス)のイラストでお金やアイテム入手のメッセージが出るので、アイコンがセスで2回目のときにキャプチャを取ります。
+アイテム入手がない時はキャプチャを取りたくないので、4桁G・5桁Gのピクセルパターンを適当に抽出して、キャプチャを取らないように回避しています。
pyautogui.moveTo(236,190) pyautogui.click() pyautogui.mouseDown() pyautogui.sleep(1.5) pyautogui.mouseUp()
pyautogui.moveTo(582,376) pyautogui.click() pyautogui.mouseDown() pyautogui.sleep(1.5) pyautogui.mouseUp()
移動時の挙動です。
マウスを適当な位置にクリックくしてから押しっぱなしにすることで走ります。
マウスを適当な位置にクリックくしてから押しっぱなしにすることで走ります。
実行に当たっての注意
このマクロを中断するためには、コマンドプロンプトに焦点を当ててctrl+cで中断する必要があります。
ポリクロームが必ず前面に出てくる使用上、コマンドプロンプトが隠れてしまうと最悪詰みますので十分注意してください。
ポリクロームが必ず前面に出てくる使用上、コマンドプロンプトが隠れてしまうと最悪詰みますので十分注意してください。
デモ
※上記ファイルとは操作を一部変えています。
添付ファイル