add:填充干员

This commit is contained in:
EightyDollars 2024-10-17 10:59:31 +08:00
parent c1b23205ee
commit e7973867ce
5 changed files with 264 additions and 2 deletions

BIN
mower/resources/choose_agent/battle_filter.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
mower/resources/choose_agent/battle_filter_close.png (Stored with Git LFS) Normal file

Binary file not shown.

View file

@ -0,0 +1,126 @@
import math
import numpy as np
from mower.solvers.fight.battle_choose.battle_filter import BattleFilterSolver
from mower.utils import config
from mower.utils.character_recognize import segment_team_select
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.image import cmatch, cropimg
from mower.utils.scene import Scene
from mower.utils.vector import va
# 按需填充干员
class BattleAgentChooseSolver(SceneGraphSolver):
def __init__(self) -> None:
self.labels = [
"获取时间",
"信赖值",
"生命上限",
"攻击",
"防御",
"法术抗性",
"再部署",
"部署费用",
"阻挡数",
"攻击速度",
"等级",
"稀有度",
]
self.profession = [
"PIONEER",
"WARRIOR",
"TANK",
"SNIPER",
"CASTER",
"MEDIC",
"SUPPORT",
"SPECIAL",
]
def run(self, label: str, number: int) -> None:
self.mode = None
# 0是非职业的筛选,如信赖值或等级
if label in self.labels:
self.mode = 0
# 1是干员职业的筛选
elif label in self.profession:
self.mode = 1
else:
raise KeyError(f"BattleAgentChooseSolver:填充干员标签错误{label}")
self.label = label
self.filter_done = False
self.number = number
super().run()
pass
def tag_choosed(self, profession: str = "ALL"):
str = "choose_agent/profession/" + profession
if pos := self.find(str):
if arrow := self.find("choose_agent/profession/choose_arrow"):
if (
math.sqrt(
math.pow(pos[0][0] - arrow[0][0], 2)
+ math.pow(pos[0][1] - arrow[0][1], 2)
)
< 100
):
return False
else:
self.tap(pos[0], interval=0.2)
return True
else:
self.tap(pos[0], interval=0.2)
return True
def filter(self):
if pos := self.find("choose_agent/open_profession"):
self.tap(pos, interval=0.1)
return
if self.mode == 1:
return self.tag_choosed(self.label)
elif self.mode == 0:
if BattleFilterSolver().run(self.label):
# 选全部干员
if self.find("choose_agent/foldup"):
return True
else:
return self.tag_choosed()
return
def fill_agent(self):
segments = segment_team_select(config.recog.img)
for i in segments:
segment = [va(i[0], (0, -95)), va(i[1], (0, -190))]
img = cropimg(config.recog.img, segment)
template = np.zeros((5, 5, 3), dtype=np.uint8)
template[:] = [120, 190, 220]
if cmatch(img, template, thresh=50):
continue
self.tap(i, interval=0.1)
config.recog.update()
img = cropimg(config.recog.img, segment)
if cmatch(img, template, thresh=50):
self.number = self.number - 1
else:
return
if self.number == 0:
return True
if self.number > 0:
self.swipe_noinertia((1000, 540), (-1900, 0))
return
def transition(self) -> bool:
if self.scene() == Scene.OPERATOR_AGENT_SELECT:
if self.filter_done is False:
if self.filter():
self.filter_done = True
return
return self.fill_agent()
else:
return False

View file

