Merge branch 'dev_battle' of https://git.zhaozuohong.vip/mower-ng/mower-ng into dev_battle

This commit is contained in:
Elaina 2024-10-11 19:54:29 +08:00
commit 224b69b3a1
6 changed files with 90 additions and 37 deletions

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

Binary file not shown.

View file

@ -5,6 +5,7 @@ from scipy.signal import argrelmax
from skimage.metrics import structural_similarity from skimage.metrics import structural_similarity
from mower.models import secret_front from mower.models import secret_front
from mower.solvers.battle_choose import BattleChooseSolver
from mower.solvers.navigation import NavigationSolver from mower.solvers.navigation import NavigationSolver
from mower.utils import config from mower.utils import config
from mower.utils import typealias as tp from mower.utils import typealias as tp
@ -463,6 +464,8 @@ class AutoFight(SceneGraphSolver):
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()
elif scene == Scene.OPERATOR_SELECT: elif scene == Scene.OPERATOR_SELECT:
BattleChooseSolver().run(self.level_name, self.opers, squad=2)
self.tap((1655, 781)) self.tap((1655, 781))
elif scene == Scene.STORY: elif scene == Scene.STORY:
self.tap_element("story_skip") self.tap_element("story_skip")

View file

@ -3,7 +3,7 @@ from .choose_squad import ChooseSquadSolver
class BattleChooseSolver: class BattleChooseSolver:
def run(self, level_name: str, opers: list, groups: list = None, squad: int = None): def run(self, level_name: str, opers: list, groups: list = [], squad: int = None):
""" """
Args: Args:
level_name: 关卡名 level_name: 关卡名
@ -13,4 +13,4 @@ class BattleChooseSolver:
""" """
if squad: if squad:
ChooseSquadSolver().run(level_name, squad) ChooseSquadSolver().run(level_name, squad)
BattleAgentChooseSolver().run(opers, groups) BattleAgentChooseSolver().run(opers + groups)

View file

