94 lines
3.1 KiB
Python
94 lines
3.1 KiB
Python
from mower.solvers.navigation import NavigationSolver
|
|
from mower.utils import config
|
|
from mower.utils import typealias as tp
|
|
from mower.utils.graph import SceneGraphSolver
|
|
from mower.utils.log import logger
|
|
from mower.utils.scene import Scene
|
|
from mower.utils.tile_pos import Calc, find_level
|
|
|
|
from .mixin import FightMixin
|
|
|
|
|
|
class AutoFight(SceneGraphSolver, FightMixin):
|
|
solver_name = "自动战斗"
|
|
|
|
def run(
|
|
self,
|
|
level_name: str,
|
|
opers: tp.Opers = [],
|
|
actions: list = [],
|
|
groups: tp.Groups = [],
|
|
):
|
|
"""
|
|
Args:
|
|
level_name: 关卡名
|
|
opers: 干员列表
|
|
actions: 行动列表
|
|
groups: 干员组列表
|
|
"""
|
|
logger.info("Start: 自动战斗")
|
|
logger.info("地图坐标计算:https://github.com/yuanyan3060/Arknights-Tile-Pos")
|
|
if level_name.endswith("#"):
|
|
level_name = level_name[:-1]
|
|
self.level_name = level_name
|
|
if (level := find_level(level_name, level_name)) is None:
|
|
logger.error(f"找不到关卡:{level_name}")
|
|
return False
|
|
self.calc = Calc(1920, 1080, level)
|
|
self.opers: list[dict] = opers # 干员列表
|
|
self.groups = groups # 干员组
|
|
self.strategies_copy = [] # 无策略,用于统一与保全的格式
|
|
self.actions_copy = actions # 行动列表备份
|
|
self.success = True
|
|
self.reset()
|
|
super().run()
|
|
return self.success
|
|
|
|
def kills(self) -> int:
|
|
"获取击杀数"
|
|
return super().kills(((800, 30), (950, 60)))
|
|
|
|
def breach_solver(self):
|
|
if (strategy := config.conf.work.enemy_breach_strategy) == "give_up":
|
|
self.scene_graph_navigation(Scene.OPERATOR_FAILED)
|
|
elif strategy == "restart_game":
|
|
config.device.exit()
|
|
self.success = False
|
|
return True
|
|
return False
|
|
|
|
def transition(self):
|
|
if (scene := self.scene()) == Scene.OPERATOR_FIGHT:
|
|
if self.loading:
|
|
self.fight_init()
|
|
return
|
|
if self.find("fight/pause_sign") and not self.find(
|
|
"fight/pause"
|
|
): # 对话剧情
|
|
self.tap((20, 20))
|
|
return
|
|
if self.find("fight/breach"):
|
|
if self.breach_solver():
|
|
return True
|
|
self.travel_watching_skills()
|
|
self.execute_action()
|
|
|
|
elif scene == Scene.OPERATOR_FAILED:
|
|
logger.warning("行动失败,请检查干员/练度")
|
|
self.success = False
|
|
return True
|
|
|
|
elif scene == Scene.OPERATOR_FINISH:
|
|
logger.info("行动结束")
|
|
return True
|
|
|
|
elif scene in self.waiting_scene:
|
|
self.waiting_solver()
|
|
elif scene == Scene.OPERATOR_SELECT:
|
|
self.tap((1655, 781))
|
|
elif scene == Scene.STORY:
|
|
self.tap("story_skip")
|
|
elif scene == Scene.STORY_SKIP:
|
|
self.tap("story_skip_confirm_dialog", x_rate=0.94)
|
|
else:
|
|
NavigationSolver().run(self.level_name, mode="copy")
|