Compare commits

...

5 commits

Author SHA1 Message Date
2485208fe5 fix:选人为空列表时报错
All checks were successful
ci/woodpecker/push/check_format Pipeline was successful
2024-10-12 17:16:18 +08:00
636f5a5ae4 优化AutoFight细节 2024-10-12 17:15:56 +08:00
3d73367de2 减少未找到干员的滑动次数 2024-10-12 17:14:06 +08:00
e0fd51d155 简化credit_fight写法,预留自动编队选项 2024-10-12 14:18:23 +08:00
9ba2b6c902 fix:无人时indexError 2024-10-12 14:17:02 +08:00
4 changed files with 42 additions and 51 deletions

View file

@ -56,16 +56,18 @@ class AutoFight(SceneGraphSolver):
def find_and_change_group_name(self, name: str) -> str:
if name in self.replacements:
return self.replacements[name]
for group in self.groups:
for i in range(len(self.groups) - 1, -1, -1):
group = self.groups[i]
if group["name"] == name:
for op in group["opers"]:
if op["name"] in self.operators:
self.replacements[name] = op["name"]
logger.debug(f"{name}替换为{op['name']}")
name = op["name"]
del op["name"]
self.watching[name] = op
self.watching[name]["location"] = None
del group
del self.groups[i]
return name
return name
@ -154,6 +156,8 @@ class AutoFight(SceneGraphSolver):
self.post_delay = 0
def check_condition(self) -> bool:
if "name" in self.action and self.action["name"] in self.replacements:
self.action["name"] = self.replacements[self.action["name"]]
if "kills" in self.action and self.action["kills"] > self.kills():
return False
if "costs" in self.action and self.action["costs"] > self.cost():
@ -313,9 +317,7 @@ class AutoFight(SceneGraphSolver):
def deploy(self):
"部署干员"
name = self.action["name"]
if self.groups or self.replacements:
name = self.find_and_change_group_name(name)
name = self.find_and_change_group_name(self.action["name"])
if name not in self.operators:
self.update_operators()
return
@ -391,8 +393,8 @@ class AutoFight(SceneGraphSolver):
sleep(0.5)
pos = self.calc.get_skill_screen_pos(x, y)
pos = int(pos.x), int(pos.y)
config.device.tap(pos)
sleep(0.5)
self.tap(pos)
self.sleep(1)
def action_skill(self):
"使用action中指定位置的技能"
@ -434,11 +436,11 @@ class AutoFight(SceneGraphSolver):
del self.watching[w]
return
if self.action is None:
self.sleep(1)
return
if not self.condition_satified:
self.condition_satified = self.check_condition()
return
logger.debug(self.action)
if self.action["type"] in ["SpeedUp", "二倍速"]:
self.toggle_speed()
elif self.action["type"] in ["Deploy", "部署"]:

View file

@ -114,7 +114,7 @@ class BattleAgentChooseSolver(SceneGraphSolver):
if set(agents.keys()).issubset(self.tmp_data.keys()):
self.swipe_time = self.swipe_time + 1
if self.swipe_time > 3:
if self.swipe_time > 1:
logger.error(f"选择干员: {self.agent}失败 滑动次数过多")
self.lack.append(self.agent)
self.agent = None

View file

@ -35,7 +35,7 @@ class ChooseSupportSolver(SceneGraphSolver):
def run(
self,
opers,
opers=[],
min_elite: int = 2,
min_level: int = 60,
retry_times: int = 10,
@ -50,12 +50,14 @@ class ChooseSupportSolver(SceneGraphSolver):
level_name: 关卡名称,用于导航,可不传
"""
self.opers_skill = {}
if opers is None:
if len(opers) == 0:
return True
for op in opers:
for i in range(len(opers) - 1, -1, -1): # 改变group的结构
op = opers[i]
if "opers" in op:
opers += op["opers"]
del op
del opers[i]
logger.debug(f"选择助战干员: {opers}")
for op in opers:
self.opers_skill[op["name"]] = op["skill"]
logger.info(f"Start: 选择助战干员{self.opers_skill}")

View file

@ -1,7 +1,6 @@
import cv2
from scipy.signal import argrelmin
from mower.solvers.fight.auto_fight import AutoFight
from mower.solvers.navigation import NavigationSolver
from mower.utils import config
from mower.utils.email import send_message
@ -10,6 +9,9 @@ from mower.utils.image import cropimg, loadres
from mower.utils.log import logger
from mower.utils.recognize import Scene
from .auto_fight import AutoFight
from .battle_choose import BattleChooseSolver
class CreditFight(SceneGraphSolver):
"""信用作战
@ -17,11 +19,25 @@ class CreditFight(SceneGraphSolver):
从首页导航至OF-1借助战并自动战斗
"""
def run(self):
def run(self, auto_choose: bool = False):
logger.info("Start: 信用作战")
self.support = False
navi_solver = NavigationSolver()
navi_solver.run("OF-1", mode="copy")
conf = config.conf.credit_fight
self.opers = [{"name": conf.operator, "skill": 1, "skill_usage": 1}]
self.actions = [
{"type": "SpeedUp"},
{
"type": "Deploy",
"name": conf.operator,
"location": [
conf.x,
conf.y,
],
"direction": conf.direction,
},
{"type": "SkillDaemon"},
]
self.auto_choose = auto_choose
super().run()
def choose_support(self):
@ -37,45 +53,17 @@ class CreditFight(SceneGraphSolver):
x = match[0]
return (x, 908), (x + 194, 983)
def current_squad(self):
count = []
for i in range(4):
hsv = cropimg(
config.recog.hsv, ((153 + i * 411, 990), (550 + i * 411, (1080)))
)
mask = cv2.inRange(hsv, (97, 0, 0), (101, 255, 255))
count.append(cv2.countNonZero(mask))
return count.index(max(count)) + 1
def transition(self):
if (scene := self.scene()) == Scene.OPERATOR_SELECT:
if self.auto_choose:
BattleChooseSolver().run("OF-1", self.opers)
self.auto_choose = False
if self.find("ope_select_start_empty"):
logger.info("编队内没有编入干员,停止OF-1")
return True
squad = self.current_squad()
target = config.conf.credit_fight.squad
if squad != target:
self.tap((target * 411 - 99, 1040))
return
if self.support:
# 开始行动
self.tap((1655, 781))
fight_solver = AutoFight()
conf = config.conf.credit_fight
actions = [
{"type": "SpeedUp"},
{
"type": "Deploy",
"name": conf.operator,
"location": [
conf.x,
conf.y,
],
"direction": conf.direction,
},
{"type": "SkillDaemon"},
]
fight_solver.run("OF-1", [], actions)
AutoFight().run("OF-1", self.opers, self.actions)
else:
# 借助战
self.ctap((1660, 315))
@ -94,5 +82,4 @@ class CreditFight(SceneGraphSolver):
elif scene in self.waiting_scene:
self.waiting_solver()
else:
navi_solver = NavigationSolver()
navi_solver.run("OF-1", mode="copy")
NavigationSolver().run("OF-1", "copy")