@ -2,6 +2,8 @@ import math
from copy import deepcopy from copy import deepcopy
import cv2 import cv2
from matplotlib import pyplot as plt
from numpy import choose
from mower.data import agent_list from mower.data import agent_list
from mower.utils import config from mower.utils import config
@ -17,7 +19,7 @@ from .choose_skill import ChooseSkillSolver
class BattleAgentChooseSolver(SceneGraphSolver): class BattleAgentChooseSolver(SceneGraphSolver):
def run(self, agents: list, groups: list = None) -> None: def run(self, agents: list) -> None:
if agents == []: if agents == []:
raise ValueError("干员列表为空") raise ValueError("干员列表为空")
self.agents = agents self.agents = agents
@ -26,56 +28,101 @@ class BattleAgentChooseSolver(SceneGraphSolver):
self.filter = False self.filter = False
self.agent = None self.agent = None
self.choosed = [] self.choosed = []
self.final_check = False
self.first_mode = {"flag": True, "agents": []} self.check = []
self.lack = []
self.tmp_data = {}
self.swipe_time = 0
super().run() super().run()
return self.lack
def choose_agents(self): def choose_agents(self):
if self.final_check:
if pos := self.find("choose_agent/foldup"):
self.tap(pos, interval=0.1)
return
check = self.get_agent_pos()
if check:
for i in check:
if i in self.choosed:
self.check.append(i)
if (len(self.check) + len(self.lack)) == len(self.agents):
self.tap_element("choose_agent/battle_confirm")
return True
elif (len(self.check) + len(self.lack)) < len(self.agents):
self.swipe_noinertia((1000, 540), (-1900, 0))
return
else:
logger.error("选人失败")
return False
if pos := self.find("choose_agent/open_profession"): if pos := self.find("choose_agent/open_profession"):
self.tap(pos, interval=0.1) self.tap(pos, interval=0.1)
agents = dict(operator_team_select(config.recog.img)) if self.cleard is False:
if self.find("choose_agent/battle_empty"):
self.cleard = True
else:
self.tap_element("choose_agent/clear_battle", interval=0.1)
return
now_choose = self.get_agent_pos()
if self.cleard is False and len(now_choose) > 0:
self.tap_element("choose_agent/clear_battle", interval=0.1)
return
else:
self.cleard = True
logger.info(now_choose)
if self.agent is None: if self.agent is None:
self.agent = self.agents_copy.pop(0) self.agent = self.agents_copy.pop(0)
elif self.agent["name"] in now_choose.keys(): elif self.agent["name"] not in self.choosed:
ChooseSkillSolver().run(self.agent["skill"]) now_choose = self.get_agent_pos()
self.tag_choosed() if self.agent["name"] in now_choose:
try: ChooseSkillSolver().run(self.agent["skill"])
self.agent = self.agents_copy.pop(0) self.choosed.append(self.agent["name"])
except IndexError as e:
logger.info(f"{e}")
return
if len(self.agents_copy) > 0:
tmp = self.agents_copy.pop(0)
else:
self.final_check = True
self.tag_choosed()
return
if "opers" in tmp:
tag = agent_list[tmp["opers"][-1]["name"]]["profession"]
else:
tag = agent_list[tmp["name"]]["profession"]
if agent_list[self.agent["name"]]["profession"] == tag:
self.tag_choosed()
self.tag_choosed(tag)
self.agent = tmp
config.recog.update()
agents = dict(operator_team_select(config.recog.img))
if "opers" in self.agent: if "opers" in self.agent:
for i in self.agent["opers"]: for i in self.agent["opers"]:
if i["name"] in agents.keys(): if i["name"] in agents.keys():
self.agent = i self.agent = i
self.tap(agents[i["name"]], interval=0.1) self.tap(agents[i["name"]], interval=0.2)
return return
if self.tag_choosed(agent_list[i["name"]]["profession"]):
return
else:
self.swipe_noinertia((1000, 540), (-1900, 0), interval=1)
else: else:
try: try:
self.tap(agents[self.agent["name"]], interval=0.1) self.tap(agents[self.agent["name"]], interval=0.2)
return return
except KeyError: except KeyError:
if self.tag_choosed(agent_list[self.agent["name"]]["profession"]): if self.tag_choosed(agent_list[self.agent["name"]]["profession"]):
return return
else:
self.swipe_noinertia((1000, 540), (-1900, 0), interval=0.5) if set(agents.keys()).issubset(self.tmp_data.keys()):
self.swipe_time = self.swipe_time + 1
if self.swipe_time > 3:
logger.error(f"选择干员: {self.agent}失败 滑动次数过多")
self.lack.append(self.agent)
self.agent = None
return
else:
self.swipe_time = 0
self.swipe_noinertia((1000, 540), (-1900, 0))
self.tmp_data = agents
return
def get_agent_pos(self): def get_agent_pos(self):
img = cv2.cvtColor(config.recog.img, cv2.COLOR_RGB2HSV) img = cv2.cvtColor(config.recog.img, cv2.COLOR_RGB2HSV)
@ -86,12 +133,8 @@ class BattleAgentChooseSolver(SceneGraphSolver):
if cv2.contourArea(contour) < 40000 or cv2.contourArea(contour) > 100000: if cv2.contourArea(contour) < 40000 or cv2.contourArea(contour) > 100000:
continue continue
# 近似轮廓 # 近似轮廓
approx = cv2.approxPolyDP(contour, cv2.arcLength(contour, True), True)
cv2.drawContours(config.recog.img, [approx], 0, (0, 255, 0), 3)
x, y, w, h = cv2.boundingRect(contour) x, y, w, h = cv2.boundingRect(contour)
current_segment = ((x, y), (x + w, y + h)) current_segment = ((x, y), (x + w, y + h))
is_close = False is_close = False
for segment in segments: for segment in segments:
if ( if (
@ -99,7 +142,7 @@ class BattleAgentChooseSolver(SceneGraphSolver):
math.pow(segment[0][0] - current_segment[0][0], 2) math.pow(segment[0][0] - current_segment[0][0], 2)
+ math.pow(segment[0][1] - current_segment[0][1], 2) + math.pow(segment[0][1] - current_segment[0][1], 2)
) )
< 50 < 40
): ):
is_close = True is_close = True
break break
@ -109,7 +152,7 @@ class BattleAgentChooseSolver(SceneGraphSolver):
segments.append(current_segment) segments.append(current_segment)
logger.debug(f"segments:{segments}") logger.debug(f"segments:{segments}")
return dict(match_portrait(config.recog.gray, segment=segments)) return list(dict(match_portrait(config.recog.gray, segment=segments)).keys())
def tag_choosed(self, profession: str = "ALL"): def tag_choosed(self, profession: str = "ALL"):
str = "choose_agent/profession/" + profession str = "choose_agent/profession/" + profession

View file

@ -98,6 +98,8 @@ class RIIC_ChooseSolver(SceneGraphSolver, BaseMixin):
self.swipe_time = self.swipe_time + 1 self.swipe_time = self.swipe_time + 1
if self.swipe_time > 3: if self.swipe_time > 3:
raise ValueError("选择干员失败 滑动次数过多") raise ValueError("选择干员失败 滑动次数过多")
else:
self.swipe_time = 0
self.tmp_data = agents self.tmp_data = agents
logger.info(agents) logger.info(agents)

View file

@ -112,6 +112,8 @@ template_matching = {
"collection_small": (1053, 982), "collection_small": (1053, 982),
"connecting": (1087, 978), "connecting": (1087, 978),
"credit_visiting": (78, 220), "credit_visiting": (78, 220),
"choose_agent/battle_confirm": (1591, 991),
"choose_agent/battle_empty": (92, 296),
"choose_agent/profession/ALL": (1828, 46), "choose_agent/profession/ALL": (1828, 46),
"choose_agent/profession/choose_arrow": ((1850, 125), (1920, 1080)), "choose_agent/profession/choose_arrow": ((1850, 125), (1920, 1080)),
"choose_agent/profession/CASTER": (1825, 630), "choose_agent/profession/CASTER": (1825, 630),