Merge branch 'dev_battle' of https://git.zhaozuohong.vip/mower-ng/mower-ng into dev_battle
This commit is contained in:
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
BIN
mower/resources/choose_agent/battle_confirm.png
(Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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),
|
||||||
|
|
Loading…
Reference in a new issue