重写领取邮件;tap_element并入tap

This commit is contained in:
zhbaor 2024-11-18 16:01:48 +08:00
parent fd7b82892d
commit 4d01bf76cf
53 changed files with 206 additions and 178 deletions

BIN
mower/resources/mail/clean.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
mower/resources/mail/collect.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
mower/resources/mail/complete.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
mower/resources/mail/delete.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
mower/resources/read_mail.png (Stored with Git LFS)

Binary file not shown.

View file

@ -172,7 +172,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
elif scene == Scene.INFRA_TODOLIST: elif scene == Scene.INFRA_TODOLIST:
return self.todo_list() return self.todo_list()
elif scene == Scene.RIIC_OPERATOR_SELECT: elif scene == Scene.RIIC_OPERATOR_SELECT:
self.tap_element("confirm_blue") self.tap("confirm_blue")
else: else:
self.scene_graph_navigation(Scene.INFRA_MAIN) self.scene_graph_navigation(Scene.INFRA_MAIN)
self.last_room = "" self.last_room = ""
@ -1795,14 +1795,14 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
for _count in range(tap_times): for _count in range(tap_times):
self.tap((config.recog.w * 0.7, config.recog.h * 0.5), interval=0.1) self.tap((config.recog.w * 0.7, config.recog.h * 0.5), interval=0.1)
else: else:
self.tap_element("all_in") self.tap("all_in")
self.tap(accelerate, y_rate=1) self.tap(accelerate, y_rate=1)
else: else:
accelerate = self.find("bill_accelerate") accelerate = self.find("bill_accelerate")
while accelerate and not adjust_time: while accelerate and not adjust_time:
logger.info("贸易站加速") logger.info("贸易站加速")
self.tap(accelerate) self.tap(accelerate)
self.tap_element("all_in") self.tap("all_in")
self.tap((config.recog.w * 0.75, config.recog.h * 0.8)) self.tap((config.recog.w * 0.75, config.recog.h * 0.8))
config.recog.update() config.recog.update()
if not ( if not (
@ -1861,7 +1861,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
if wait_confirm > 0: if wait_confirm > 0:
logger.info(f"等待跑单 {str(wait_confirm)}") logger.info(f"等待跑单 {str(wait_confirm)}")
self.sleep(wait_confirm) self.sleep(wait_confirm)
self.tap_element("confirm_blue") self.tap("confirm_blue")
if self.find("arrange_confirm"): if self.find("arrange_confirm"):
_x0 = config.recog.w // 3 * 2 # double confirm _x0 = config.recog.w // 3 * 2 # double confirm
_y0 = config.recog.h - 10 _y0 = config.recog.h - 10
@ -1959,7 +1959,7 @@ class BaseSchedulerSolver(SceneGraphSolver, BaseMixin):
ed = ret[0][1][0] # 终点 ed = ret[0][1][0] # 终点
self.swipe_noinertia(st, (ed[0] - st[0], 0)) self.swipe_noinertia(st, (ed[0] - st[0], 0))
while self.find("confirm_blue"): while self.find("confirm_blue"):
self.tap_element("confirm_blue") self.tap("confirm_blue")
self.last_room = room self.last_room = room

View file

@ -87,8 +87,8 @@ class AutoFight(SceneGraphSolver, FightMixin):
elif scene == Scene.OPERATOR_SELECT: elif scene == Scene.OPERATOR_SELECT:
self.tap((1655, 781)) self.tap((1655, 781))
elif scene == Scene.STORY: elif scene == Scene.STORY:
self.tap_element("story_skip") self.tap("story_skip")
elif scene == Scene.STORY_SKIP: elif scene == Scene.STORY_SKIP:
self.tap_element("story_skip_confirm_dialog", x_rate=0.94) self.tap("story_skip_confirm_dialog", x_rate=0.94)
else: else:
NavigationSolver().run(self.level_name, mode="copy") NavigationSolver().run(self.level_name, mode="copy")

View file

@ -31,7 +31,7 @@ class BattleChooseSolver(SceneGraphSolver):
def transition(self): def transition(self):
if (scene := self.scene()) == Scene.OPERATOR_AGENT_SELECT: if (scene := self.scene()) == Scene.OPERATOR_AGENT_SELECT:
self.tap_element("choose_agent/battle_confirm") self.tap("choose_agent/battle_confirm")
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()
else: else:

View file

@ -139,13 +139,13 @@ class BattleAgentChooseSolver(SceneGraphSolver):
if self.find("choose_agent/battle_empty"): if self.find("choose_agent/battle_empty"):
self.cleard = True self.cleard = True
else: else:
self.tap_element("choose_agent/clear_battle", interval=0.1) self.tap("choose_agent/clear_battle", interval=0.1)
return return
return self.choose_agents() return self.choose_agents()
elif scene == Scene.OPERATOR_SELECT: elif scene == Scene.OPERATOR_SELECT:
self.tap_element("choose_agent/fast_select") self.tap("choose_agent/fast_select")
elif scene == Scene.SSS_SQUAD: elif scene == Scene.SSS_SQUAD:
self.tap_element("sss/choose/fast_select") self.tap("sss/choose/fast_select")
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()
else: else:

View file

@ -133,7 +133,7 @@ class BattleFillChooseSolver(SceneGraphSolver):
def transition(self) -> bool: def transition(self) -> bool:
if self.scene() == Scene.OPERATOR_AGENT_SELECT: if self.scene() == Scene.OPERATOR_AGENT_SELECT:
if self.find("fight/collection_on"): if self.find("fight/collection_on"):
self.tap_element("fight/collection_on") self.tap("fight/collection_on")
return return
if self.filter_done is False: if self.filter_done is False:
if self.filter(): if self.filter():

View file

@ -107,7 +107,7 @@ class BattleFilterSolver(SceneGraphSolver):
return True return True
if not self.find("choose_agent/battle_filter_close"): if not self.find("choose_agent/battle_filter_close"):
self.tap_element("choose_agent/battle_filter") self.tap("choose_agent/battle_filter")
return return
self.tap((1750, (self.labels.index(self.tag)) * 90 + 135), interval=0.1) self.tap((1750, (self.labels.index(self.tag)) * 90 + 135), interval=0.1)

View file

@ -80,7 +80,7 @@ class CheckCurrentTeamSolver(SceneGraphSolver):
def transition(self): def transition(self):
if (scene := self.scene()) == Scene.OPERATOR_AGENT_SELECT: if (scene := self.scene()) == Scene.OPERATOR_AGENT_SELECT:
if self.success: if self.success:
self.tap_element("choose_agent/battle_confirm") self.tap("choose_agent/battle_confirm")
return return
ChooseSkillSolver().run(self.skill) ChooseSkillSolver().run(self.skill)
self.success = True self.success = True

View file

@ -159,7 +159,7 @@ class ChooseSupportSolver(SceneGraphSolver):
if self.matched: if self.matched:
if self.find("fight/refresh"): if self.find("fight/refresh"):
self.swipe_noinertia((800, 350), (150, 0)) self.swipe_noinertia((800, 350), (150, 0))
self.tap_element("fight/refresh") self.tap("fight/refresh")
self.sleep(0.4) self.sleep(0.4)
self.retry_times -= 1 self.retry_times -= 1
self.matched = False self.matched = False
@ -182,7 +182,7 @@ class ChooseSupportSolver(SceneGraphSolver):
): ):
self.tap(skill_pos[self.skill - 1]) self.tap(skill_pos[self.skill - 1])
else: else:
self.tap_element("fight/use") self.tap("fight/use")
self.success = True self.success = True
elif scene == Scene.OPERATOR_SELECT: elif scene == Scene.OPERATOR_SELECT:
@ -201,7 +201,7 @@ class ChooseSupportSolver(SceneGraphSolver):
logger.warning("选择助战干员失败,请降低练度要求或添加好友") logger.warning("选择助战干员失败,请降低练度要求或添加好友")
return True return True
else: else:
self.tap_element("sss/choose/choose_support") self.tap("sss/choose/choose_support")
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()

View file

