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

View file

@ -87,8 +87,8 @@ class AutoFight(SceneGraphSolver, FightMixin):
elif scene == Scene.OPERATOR_SELECT:
self.tap((1655, 781))
elif scene == Scene.STORY:
self.tap_element("story_skip")
self.tap("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:
NavigationSolver().run(self.level_name, mode="copy")

View file

@ -31,7 +31,7 @@ class BattleChooseSolver(SceneGraphSolver):
def transition(self):
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:
self.waiting_solver()
else:

View file

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

View file

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

View file

@ -107,7 +107,7 @@ class BattleFilterSolver(SceneGraphSolver):
return True
if not self.find("choose_agent/battle_filter_close"):
self.tap_element("choose_agent/battle_filter")
self.tap("choose_agent/battle_filter")
return
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):
if (scene := self.scene()) == Scene.OPERATOR_AGENT_SELECT:
if self.success:
self.tap_element("choose_agent/battle_confirm")
self.tap("choose_agent/battle_confirm")
return
ChooseSkillSolver().run(self.skill)
self.success = True

View file

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

View file

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

View file

@ -87,7 +87,7 @@ class CreditFight(SceneGraphSolver):
elif scene == Scene.OPERATOR_SUPPORT:
self.tap(self.choose_support())
elif scene == Scene.OPERATOR_SUPPORT_AGENT:
self.tap_element("fight/use")
self.tap("fight/use")
elif scene == Scene.OPERATOR_FINISH:
return True
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 i not in self.agents and i not in self.choosed:
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.choosed = []
self.agent = None
@ -212,11 +212,11 @@ class RIIC_ChooseSolver(SceneGraphSolver, BaseMixin):
if contain_choose is False or len(self.agents) == 1:
self.cleard = True
else:
self.tap_element("choose_agent/clear", interval=0.1)
self.tap("choose_agent/clear", interval=0.1)
return
if self.riic_agent_choose():
self.sleep(self.check_wait_time())
self.tap_element("confirm_blue")
self.tap("confirm_blue")
self.success = True
elif self.find("room_detail"):

View file

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

View file

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

View file