@ -0,0 +1,129 @@
import math
from re import I
import cv2
import numpy as np
from mower.utils import config
from mower.utils.graph.utils import SceneGraphSolver
from mower.utils.image import cropimg
from mower.utils.log import logger
from mower.utils.scene import Scene
class BattleFilterSolver(SceneGraphSolver):
def __init__(self) -> None:
self.labels = [
"获取时间",
"信赖值",
"生命上限",
"攻击",
"防御",
"法术抗性",
"再部署",
"部署费用",
"阻挡数",
"攻击速度",
]
self.orders = [
"等级",
"稀有度",
"自定义",
]
def run(self, tag: str, ascending: bool = True) -> None:
if tag not in self.labels and tag not in self.orders:
raise KeyError
self.tag = tag
self.ascending = ascending
self.label = "自定义"
self.tag_choose_done = False
if self.tag in self.orders:
self.tag_choose_done = True
self.in_label = False
self.label = self.tag
super().run()
return True
def get_now_filter(self):
image = cropimg(config.recog.img, [(1500, 90), (1900, 1080)])
hsv_image = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)
mask = cv2.inRange(hsv_image, (0, 200, 100), (140, 255, 255))
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
_, y, _, h = cv2.boundingRect(contour)
return f"{self.labels[ int((y + h / 2) / 90) ]}"
def tag_choosed(self, profession: str = "ALL"):
str = "choose_agent/profession/" + profession
if pos := self.find(str):
if arrow := self.find("choose_agent/profession/choose_arrow"):
if (
math.sqrt(
math.pow(pos[0][0] - arrow[0][0], 2)
+ math.pow(pos[0][1] - arrow[0][1], 2)
)
< 100
):
return False
else:
self.tap(pos[0], interval=0.2)
return True
else:
self.tap(pos[0], interval=0.2)
return True
def detect_arrange_order(self):
x_list = (1280, 1430, 1575)
y = 64
hsv = cv2.cvtColor(config.recog.img, cv2.COLOR_RGB2HSV)
mask = cv2.inRange(hsv, (99, 200, 0), (100, 255, 255))
for idx, x in enumerate(x_list):
if np.count_nonzero(mask[y : y + 3, x : x + 5]):
return (self.orders[idx], True)
if np.count_nonzero(mask[y + 10 : y + 13, x : x + 5]):
return (self.orders[idx], False)
def switch_arrange_order(self, name, ascending=False):
name_x = {"等级": 1280, "稀有度": 1430, "自定义": 1575}
if isinstance(name, int):
name = list(name_x.keys())[name - 1]
if isinstance(ascending, str):
ascending = ascending == "true"
name_y = 60
self.tap((name_x[name], name_y), interval=0.5)
def choose_tag(self):
if self.tag_choose_done:
if self.find("choose_agent/battle_filter_close"):
self.tap((1750, 60), interval=0.1)
return
n, s = self.detect_arrange_order()
if n != self.label or s != self.ascending:
self.switch_arrange_order(self.label, self.ascending)
return
return True
if not self.find("choose_agent/battle_filter_close"):
self.tap_element("choose_agent/battle_filter")
return
self.tap((1750, (self.labels.index(self.tag)) * 90 + 135), interval=0.1)
config.recog.update()
if str := self.get_now_filter():
if str == self.tag:
self.tag_choose_done = True
return
def transition(self) -> bool:
if self.scene() == Scene.OPERATOR_AGENT_SELECT:
return self.choose_tag()
else:
return False

View file

@ -57,7 +57,7 @@ def segment_team(img: tp.Image) -> list[tp.Scope]:
def segment_team_select(img: tp.Image) -> list[tp.Scope]: def segment_team_select(img: tp.Image) -> list[tp.Scope]:
"作战编队和训练位选干员" "作战编队和训练位选干员"
line1 = cropimg(img, ((600, 510), (1920, 511))) line1 = cropimg(img, ((600, 476), (1920, 477)))
hsv = cv2.cvtColor(line1, cv2.COLOR_RGB2HSV) hsv = cv2.cvtColor(line1, cv2.COLOR_RGB2HSV)
mask = cv2.inRange(hsv, (98, 140, 200), (102, 255, 255)) mask = cv2.inRange(hsv, (98, 140, 200), (102, 255, 255))
line1 = cv2.cvtColor(line1, cv2.COLOR_RGB2GRAY) line1 = cv2.cvtColor(line1, cv2.COLOR_RGB2GRAY)
@ -69,8 +69,9 @@ def segment_team_select(img: tp.Image) -> list[tp.Scope]:
name_x = [] name_x = []
for i in range(1, line1.shape[1]): for i in range(1, line1.shape[1]):
curr = last_line[i] curr = last_line[i]
if prev == 0 and curr == 255 and start and i - start > 96: if prev == 0 and curr == 255 and start and i - start > 70:
name_x.append((i + 415, i + 590)) name_x.append((i + 415, i + 590))
# name_x.append((i+460, i + 640))
elif prev == 255 and curr == 0: elif prev == 255 and curr == 0:
start = i start = i
prev = curr prev = curr