@ -114,10 +114,10 @@ class CopyWorksSolver(SceneGraphSolver):
return True return True
elif scene == Scene.OPERATOR_BEFORE: elif scene == Scene.OPERATOR_BEFORE:
if self.level_name.endswith("#"): if self.level_name.endswith("#"):
self.tap_element("ope_ex_start") self.tap("ope_ex_start")
return return
self.tap_element("ope_start") self.tap("ope_start")
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()
else: else:

View file

@ -87,7 +87,7 @@ class CreditFight(SceneGraphSolver):
elif scene == Scene.OPERATOR_SUPPORT: elif scene == Scene.OPERATOR_SUPPORT:
self.tap(self.choose_support()) self.tap(self.choose_support())
elif scene == Scene.OPERATOR_SUPPORT_AGENT: elif scene == Scene.OPERATOR_SUPPORT_AGENT:
self.tap_element("fight/use") self.tap("fight/use")
elif scene == Scene.OPERATOR_FINISH: elif scene == Scene.OPERATOR_FINISH:
return True return True
elif scene == Scene.OPERATOR_FAILED: elif scene == Scene.OPERATOR_FAILED:

View file

@ -92,7 +92,7 @@ class RIIC_ChooseSolver(SceneGraphSolver, BaseMixin):
if self.is_choosed(agents[i]) and agents[i][0][0] < 1600: if self.is_choosed(agents[i]) and agents[i][0][0] < 1600:
if i not in self.agents and i not in self.choosed: if i not in self.agents and i not in self.choosed:
logger.debug(f"错选 {i}") logger.debug(f"错选 {i}")
self.tap_element("choose_agent/clear", interval=0.1) self.tap("choose_agent/clear", interval=0.1)
self.agents_copy = deepcopy(self.agents) self.agents_copy = deepcopy(self.agents)
self.choosed = [] self.choosed = []
self.agent = None self.agent = None
@ -212,11 +212,11 @@ class RIIC_ChooseSolver(SceneGraphSolver, BaseMixin):
if contain_choose is False or len(self.agents) == 1: if contain_choose is False or len(self.agents) == 1:
self.cleard = True self.cleard = True
else: else:
self.tap_element("choose_agent/clear", interval=0.1) self.tap("choose_agent/clear", interval=0.1)
return return
if self.riic_agent_choose(): if self.riic_agent_choose():
self.sleep(self.check_wait_time()) self.sleep(self.check_wait_time())
self.tap_element("confirm_blue") self.tap("confirm_blue")
self.success = True self.success = True
elif self.find("room_detail"): elif self.find("room_detail"):

View file

@ -28,7 +28,7 @@ class DailySolver(SceneGraphSolver):
"clue/icon_notification", scope=((1400, 0), (1920, 400)) "clue/icon_notification", scope=((1400, 0), (1920, 400))
) and (clue := clue_cls("daily")): ) and (clue := clue_cls("daily")):
logger.info(f"领取今日线索({clue}号)") logger.info(f"领取今日线索({clue}号)")
self.tap_element("clue/button_get") self.tap("clue/button_get")
else: else:
# 今日线索已领取,点X退出 # 今日线索已领取,点X退出
self.tap((1484, 152)) self.tap((1484, 152))

View file

@ -99,7 +99,7 @@ class SwitchAssistantsSolver(SceneGraphSolver, BaseMixin):
if name := BattleFillChooseSolver().run("信赖值", 1, self.black_list): if name := BattleFillChooseSolver().run("信赖值", 1, self.black_list):
self.black_list.append(name[0]) self.black_list.append(name[0])
if self.find("choose_agent/battle_confirm"): if self.find("choose_agent/battle_confirm"):
self.tap_element("choose_agent/battle_confirm") self.tap("choose_agent/battle_confirm")
self.sleep(0.5) self.sleep(0.5)
else: else:
self.scene_graph_step(Scene.RIIC_REPORT) self.scene_graph_step(Scene.RIIC_REPORT)

View file

@ -85,7 +85,7 @@ class ChooseProductSolver(SceneGraphSolver):
else: else:
self.tap(self.second_pos) self.tap(self.second_pos)
elif scene == Scene.PRODUCT_SWITCHING_CONFIRM: elif scene == Scene.PRODUCT_SWITCHING_CONFIRM:
self.tap_element("double_confirm/main", x_rate=1) self.tap("double_confirm/main", x_rate=1)
self.success = True self.success = True
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()

View file

@ -1,3 +1,6 @@
from datetime import timedelta
from mower.utils import config
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.log import logger from mower.utils.log import logger
from mower.utils.recognize import Scene from mower.utils.recognize import Scene
@ -5,18 +8,30 @@ from mower.utils.recognize import Scene
class MailSolver(SceneGraphSolver): class MailSolver(SceneGraphSolver):
solver_name = "领取邮件" solver_name = "领取邮件"
solver_max_duration = timedelta(minutes=2)
def run(self) -> None: def run(self):
self.touched = False self.read = False
logger.info("Start: 领取邮件")
return super().run() return super().run()
def transition(self) -> bool: def transition(self):
if self.scene() == Scene.MAIL: if self.scene() == Scene.MAIL:
if self.touched: if not self.read:
if self.find("mail/complete"):
logger.info("没有未领取邮件")
self.read = True
self.solver_update_before_transition = False
else:
logger.info("收取所有邮件")
self.tap("mail/collect")
elif config.conf.delete_read_mail:
if self.find("mail/clean"):
logger.info("没有邮件需要删除")
return True
else:
logger.info("删除已读邮件")
self.tap("mail/delete")
else:
return True return True
self.touched = True
self.tap_element("read_mail")
else: else:
self.scene_graph_step(Scene.MAIL) self.scene_graph_step(Scene.MAIL)

View file

@ -1,3 +1,5 @@
from datetime import timedelta
from mower.utils import config from mower.utils import config
from mower.utils.graph import SceneGraphSolver from mower.utils.graph import SceneGraphSolver
from mower.utils.image import cropimg, diff_ratio from mower.utils.image import cropimg, diff_ratio
@ -7,6 +9,7 @@ from mower.utils.recognize import Scene
class MissionSolver(SceneGraphSolver): class MissionSolver(SceneGraphSolver):
solver_name = "每日/每周任务" solver_name = "每日/每周任务"
solver_max_duration = timedelta(minutes=2)
def run(self) -> None: def run(self) -> None:
logger.info("Start: 每日/每周任务") logger.info("Start: 每日/每周任务")
@ -23,7 +26,7 @@ class MissionSolver(SceneGraphSolver):
def transition(self): def transition(self):
if (scene := self.scene()) == Scene.MISSION_DAILY: if (scene := self.scene()) == Scene.MISSION_DAILY:
if self.daily: if self.daily:
self.tap_element("mission_weekly") self.tap("mission_weekly")
return return
if pos := self.find("mission_collect"): if pos := self.find("mission_collect"):
self.tap(pos) self.tap(pos)
@ -35,7 +38,7 @@ class MissionSolver(SceneGraphSolver):
self.solver_update_before_transition = False self.solver_update_before_transition = False
elif scene == Scene.MISSION_WEEKLY: elif scene == Scene.MISSION_WEEKLY:
if not self.daily: if not self.daily:
self.tap_element("mission_daily") self.tap("mission_daily")
return return
if pos := self.find("mission_collect"): if pos := self.find("mission_collect"):
self.tap(pos) self.tap(pos)

View file