@ -85,7 +85,7 @@ class ChooseProductSolver(SceneGraphSolver):
else:
self.tap(self.second_pos)
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
elif scene in self.waiting_scene:
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.log import logger
from mower.utils.recognize import Scene
@ -5,18 +8,30 @@ from mower.utils.recognize import Scene
class MailSolver(SceneGraphSolver):
solver_name = "领取邮件"
solver_max_duration = timedelta(minutes=2)
def run(self) -> None:
self.touched = False
logger.info("Start: 领取邮件")
def run(self):
self.read = False
return super().run()
def transition(self) -> bool:
def transition(self):
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
self.touched = True
self.tap_element("read_mail")
else:
self.scene_graph_step(Scene.MAIL)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -290,7 +290,7 @@ class ReclamationAlgorithm(SceneGraphSolver):
logger.debug(f"剩余决断次数:{self.ap}")
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):
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:
self.tap_terminal_button("longterm")
elif scene == Scene.TERMINAL_LONGTERM:
self.tap_element("terminal_longterm_reclamation_algorithm")
self.tap("terminal_longterm_reclamation_algorithm")
# 从生息演算主页进入生息演算
elif scene == Scene.RA_MAIN:
@ -346,7 +346,7 @@ class ReclamationAlgorithm(SceneGraphSolver):
if pos := self.find("ra/start_button"):
self.tap(pos, interval=8)
else:
self.tap_element("ra/continue_button", interval=3)
self.tap("ra/continue_button", interval=3)
# 剧情
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)
elif scene == Scene.RA_GUIDE_BATTLE_ENTRANCE:
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:
self.battle_wait = 0
self.fast_tap((1631, 675))
@ -364,7 +364,7 @@ class ReclamationAlgorithm(SceneGraphSolver):
if self.battle_task in self.task_queue:
self.task_queue.remove(self.battle_task)
self.ap -= 1
self.tap_element("ra/start_action")
self.tap("ra/start_action")
elif scene == Scene.RA_BATTLE:
if self.battle_wait > 0:
self.battle_wait -= 1
@ -375,9 +375,9 @@ class ReclamationAlgorithm(SceneGraphSolver):
else:
config.recog.update()
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:
self.tap_element("ra/battle_complete", interval=0.5)
self.tap("ra/battle_complete", interval=0.5)
# 结算界面
elif scene == Scene.RA_DAY_COMPLETE:
@ -521,9 +521,9 @@ class ReclamationAlgorithm(SceneGraphSolver):
self.battle_task = place
config.recog.update()
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:
self.tap_element("ra/confirm_green")
self.tap("ra/confirm_green")
# 作战编队
elif scene == Scene.RA_SQUAD_EDIT:
@ -531,34 +531,34 @@ class ReclamationAlgorithm(SceneGraphSolver):
self.left_kitchen = False
self.tap((1430, 1015), interval=0.5)
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:
self.tap_element("ra/confirm_red", interval=6)
self.tap("ra/confirm_red", interval=6)
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:
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
last_drink = self.detect_prepared()
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()
if drink == last_drink:
logger.debug("饮料无法合成,返回地图,清空任务列表")
self.task_queue = []
self.tap_element("ra/return_from_kitchen", x_rate=0.07)
self.tap_element("ra/squad_back")
self.tap("ra/return_from_kitchen", x_rate=0.07)
self.tap("ra/squad_back")
self.map_back()
return
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:
self.tap_element("ra/dialog_cancel")
self.tap("ra/dialog_cancel")
# 获得物资
elif scene == Scene.RA_GET_ITEM:
@ -569,7 +569,7 @@ class ReclamationAlgorithm(SceneGraphSolver):
self.tap((428, 411), interval=0.5)
else:
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:
self.sleep(0.5)
@ -585,15 +585,15 @@ class ReclamationAlgorithm(SceneGraphSolver):
if scene == Scene.CONNECTING:
self.sleep()
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]:
self.map_back()
elif scene == Scene.RA_SQUAD_EDIT:
self.tap_element("ra/squad_back")
self.tap("ra/squad_back")
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]:
self.tap_element("ra/dialog_cancel")
self.tap("ra/dialog_cancel")
elif 900 < scene < 1000:
self.move_forward(scene)
else:

View file

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

View file

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

View file

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

View file

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

View file

@ -67,7 +67,7 @@ class SSSSolver(SceneGraphSolver):
deadline=self.deadline,
):
return
self.tap_element("sss/settlement_commission")
self.tap("sss/settlement_commission")
elif (
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:
if config.conf.sss.choose_agent:
SSSChooseSolver().run()
self.tap_element("sss/squad")
self.tap("sss/squad")
elif scene in self.waiting_scene:
self.waiting_solver()

View file

@ -26,7 +26,7 @@ class SSSChooseSolver(SceneGraphSolver):
def transition(self):
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:
self.waiting_solver()
elif scene == Scene.SSS_SQUAD:

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -18,17 +18,17 @@ def login_start(solver: BaseSolver):
@edge(Scene.CONFIRM, Scene.LOGIN_START)
def confirm(solver: BaseSolver):
solver.tap_element("confirm")
solver.tap("confirm")
@edge(Scene.NOTICE, Scene.INDEX)
def close_notice(solver: BaseSolver):
solver.tap_element("notice")
solver.tap("notice")
@edge(Scene.NETWORK_CHECK, Scene.LOGIN_START)
def network_check_cancel(solver: BaseSolver):
solver.tap_element("confirm")
solver.tap("confirm")
@edge(Scene.MOON_FESTIVAL, Scene.SIGN_IN_DAILY)
@ -43,12 +43,12 @@ def story_stage(solver: BaseSolver):
@edge(Scene.STORY, Scene.STORY_SKIP)
def skip_story(solver: BaseSolver):
solver.tap_element("story_skip")
solver.tap("story_skip")
@edge(Scene.STORY_SKIP, Scene.OPERATOR_BEFORE)
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)

View file

