参照保全优化AutoFight

This commit is contained in:
Elaina 2024-10-17 17:18:40 +08:00
parent edb37a0660
commit 2032c6b5c8
4 changed files with 28 additions and 16 deletions

View file

@ -12,9 +12,6 @@ class FightSolver:
auto_choose: bool = True, auto_choose: bool = True,
squad: int = None, squad: int = None,
support_oper: list = [], support_oper: list = [],
min_elite: int = 2,
min_level: int = 60,
retry_times: int = 10,
): ):
""" """
Args: Args:
@ -36,8 +33,5 @@ class FightSolver:
groups, groups,
squad, squad,
support_oper, support_oper,
min_elite,
min_level,
retry_times,
) )
AutoFight().run(level_name, opers, actions, groups) AutoFight().run(level_name, opers, actions, groups)

View file

@ -1,3 +1,5 @@
from copy import deepcopy
import cv2 import cv2
from scipy.signal import argrelmax from scipy.signal import argrelmax
from skimage.metrics import structural_similarity from skimage.metrics import structural_similarity
@ -35,9 +37,9 @@ class AutoFight(SceneGraphSolver):
self.level_name = level_name self.level_name = level_name
level = find_level(level_name, None) level = find_level(level_name, None)
self.calc = Calc(1920, 1080, level) self.calc = Calc(1920, 1080, level)
self.actions = actions # 行动列表 self.actions = deepcopy(actions) # 行动列表
self.opers = opers # 干员列表 self.opers = opers # 干员列表
self.groups = groups # 干员组 self.groups = deepcopy(groups) # 干员组
self.speed = 1 # 一倍/二倍速 self.speed = 1 # 一倍/二倍速
self.loading = True # 等待加载 self.loading = True # 等待加载
self.playing = True # 暂停/继续 self.playing = True # 暂停/继续
@ -49,7 +51,9 @@ class AutoFight(SceneGraphSolver):
self.post_delay = 0 # 行动后等待时间 self.post_delay = 0 # 行动后等待时间
self.watching = {} # 需要开技能的干员 self.watching = {} # 需要开技能的干员
self.replacements = {} # 将干员组的名字替换为对应干员 self.replacements = {} # 将干员组的名字替换为对应干员
self.success = True
super().run() super().run()
return self.success
def change_group(self): def change_group(self):
for group in self.groups: for group in self.groups:
@ -61,7 +65,7 @@ class AutoFight(SceneGraphSolver):
def update_watching(self): def update_watching(self):
for op in self.opers: for op in self.opers:
name = op["name"] name = op["name"]
self.watching[name] = op self.watching[name] = deepcopy(op)
self.watching[name]["location"] = None self.watching[name]["location"] = None
def number(self, scope: tp.Scope, height: int, thres: int) -> int: def number(self, scope: tp.Scope, height: int, thres: int) -> int:
@ -198,6 +202,8 @@ class AutoFight(SceneGraphSolver):
def update_operators(self): def update_operators(self):
"识别可部署的干员" "识别可部署的干员"
if config.conf.avatar_recog_pause:
self.pause()
config.recog.update() config.recog.update()
y = 887 y = 887
img = cropimg(config.recog.gray, ((0, y), (1920, 905))) img = cropimg(config.recog.gray, ((0, y), (1920, 905)))
@ -231,6 +237,8 @@ class AutoFight(SceneGraphSolver):
name = self.replacements[name] if name in self.replacements else name name = self.replacements[name] if name in self.replacements else name
self.operators[name] = {"scope": scope, "cost": cost[idx]} self.operators[name] = {"scope": scope, "cost": cost[idx]}
logger.debug(self.operators) logger.debug(self.operators)
if config.conf.avatar_recog_pause:
self.play()
@property @property
def action(self): def action(self):
@ -378,7 +386,11 @@ class AutoFight(SceneGraphSolver):
pos = self.calc.get_skill_screen_pos(x, y) pos = self.calc.get_skill_screen_pos(x, y)
pos = int(pos.x), int(pos.y) pos = int(pos.x), int(pos.y)
self.tap(pos) self.tap(pos)
self.sleep(1) self.sleep(0.8)
if self.find("fight/attack"):
self.tap((1900, 30))
return False
return True
def action_skill(self): def action_skill(self):
"使用action中指定位置的技能" "使用action中指定位置的技能"
@ -414,7 +426,7 @@ class AutoFight(SceneGraphSolver):
continue continue
x, y = self.location[w] x, y = self.location[w]
if self.skill_ready(x, y): if self.skill_ready(x, y):
self.use_skill(x, y) if self.use_skill(x, y):
if d["skill_usage"] == 2: if d["skill_usage"] == 2:
d["skill_times"] -= 1 d["skill_times"] -= 1
if d["skill_times"] <= 0: if d["skill_times"] <= 0:
@ -450,6 +462,7 @@ class AutoFight(SceneGraphSolver):
elif scene == Scene.OPERATOR_FAILED: elif scene == Scene.OPERATOR_FAILED:
logger.warning("行动失败,请检查干员/练度") logger.warning("行动失败,请检查干员/练度")
self.success = False
return True return True
elif scene == Scene.OPERATOR_FINISH: elif scene == Scene.OPERATOR_FINISH:
@ -458,6 +471,7 @@ class AutoFight(SceneGraphSolver):
elif scene == Scene.CONFIRM: elif scene == Scene.CONFIRM:
logger.warning("被顶号") logger.warning("被顶号")
self.success = False
return True return True
elif scene in self.waiting_scene: elif scene in self.waiting_scene:

View file

@ -152,6 +152,7 @@ template_matching = {
"episode": (535, 937), "episode": (535, 937),
"factory_accelerate": (1800, 775), "factory_accelerate": (1800, 775),
"fight/attack": (15, 270), "fight/attack": (15, 270),
"fight/defend": (27, 406),
"fight/gear": (82, 45), "fight/gear": (82, 45),
"fight/use": (1037, 845), "fight/use": (1037, 845),
"friend_list": (61, 306), "friend_list": (61, 306),

View file

@ -16,6 +16,8 @@ Res = Literal[
"business_card", "business_card",
"choose_agent/battle_confirm", "choose_agent/battle_confirm",
"choose_agent/battle_empty", "choose_agent/battle_empty",
"choose_agent/battle_filter",
"choose_agent/battle_filter_close",
"choose_agent/clear", "choose_agent/clear",
"choose_agent/clear_battle", "choose_agent/clear_battle",
"choose_agent/confirm", "choose_agent/confirm",
@ -116,6 +118,7 @@ Res = Literal[
"fight/collection", "fight/collection",
"fight/collection_on", "fight/collection_on",
"fight/complete", "fight/complete",
"fight/defend",
"fight/elite1", "fight/elite1",
"fight/elite2", "fight/elite2",
"fight/enemy", "fight/enemy",