@ -545,9 +545,9 @@ class NavigationSolver(SceneGraphSolver):
self.back() self.back()
return return
if self.find(f"navigation/biography/{self.prefix}_banner"): if self.find(f"navigation/biography/{self.prefix}_banner"):
self.tap_element("navigation/entry") self.tap("navigation/entry")
return return
self.tap_element(f"navigation/biography/{self.prefix}_entry") self.tap(f"navigation/biography/{self.prefix}_entry")
elif scene == Scene.TERMINAL_COLLECTION: elif scene == Scene.TERMINAL_COLLECTION:
prefix = self.prefix prefix = self.prefix
val = 0.9 val = 0.9
@ -606,12 +606,12 @@ class NavigationSolver(SceneGraphSolver):
if self.change_to is not None and self.now_difficulty != self.change_to: if self.change_to is not None and self.now_difficulty != self.change_to:
config.recog.update() config.recog.update()
if self.find("navigation/ope_difficulty"): if self.find("navigation/ope_difficulty"):
self.tap_element( self.tap(
f"navigation/ope_{difficulty_str[self.change_to]}_small" f"navigation/ope_{difficulty_str[self.change_to]}_small"
) )
self.now_difficulty = None self.now_difficulty = None
else: else:
self.tap_element( self.tap(
f"navigation/ope_{difficulty_str[self.now_difficulty]}" f"navigation/ope_{difficulty_str[self.now_difficulty]}"
) )
return return
@ -650,7 +650,7 @@ class NavigationSolver(SceneGraphSolver):
self.tap(va(target, (60, 20))) self.tap(va(target, (60, 20)))
elif scene == Scene.OPERATOR_BEFORE: elif scene == Scene.OPERATOR_BEFORE:
if self.find("ope_ex_mode") and self.switch_to_ex: if self.find("ope_ex_mode") and self.switch_to_ex:
self.tap_element("ope_ex_mode") self.tap("ope_ex_mode")
return return
if self.mode == "auto": if self.mode == "auto":
@ -683,15 +683,15 @@ class NavigationSolver(SceneGraphSolver):
): ):
self.tap((1776, 908)) self.tap((1776, 908))
return return
self.tap_element("ope_start") self.tap("ope_start")
else: else:
self.tap_element("ope_ex_start") self.tap("ope_ex_start")
elif scene == Scene.OPERATOR_SELECT and self.success: elif scene == Scene.OPERATOR_SELECT and self.success:
return True return True
elif scene in [Scene.OPERATOR_RECOVER_ORIGINITE, Scene.OPERATOR_RECOVER_POTION]: elif scene in [Scene.OPERATOR_RECOVER_ORIGINITE, Scene.OPERATOR_RECOVER_POTION]:
return True return True
elif scene == Scene.STORY_STAGE: elif scene == Scene.STORY_STAGE:
self.tap_element("start_story") self.tap("start_story")
else: else:
self.scene_graph_step(Scene.TERMINAL_MAIN) self.scene_graph_step(Scene.TERMINAL_MAIN)

View file

@ -97,7 +97,7 @@ class ActivityNavigation(SceneGraphSolver):
saveimg(debug_img, "navigation") saveimg(debug_img, "navigation")
self.tap(kp2[good[0].trainIdx].pt, interval=4) self.tap(kp2[good[0].trainIdx].pt, interval=4)
elif scene == Scene.ACTIVITY_MAIN: elif scene == Scene.ACTIVITY_MAIN:
self.tap_element("navigation/activity/entry") self.tap("navigation/activity/entry")
elif scene == Scene.ACTIVITY_CHOOSE_LEVEL: elif scene == Scene.ACTIVITY_CHOOSE_LEVEL:
if ( if (
self.mode == "copy" self.mode == "copy"
@ -126,7 +126,7 @@ class ActivityNavigation(SceneGraphSolver):
self.tap(va(target, (60, 20))) self.tap(va(target, (60, 20)))
elif scene == Scene.OPERATOR_BEFORE: elif scene == Scene.OPERATOR_BEFORE:
if self.find("ope_ex_mode") and self.switch_to_ex: if self.find("ope_ex_mode") and self.switch_to_ex:
self.tap_element("ope_ex_mode") self.tap("ope_ex_mode")
return return
if self.mode == "auto": if self.mode == "auto":
@ -142,15 +142,15 @@ class ActivityNavigation(SceneGraphSolver):
): ):
self.tap((1776, 908)) self.tap((1776, 908))
return return
self.tap_element("ope_start") self.tap("ope_start")
else: else:
self.tap_element("ope_ex_start") self.tap("ope_ex_start")
elif scene == Scene.OPERATOR_SELECT and self.mode == "copy": elif scene == Scene.OPERATOR_SELECT and self.mode == "copy":
return True return True
elif scene in [Scene.OPERATOR_RECOVER_ORIGINITE, Scene.OPERATOR_RECOVER_POTION]: elif scene in [Scene.OPERATOR_RECOVER_ORIGINITE, Scene.OPERATOR_RECOVER_POTION]:
return True return True
elif scene == Scene.STORY_STAGE: elif scene == Scene.STORY_STAGE:
self.tap_element("start_story") self.tap("start_story")
else: else:
self.scene_graph_step(Scene.TERMINAL_MAIN) self.scene_graph_step(Scene.TERMINAL_MAIN)

View file

@ -68,7 +68,7 @@ class LastStageNavigation(SceneGraphSolver):
return True return True
elif scene == Scene.OPERATOR_BEFORE: elif scene == Scene.OPERATOR_BEFORE:
if self.find("ope_ex_mode") and self.switch_to_ex: if self.find("ope_ex_mode") and self.switch_to_ex:
self.tap_element("ope_ex_mode") self.tap("ope_ex_mode")
return return
if self.mode == "auto": if self.mode == "auto":
@ -84,9 +84,9 @@ class LastStageNavigation(SceneGraphSolver):
): ):
self.tap((1776, 908)) self.tap((1776, 908))
return return
self.tap_element("ope_start") self.tap("ope_start")
else: else:
self.tap_element("ope_ex_start") self.tap("ope_ex_start")
elif scene == Scene.OPERATOR_SELECT and self.mode == "copy": elif scene == Scene.OPERATOR_SELECT and self.mode == "copy":
return True return True

View file

@ -121,7 +121,7 @@ class OperationSolver(SceneGraphSolver):
return return
self.operation_start_time = datetime.now() self.operation_start_time = datetime.now()
self.drop_recog_complete = False self.drop_recog_complete = False
self.tap_element("ope_start") self.tap("ope_start")
elif scene == Scene.OPERATOR_SELECT: elif scene == Scene.OPERATOR_SELECT:
if self.stop_time and datetime.now() > self.stop_time: if self.stop_time and datetime.now() > self.stop_time:
self.timeout = True self.timeout = True
@ -143,7 +143,7 @@ class OperationSolver(SceneGraphSolver):
else: else:
self.sleep(10) self.sleep(10)
elif scene == Scene.OPERATOR_GIVEUP: elif scene == Scene.OPERATOR_GIVEUP:
self.tap_element("fight/give_up") self.tap("fight/give_up")
elif scene == Scene.OPERATOR_RECOVER_POTION: elif scene == Scene.OPERATOR_RECOVER_POTION:
use_medicine = False use_medicine = False
# 先看设置是否吃药 # 先看设置是否吃药
@ -182,12 +182,12 @@ class OperationSolver(SceneGraphSolver):
return return
self.operation_start_time = datetime.now() self.operation_start_time = datetime.now()
self.drop_recog_complete = False self.drop_recog_complete = False
self.tap_element("ope_start") self.tap("ope_start")
elif scene == Scene.OPERATOR_ELIMINATE_AGENCY: elif scene == Scene.OPERATOR_ELIMINATE_AGENCY:
if self.find("can_not_use_ope"): if self.find("can_not_use_ope"):
logger.warning("当期剿灭代理获取合成玉数量为0") logger.warning("当期剿灭代理获取合成玉数量为0")
return True return True
self.tap_element("ope_elimi_agency_confirm", interval=2) self.tap("ope_elimi_agency_confirm", interval=2)
elif scene == Scene.UPGRADE: elif scene == Scene.UPGRADE:
self.tap((960, 540)) self.tap((960, 540))
elif scene in self.waiting_scene: elif scene in self.waiting_scene:

View file