@ -23,4 +23,4 @@ def friend_visiting_back(solver: BaseSolver):
@edge(Scene.BACK_TO_FRIEND_LIST, Scene.BUSINESS_CARD)
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)
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)
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)
def login_quickly(solver: BaseSolver):
solver.tap_element("login_awake")
solver.tap("login_awake")
@edge(Scene.LOGIN_CAPTCHA, Scene.INDEX)
@ -63,7 +63,7 @@ def login_bilibili(solver: BaseSolver):
@edge(Scene.EXIT_GAME, Scene.INDEX)
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)

View file

@ -9,9 +9,9 @@ from .utils import edge
@edge(Scene.MISSION_DAILY, Scene.MISSION_WEEKLY)
@edge(Scene.MISSION_TRAINEE, Scene.MISSION_WEEKLY)
def mission_to_weekly(solver: BaseSolver):
solver.tap_element("mission_weekly")
solver.tap("mission_weekly")
@edge(Scene.MISSION_TRAINEE, Scene.MISSION_DAILY)
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.ROGUE_INDEX, Scene.NAVIGATION_BAR)
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)
def operation_fight(solver: BaseSolver):
solver.tap_element("fight/gear")
solver.tap("fight/gear")
@edge(Scene.OPERATOR_GIVEUP, Scene.OPERATOR_FAILED)
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)
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)

View file

@ -13,7 +13,7 @@ def recruit_result(solver: BaseSolver):
@edge(Scene.REFRESH_TAGS, Scene.RECRUIT_TAGS)
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)
@ -23,4 +23,4 @@ def recruit_back(solver: BaseSolver):
@edge(Scene.SKIP, Scene.RECRUIT_AGENT)
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)
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)
@ -47,12 +47,12 @@ def riic_back(solver: BaseSolver):
@edge(Scene.CTRLCENTER_ASSISTANT, Scene.RIIC_REPORT)
def riic(solver: BaseSolver):
solver.tap_element("control_central_assistants")
solver.tap("control_central_assistants")
@edge(Scene.INFRA_MAIN, Scene.CTRLCENTER_ASSISTANT)
def control_central(solver: BaseSolver):
solver.tap_element("control_central")
solver.tap("control_central")
@edge(Scene.SANITY_CHARGE, Scene.INFRA_MAIN)
@ -72,4 +72,4 @@ def switch_order(solver: BaseSolver):
@edge(Scene.PRODUCT_SWITCHING_CONFIRM, Scene.FACTORY_ROOMS)
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.ROGUE_SELECT, Scene.ROGUE_INDEX)
def infra_back(solver: BaseSolver):
solver.tap_element("rogue/back")
solver.tap("rogue/back")
@edge(Scene.ROGUE_ABANDON, Scene.ROGUE_INDEX)
@edge(Scene.ROGUE_REFRESH_SHOP, Scene.UNKNOW_ROGUE)
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)
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_EXIT_CONFIRM, Scene.SSS_TERMINATED)
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
elif self.find("factory_collect"):
self.scene = Scene.FACTORY_ROOMS
elif self.find("mail"):
elif self.find("mail/banner"):
self.scene = Scene.MAIL
elif self.find("navigation/record_restoration"):
self.scene = Scene.OPERATOR_CHOOSE_LEVEL
@ -671,7 +671,7 @@ class Recognizer:
judge: bool = True,
strict: bool = False,
threshold: float = 0.0,
) -> tp.Scope:
) -> tp.Scope | None:
"""
查找元素是否出现在画面中

View file

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

View file

@ -174,22 +174,36 @@ class BaseSolver:
judge: bool = True,
strict: bool = False,
score=0.0,
) -> tp.Scope:
) -> tp.Scope | None:
return config.recog.find(res, draw, scope, thres, judge, strict, score)
def tap(
self,
poly: tp.Location,
poly: tp.Location | tp.Res,
x_rate: float = 0.5,
y_rate: float = 0.5,
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():
raise MowerExit
if isinstance(poly, str):
poly = self.find(poly)
if poly is None:
raise RecognizeError("未识别到{res}元素")
self.tap_info = None, None
pos = self.get_pos(poly, x_rate, y_rate)
config.device.tap(pos)
config.device.tap(self.get_pos(poly, x_rate, y_rate))
if interval > 0:
self.sleep(interval)
@ -232,28 +246,6 @@ class BaseSolver:
config.device.launch()
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(
self,
name: Literal[

View file

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