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

View file

@ -3,7 +3,7 @@ from .choose_squad import ChooseSquadSolver
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:
level_name: 关卡名
@ -13,4 +13,4 @@ class BattleChooseSolver:
"""
if 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
import cv2
from matplotlib import pyplot as plt
from numpy import choose
from mower.data import agent_list
from mower.utils import config
@ -17,7 +19,7 @@ from .choose_skill import ChooseSkillSolver
class BattleAgentChooseSolver(SceneGraphSolver):
def run(self, agents: list, groups: list = None) -> None:
def run(self, agents: list) -> None:
if agents == []:
raise ValueError("干员列表为空")
self.agents = agents
@ -26,56 +28,101 @@ class BattleAgentChooseSolver(SceneGraphSolver):
self.filter = False
self.agent = None
self.choosed = []
self.first_mode = {"flag": True, "agents": []}
self.final_check = False
self.check = []
self.lack = []
self.tmp_data = {}
self.swipe_time = 0
super().run()
return self.lack
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"):
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:
self.agent = self.agents_copy.pop(0)
elif self.agent["name"] in now_choose.keys():
ChooseSkillSolver().run(self.agent["skill"])
self.tag_choosed()
try:
self.agent = self.agents_copy.pop(0)
except IndexError as e:
logger.info(f"{e}")
return
elif self.agent["name"] not in self.choosed:
now_choose = self.get_agent_pos()
if self.agent["name"] in now_choose:
ChooseSkillSolver().run(self.agent["skill"])
self.choosed.append(self.agent["name"])
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:
for i in self.agent["opers"]:
if i["name"] in agents.keys():
self.agent = i
self.tap(agents[i["name"]], interval=0.1)
self.tap(agents[i["name"]], interval=0.2)
return
if self.tag_choosed(agent_list[i["name"]]["profession"]):
return
else:
self.swipe_noinertia((1000, 540), (-1900, 0), interval=1)
else:
try:
self.tap(agents[self.agent["name"]], interval=0.1)
self.tap(agents[self.agent["name"]], interval=0.2)
return
except KeyError:
if self.tag_choosed(agent_list[self.agent["name"]]["profession"]):
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):
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:
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)
current_segment = ((x, y), (x + w, y + h))
is_close = False
for segment in segments:
if (
@ -99,7 +142,7 @@ class BattleAgentChooseSolver(SceneGraphSolver):
math.pow(segment[0][0] - current_segment[0][0], 2)
+ math.pow(segment[0][1] - current_segment[0][1], 2)
)
< 50
< 40
):
is_close = True
break
@ -109,7 +152,7 @@ class BattleAgentChooseSolver(SceneGraphSolver):
segments.append(current_segment)
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"):
str = "choose_agent/profession/" + profession

View file

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

View file

@ -112,6 +112,8 @@ template_matching = {
"collection_small": (1053, 982),
"connecting": (1087, 978),
"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/choose_arrow": ((1850, 125), (1920, 1080)),
"choose_agent/profession/CASTER": (1825, 630),