@ -290,7 +290,7 @@ class ReclamationAlgorithm(SceneGraphSolver):
logger.debug(f"剩余决断次数:{self.ap}") logger.debug(f"剩余决断次数:{self.ap}")
def map_back(self): def map_back(self):
self.tap_element("ra/map_back", thres=200) self.tap("ra/map_back", thres=200)
def detect_score(self, scope=None, find_max=True): def detect_score(self, scope=None, find_max=True):
if find_max and self.find("ra/max", scope=scope, score=0.7): if find_max and self.find("ra/max", scope=scope, score=0.7):
@ -338,7 +338,7 @@ class ReclamationAlgorithm(SceneGraphSolver):
elif scene == Scene.TERMINAL_MAIN: elif scene == Scene.TERMINAL_MAIN:
self.tap_terminal_button("longterm") self.tap_terminal_button("longterm")
elif scene == Scene.TERMINAL_LONGTERM: elif scene == Scene.TERMINAL_LONGTERM:
self.tap_element("terminal_longterm_reclamation_algorithm") self.tap("terminal_longterm_reclamation_algorithm")
# 从生息演算主页进入生息演算 # 从生息演算主页进入生息演算
elif scene == Scene.RA_MAIN: elif scene == Scene.RA_MAIN:
@ -346,7 +346,7 @@ class ReclamationAlgorithm(SceneGraphSolver):
if pos := self.find("ra/start_button"): if pos := self.find("ra/start_button"):
self.tap(pos, interval=8) self.tap(pos, interval=8)
else: else:
self.tap_element("ra/continue_button", interval=3) self.tap("ra/continue_button", interval=3)
# 剧情 # 剧情
elif scene == Scene.RA_GUIDE_ENTRANCE: elif scene == Scene.RA_GUIDE_ENTRANCE:
@ -354,7 +354,7 @@ class ReclamationAlgorithm(SceneGraphSolver):
self.tap(pos, x_rate=2, y_rate=1.5, interval=0.5) self.tap(pos, x_rate=2, y_rate=1.5, interval=0.5)
elif scene == Scene.RA_GUIDE_BATTLE_ENTRANCE: elif scene == Scene.RA_GUIDE_BATTLE_ENTRANCE:
self.battle_wait = 3 self.battle_wait = 3
self.tap_element("ra/start_action", interval=5) self.tap("ra/start_action", interval=5)
elif scene == Scene.RA_GUIDE_DIALOG: elif scene == Scene.RA_GUIDE_DIALOG:
self.battle_wait = 0 self.battle_wait = 0
self.fast_tap((1631, 675)) self.fast_tap((1631, 675))
@ -364,7 +364,7 @@ class ReclamationAlgorithm(SceneGraphSolver):
if self.battle_task in self.task_queue: if self.battle_task in self.task_queue:
self.task_queue.remove(self.battle_task) self.task_queue.remove(self.battle_task)
self.ap -= 1 self.ap -= 1
self.tap_element("ra/start_action") self.tap("ra/start_action")
elif scene == Scene.RA_BATTLE: elif scene == Scene.RA_BATTLE:
if self.battle_wait > 0: if self.battle_wait > 0:
self.battle_wait -= 1 self.battle_wait -= 1
@ -375,9 +375,9 @@ class ReclamationAlgorithm(SceneGraphSolver):
else: else:
config.recog.update() config.recog.update()
elif scene == Scene.RA_BATTLE_EXIT_CONFIRM: elif scene == Scene.RA_BATTLE_EXIT_CONFIRM:
self.tap_element("ra/confirm_green", interval=0.5) self.tap("ra/confirm_green", interval=0.5)
elif scene == Scene.RA_BATTLE_COMPLETE: elif scene == Scene.RA_BATTLE_COMPLETE:
self.tap_element("ra/battle_complete", interval=0.5) self.tap("ra/battle_complete", interval=0.5)
# 结算界面 # 结算界面
elif scene == Scene.RA_DAY_COMPLETE: elif scene == Scene.RA_DAY_COMPLETE:
@ -521,9 +521,9 @@ class ReclamationAlgorithm(SceneGraphSolver):
self.battle_task = place self.battle_task = place
config.recog.update() config.recog.update()
elif scene == Scene.RA_DAY_DETAIL: elif scene == Scene.RA_DAY_DETAIL:
self.tap_element("ra/waste_time_button", interval=0.5) self.tap("ra/waste_time_button", interval=0.5)
elif scene == Scene.RA_WASTE_TIME_DIALOG: elif scene == Scene.RA_WASTE_TIME_DIALOG:
self.tap_element("ra/confirm_green") self.tap("ra/confirm_green")
# 作战编队 # 作战编队
elif scene == Scene.RA_SQUAD_EDIT: elif scene == Scene.RA_SQUAD_EDIT:
@ -531,34 +531,34 @@ class ReclamationAlgorithm(SceneGraphSolver):
self.left_kitchen = False self.left_kitchen = False
self.tap((1430, 1015), interval=0.5) self.tap((1430, 1015), interval=0.5)
else: else:
self.tap_element("ra/squad_edit_start_button", interval=0.5) self.tap("ra/squad_edit_start_button", interval=0.5)
elif scene == Scene.RA_SQUAD_EDIT_DIALOG: elif scene == Scene.RA_SQUAD_EDIT_DIALOG:
self.tap_element("ra/confirm_red", interval=6) self.tap("ra/confirm_red", interval=6)
elif scene == Scene.RA_SQUAD_ABNORMAL: elif scene == Scene.RA_SQUAD_ABNORMAL:
self.tap_element("ra/confirm_red", interval=6) self.tap("ra/confirm_red", interval=6)
# 烹饪台 # 烹饪台
elif scene == Scene.RA_KITCHEN: elif scene == Scene.RA_KITCHEN:
if self.left_kitchen: if self.left_kitchen:
self.tap_element("ra/return_from_kitchen", x_rate=0.07) self.tap("ra/return_from_kitchen", x_rate=0.07)
return return
last_drink = self.detect_prepared() last_drink = self.detect_prepared()
while last_drink < 2: while last_drink < 2:
self.tap_element("ra/auto+1", interval=0.5) self.tap("ra/auto+1", interval=0.5)
drink = self.detect_prepared() drink = self.detect_prepared()
if drink == last_drink: if drink == last_drink:
logger.debug("饮料无法合成,返回地图,清空任务列表") logger.debug("饮料无法合成,返回地图,清空任务列表")
self.task_queue = [] self.task_queue = []
self.tap_element("ra/return_from_kitchen", x_rate=0.07) self.tap("ra/return_from_kitchen", x_rate=0.07)
self.tap_element("ra/squad_back") self.tap("ra/squad_back")
self.map_back() self.map_back()
return return
last_drink = drink last_drink = drink
self.tap_element("ra/cook_button", interval=0.5) self.tap("ra/cook_button", interval=0.5)
# 能量饮料不足 # 能量饮料不足
elif scene == Scene.RA_INSUFFICIENT_DRINK: elif scene == Scene.RA_INSUFFICIENT_DRINK:
self.tap_element("ra/dialog_cancel") self.tap("ra/dialog_cancel")
# 获得物资 # 获得物资
elif scene == Scene.RA_GET_ITEM: elif scene == Scene.RA_GET_ITEM:
@ -569,7 +569,7 @@ class ReclamationAlgorithm(SceneGraphSolver):
self.tap((428, 411), interval=0.5) self.tap((428, 411), interval=0.5)
else: else:
self.left_kitchen = True self.left_kitchen = True
self.tap_element("ra/return_from_kitchen", x_rate=0.07) self.tap("ra/return_from_kitchen", x_rate=0.07)
else: else:
self.sleep(0.5) self.sleep(0.5)
@ -585,15 +585,15 @@ class ReclamationAlgorithm(SceneGraphSolver):
if scene == Scene.CONNECTING: if scene == Scene.CONNECTING:
self.sleep() self.sleep()
elif scene in [Scene.RA_MAIN, Scene.TERMINAL_LONGTERM, Scene.TERMINAL_MAIN]: elif scene in [Scene.RA_MAIN, Scene.TERMINAL_LONGTERM, Scene.TERMINAL_MAIN]:
self.tap_element("nav_button", x_rate=0.21) self.tap("nav_button", x_rate=0.21)
elif scene in [Scene.RA_MAP, Scene.RA_DAY_DETAIL, Scene.RA_BATTLE_ENTRANCE]: elif scene in [Scene.RA_MAP, Scene.RA_DAY_DETAIL, Scene.RA_BATTLE_ENTRANCE]:
self.map_back() self.map_back()
elif scene == Scene.RA_SQUAD_EDIT: elif scene == Scene.RA_SQUAD_EDIT:
self.tap_element("ra/squad_back") self.tap("ra/squad_back")
elif scene == Scene.RA_KITCHEN: elif scene == Scene.RA_KITCHEN:
self.tap_element("ra/return_from_kitchen", x_rate=0.07) self.tap("ra/return_from_kitchen", x_rate=0.07)
elif scene in [Scene.RA_SQUAD_EDIT_DIALOG, Scene.RA_WASTE_TIME_DIALOG]: elif scene in [Scene.RA_SQUAD_EDIT_DIALOG, Scene.RA_WASTE_TIME_DIALOG]:
self.tap_element("ra/dialog_cancel") self.tap("ra/dialog_cancel")
elif 900 < scene < 1000: elif 900 < scene < 1000:
self.move_forward(scene) self.move_forward(scene)
else: else:

