参照保全优化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,
squad: int = None,
support_oper: list = [],
min_elite: int = 2,
min_level: int = 60,
retry_times: int = 10,
):
"""
Args:
@ -36,8 +33,5 @@ class FightSolver:
groups,
squad,
support_oper,
min_elite,
min_level,
retry_times,
)
AutoFight().run(level_name, opers, actions, groups)

View file

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

View file

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

View file

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