diff --git a/README.md b/README.md index f48e64f..2992f14 100644 --- a/README.md +++ b/README.md @@ -10,13 +10,13 @@ Rise of Kingdoms なぜ公式で用意しないのかランキング圧倒的No1 - Windows 10以降 - Python 3.10(Microsoft Store版) -- NoxPlayer 7 +- BlueStacks 5 ### セットアップ #### 環境 -Pythonは[Microsoft Store](https://www.microsoft.com/ja-jp/p/python-310/9pjpw5ldxlz5?cid=msft_web_chart&activetab=pivot:overviewtab)からインストールするのが手軽。 +Pythonは[Microsoft Store](https://www.microsoft.com/ja-jp/p/python-310/9pjpw5ldxlz5?cid=msft_web_chart&activetab=pivot:overviewtab)からインストールするのが手軽です。 コマンドプロンプトやPowerShellで以下のコマンドを入力し、動作に必要なモジュールをインストールしてください。 @@ -27,53 +27,77 @@ pip install portalocker pip install fasteners ``` -rok-scan-statsディレクトリのパスには日本語を含まないようにしてください(`C:¥Program Files¥ライキン¥rok-scan-stats¥`のようにパスの途中に日本語を含むと画像解析に失敗します) -`adb.exe が見つかりません。`エラーが出た場合は、`autocap.py`の`ADB_PATH`をNoxPlayerのadb.exeがあるパスに変更してください。 +画像解析に失敗するため、rok-scan-statsディレクトリのパスには日本語やスペース等が含まれないようにしてください。 +OK → `C:¥rok-scan-stats` +NG → `C:¥ライキン¥rok-scan-stats¥` -#### NoxPlayerとライキンの設定 +#### 初期設定 -NoxPlayerの設定は、パフォーマンス「高い(4コアCPU、4096MBメモリ)」、解像度「1600x900」にし、ライキンは、言語「日本語」、画質「中」、フレームレート「至高」にします。 -なお、同盟から脱退し無所属の状態で実行することを推奨します(同盟通知が読み取り対象に重なってしまうことがあります) +##### BlueStacksインスタンス + +- パフォーマンス + - CPUの割り当て: 高(4コア) + - メモリの割り当て: 改良済み(4GB) + - パフォーマンスモード: バランス + - フレームレート: 60 +- ディスプレイ + - 画面解像度: 1600 x 900 + - 画素密度: 240 DPI(中) +- 上位設定 + - Android Debug Bridge(ADB): 有効 + +##### RoK + +- 言語: 日本語 +- 画質: 中 +- フレームレート: 60 +- 画面フラッシュ効果オフ: 有効 +- 王国称号の通知: 無効 + +※ 同盟通知が読み取り対象に重なってしまうため、同盟から脱退し無所属の状態で実行してください。 ### 使い方 -NoxPlayerでライキンを起動し、戦力ランキングを表示した状態で実行します。 -ライキンを起動してから時間が経つとライキンの動作が重くなってくるため、画面遷移時の待機時間が不足しキャプチャに失敗することがあります。その際は、`autocap.py`の`aapo.sleep(sec)`の`sec`部分を調整するか、`--delay`オプションを使用してください。 +RoKを起動し、戦力ランキングを表示した状態で実行します。 +RoKを起動してから時間が経つとRoKの動作が重くなってくるため、画面遷移時の待機時間が不足しキャプチャに失敗することがあります。その際は、`autocap.py`の`aapo.sleep(sec)`の`sec`部分を調整するか、`--delay`オプションを使用してください。 ```bash -python autocap.py +python autocap.py 127.0.0.1:5745 ``` +`127.0.0.1:5745`の部分は環境によって異なります。 +BlueStacksインスタンスの上位設定の`Android Debug Bridge(ADB)`に記載されているものに置き換えてください。 + #### オプション -| オプション | デフォルト値 | 説明 | -| ---------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | -| -d, --dir | 実行時の日付
(年-月-日) | キャプチャの保存先ディレクトリ名 | -| -s, --start-rank | 1 | キャプチャ開始順位
※ 4位以降から撮影開始する場合は、指定した順位が戦力ランキングの上から4番目に位置するよう表示してください | -| -e, --end-rank | 1000 | キャプチャ終了順位 | -| --delay | 1 | 各画面遷移時の待機時間調整倍率
例えば2を渡すと本来0.5秒待機するところが1秒待機となります | +| オプション | デフォルト値 | 説明 | +| ---------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | +| -d, --dir | 実行時の日付
(YYYY-MM-DD) | キャプチャの保存先ディレクトリ名 | +| -s, --start-rank | 1 | キャプチャ開始順位
※ 4位以降から撮影開始する場合は、指定した順位が戦力ランキングの上から4番目に位置するよう表示してください | +| -e, --end-rank | 1000 | キャプチャ終了順位 | +| --delay | 1 | 各画面遷移時の待機時間調整倍率
例えば2を渡すと本来0.5秒待機するところが1秒待機となります | ```bash # 「data/abc/」に100-200位のスクリーンショットを保存 -python autocap.py -d abc -s 100 -e 200 +python autocap.py 127.0.0.1:5745 -d abc -s 100 -e 200 ``` ### 並列実行 -複数のNoxPlayerとPowerShellを起動することで、並列に処理させることが可能です。 -※ 複数のNoxPlayerでそれぞれランキングを表示する際、時間差による順位ズレが発生しキャプチャ漏れするプレイヤーが出る可能性があります。NoxPlayerのマルチ同期機能を使用し同時にランキングを表示することである程度防止できます。 +複数のBlueStacksとPowerShellを起動することで、並列に処理させることが可能です。 +※ 複数のBlueStacksでそれぞれランキングを表示する際、時間差による順位ズレが発生しキャプチャ漏れするプレイヤーが出る可能性があります。BlueStacksの同期操作機能を使用し同時にランキングを表示することで防止できます。 ※ 2並列で4コア8スレッドCPU・メモリ16GB、3並列で8コア16スレッドCPU・メモリ24GB搭載のPC推奨します。性能が不足すると表示遅延が発生し、正しくキャプチャできない場合があります。 ```bash # PowerShell 1 # 1-150位を処理 -python autocap.py -d scan -e 150 +python autocap.py 127.0.0.1:5745 -e 150 ``` ```bash # PowerShell 2 # 151-300位を処理 -python autocap.py -d scan -s 151 -e 300 +python autocap.py 127.0.0.1:5755 -s 151 -e 300 ``` ## OCR - ocr.py @@ -83,9 +107,7 @@ autocap.pyで収集したスクリーンショットから、プレイヤー名 ### 動作環境 - Windows 10以降 - - Python 3.10(Microsoft Store) -- macOS 12 - - Python 3.10(Homebrew) + - Python 3.10 - Tesseract OCR 5.x ### セットアップ @@ -114,7 +136,7 @@ python ocr.py {キャプチャの保存ディレクトリ名 } #### オプション -| オプション | デフォルト値 | 説明 | +| オプション | デフォルト値 | 説明 | | ------------- | --------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | | -j, --jobs | 論理CPU数 - 1 | 並列処理数 | | -t, --targets | id alliance power hpower t1kill t2kill t3kill t4kill t5kill ranged dead rss | OCR対象 | diff --git a/autocap.ps1 b/autocap.ps1 index 39074a5..1e89528 100644 --- a/autocap.ps1 +++ b/autocap.ps1 @@ -3,9 +3,9 @@ param([String]$dir = (Get-Date -Format "yyyy-MM-dd")) -$p1 = Start-Process -FilePath powershell.exe -PassThru -ArgumentList "-noexit -command python autocap.py -d $dir -s 1 -e 333" -$p2 = Start-Process -FilePath powershell.exe -PassThru -ArgumentList "-noexit -command python autocap.py -d $dir -s 334 -e 666" -$p3 = Start-Process -FilePath powershell.exe -PassThru -ArgumentList "-noexit -command python autocap.py -d $dir -s 667 -e 1000" +$p1 = Start-Process -FilePath powershell.exe -PassThru -ArgumentList "-noexit -command python autocap.py 127.0.0.1:5745 -d $dir -s 1 -e 333" +$p2 = Start-Process -FilePath powershell.exe -PassThru -ArgumentList "-noexit -command python autocap.py 127.0.0.1:5755 -d $dir -s 334 -e 666" +$p3 = Start-Process -FilePath powershell.exe -PassThru -ArgumentList "-noexit -command python autocap.py 127.0.0.1:5765 -d $dir -s 667 -e 1000" $w = 640 $h = 300 diff --git a/autocap.py b/autocap.py index 2ba6222..a1da0f0 100644 --- a/autocap.py +++ b/autocap.py @@ -2,6 +2,7 @@ import os import sys +from pathlib import Path import datetime import argparse import pyperclip @@ -10,9 +11,6 @@ import fasteners from android_auto_play_opencv import AapoManager -# Nox adbパス -ADB_PATH = "C:/Program Files/Nox/bin/" - # ランキングタップ位置(X軸) RANKING_TAP_POS_X = 760 # ランキングタップ位置(Y軸、[1位,2位,3位,4位-998位,999位,1000位]) @@ -39,10 +37,8 @@ def main(): global aapo, template_dir_path, dir_path, img_dir_path, log_dir_path, delay - aapo = AapoManager(ADB_PATH) - devices = aapo.adbl.devices - parser = argparse.ArgumentParser() + parser.add_argument("adb", type=str) parser.add_argument( "-d", "--dir", type=str, default=datetime.datetime.now().strftime("%Y-%m-%d") ) @@ -51,7 +47,17 @@ def main(): parser.add_argument("--delay", type=float, default=1) args = parser.parse_args() - print(f"\n===== {args.start_rank}位から{args.end_rank}位までキャプチャします。 =====\n") + libs_dir = "./libs/" + adb_path = Path(libs_dir).absolute() / "adb.exe" + + os.system(f"{adb_path} connect {args.adb}") + + aapo = AapoManager(libs_dir) + devices = aapo.adbl.devices + + print( + f"\n===== {args.start_rank}位から{args.end_rank}位までキャプチャします。 =====\n" + ) for i, device in enumerate(devices): if device == "": @@ -104,7 +110,9 @@ def auto_capture(start: int, end: int): try: checkImg(template_dir_path + "player1.png") except TimeoutError: - err(f"{current_rank}位: 総督情報の表示に失敗しました。キャプチャをスキップします。 -> {current_rank}.png") + err( + f"{current_rank}位: 総督情報の表示に失敗しました。キャプチャをスキップします。 -> {current_rank}.png" + ) if aapo.chkImg(template_dir_path + "ranking.png"): aapo.swipeTouchPos( RANKING_TAP_POS_X, @@ -115,7 +123,9 @@ def auto_capture(start: int, end: int): ) continue else: - err(f"ランキングの表示に失敗しました。処理を中止します。 -> {current_rank}.png") + err( + f"ランキングの表示に失敗しました。処理を中止します。 -> {current_rank}.png" + ) sys.exit(1) # 撃破詳細表示・キャプチャ @@ -125,7 +135,9 @@ def auto_capture(start: int, end: int): try: checkImg(template_dir_path + "kill.png") except TimeoutError: - err(f"{current_rank}位: 撃破詳細の表示に失敗しました。キャプチャをスキップします。 -> {current_rank}.png") + err( + f"{current_rank}位: 撃破詳細の表示に失敗しました。キャプチャをスキップします。 -> {current_rank}.png" + ) returnToRankingScreen() continue @@ -138,7 +150,9 @@ def auto_capture(start: int, end: int): try: checkImg(template_dir_path + "player2.png") except TimeoutError: - err(f"{current_rank}位: 詳細情報の表示に失敗しました。キャプチャをスキップします。 -> {current_rank}.png") + err( + f"{current_rank}位: 詳細情報の表示に失敗しました。キャプチャをスキップします。 -> {current_rank}.png" + ) returnToRankingScreen() continue @@ -191,7 +205,9 @@ def returnToRankingScreen(current_screen: str = None): returnToRankingScreen("DETAIL") return else: - err(f"ランキングの表示に失敗しました。処理を中止します。 -> {current_rank}.png") + err( + f"ランキングの表示に失敗しました。処理を中止します。 -> {current_rank}.png" + ) sys.exit(1) # 前の画面へ戻る else: diff --git a/libs/AdbWinApi.dll b/libs/AdbWinApi.dll new file mode 100644 index 0000000..82163cc Binary files /dev/null and b/libs/AdbWinApi.dll differ diff --git a/libs/adb.exe b/libs/adb.exe new file mode 100644 index 0000000..f19d9cb Binary files /dev/null and b/libs/adb.exe differ