View file

@ -256,8 +256,8 @@ class RecruitSolver(SceneGraphSolver):
pos = self.get_pos(self.find("one_hour"), 0.2, 0.8) pos = self.get_pos(self.find("one_hour"), 0.2, 0.8)
self.ctap(pos) self.ctap(pos)
elif recruit_time == [3, 50]: elif recruit_time == [3, 50]:
[self.tap_element("one_hour", 0.2, 0.2, 0.1) for _ in range(3)] [self.tap("one_hour", 0.2, 0.2, 0.1) for _ in range(3)]
[self.tap_element("one_hour", 0.5, 0.8, 0.1) for _ in range(1)] [self.tap("one_hour", 0.5, 0.8, 0.1) for _ in range(1)]
self.sleep(1) self.sleep(1)
if now_time not in [[9, 0], [3, 50], [1, 0]]: if now_time not in [[9, 0], [3, 50], [1, 0]]:
@ -268,7 +268,7 @@ class RecruitSolver(SceneGraphSolver):
return return
# # start recruit # # start recruit
self.tap_element("recruit/start_recruit") self.tap("recruit/start_recruit")
self.agent_choose[self.recruit_index]["choosed"] = True self.agent_choose[self.recruit_index]["choosed"] = True
self.ticket_number = self.ticket_number - 1 self.ticket_number = self.ticket_number - 1
self.recruit_index = self.recruit_index + 1 self.recruit_index = self.recruit_index + 1
@ -276,7 +276,7 @@ class RecruitSolver(SceneGraphSolver):
else: else:
self.recruit_tags(self.tags[self.recruit_index]) self.recruit_tags(self.tags[self.recruit_index])
elif scene == Scene.REFRESH_TAGS: elif scene == Scene.REFRESH_TAGS:
self.tap_element("recruit/refresh_comfirm") self.tap("recruit/refresh_comfirm")
elif scene == Scene.RECRUIT_AGENT: elif scene == Scene.RECRUIT_AGENT:
return self.recruit_result() return self.recruit_result()
else: else:
@ -595,7 +595,7 @@ class RecruitSolver(SceneGraphSolver):
if mode == "minute": if mode == "minute":
click_time = int(abs(subtract_time) / 10) click_time = int(abs(subtract_time) / 10)
tap_pos = 0.5 tap_pos = 0.5
[self.tap_element("one_hour", tap_pos, 0.8, 0.1) for _ in range(click_time)] [self.tap("one_hour", tap_pos, 0.8, 0.1) for _ in range(click_time)]
return return
if mode == "hour": if mode == "hour":
@ -605,16 +605,16 @@ class RecruitSolver(SceneGraphSolver):
if abs(subtract_time) > (max_click / 2): if abs(subtract_time) > (max_click / 2):
if subtract_time > 0: if subtract_time > 0:
[self.tap_element("one_hour", 0.2, 0.2, 0.1) for _ in range(click_time)] [self.tap("one_hour", 0.2, 0.2, 0.1) for _ in range(click_time)]
else: else:
[ [
self.tap_element("one_hour", 0.2, 0.8, 0.1) self.tap("one_hour", 0.2, 0.8, 0.1)
for _ in range(max_click - click_time) for _ in range(max_click - click_time)
] ]
else: else:
if subtract_time < 0: if subtract_time < 0:
[self.tap_element("one_hour", 0.2, 0.2, 0.1) for _ in range(click_time)] [self.tap("one_hour", 0.2, 0.2, 0.1) for _ in range(click_time)]
else: else:
[self.tap_element("one_hour", 0.2, 0.8, 0.1) for _ in range(click_time)] [self.tap("one_hour", 0.2, 0.8, 0.1) for _ in range(click_time)]
return return

View file

@ -226,18 +226,18 @@ class SecretFront(SceneGraphSolver):
elif scene == Scene.TERMINAL_MAIN: elif scene == Scene.TERMINAL_MAIN:
self.tap_terminal_button("main_theme") self.tap_terminal_button("main_theme")
elif scene == Scene.TERMINAL_MAIN_THEME: elif scene == Scene.TERMINAL_MAIN_THEME:
self.tap_element("navigation/main/14") self.tap("navigation/main/14")
elif scene == Scene.SF_ENTRANCE: elif scene == Scene.SF_ENTRANCE:
self.tap_element("sf/entrance") self.tap("sf/entrance")
# 选择小队 # 选择小队
elif scene == Scene.SF_SELECT_TEAM: elif scene == Scene.SF_SELECT_TEAM:
self.tap_element(f"sf/team_{self.team}") self.tap(f"sf/team_{self.team}")
self.tap_element("sf/select_team_ok") self.tap("sf/select_team_ok")
# 继续前进 # 继续前进
elif scene == Scene.SF_CONTINUE: elif scene == Scene.SF_CONTINUE:
self.tap_element("sf/continue") self.tap("sf/continue")
# 选择路线时识别已有属性值 # 选择路线时识别已有属性值
elif scene == Scene.SF_SELECT: elif scene == Scene.SF_SELECT:
@ -289,10 +289,10 @@ class SecretFront(SceneGraphSolver):
self.choose_card(total, idx) self.choose_card(total, idx)
else: else:
self.exit = "restart" self.exit = "restart"
self.tap_element("sf/exit_button") self.tap("sf/exit_button")
return return
self.exit = "restart" self.exit = "restart"
self.tap_element("sf/exit_button") self.tap("sf/exit_button")
return return
if (page_number := self.page_number()) is None: if (page_number := self.page_number()) is None:
@ -348,7 +348,7 @@ class SecretFront(SceneGraphSolver):
elif scene == Scene.SF_EVENT: elif scene == Scene.SF_EVENT:
self.event = True self.event = True
self.tap_element("sf/continue_event", interval=1.5) self.tap("sf/continue_event", interval=1.5)
elif scene in [Scene.SF_TEAM_PASS, Scene.SF_CLICK_ANYWHERE, Scene.SF_END]: elif scene in [Scene.SF_TEAM_PASS, Scene.SF_CLICK_ANYWHERE, Scene.SF_END]:
self.tap((960, 980), interval=2) self.tap((960, 980), interval=2)
@ -360,7 +360,7 @@ class SecretFront(SceneGraphSolver):
# 关闭说明 # 关闭说明
elif scene == Scene.NOTICE: elif scene == Scene.NOTICE:
self.tap_element("notice") self.tap("notice")
elif scene == Scene.SF_EXIT: elif scene == Scene.SF_EXIT:
if self.exit == "restart": if self.exit == "restart":
@ -368,10 +368,10 @@ class SecretFront(SceneGraphSolver):
self.route_matcher = None self.route_matcher = None
self.event = False self.event = False
self.tap_element("sf/restart") self.tap("sf/restart")
self.tap_element("sf/confirm") self.tap("sf/confirm")
elif self.exit == "exit": elif self.exit == "exit":
self.tap_element("sf/confirm") self.tap("sf/confirm")
else: else:
self.tap((480, 590)) self.tap((480, 590))
@ -385,7 +385,7 @@ class SecretFront(SceneGraphSolver):
self.move_forward(scene) self.move_forward(scene)
else: else:
self.exit = "exit" self.exit = "exit"
self.tap_element("sf/exit_button") self.tap("sf/exit_button")
def transition(self): def transition(self):
now = datetime.now() now = datetime.now()

View file

@ -134,6 +134,6 @@ class CreditShop(SceneGraphSolver):
if self.find("shop/credit_not_enough"): if self.find("shop/credit_not_enough"):
return True return True
else: else:
self.tap_element("shop/cart") self.tap("shop/cart")
else: else:
self.scene_graph_step(Scene.SHOP_CREDIT) self.scene_graph_step(Scene.SHOP_CREDIT)

View file

