Skip to content
This repository has been archived by the owner on May 6, 2024. It is now read-only.

Commit

Permalink
NoxPlayer 7からBlueStacks 5に移行
Browse files Browse the repository at this point in the history
  • Loading branch information
iwbc committed Mar 27, 2024
1 parent bb7e5cb commit 1d8d991
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 40 deletions.
72 changes: 47 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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で以下のコマンドを入力し、動作に必要なモジュールをインストールしてください。

Expand All @@ -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 | 実行時の日付<br>(年-月-日| キャプチャの保存先ディレクトリ名 |
| -s, --start-rank | 1 | キャプチャ開始順位<br>※ 4位以降から撮影開始する場合は、指定した順位が戦力ランキングの上から4番目に位置するよう表示してください |
| -e, --end-rank | 1000 | キャプチャ終了順位 |
| --delay | 1 | 各画面遷移時の待機時間調整倍率<br>例えば2を渡すと本来0.5秒待機するところが1秒待機となります |
| オプション | デフォルト値 | 説明 |
| ---------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------ |
| -d, --dir | 実行時の日付<br>(YYYY-MM-DD| キャプチャの保存先ディレクトリ名 |
| -s, --start-rank | 1 | キャプチャ開始順位<br>※ 4位以降から撮影開始する場合は、指定した順位が戦力ランキングの上から4番目に位置するよう表示してください |
| -e, --end-rank | 1000 | キャプチャ終了順位 |
| --delay | 1 | 各画面遷移時の待機時間調整倍率<br>例えば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
Expand All @@ -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

### セットアップ
Expand Down Expand Up @@ -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対象 |
Expand Down
6 changes: 3 additions & 3 deletions autocap.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
40 changes: 28 additions & 12 deletions autocap.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import os
import sys
from pathlib import Path
import datetime
import argparse
import pyperclip
Expand All @@ -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位])
Expand All @@ -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")
)
Expand All @@ -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 == "":
Expand Down Expand Up @@ -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,
Expand All @@ -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)

# 撃破詳細表示・キャプチャ
Expand All @@ -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

Expand All @@ -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

Expand Down Expand Up @@ -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:
Expand Down
Binary file added libs/AdbWinApi.dll
Binary file not shown.
Binary file added libs/adb.exe
Binary file not shown.

0 comments on commit 1d8d991

Please sign in to comment.