@ -19,12 +19,12 @@ class Headhunting(SceneGraphSolver):
def transition(self) -> bool: def transition(self) -> bool:
if (scene := self.scene()) == Scene.HEADHUNTING: if (scene := self.scene()) == Scene.HEADHUNTING:
if config.recog.match("sign_in/headhunting/available")[0] >= 0.9: if config.recog.match("sign_in/headhunting/available")[0] >= 0.9:
self.tap_element("pull_once") self.tap("pull_once")
else: else:
notify("今日赠送单抽已抽完") notify("今日赠送单抽已抽完")
return True return True
elif scene == Scene.HEADHUNTING_FREE_CONFIRM: elif scene == Scene.HEADHUNTING_FREE_CONFIRM:
self.tap_element("double_confirm/main", x_rate=1) self.tap("double_confirm/main", x_rate=1)
elif scene == Scene.HEADHUNTING_RESULT: elif scene == Scene.HEADHUNTING_RESULT:
notify("成功抽完赠送单抽") notify("成功抽完赠送单抽")
return True return True

View file

@ -67,7 +67,7 @@ class SSSSolver(SceneGraphSolver):
deadline=self.deadline, deadline=self.deadline,
): ):
return return
self.tap_element("sss/settlement_commission") self.tap("sss/settlement_commission")
elif ( elif (
scene == Scene.SSS_MAIN and config.conf.sss.finish_while_full and is_full() scene == Scene.SSS_MAIN and config.conf.sss.finish_while_full and is_full()
@ -93,7 +93,7 @@ class SSSSolver(SceneGraphSolver):
elif scene == Scene.SSS_SQUAD: elif scene == Scene.SSS_SQUAD:
if config.conf.sss.choose_agent: if config.conf.sss.choose_agent:
SSSChooseSolver().run() SSSChooseSolver().run()
self.tap_element("sss/squad") self.tap("sss/squad")
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()

View file

@ -26,7 +26,7 @@ class SSSChooseSolver(SceneGraphSolver):
def transition(self): def transition(self):
if (scene := self.scene()) == Scene.OPERATOR_AGENT_SELECT: if (scene := self.scene()) == Scene.OPERATOR_AGENT_SELECT:
self.tap_element("choose_agent/battle_confirm") self.tap("choose_agent/battle_confirm")
elif scene in self.waiting_scene: elif scene in self.waiting_scene:
self.waiting_solver() self.waiting_solver()
elif scene == Scene.SSS_SQUAD: elif scene == Scene.SSS_SQUAD:

View file

@ -133,7 +133,7 @@ class SSSDROPSolver(SceneGraphSolver):
self.sleep(0.5) self.sleep(0.5)
self.tap((1750, 550)) self.tap((1750, 550))
return return
self.tap_element("sss/abandon") self.tap("sss/abandon")
elif scene == Scene.SSS_DROP_EC_BEFORE_FIGHT: elif scene == Scene.SSS_DROP_EC_BEFORE_FIGHT:
if self.timeout(): if self.timeout():

View file

@ -110,7 +110,7 @@ class SSSFightSolver(SceneGraphSolver, FightMixin):
self.clear_op() self.clear_op()
return return
elif self.find("sss/start_directly"): elif self.find("sss/start_directly"):
self.tap_element("sss/start_directly") self.tap("sss/start_directly")
return return
self.travel_watching_skills() self.travel_watching_skills()

View file

@ -62,17 +62,17 @@ class SSSNaviSolver(SceneGraphSolver):
self.tap(va(pos, (-240, 0))) self.tap(va(pos, (-240, 0)))
elif scene == Scene.SSS_START: elif scene == Scene.SSS_START:
if self.mode == "normal" and self.find("sss/switch_to_normal"): if self.mode == "normal" and self.find("sss/switch_to_normal"):
self.tap_element("sss/switch_to_normal") self.tap("sss/switch_to_normal")
return return
elif self.mode == "ex" and self.find("sss/switch_to_ex"): elif self.mode == "ex" and self.find("sss/switch_to_ex"):
self.tap_element("sss/switch_to_ex") self.tap("sss/switch_to_ex")
return return
self.tap((1555, 966)) self.tap((1555, 966))
elif scene == Scene.SSS_EC: elif scene == Scene.SSS_EC:
score, scope = config.recog.matcher.match2d(self.ec) score, scope = config.recog.matcher.match2d(self.ec)
if score > 0.8: if score > 0.8:
self.tap(scope) self.tap(scope)
self.tap_element("sss/ec") self.tap("sss/ec")
elif scene == Scene.SSS_DEVICE: elif scene == Scene.SSS_DEVICE:
current = self.get_device() current = self.get_device()
for i in range(8): for i in range(8):
@ -83,9 +83,9 @@ class SSSNaviSolver(SceneGraphSolver):
elif scene == Scene.SSS_SQUAD: elif scene == Scene.SSS_SQUAD:
if config.conf.sss.choose_agent: if config.conf.sss.choose_agent:
return True return True
self.tap_element("sss/squad") self.tap("sss/squad")
elif scene == Scene.SSS_EC_EX: elif scene == Scene.SSS_EC_EX:
self.tap_element("sss/check_ex") self.tap("sss/check_ex")
else: else:
self.scene_graph_step(Scene.SSS_MAIN) self.scene_graph_step(Scene.SSS_MAIN)

View file

@ -14,7 +14,7 @@ class TradeTokenSolver(SceneGraphSolver):
def transition(self): def transition(self):
if (scene := self.scene()) == Scene.SHOP_TRADE_TOKEN: if (scene := self.scene()) == Scene.SHOP_TRADE_TOKEN:
self.finished = True self.finished = True
self.tap_element("shop/trade_token_dialog", x_rate=1) self.tap("shop/trade_token_dialog", x_rate=1)
elif scene == Scene.SHOP_TOKEN: elif scene == Scene.SHOP_TOKEN:
if self.finished: if self.finished:
return True return True
@ -24,6 +24,6 @@ class TradeTokenSolver(SceneGraphSolver):
self.tap(pos) self.tap(pos)
else: else:
self.swipe((200, 400), (0, 400)) self.swipe((200, 400), (0, 400))
self.tap_element("shop/commendation") self.tap("shop/commendation")
else: else:
self.scene_graph_step(Scene.SHOP_TOKEN) self.scene_graph_step(Scene.SHOP_TOKEN)

View file

@ -252,6 +252,8 @@ class RegularTaskPart(ConfModel):
check_mail_enable: bool = True check_mail_enable: bool = True
"领取邮件奖励" "领取邮件奖励"
delete_read_mail: bool = False
"删除已读邮件"
maa_enable: bool = True maa_enable: bool = True
"日常任务" "日常任务"
maa_gap: float = 3 maa_gap: float = 3

View file

@ -18,17 +18,17 @@ def login_start(solver: BaseSolver):
@edge(Scene.CONFIRM, Scene.LOGIN_START) @edge(Scene.CONFIRM, Scene.LOGIN_START)
def confirm(solver: BaseSolver): def confirm(solver: BaseSolver):
solver.tap_element("confirm") solver.tap("confirm")
@edge(Scene.NOTICE, Scene.INDEX) @edge(Scene.NOTICE, Scene.INDEX)
def close_notice(solver: BaseSolver): def close_notice(solver: BaseSolver):
solver.tap_element("notice") solver.tap("notice")
@edge(Scene.NETWORK_CHECK, Scene.LOGIN_START) @edge(Scene.NETWORK_CHECK, Scene.LOGIN_START)
def network_check_cancel(solver: BaseSolver): def network_check_cancel(solver: BaseSolver):
solver.tap_element("confirm") solver.tap("confirm")
@edge(Scene.MOON_FESTIVAL, Scene.SIGN_IN_DAILY) @edge(Scene.MOON_FESTIVAL, Scene.SIGN_IN_DAILY)
@ -43,12 +43,12 @@ def story_stage(solver: BaseSolver):
@edge(Scene.STORY, Scene.STORY_SKIP) @edge(Scene.STORY, Scene.STORY_SKIP)
def skip_story(solver: BaseSolver): def skip_story(solver: BaseSolver):
solver.tap_element("story_skip") solver.tap("story_skip")
@edge(Scene.STORY_SKIP, Scene.OPERATOR_BEFORE) @edge(Scene.STORY_SKIP, Scene.OPERATOR_BEFORE)
def skip_story_confirm(solver: BaseSolver): def skip_story_confirm(solver: BaseSolver):
solver.tap_element("story_skip_confirm_dialog", x_rate=0.94) solver.tap("story_skip_confirm_dialog", x_rate=0.94)
@edge(Scene.OPERATOR_DETAILS, Scene.OPERATOR_MANAGEMENT) @edge(Scene.OPERATOR_DETAILS, Scene.OPERATOR_MANAGEMENT)

View file

@ -23,4 +23,4 @@ def friend_visiting_back(solver: BaseSolver):
@edge(Scene.BACK_TO_FRIEND_LIST, Scene.BUSINESS_CARD) @edge(Scene.BACK_TO_FRIEND_LIST, Scene.BUSINESS_CARD)
def back_to_friend_confirm(solver: BaseSolver): def back_to_friend_confirm(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=1) solver.tap("double_confirm/main", x_rate=1)

View file

@ -37,17 +37,17 @@ def back_to_index(solver: BaseSolver):
@edge(Scene.LEAVE_INFRASTRUCTURE, Scene.INDEX) @edge(Scene.LEAVE_INFRASTRUCTURE, Scene.INDEX)
def leave_infrastructure(solver: BaseSolver): def leave_infrastructure(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=1) solver.tap("double_confirm/main", x_rate=1)
@edge(Scene.DOWNLOAD_VOICE_RESOURCES, Scene.INDEX) @edge(Scene.DOWNLOAD_VOICE_RESOURCES, Scene.INDEX)
def dont_download_voice(solver: BaseSolver): def dont_download_voice(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=0) solver.tap("double_confirm/main", x_rate=0)
@edge(Scene.LOGIN_QUICKLY, Scene.INDEX) @edge(Scene.LOGIN_QUICKLY, Scene.INDEX)
def login_quickly(solver: BaseSolver): def login_quickly(solver: BaseSolver):
solver.tap_element("login_awake") solver.tap("login_awake")
@edge(Scene.LOGIN_CAPTCHA, Scene.INDEX) @edge(Scene.LOGIN_CAPTCHA, Scene.INDEX)
@ -63,7 +63,7 @@ def login_bilibili(solver: BaseSolver):
@edge(Scene.EXIT_GAME, Scene.INDEX) @edge(Scene.EXIT_GAME, Scene.INDEX)
def exit_cancel(solver: BaseSolver): def exit_cancel(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=0) solver.tap("double_confirm/main", x_rate=0)
@edge(Scene.MATERIEL, Scene.INDEX) @edge(Scene.MATERIEL, Scene.INDEX)

View file

@ -9,9 +9,9 @@ from .utils import edge
@edge(Scene.MISSION_DAILY, Scene.MISSION_WEEKLY) @edge(Scene.MISSION_DAILY, Scene.MISSION_WEEKLY)
@edge(Scene.MISSION_TRAINEE, Scene.MISSION_WEEKLY) @edge(Scene.MISSION_TRAINEE, Scene.MISSION_WEEKLY)
def mission_to_weekly(solver: BaseSolver): def mission_to_weekly(solver: BaseSolver):
solver.tap_element("mission_weekly") solver.tap("mission_weekly")
@edge(Scene.MISSION_TRAINEE, Scene.MISSION_DAILY) @edge(Scene.MISSION_TRAINEE, Scene.MISSION_DAILY)
def mission_trainee_to_daily(solver: BaseSolver): def mission_trainee_to_daily(solver: BaseSolver):
solver.tap_element("mission_daily") solver.tap("mission_daily")

View file

@ -53,7 +53,7 @@ from .utils import edge
@edge(Scene.OPERATOR_DETAILS, Scene.NAVIGATION_BAR) @edge(Scene.OPERATOR_DETAILS, Scene.NAVIGATION_BAR)
@edge(Scene.ROGUE_INDEX, Scene.NAVIGATION_BAR) @edge(Scene.ROGUE_INDEX, Scene.NAVIGATION_BAR)
def index_nav(solver: BaseSolver): def index_nav(solver: BaseSolver):
solver.tap_element("nav_button") solver.tap("nav_button")
# 不加从导航栏到基建首页的边,防止在基建内循环 # 不加从导航栏到基建首页的边,防止在基建内循环

View file

@ -24,17 +24,17 @@ def operation_back(solver: BaseSolver):
@edge(Scene.OPERATOR_FIGHT, Scene.OPERATOR_GIVEUP) @edge(Scene.OPERATOR_FIGHT, Scene.OPERATOR_GIVEUP)
def operation_fight(solver: BaseSolver): def operation_fight(solver: BaseSolver):
solver.tap_element("fight/gear") solver.tap("fight/gear")
@edge(Scene.OPERATOR_GIVEUP, Scene.OPERATOR_FAILED) @edge(Scene.OPERATOR_GIVEUP, Scene.OPERATOR_FAILED)
def operation_give_up(solver: BaseSolver): def operation_give_up(solver: BaseSolver):
solver.tap_element("fight/give_up") solver.tap("fight/give_up")
@edge(Scene.OPERATOR_FAULT_CONFIRM, Scene.OPERATOR_FAILED) @edge(Scene.OPERATOR_FAULT_CONFIRM, Scene.OPERATOR_FAILED)
def operation_fault_confirm(solver: BaseSolver): def operation_fault_confirm(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=1) solver.tap("double_confirm/main", x_rate=1)
@edge(Scene.OPERATOR_FINISH, Scene.OPERATOR_BEFORE) @edge(Scene.OPERATOR_FINISH, Scene.OPERATOR_BEFORE)

View file

@ -13,7 +13,7 @@ def recruit_result(solver: BaseSolver):
@edge(Scene.REFRESH_TAGS, Scene.RECRUIT_TAGS) @edge(Scene.REFRESH_TAGS, Scene.RECRUIT_TAGS)
def refresh_cancel(solver: BaseSolver): def refresh_cancel(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=0) solver.tap("double_confirm/main", x_rate=0)
@edge(Scene.RECRUIT_TAGS, Scene.RECRUIT_MAIN) @edge(Scene.RECRUIT_TAGS, Scene.RECRUIT_MAIN)
@ -23,4 +23,4 @@ def recruit_back(solver: BaseSolver):
@edge(Scene.SKIP, Scene.RECRUIT_AGENT) @edge(Scene.SKIP, Scene.RECRUIT_AGENT)
def skip(solver: BaseSolver): def skip(solver: BaseSolver):
solver.tap_element("skip") solver.tap("skip")

View file

@ -37,7 +37,7 @@ def infra_arrange_confirm(solver: BaseSolver):
@edge(Scene.INFRA_ARRANGE_ORDER, Scene.RIIC_OPERATOR_SELECT) @edge(Scene.INFRA_ARRANGE_ORDER, Scene.RIIC_OPERATOR_SELECT)
def infra_arrange_order(solver: BaseSolver): def infra_arrange_order(solver: BaseSolver):
solver.tap_element("arrange_blue_yes", x_rate=0.66) solver.tap("arrange_blue_yes", x_rate=0.66)
@edge(Scene.RIIC_REPORT, Scene.CTRLCENTER_ASSISTANT) @edge(Scene.RIIC_REPORT, Scene.CTRLCENTER_ASSISTANT)
@ -47,12 +47,12 @@ def riic_back(solver: BaseSolver):
@edge(Scene.CTRLCENTER_ASSISTANT, Scene.RIIC_REPORT) @edge(Scene.CTRLCENTER_ASSISTANT, Scene.RIIC_REPORT)
def riic(solver: BaseSolver): def riic(solver: BaseSolver):
solver.tap_element("control_central_assistants") solver.tap("control_central_assistants")
@edge(Scene.INFRA_MAIN, Scene.CTRLCENTER_ASSISTANT) @edge(Scene.INFRA_MAIN, Scene.CTRLCENTER_ASSISTANT)
def control_central(solver: BaseSolver): def control_central(solver: BaseSolver):
solver.tap_element("control_central") solver.tap("control_central")
@edge(Scene.SANITY_CHARGE, Scene.INFRA_MAIN) @edge(Scene.SANITY_CHARGE, Scene.INFRA_MAIN)
@ -72,4 +72,4 @@ def switch_order(solver: BaseSolver):
@edge(Scene.PRODUCT_SWITCHING_CONFIRM, Scene.FACTORY_ROOMS) @edge(Scene.PRODUCT_SWITCHING_CONFIRM, Scene.FACTORY_ROOMS)
def product_switching_confirm(solver: BaseSolver): def product_switching_confirm(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=0) solver.tap("double_confirm/main", x_rate=0)

View file

@ -7,10 +7,10 @@ from .utils import edge
@edge(Scene.UNKNOW_ROGUE, Scene.ROGUE_INDEX) @edge(Scene.UNKNOW_ROGUE, Scene.ROGUE_INDEX)
@edge(Scene.ROGUE_SELECT, Scene.ROGUE_INDEX) @edge(Scene.ROGUE_SELECT, Scene.ROGUE_INDEX)
def infra_back(solver: BaseSolver): def infra_back(solver: BaseSolver):
solver.tap_element("rogue/back") solver.tap("rogue/back")
@edge(Scene.ROGUE_ABANDON, Scene.ROGUE_INDEX) @edge(Scene.ROGUE_ABANDON, Scene.ROGUE_INDEX)
@edge(Scene.ROGUE_REFRESH_SHOP, Scene.UNKNOW_ROGUE) @edge(Scene.ROGUE_REFRESH_SHOP, Scene.UNKNOW_ROGUE)
def double_confirm_back(solver: BaseSolver): def double_confirm_back(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=1) solver.tap("double_confirm/main", x_rate=1)

View file

@ -26,4 +26,4 @@ def shop_back(solver: BaseSolver):
@edge(Scene.SHOP_TRADE_TOKEN, Scene.SHOP_TOKEN) @edge(Scene.SHOP_TRADE_TOKEN, Scene.SHOP_TOKEN)
def trade_cancel(solver: BaseSolver): def trade_cancel(solver: BaseSolver):
solver.tap_element("shop/trade_token_dialog", x_rate=0) solver.tap("shop/trade_token_dialog", x_rate=0)

View file

@ -35,4 +35,4 @@ def sss_back(solver: BaseSolver):
@edge(Scene.SSS_ABANDON_DROP_IN_FIGHT, Scene.OPERATOR_FIGHT) @edge(Scene.SSS_ABANDON_DROP_IN_FIGHT, Scene.OPERATOR_FIGHT)
@edge(Scene.SSS_EXIT_CONFIRM, Scene.SSS_TERMINATED) @edge(Scene.SSS_EXIT_CONFIRM, Scene.SSS_TERMINATED)
def sss_exit(solver: BaseSolver): def sss_exit(solver: BaseSolver):
solver.tap_element("double_confirm/main", x_rate=1) solver.tap("double_confirm/main", x_rate=1)

View file

@ -153,7 +153,7 @@ class Recognizer:
self.scene = Scene.DRONE_ACCELERATE self.scene = Scene.DRONE_ACCELERATE
elif self.find("factory_collect"): elif self.find("factory_collect"):
self.scene = Scene.FACTORY_ROOMS self.scene = Scene.FACTORY_ROOMS
elif self.find("mail"): elif self.find("mail/banner"):
self.scene = Scene.MAIL self.scene = Scene.MAIL
elif self.find("navigation/record_restoration"): elif self.find("navigation/record_restoration"):
self.scene = Scene.OPERATOR_CHOOSE_LEVEL self.scene = Scene.OPERATOR_CHOOSE_LEVEL
@ -671,7 +671,7 @@ class Recognizer:
judge: bool = True, judge: bool = True,
strict: bool = False, strict: bool = False,
threshold: float = 0.0, threshold: float = 0.0,
) -> tp.Scope: ) -> tp.Scope | None:
""" """
查找元素是否出现在画面中 查找元素是否出现在画面中

View file

@ -61,7 +61,9 @@ color = {
"login_connecting": (760, 881), "login_connecting": (760, 881),
"login_loading": (920, 388), "login_loading": (920, 388),
"login_logo": (601, 332), "login_logo": (601, 332),
"mail": (307, 39), "mail/banner": (307, 39),
"mail/collect": (1601, 979),
"mail/delete": (1226, 978),
"mission_collect": (1521, 164), "mission_collect": (1521, 164),
"mission_trainee_on": (690, 17), "mission_trainee_on": (690, 17),
"nav_bar": (655, 0), "nav_bar": (655, 0),
@ -219,6 +221,8 @@ template_matching = {
"loading2": (620, 247), "loading2": (620, 247),
"loading3": (1681, 1000), "loading3": (1681, 1000),
"loading4": (828, 429), "loading4": (828, 429),
"mail/clean": ((1560, 150), (1830, 390)),
"mail/complete": ((1560, 150), (1830, 390)),
"main_theme": (283, 945), "main_theme": (283, 945),
"main_theme_small": (321, 973), "main_theme_small": (321, 973),
"materiel_ico": (892, 61), "materiel_ico": (892, 61),

View file

@ -174,22 +174,36 @@ class BaseSolver:
judge: bool = True, judge: bool = True,
strict: bool = False, strict: bool = False,
score=0.0, score=0.0,
) -> tp.Scope: ) -> tp.Scope | None:
return config.recog.find(res, draw, scope, thres, judge, strict, score) return config.recog.find(res, draw, scope, thres, judge, strict, score)
def tap( def tap(
self, self,
poly: tp.Location, poly: tp.Location | tp.Res,
x_rate: float = 0.5, x_rate: float = 0.5,
y_rate: float = 0.5, y_rate: float = 0.5,
interval: float = 1, interval: float = 1,
) -> None: ):
"""tap""" """点击元素或坐标
Args:
poly (tp.Location | tp.Res): 元素名区域或坐标
x_rate (float, optional): 区域中横坐标的比例. Defaults to 0.5.
y_rate (float, optional): 区域中纵坐标的比例. Defaults to 0.5.
interval (float, optional): 点击后等待动画的时长. Defaults to 1.
Raises:
MowerExit: 停止运行
RecognizeError: 未识别到元素
"""
if config.stop_mower.is_set(): if config.stop_mower.is_set():
raise MowerExit raise MowerExit
if isinstance(poly, str):
poly = self.find(poly)
if poly is None:
raise RecognizeError("未识别到{res}元素")
self.tap_info = None, None self.tap_info = None, None
pos = self.get_pos(poly, x_rate, y_rate) config.device.tap(self.get_pos(poly, x_rate, y_rate))
config.device.tap(pos)
if interval > 0: if interval > 0:
self.sleep(interval) self.sleep(interval)
@ -232,28 +246,6 @@ class BaseSolver:
config.device.launch() config.device.launch()
config.recog.update() config.recog.update()
def tap_element(
self,
element_name: tp.Res,
x_rate: float = 0.5,
y_rate: float = 0.5,
interval: float = 1,
score: float = 0.0,
draw: bool = False,
scope: tp.Scope = None,
judge: bool = True,
detected: bool = False,
thres: Optional[int] = None,
) -> bool:
"""tap element"""
element = self.find(
element_name, draw, scope, judge=judge, score=score, thres=thres
)
if detected and element is None:
return False
self.tap(element, x_rate, y_rate, interval)
return True
def tap_index_element( def tap_index_element(
self, self,
name: Literal[ name: Literal[

View file

@ -155,7 +155,11 @@ Res = Literal[
"login_captcha", "login_captcha",
"login_connecting", "login_connecting",
"login_logo", "login_logo",
"mail", "mail/banner",
"mail/clean",
"mail/collect",
"mail/complete",
"mail/delete",
"main_theme", "main_theme",
"materiel_ico", "materiel_ico",
"mission_collect", "mission_collect",
@ -354,7 +358,6 @@ Res = Literal[
"ra/waste_time_button", "ra/waste_time_button",
"ra/waste_time_dialog", "ra/waste_time_dialog",
"read_and_agree", "read_and_agree",
"read_mail",
"recruit/agent_token", "recruit/agent_token",
"recruit/agent_token_first", "recruit/agent_token_first",
"recruit/begin_recruit", "recruit/begin_recruit",