From af6d1bcb8c47ef1c15423ba502d95dfa7672fbd8 Mon Sep 17 00:00:00 2001 From: Vanity <467029499@qq.com> Date: Sun, 11 Oct 2026 00:37:20 +0800 Subject: [PATCH 01/25] =?UTF-8?q?fix(Exploration):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=89=B9=E5=AE=9AUP=E7=B1=BB=E5=9E=8B=E6=89=BE=E6=80=AA?= =?UTF-8?q?=E6=8F=90=E5=89=8D=E9=80=80=E5=87=BA=E5=8F=8A=E6=BB=91=E5=B1=8F?= =?UTF-8?q?=E8=BE=B9=E7=BC=98=E6=A3=80=E6=B5=8B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修复 search_fail_timer 未启动即触发及与 swipe(interval=3) 时序冲突吞掉滑动指令导致误判滑到底退出的问题; 2. 将单屏找怪观察时间从 3.2s 缩短至 1.0s,并在滑屏后立即调用 is_swipe_unchanged 检测中上部背景(250,140,800,90)像素差,避开顶部跑马灯与右侧浮动鬼火干扰,到底即退; 3. 退出/切换探索场景时清理 swipe_background_right 点击历史记录,避免多轮翻找累计触发 GameTooManyClickError; 4. 修复 search_up_fight 在特定 UP 模式下未匹配到挑战图标时向下穿透到 UpType.ALL 的问题。 --- tasks/Exploration/base.py | 13 ++++---- tasks/Exploration/solo.py | 70 ++++++++++++++++++++++++++++++++------- 2 files changed, 65 insertions(+), 18 deletions(-) diff --git a/tasks/Exploration/base.py b/tasks/Exploration/base.py index 3cc7f87b73..aa5ee43459 100644 --- a/tasks/Exploration/base.py +++ b/tasks/Exploration/base.py @@ -58,9 +58,9 @@ def _config(self): def _match_end(self): return RuleAnimate(self.I_SWIPE_END) - def is_swipe_unchanged(self, before_image, after_image, threshold: float = 20) -> bool: - # 对比滑屏前后同一块区域,变化很小说明地图大概率没有移动,已经滑到尽头。 - swipe_check_roi = (1216, 86, 64, 225) + def is_swipe_unchanged(self, before_image, after_image, threshold: float = 15) -> bool: + # 对比滑屏前后中上部背景区域(避开顶部跑马灯、下方小怪挑战图标及最右侧浮动鬼火),变化很小说明地图已滑到尽头。 + swipe_check_roi = (250, 140, 800, 90) before = self.I_SWIPE_END.corp(before_image, swipe_check_roi) after = self.I_SWIPE_END.corp(after_image, swipe_check_roi) diff = np.mean(np.abs(before.astype(np.int16) - after.astype(np.int16))) @@ -329,11 +329,11 @@ def search_up_fight(self, up_type: UpType = None): self.I_NORMAL_BATTLE_BUTTON.roi_front = roi_front logger.info(f"Target locked: sword at {roi_front} (aligned with UP icon)") return self.I_NORMAL_BATTLE_BUTTON - else: - # 没找到 UP 图标,返回 None 让外层逻辑去处理(滑动或退出) - return None + # 没找到 UP 图标或对应战斗图标,返回 None 让外层逻辑去处理(滑动或退出) + return None # 2. 如果是默认情况 (UpType.ALL),则只要有怪就打 + self.I_NORMAL_BATTLE_BUTTON.roi_back = (0, 0, 1279, 719) if self.appear(self.I_NORMAL_BATTLE_BUTTON): return self.I_NORMAL_BATTLE_BUTTON @@ -389,6 +389,7 @@ def check_exit(self) -> bool: def quit_explore(self): logger.info('Quit explore') + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) boss_timer = Timer(15) boss_timer.start() # click_yellow_button = 0 #用于保证只点一次左上返回按钮,不要直接触发连点回到主界面 diff --git a/tasks/Exploration/solo.py b/tasks/Exploration/solo.py index 80cef942c2..ae99346ee5 100644 --- a/tasks/Exploration/solo.py +++ b/tasks/Exploration/solo.py @@ -62,7 +62,7 @@ def _check_mate_leave(self, friend_leave_timer: Timer) -> bool: def run_solo(self): logger.hr('solo') - search_fail_timer = Timer(3.2) # 这里设置的时间一定要大于S_SWIPE_BACKGROUND_RIGHT滑动的时间 + search_fail_timer = Timer(1.0) while 1: self.screenshot() @@ -70,6 +70,9 @@ def run_solo(self): logger.info(f'[run_solo] Current scene: {scene.name}') # TODO 2026.06.22 之后删掉这个刷屏的 # if scene == Scene.WORLD: + search_fail_timer.clear() + self._match_end.refresh() + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) # 打开右边箭头 if not self.wait_world_stable(): continue @@ -79,6 +82,9 @@ def run_solo(self): continue # elif scene == Scene.ENTRANCE: + search_fail_timer.clear() + self._match_end.refresh() + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.check_exit(): break self.ui_click(self.I_E_EXPLORATION_CLICK, stop=self.I_E_SETTINGS_BUTTON) @@ -90,8 +96,12 @@ def run_solo(self): self.enter_settings_and_do_operations() self.ui_click(self.I_E_AUTO_ROTATE_OFF, stop=self.I_E_AUTO_ROTATE_ON, timeout=5) self.explore_init = True + search_fail_timer.clear() + self._match_end.refresh() continue if self._handle_treasure_box(): + search_fail_timer.clear() + self._match_end.refresh() continue if (self.appear_then_click(self.I_UI_CONFIRM, interval=1) or self.appear_then_click(self.I_UI_CONFIRM_SAMLL, interval=1)): @@ -99,28 +109,39 @@ def run_solo(self): # 小纸人 if self.appear(self.I_BATTLE_REWARD): if self.ui_get_reward(self.I_BATTLE_REWARD): + search_fail_timer.clear() + self._match_end.refresh() continue # boss if self.appear(self.I_BOSS_BATTLE_BUTTON): + search_fail_timer.clear() + self._match_end.refresh() if self.fire(self.I_BOSS_BATTLE_BUTTON): logger.info(f'Boss battle, minions cnt {self.minions_cnt}') continue # 小怪 fight_button = self.search_up_fight() if fight_button is not None: + search_fail_timer.clear() + self._match_end.refresh() if self.fire(fight_button): logger.info(f'Fight, minions cnt {self.minions_cnt}') continue # 向后拉,寻找怪 + if not search_fail_timer.started(): + search_fail_timer.start() + continue if search_fail_timer.reached(): - search_fail_timer.reset() - if self._match_end.stable(self.device.image, refresh_after_stable=True): + before_image = self.device.image + self.swipe(self.S_SWIPE_BACKGROUND_RIGHT) + sleep(0.3) + self.screenshot() + if self.is_swipe_unchanged(before_image, self.device.image): + search_fail_timer.clear() self.quit_explore() continue - self.swipe(self.S_SWIPE_BACKGROUND_RIGHT, interval=3) + search_fail_timer.reset() continue - if not search_fail_timer.started(): - search_fail_timer.start() # elif scene == Scene.BATTLE_PREPARE or scene == Scene.BATTLE_FIGHTING: self.check_take_over_battle(is_screenshot=False, config=self._config.general_battle_config) @@ -129,7 +150,7 @@ def run_solo(self): def run_leader(self): logger.hr('leader') - search_fail_timer = Timer(3.2) # 这里设置的时间一定要大于S_SWIPE_BACKGROUND_RIGHT滑动的时间 + search_fail_timer = Timer(1.0) friend_leave_timer = Timer(self.FRIEND_LEAVE_TIMEOUT) while 1: @@ -137,6 +158,9 @@ def run_leader(self): scene = self.get_current_scene() # 探索大世界 if scene == Scene.WORLD: + search_fail_timer.clear() + self._match_end.refresh() + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) # 打开右边箭头 if not self.wait_world_stable(): continue @@ -155,6 +179,9 @@ def run_leader(self): # 邀请好友, 非常有可能是后面邀请好友,然后直接跳到组队了 elif scene == Scene.ENTRANCE: + search_fail_timer.clear() + self._match_end.refresh() + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) while 1: self.screenshot() if self.is_in_room(): @@ -170,6 +197,8 @@ def run_leader(self): continue # elif scene == Scene.TEAM: + search_fail_timer.clear() + self._match_end.refresh() self.wait_until_stable(self.I_ADD_2, timer=Timer(0.8, 1)) if self.appear(self.I_FIRE, threshold=0.8) and not self.appear(self.I_ADD_2): self.ui_click_until_disappear(self.I_FIRE, interval=1) @@ -196,37 +225,54 @@ def run_leader(self): self.enter_settings_and_do_operations() self.ui_click(self.I_E_AUTO_ROTATE_OFF, stop=self.I_E_AUTO_ROTATE_ON) self.explore_init = True + search_fail_timer.clear() + self._match_end.refresh() continue if self._handle_treasure_box(): + search_fail_timer.clear() + self._match_end.refresh() continue # 小纸人 if self.appear(self.I_BATTLE_REWARD): if self.ui_get_reward(self.I_BATTLE_REWARD): + search_fail_timer.clear() + self._match_end.refresh() continue # 中途有人跑路 if self._check_mate_leave(friend_leave_timer): + search_fail_timer.clear() + self._match_end.refresh() continue # boss if self.appear(self.I_BOSS_BATTLE_BUTTON): + search_fail_timer.clear() + self._match_end.refresh() if self.fire(self.I_BOSS_BATTLE_BUTTON): logger.info(f'Boss battle, minions cnt {self.minions_cnt}') continue # 小怪 fight_button = self.search_up_fight() if fight_button is not None: + search_fail_timer.clear() + self._match_end.refresh() if self.fire(fight_button): logger.info(f'Fight, minions cnt {self.minions_cnt}') continue # 向后拉,寻找怪 + if not search_fail_timer.started(): + search_fail_timer.start() + continue if search_fail_timer.reached(): - search_fail_timer.reset() - if self._match_end.stable(self.device.image, refresh_after_stable=True): + before_image = self.device.image + self.swipe(self.S_SWIPE_BACKGROUND_RIGHT) + sleep(0.3) + self.screenshot() + if self.is_swipe_unchanged(before_image, self.device.image): + search_fail_timer.clear() self.quit_explore() continue - self.swipe(self.S_SWIPE_BACKGROUND_RIGHT, interval=3) + search_fail_timer.reset() continue - if not search_fail_timer.started(): - search_fail_timer.start() # elif scene == Scene.BATTLE_PREPARE or scene == Scene.BATTLE_FIGHTING: self.check_take_over_battle(is_screenshot=False, config=self._config.general_battle_config) From c8f93d1b6c2381b3fdb64147eb57c8ec3010b7fc Mon Sep 17 00:00:00 2001 From: Vanity <467029499@qq.com> Date: Sun, 11 Oct 2026 01:25:50 +0800 Subject: [PATCH 02/25] fix(Exploration): address review feedback on timer reset and swipe edge check - Reset search_fail_timer and unchanged_swipe_cnt when clicking confirmation popups in Scene.MAIN - Re-check screenshot after a delayed swipe, ignore popups/scene changes, and require 2 consecutive unchanged swipes before quitting exploration - Clear S_SWIPE_BACKGROUND_RIGHT click records when swipes move the map or battles trigger to prevent false GameTooManyClickError during long searches --- tasks/Exploration/solo.py | 69 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/tasks/Exploration/solo.py b/tasks/Exploration/solo.py index ae99346ee5..32b84ccc36 100644 --- a/tasks/Exploration/solo.py +++ b/tasks/Exploration/solo.py @@ -63,6 +63,7 @@ def _check_mate_leave(self, friend_leave_timer: Timer) -> bool: def run_solo(self): logger.hr('solo') search_fail_timer = Timer(1.0) + unchanged_swipe_cnt = 0 while 1: self.screenshot() @@ -71,6 +72,7 @@ def run_solo(self): # if scene == Scene.WORLD: search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) # 打开右边箭头 @@ -83,6 +85,7 @@ def run_solo(self): # elif scene == Scene.ENTRANCE: search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.check_exit(): @@ -97,25 +100,33 @@ def run_solo(self): self.ui_click(self.I_E_AUTO_ROTATE_OFF, stop=self.I_E_AUTO_ROTATE_ON, timeout=5) self.explore_init = True search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() continue if self._handle_treasure_box(): search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() continue if (self.appear_then_click(self.I_UI_CONFIRM, interval=1) or self.appear_then_click(self.I_UI_CONFIRM_SAMLL, interval=1)): + search_fail_timer.clear() + unchanged_swipe_cnt = 0 + self._match_end.refresh() continue # 小纸人 if self.appear(self.I_BATTLE_REWARD): if self.ui_get_reward(self.I_BATTLE_REWARD): search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() continue # boss if self.appear(self.I_BOSS_BATTLE_BUTTON): search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.fire(self.I_BOSS_BATTLE_BUTTON): logger.info(f'Boss battle, minions cnt {self.minions_cnt}') continue @@ -123,7 +134,9 @@ def run_solo(self): fight_button = self.search_up_fight() if fight_button is not None: search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.fire(fight_button): logger.info(f'Fight, minions cnt {self.minions_cnt}') continue @@ -137,9 +150,24 @@ def run_solo(self): sleep(0.3) self.screenshot() if self.is_swipe_unchanged(before_image, self.device.image): - search_fail_timer.clear() - self.quit_explore() + sleep(0.3) + self.screenshot() + if (self.get_current_scene() != Scene.MAIN + or self.appear(self.I_UI_CONFIRM) + or self.appear(self.I_UI_CONFIRM_SAMLL)): + unchanged_swipe_cnt = 0 + search_fail_timer.reset() continue + if self.is_swipe_unchanged(before_image, self.device.image): + unchanged_swipe_cnt += 1 + if unchanged_swipe_cnt >= 2: + unchanged_swipe_cnt = 0 + search_fail_timer.clear() + self.quit_explore() + continue + else: + unchanged_swipe_cnt = 0 + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) search_fail_timer.reset() continue # @@ -151,6 +179,7 @@ def run_solo(self): def run_leader(self): logger.hr('leader') search_fail_timer = Timer(1.0) + unchanged_swipe_cnt = 0 friend_leave_timer = Timer(self.FRIEND_LEAVE_TIMEOUT) while 1: @@ -159,6 +188,7 @@ def run_leader(self): # 探索大世界 if scene == Scene.WORLD: search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) # 打开右边箭头 @@ -180,6 +210,7 @@ def run_leader(self): # 邀请好友, 非常有可能是后面邀请好友,然后直接跳到组队了 elif scene == Scene.ENTRANCE: search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) while 1: @@ -198,6 +229,7 @@ def run_leader(self): # elif scene == Scene.TEAM: search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() self.wait_until_stable(self.I_ADD_2, timer=Timer(0.8, 1)) if self.appear(self.I_FIRE, threshold=0.8) and not self.appear(self.I_ADD_2): @@ -226,27 +258,39 @@ def run_leader(self): self.ui_click(self.I_E_AUTO_ROTATE_OFF, stop=self.I_E_AUTO_ROTATE_ON) self.explore_init = True search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() continue if self._handle_treasure_box(): search_fail_timer.clear() + unchanged_swipe_cnt = 0 + self._match_end.refresh() + continue + if (self.appear_then_click(self.I_UI_CONFIRM, interval=1) + or self.appear_then_click(self.I_UI_CONFIRM_SAMLL, interval=1)): + search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() continue # 小纸人 if self.appear(self.I_BATTLE_REWARD): if self.ui_get_reward(self.I_BATTLE_REWARD): search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() continue # 中途有人跑路 if self._check_mate_leave(friend_leave_timer): search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() continue # boss if self.appear(self.I_BOSS_BATTLE_BUTTON): search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.fire(self.I_BOSS_BATTLE_BUTTON): logger.info(f'Boss battle, minions cnt {self.minions_cnt}') continue @@ -254,7 +298,9 @@ def run_leader(self): fight_button = self.search_up_fight() if fight_button is not None: search_fail_timer.clear() + unchanged_swipe_cnt = 0 self._match_end.refresh() + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.fire(fight_button): logger.info(f'Fight, minions cnt {self.minions_cnt}') continue @@ -268,9 +314,24 @@ def run_leader(self): sleep(0.3) self.screenshot() if self.is_swipe_unchanged(before_image, self.device.image): - search_fail_timer.clear() - self.quit_explore() + sleep(0.3) + self.screenshot() + if (self.get_current_scene() != Scene.MAIN + or self.appear(self.I_UI_CONFIRM) + or self.appear(self.I_UI_CONFIRM_SAMLL)): + unchanged_swipe_cnt = 0 + search_fail_timer.reset() continue + if self.is_swipe_unchanged(before_image, self.device.image): + unchanged_swipe_cnt += 1 + if unchanged_swipe_cnt >= 2: + unchanged_swipe_cnt = 0 + search_fail_timer.clear() + self.quit_explore() + continue + else: + unchanged_swipe_cnt = 0 + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) search_fail_timer.reset() continue # From 2bc21f59433f86f36b17e5b1da09fab27ab60951 Mon Sep 17 00:00:00 2001 From: Vanity <467029499@qq.com> Date: Sun, 11 Oct 2026 13:49:37 +0800 Subject: [PATCH 03/25] =?UTF-8?q?refactor(Exploration):=20=E6=A0=B9?= =?UTF-8?q?=E6=8D=AEReview=E5=BB=BA=E8=AE=AE=E6=8A=BD=E5=8F=96=E6=BB=91?= =?UTF-8?q?=E5=B1=8F=E4=B8=8E=E9=87=8D=E7=BD=AE=E8=BE=85=E5=8A=A9=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8C=E6=B6=88=E9=99=A4=E9=87=8D=E5=A4=8D=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 抽取 _reset_search_state 统一重置滑动计时器与刷新结算状态 - 抽取 _search_next_area 统一滑屏找怪与边界停滞检测判定 - 精简 run_solo 和 run_leader,去除重复实现,保持两处逻辑一致 --- tasks/Exploration/solo.py | 172 +++++++++++++------------------------- 1 file changed, 60 insertions(+), 112 deletions(-) diff --git a/tasks/Exploration/solo.py b/tasks/Exploration/solo.py index 32b84ccc36..81828cf810 100644 --- a/tasks/Exploration/solo.py +++ b/tasks/Exploration/solo.py @@ -60,6 +60,44 @@ def _check_mate_leave(self, friend_leave_timer: Timer) -> bool: self.quit_explore() return True + def _reset_search_state(self, search_fail_timer: Timer) -> int: + search_fail_timer.clear() + self._match_end.refresh() + return 0 + + def _search_next_area(self, search_fail_timer: Timer, unchanged_swipe_cnt: int) -> int: + if not search_fail_timer.started(): + search_fail_timer.start() + return unchanged_swipe_cnt + if not search_fail_timer.reached(): + return unchanged_swipe_cnt + + before_image = self.device.image + self.swipe(self.S_SWIPE_BACKGROUND_RIGHT) + sleep(0.3) + self.screenshot() + if self.is_swipe_unchanged(before_image, self.device.image): + sleep(0.3) + self.screenshot() + if (self.get_current_scene() != Scene.MAIN + or self.appear(self.I_UI_CONFIRM) + or self.appear(self.I_UI_CONFIRM_SAMLL)): + search_fail_timer.reset() + return 0 + + if self.is_swipe_unchanged(before_image, self.device.image): + unchanged_swipe_cnt += 1 + if unchanged_swipe_cnt >= 2: + search_fail_timer.clear() + self.quit_explore() + return 0 + else: + unchanged_swipe_cnt = 0 + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) + + search_fail_timer.reset() + return unchanged_swipe_cnt + def run_solo(self): logger.hr('solo') search_fail_timer = Timer(1.0) @@ -71,9 +109,7 @@ def run_solo(self): logger.info(f'[run_solo] Current scene: {scene.name}') # TODO 2026.06.22 之后删掉这个刷屏的 # if scene == Scene.WORLD: - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) # 打开右边箭头 if not self.wait_world_stable(): @@ -84,9 +120,7 @@ def run_solo(self): continue # elif scene == Scene.ENTRANCE: - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.check_exit(): break @@ -99,33 +133,23 @@ def run_solo(self): self.enter_settings_and_do_operations() self.ui_click(self.I_E_AUTO_ROTATE_OFF, stop=self.I_E_AUTO_ROTATE_ON, timeout=5) self.explore_init = True - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) continue if self._handle_treasure_box(): - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) continue if (self.appear_then_click(self.I_UI_CONFIRM, interval=1) or self.appear_then_click(self.I_UI_CONFIRM_SAMLL, interval=1)): - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) continue # 小纸人 if self.appear(self.I_BATTLE_REWARD): if self.ui_get_reward(self.I_BATTLE_REWARD): - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) continue # boss if self.appear(self.I_BOSS_BATTLE_BUTTON): - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.fire(self.I_BOSS_BATTLE_BUTTON): logger.info(f'Boss battle, minions cnt {self.minions_cnt}') @@ -133,43 +157,14 @@ def run_solo(self): # 小怪 fight_button = self.search_up_fight() if fight_button is not None: - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.fire(fight_button): logger.info(f'Fight, minions cnt {self.minions_cnt}') continue # 向后拉,寻找怪 - if not search_fail_timer.started(): - search_fail_timer.start() - continue - if search_fail_timer.reached(): - before_image = self.device.image - self.swipe(self.S_SWIPE_BACKGROUND_RIGHT) - sleep(0.3) - self.screenshot() - if self.is_swipe_unchanged(before_image, self.device.image): - sleep(0.3) - self.screenshot() - if (self.get_current_scene() != Scene.MAIN - or self.appear(self.I_UI_CONFIRM) - or self.appear(self.I_UI_CONFIRM_SAMLL)): - unchanged_swipe_cnt = 0 - search_fail_timer.reset() - continue - if self.is_swipe_unchanged(before_image, self.device.image): - unchanged_swipe_cnt += 1 - if unchanged_swipe_cnt >= 2: - unchanged_swipe_cnt = 0 - search_fail_timer.clear() - self.quit_explore() - continue - else: - unchanged_swipe_cnt = 0 - self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) - search_fail_timer.reset() - continue + unchanged_swipe_cnt = self._search_next_area(search_fail_timer, unchanged_swipe_cnt) + continue # elif scene == Scene.BATTLE_PREPARE or scene == Scene.BATTLE_FIGHTING: self.check_take_over_battle(is_screenshot=False, config=self._config.general_battle_config) @@ -187,9 +182,7 @@ def run_leader(self): scene = self.get_current_scene() # 探索大世界 if scene == Scene.WORLD: - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) # 打开右边箭头 if not self.wait_world_stable(): @@ -209,9 +202,7 @@ def run_leader(self): # 邀请好友, 非常有可能是后面邀请好友,然后直接跳到组队了 elif scene == Scene.ENTRANCE: - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) while 1: self.screenshot() @@ -228,9 +219,7 @@ def run_leader(self): continue # elif scene == Scene.TEAM: - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) self.wait_until_stable(self.I_ADD_2, timer=Timer(0.8, 1)) if self.appear(self.I_FIRE, threshold=0.8) and not self.appear(self.I_ADD_2): self.ui_click_until_disappear(self.I_FIRE, interval=1) @@ -257,39 +246,27 @@ def run_leader(self): self.enter_settings_and_do_operations() self.ui_click(self.I_E_AUTO_ROTATE_OFF, stop=self.I_E_AUTO_ROTATE_ON) self.explore_init = True - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) continue if self._handle_treasure_box(): - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) continue if (self.appear_then_click(self.I_UI_CONFIRM, interval=1) or self.appear_then_click(self.I_UI_CONFIRM_SAMLL, interval=1)): - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) continue # 小纸人 if self.appear(self.I_BATTLE_REWARD): if self.ui_get_reward(self.I_BATTLE_REWARD): - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) continue # 中途有人跑路 if self._check_mate_leave(friend_leave_timer): - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) continue # boss if self.appear(self.I_BOSS_BATTLE_BUTTON): - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.fire(self.I_BOSS_BATTLE_BUTTON): logger.info(f'Boss battle, minions cnt {self.minions_cnt}') @@ -297,43 +274,14 @@ def run_leader(self): # 小怪 fight_button = self.search_up_fight() if fight_button is not None: - search_fail_timer.clear() - unchanged_swipe_cnt = 0 - self._match_end.refresh() + unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.fire(fight_button): logger.info(f'Fight, minions cnt {self.minions_cnt}') continue # 向后拉,寻找怪 - if not search_fail_timer.started(): - search_fail_timer.start() - continue - if search_fail_timer.reached(): - before_image = self.device.image - self.swipe(self.S_SWIPE_BACKGROUND_RIGHT) - sleep(0.3) - self.screenshot() - if self.is_swipe_unchanged(before_image, self.device.image): - sleep(0.3) - self.screenshot() - if (self.get_current_scene() != Scene.MAIN - or self.appear(self.I_UI_CONFIRM) - or self.appear(self.I_UI_CONFIRM_SAMLL)): - unchanged_swipe_cnt = 0 - search_fail_timer.reset() - continue - if self.is_swipe_unchanged(before_image, self.device.image): - unchanged_swipe_cnt += 1 - if unchanged_swipe_cnt >= 2: - unchanged_swipe_cnt = 0 - search_fail_timer.clear() - self.quit_explore() - continue - else: - unchanged_swipe_cnt = 0 - self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) - search_fail_timer.reset() - continue + unchanged_swipe_cnt = self._search_next_area(search_fail_timer, unchanged_swipe_cnt) + continue # elif scene == Scene.BATTLE_PREPARE or scene == Scene.BATTLE_FIGHTING: self.check_take_over_battle(is_screenshot=False, config=self._config.general_battle_config) From 7f0728bf368eae4a854e1bb2c014ea8fa1497d4c Mon Sep 17 00:00:00 2001 From: davidyangkunlong <22984788@qq.com> Date: Sun, 11 Oct 2026 17:45:02 +0800 Subject: [PATCH 04/25] =?UTF-8?q?=E7=82=B9=E5=87=BB=E5=BE=A1=E9=AD=82?= =?UTF-8?q?=E6=BA=A2=E5=87=BA=E7=9A=84=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1 点击御魂溢出的提示 2 测试过在interupt里面增加,无法生效。 --- tasks/Component/GeneralBattle/battle_wait.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tasks/Component/GeneralBattle/battle_wait.py b/tasks/Component/GeneralBattle/battle_wait.py index 9b7820454a..d453032f50 100644 --- a/tasks/Component/GeneralBattle/battle_wait.py +++ b/tasks/Component/GeneralBattle/battle_wait.py @@ -1180,6 +1180,10 @@ def _bw_success_default(self, pub: PublicContext, pri: PrivateContext) -> HookSi while 1: self.screenshot() + # 结算的时候御魂溢出提示,点击【知道了】 + if self.appear(self.I_OVER_GHOST): + self.click(self.I_OVER_GHOST) + # 不小心点到了具体的奖励,他会弹出这个物品的详细描述 里面必定包含有“获取途径” if self.appear(self.I_END_FIX_1) or self.appear(self.I_END_FIX_2): self.click(self.C_REWARD_2, interval=1.5) From 69a0fc4f24d5a2456ded4eb80f8cc5242fddff98 Mon Sep 17 00:00:00 2001 From: Vanity <467029499@qq.com> Date: Sun, 11 Oct 2026 19:53:55 +0800 Subject: [PATCH 05/25] =?UTF-8?q?perf(Exploration):=20=E6=8C=89UP=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E8=87=AA=E9=80=82=E5=BA=94=E6=BB=91=E5=B1=8F=E6=89=BE?= =?UTF-8?q?=E6=80=AA=E7=AD=96=E7=95=A5=E4=B8=8E=E6=AD=BB=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=B2=BE=E7=AE=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 特定UP模式(经验/金币/达摩):启用2次滑屏早退策略(MAX_SWIPE_COUNT = 2),覆盖前3屏无怪即早退重开 - 全部模式(UpType.ALL):不限制滑屏次数,支持滑至最右边缘以打完全部小怪并击杀首领 - 剔除失效的巡航常量与 current_swipe_interval 死代码,清理废弃的 _match_end.refresh() - 缓存滑屏位移判定,避免单次检测内重复计算图像差分与输出日志 - 成员化 search_fail_timer,消除 17 处冗余参数透传 --- tasks/Exploration/solo.py | 121 +++++++++++++++++++++++--------------- 1 file changed, 73 insertions(+), 48 deletions(-) diff --git a/tasks/Exploration/solo.py b/tasks/Exploration/solo.py index 81828cf810..018aa37cbe 100644 --- a/tasks/Exploration/solo.py +++ b/tasks/Exploration/solo.py @@ -18,7 +18,11 @@ class SoloExploration(BaseExploration): INVITE_FLAG_ON = (227, 193, 153) INVITE_TIMEOUT = 20 FRIEND_LEAVE_TIMEOUT = 3 + SEARCH_SWIPE_INTERVAL = 1.5 + MAX_SWIPE_COUNT = 2 explore_init = False + swipe_cnt: int = 0 + search_fail_timer: Timer = None @cached_property def _invite_config(self) -> InviteConfig: @@ -60,48 +64,65 @@ def _check_mate_leave(self, friend_leave_timer: Timer) -> bool: self.quit_explore() return True - def _reset_search_state(self, search_fail_timer: Timer) -> int: - search_fail_timer.clear() - self._match_end.refresh() - return 0 - - def _search_next_area(self, search_fail_timer: Timer, unchanged_swipe_cnt: int) -> int: - if not search_fail_timer.started(): - search_fail_timer.start() - return unchanged_swipe_cnt - if not search_fail_timer.reached(): - return unchanged_swipe_cnt + def _reset_search_state(self, reset_swipe_cnt: bool = False) -> None: + if reset_swipe_cnt: + if self.swipe_cnt > 0: + logger.info(f"Exploration search reset (cleared count: {self.swipe_cnt})") + self.swipe_cnt = 0 + self.search_fail_timer.clear() + + def _search_next_area(self) -> None: + if not self.search_fail_timer.started(): + self.search_fail_timer.start() + return + if not self.search_fail_timer.reached(): + return + + # 若选择特定 UP(如经验怪),达到最大滑屏次数(默认2次,覆盖前3屏高密度区)超时仍无目标直接早退重开; + # 若选择“全部”,则不限次数滑动直到最右边界,以保证清完全图小怪并击杀 BOSS。 + is_specific_up = self._config.exploration_config.up_type != UpType.ALL + if is_specific_up and self.swipe_cnt >= self.MAX_SWIPE_COUNT: + logger.info(f"Max search swipe count ({self.MAX_SWIPE_COUNT}) reached for specific UP target. Quitting exploration early.") + self._reset_search_state(reset_swipe_cnt=True) + self.quit_explore() + return before_image = self.device.image self.swipe(self.S_SWIPE_BACKGROUND_RIGHT) sleep(0.3) self.screenshot() - if self.is_swipe_unchanged(before_image, self.device.image): + unchanged = self.is_swipe_unchanged(before_image, self.device.image) + if unchanged: sleep(0.3) self.screenshot() + unchanged = self.is_swipe_unchanged(before_image, self.device.image) + if (self.get_current_scene() != Scene.MAIN or self.appear(self.I_UI_CONFIRM) or self.appear(self.I_UI_CONFIRM_SAMLL)): - search_fail_timer.reset() - return 0 + self.search_fail_timer.reset() + return - if self.is_swipe_unchanged(before_image, self.device.image): - unchanged_swipe_cnt += 1 - if unchanged_swipe_cnt >= 2: - search_fail_timer.clear() + # 若未产生位移,原地做快速二次复核保底 + if unchanged: + sleep(0.3) + before_retry = self.device.image + self.swipe(self.S_SWIPE_BACKGROUND_RIGHT) + sleep(0.3) + self.screenshot() + if self.is_swipe_unchanged(before_retry, self.device.image): + logger.info("Reached rightmost boundary (confirmed twice). Quitting exploration.") + self._reset_search_state(reset_swipe_cnt=True) self.quit_explore() - return 0 - else: - unchanged_swipe_cnt = 0 - self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) + return - search_fail_timer.reset() - return unchanged_swipe_cnt + self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) + self.swipe_cnt += 1 + self.search_fail_timer.reset() def run_solo(self): logger.hr('solo') - search_fail_timer = Timer(1.0) - unchanged_swipe_cnt = 0 + self.search_fail_timer = Timer(self.SEARCH_SWIPE_INTERVAL) while 1: self.screenshot() @@ -109,7 +130,8 @@ def run_solo(self): logger.info(f'[run_solo] Current scene: {scene.name}') # TODO 2026.06.22 之后删掉这个刷屏的 # if scene == Scene.WORLD: - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self.explore_init = False + self._reset_search_state(reset_swipe_cnt=True) self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) # 打开右边箭头 if not self.wait_world_stable(): @@ -120,7 +142,8 @@ def run_solo(self): continue # elif scene == Scene.ENTRANCE: - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self.explore_init = False + self._reset_search_state(reset_swipe_cnt=True) self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.check_exit(): break @@ -133,23 +156,23 @@ def run_solo(self): self.enter_settings_and_do_operations() self.ui_click(self.I_E_AUTO_ROTATE_OFF, stop=self.I_E_AUTO_ROTATE_ON, timeout=5) self.explore_init = True - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state(reset_swipe_cnt=True) continue if self._handle_treasure_box(): - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state() continue if (self.appear_then_click(self.I_UI_CONFIRM, interval=1) or self.appear_then_click(self.I_UI_CONFIRM_SAMLL, interval=1)): - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state() continue # 小纸人 if self.appear(self.I_BATTLE_REWARD): if self.ui_get_reward(self.I_BATTLE_REWARD): - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state() continue # boss if self.appear(self.I_BOSS_BATTLE_BUTTON): - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state() self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.fire(self.I_BOSS_BATTLE_BUTTON): logger.info(f'Boss battle, minions cnt {self.minions_cnt}') @@ -157,13 +180,13 @@ def run_solo(self): # 小怪 fight_button = self.search_up_fight() if fight_button is not None: - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state() self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.fire(fight_button): logger.info(f'Fight, minions cnt {self.minions_cnt}') continue # 向后拉,寻找怪 - unchanged_swipe_cnt = self._search_next_area(search_fail_timer, unchanged_swipe_cnt) + self._search_next_area() continue # elif scene == Scene.BATTLE_PREPARE or scene == Scene.BATTLE_FIGHTING: @@ -173,8 +196,7 @@ def run_solo(self): def run_leader(self): logger.hr('leader') - search_fail_timer = Timer(1.0) - unchanged_swipe_cnt = 0 + self.search_fail_timer = Timer(self.SEARCH_SWIPE_INTERVAL) friend_leave_timer = Timer(self.FRIEND_LEAVE_TIMEOUT) while 1: @@ -182,7 +204,8 @@ def run_leader(self): scene = self.get_current_scene() # 探索大世界 if scene == Scene.WORLD: - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self.explore_init = False + self._reset_search_state(reset_swipe_cnt=True) self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) # 打开右边箭头 if not self.wait_world_stable(): @@ -202,7 +225,8 @@ def run_leader(self): # 邀请好友, 非常有可能是后面邀请好友,然后直接跳到组队了 elif scene == Scene.ENTRANCE: - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self.explore_init = False + self._reset_search_state(reset_swipe_cnt=True) self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) while 1: self.screenshot() @@ -219,7 +243,8 @@ def run_leader(self): continue # elif scene == Scene.TEAM: - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self.explore_init = False + self._reset_search_state(reset_swipe_cnt=True) self.wait_until_stable(self.I_ADD_2, timer=Timer(0.8, 1)) if self.appear(self.I_FIRE, threshold=0.8) and not self.appear(self.I_ADD_2): self.ui_click_until_disappear(self.I_FIRE, interval=1) @@ -246,27 +271,27 @@ def run_leader(self): self.enter_settings_and_do_operations() self.ui_click(self.I_E_AUTO_ROTATE_OFF, stop=self.I_E_AUTO_ROTATE_ON) self.explore_init = True - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state(reset_swipe_cnt=True) continue if self._handle_treasure_box(): - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state() continue if (self.appear_then_click(self.I_UI_CONFIRM, interval=1) or self.appear_then_click(self.I_UI_CONFIRM_SAMLL, interval=1)): - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state() continue # 小纸人 if self.appear(self.I_BATTLE_REWARD): if self.ui_get_reward(self.I_BATTLE_REWARD): - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state() continue # 中途有人跑路 if self._check_mate_leave(friend_leave_timer): - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state() continue # boss if self.appear(self.I_BOSS_BATTLE_BUTTON): - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state() self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.fire(self.I_BOSS_BATTLE_BUTTON): logger.info(f'Boss battle, minions cnt {self.minions_cnt}') @@ -274,13 +299,13 @@ def run_leader(self): # 小怪 fight_button = self.search_up_fight() if fight_button is not None: - unchanged_swipe_cnt = self._reset_search_state(search_fail_timer) + self._reset_search_state() self.device.click_record_remove(self.S_SWIPE_BACKGROUND_RIGHT.name) if self.fire(fight_button): logger.info(f'Fight, minions cnt {self.minions_cnt}') continue # 向后拉,寻找怪 - unchanged_swipe_cnt = self._search_next_area(search_fail_timer, unchanged_swipe_cnt) + self._search_next_area() continue # elif scene == Scene.BATTLE_PREPARE or scene == Scene.BATTLE_FIGHTING: From 2f5c306e186d31972aff71f0d75fbd34019d1667 Mon Sep 17 00:00:00 2001 From: llBai <15292242703@163.com> Date: Mon, 12 Oct 2026 09:56:45 +0800 Subject: [PATCH 06/25] =?UTF-8?q?fix(invite=5Ffriends)=EF=BC=9Asleep(3)=20?= =?UTF-8?q?before=20invite=5Ffriend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 邀请第二个队友时等待3s,解决邀请过快导致邀请失败的问题 --- tasks/Component/GeneralInvite/general_invite.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasks/Component/GeneralInvite/general_invite.py b/tasks/Component/GeneralInvite/general_invite.py index 1c137755c6..94a6385bc7 100644 --- a/tasks/Component/GeneralInvite/general_invite.py +++ b/tasks/Component/GeneralInvite/general_invite.py @@ -481,6 +481,8 @@ def invite_friends(self, config: InviteConfig) -> bool: logger.warning('Invite friend 1 failed') # 如果是邀请第二个人 if config.invite_number == InviteNumber.TWO: + # 确定邀请前等待一段时间,避免游戏弹出邀请过快 + sleep(3) success = self.invite_friend(config.friend_2, config.find_mode) if not success: logger.warning('Invite friend 2 failed') From aaac78b3bdcd7617d6c6745e571b79cd2694c362 Mon Sep 17 00:00:00 2001 From: llBai <15292242703@163.com> Date: Mon, 12 Oct 2026 10:04:19 +0800 Subject: [PATCH 07/25] change(open_expect_level): reverse swipe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 章节列表滑动方向改为向下滑动,使能找到困28入口 --- tasks/Exploration/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/Exploration/base.py b/tasks/Exploration/base.py index 3cc7f87b73..623f444cc9 100644 --- a/tasks/Exploration/base.py +++ b/tasks/Exploration/base.py @@ -162,7 +162,7 @@ def open_expect_level(self): if self.appear_then_click(self.I_UI_CONFIRM_SAMLL, interval=1): continue self.device.click_record_clear() - self.swipe(self.S_SWIPE_LEVEL_UP) + self.swipe(self.S_SWIPE_LEVEL_DOWN) swipeCount += 1 debug_info = f"Swiped {swipeCount} times, current exploration level: {text1}" logger.info(debug_info) From 372ef8f3b4de4c7c27a7911f31f7f84df7900a2c Mon Sep 17 00:00:00 2001 From: llBai <15292242703@163.com> Date: Mon, 12 Oct 2026 17:32:13 +0800 Subject: [PATCH 08/25] add S_SWIPE_LEVEL_DOWN_PRO --- tasks/Exploration/assets.py | 1 + tasks/Exploration/base.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/tasks/Exploration/assets.py b/tasks/Exploration/assets.py index 91d5300af8..86d2853139 100644 --- a/tasks/Exploration/assets.py +++ b/tasks/Exploration/assets.py @@ -162,6 +162,7 @@ class ExplorationAssets: S_SWIPE_LEVEL_UP = RuleSwipe(roi_front=(1142,328,21,21), roi_back=(1143,444,21,21), mode="default", name="swipe_level_up") # 向下滑动章节 S_SWIPE_LEVEL_DOWN = RuleSwipe(roi_front=(1143,486,21,21), roi_back=(1143,367,21,23), mode="default", name="swipe_level_down") + S_SWIPE_LEVEL_DOWN_PRO = RuleSwipe(roi_front=(1143, 486, 21, 21), roi_back=(1143, 248, 21, 23), mode="default", name="swipe_level_down_pro") # 往左滑动 S_SWIPE_BACKGROUND_RIGHT = RuleSwipe(roi_front=(1093,148,21,21), roi_back=(397,140,21,21), mode="default", name="swipe_background_right") # 往右滑动 diff --git a/tasks/Exploration/base.py b/tasks/Exploration/base.py index 623f444cc9..cd40c79318 100644 --- a/tasks/Exploration/base.py +++ b/tasks/Exploration/base.py @@ -162,7 +162,7 @@ def open_expect_level(self): if self.appear_then_click(self.I_UI_CONFIRM_SAMLL, interval=1): continue self.device.click_record_clear() - self.swipe(self.S_SWIPE_LEVEL_DOWN) + self.swipe(self.S_SWIPE_LEVEL_DOWN_PRO) swipeCount += 1 debug_info = f"Swiped {swipeCount} times, current exploration level: {text1}" logger.info(debug_info) From d6c42beea8c69a0b439979ff752a414858539571 Mon Sep 17 00:00:00 2001 From: neptine <2234044577@qq.com> Date: Mon, 12 Oct 2026 23:39:46 +0800 Subject: [PATCH 09/25] fix(GeneralBattle): Log battle start in strategy-based wait --- tasks/Component/GeneralBattle/battle.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tasks/Component/GeneralBattle/battle.py b/tasks/Component/GeneralBattle/battle.py index fa5c3c9a5a..cfb3030dca 100644 --- a/tasks/Component/GeneralBattle/battle.py +++ b/tasks/Component/GeneralBattle/battle.py @@ -1,4 +1,5 @@ import random +from functools import wraps from module.logger import logger from module.atom.image import RuleImage @@ -12,6 +13,16 @@ from tasks.Component.GeneralBattle.config_general_battle import GeneralBattleConfig, GreenMarkType + +def log_battle_start(func): + @wraps(func) + def wrapper(owner, *args, **kwargs): + logger.hr("General battle start", 2) + return func(owner, *args, **kwargs) + + return wrapper + + class Battle(BattleWait): def start_fire(self, buttons: list[RuleOcr | RuleImage], checks: list[RuleImage]) -> bool: @@ -47,6 +58,7 @@ def start_fire(self, buttons: list[RuleOcr | RuleImage], checks: list[RuleImage] continue return True + @log_battle_start @battle_wait_strategy() def battle_wait(self, *args, **kwargs): return self.battle_wait_with_strategy(*args, **kwargs) From 5b556e92cf259dba18e255580886aac9ec53fb04 Mon Sep 17 00:00:00 2001 From: neptine <2234044577@qq.com> Date: Tue, 13 Oct 2026 00:05:08 +0800 Subject: [PATCH 10/25] fix(Restart): Reuse global UI assets for login and mail dialogs - replace login cancel and mail confirmation assets with shared global UI assets - remove obsolete Restart image rules, metadata entries, and PNG files - update the main page hook to use the shared cancel asset --- tasks/ActivityShikigami/script_task.py | 4 +++ tasks/GameUi/default_pages.py | 2 +- tasks/GlobalGame/assets.py | 8 +++--- tasks/GlobalGame/ui/image.json | 6 ++-- tasks/Restart/assets.py | 8 ------ .../harvest/harvest_harvest_mail_confirm.png | Bin 5931 -> 0 bytes tasks/Restart/harvest/image.json | 11 +------ tasks/Restart/login.py | 8 +++--- tasks/Restart/login/image.json | 27 ------------------ tasks/Restart/login/login_cancel_battle.png | Bin 9223 -> 0 bytes .../login/login_login_cancel_bind_phone.png | Bin 6090 -> 0 bytes .../login/login_watch_video_cancel.png | Bin 4832 -> 0 bytes 12 files changed, 17 insertions(+), 57 deletions(-) delete mode 100644 tasks/Restart/harvest/harvest_harvest_mail_confirm.png delete mode 100644 tasks/Restart/login/login_cancel_battle.png delete mode 100644 tasks/Restart/login/login_login_cancel_bind_phone.png delete mode 100644 tasks/Restart/login/login_watch_video_cancel.png diff --git a/tasks/ActivityShikigami/script_task.py b/tasks/ActivityShikigami/script_task.py index 375725edbb..c33731ff60 100644 --- a/tasks/ActivityShikigami/script_task.py +++ b/tasks/ActivityShikigami/script_task.py @@ -265,6 +265,10 @@ def _run_pass(self): break if self.appear(self.I_CHECK_BATTLE_MAIN) and self.appear_then_click(self.I_UI_BACK_YELLOW, interval=2.5): continue + if self.appear_then_click(self.I_UI_BACK_CIRCLE, interval=2.5): + continue + if self.appear_then_click(self.I_UI_BACK_RED, interval=1.5): + continue def _run_ap(self): """ diff --git a/tasks/GameUi/default_pages.py b/tasks/GameUi/default_pages.py index 733bf0b90c..2860d86581 100644 --- a/tasks/GameUi/default_pages.py +++ b/tasks/GameUi/default_pages.py @@ -61,7 +61,7 @@ def handle_login_page(task) -> bool: # 庭院主页(此处通过提高阈值来处理部分探索章节会识别成原始庭院的问题, 后续有其他更好方法需改善) page_main = Page(GameUiAssets.I_CHECK_MAIN, category="global") page_main.add_enter_success_hooks( - GameUiAssets.I_AD_CLOSE_RED, GlobalGameAssets.I_UI_BACK_RED, RestartAssets.I_CANCEL_BATTLE, + GameUiAssets.I_AD_CLOSE_RED, GlobalGameAssets.I_UI_BACK_RED, GlobalGameAssets.I_UI_CANCEL_SAMLL, conditional_action(RestartAssets.I_LOGIN_COURTYARD, RestartAssets.C_LOGIN_SCROLL_CLOSE_AREA), ) diff --git a/tasks/GlobalGame/assets.py b/tasks/GlobalGame/assets.py index ae7808b18d..106569e11c 100644 --- a/tasks/GlobalGame/assets.py +++ b/tasks/GlobalGame/assets.py @@ -42,11 +42,11 @@ class GlobalGameAssets: # 长一点的确认(旧) I_UI_CONFIRM_OLD = RuleImage(roi_front=(685,376,179,66), roi_back=(663,334,232,193), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_confirm_old.png") # 长一点的确认 - I_UI_CONFIRM = RuleImage(roi_front=(664,407,179,66), roi_back=(643,389,214,95), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_confirm.png") + I_UI_CONFIRM = RuleImage(roi_front=(664,407,179,66), roi_back=(643,345,231,320), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_confirm.png") # 长一点的取消(旧) I_UI_CANCEL_OLD = RuleImage(roi_front=(417,368,177,62), roi_back=(366,349,261,173), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_cancel_old.png") # 长一点的取消 - I_UI_CANCEL = RuleImage(roi_front=(438,407,177,62), roi_back=(356,384,276,125), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_cancel.png") + I_UI_CANCEL = RuleImage(roi_front=(438,407,177,62), roi_back=(356,384,275,256), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_cancel.png") # '获得奖励' 四个大字 I_UI_REWARD = RuleImage(roi_front=(530,126,211,66), roi_back=(464,69,352,303), threshold=0.73, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_reward.png") # description @@ -64,12 +64,12 @@ class GlobalGameAssets: # 短一点的取消 I_UI_CANCEL_SAMLL = RuleImage(roi_front=(472,389,128,62), roi_back=(360,377,272,185), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_cancel_samll.png") # description - I_UI_UNCHECK = RuleImage(roi_front=(567,343,33,36), roi_back=(497,303,216,100), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_uncheck.png") + I_UI_UNCHECK = RuleImage(roi_front=(545,343,33,36), roi_back=(497,303,216,100), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_uncheck.png") # 勾选 I_UI_CHECK = RuleImage(roi_front=(564,341,40,38), roi_back=(512,329,164,78), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_check.png") # 知道了 I_UI_GOTIT_SMALL = RuleImage(roi_front=(678,396,127,60), roi_back=(622,371,242,100), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_gotit_small.png") # 圆形返回按钮(移植自mine) - # I_UI_BACK_CIRCLE = RuleImage(roi_front=(24,21,36,39), roi_back=(0,0,95,101), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_back_circle.png") + I_UI_BACK_CIRCLE = RuleImage(roi_front=(24,21,36,39), roi_back=(0,0,95,101), threshold=0.8, method="Template matching", file="./tasks/GlobalGame/ui/ui_ui_back_circle.png") diff --git a/tasks/GlobalGame/ui/image.json b/tasks/GlobalGame/ui/image.json index 9b721f7b63..be77145cac 100644 --- a/tasks/GlobalGame/ui/image.json +++ b/tasks/GlobalGame/ui/image.json @@ -12,7 +12,7 @@ "itemName": "ui_confirm", "imageName": "ui_ui_confirm.png", "roiFront": "664,407,179,66", - "roiBack": "643,389,214,95", + "roiBack": "643,345,231,320", "method": "Template matching", "threshold": 0.8, "description": "长一点的确认" @@ -30,7 +30,7 @@ "itemName": "ui_cancel", "imageName": "ui_ui_cancel.png", "roiFront": "438,407,177,62", - "roiBack": "356,384,276,125", + "roiBack": "356,384,275,256", "method": "Template matching", "threshold": 0.8, "description": "长一点的取消" @@ -110,7 +110,7 @@ { "itemName": "ui_uncheck", "imageName": "ui_ui_uncheck.png", - "roiFront": "567,343,33,36", + "roiFront": "545,343,33,36", "roiBack": "497,303,216,100", "method": "Template matching", "threshold": 0.8, diff --git a/tasks/Restart/assets.py b/tasks/Restart/assets.py index ca2cb5af1e..a2cab9e647 100644 --- a/tasks/Restart/assets.py +++ b/tasks/Restart/assets.py @@ -44,8 +44,6 @@ class RestartAssets: I_HARVEST_MAIL_ALL = RuleImage(roi_front=(69,579,80,67), roi_back=(28,551,142,144), threshold=0.8, method="Template matching", file="./tasks/Restart/harvest/harvest_harvest_mail_all.png") # 有些邮件需要点击一次 I_HARVEST_MAIL_OPEN = RuleImage(roi_front=(163,367,45,48), roi_back=(139,86,100,487), threshold=0.9, method="Template matching", file="./tasks/Restart/harvest/harvest_harvest_mail_open.png") - # 确认收取邮件 - I_HARVEST_MAIL_CONFIRM = RuleImage(roi_front=(687,543,168,64), roi_back=(687,543,168,64), threshold=0.8, method="Template matching", file="./tasks/Restart/harvest/harvest_harvest_mail_confirm.png") # description I_HARVEST_SOUL = RuleImage(roi_front=(241,497,38,36), roi_back=(68,480,930,72), threshold=0.8, method="Template matching", file="./tasks/Restart/harvest/harvest_harvest_soul.png") # description @@ -108,8 +106,6 @@ class RestartAssets: I_LOGIN_YELLOW_CLOSE = RuleImage(roi_front=(29,17,46,44), roi_back=(0,0,94,86), threshold=0.8, method="Template matching", file="./tasks/Restart/login/login_login_yellow_close.png") # 用于判断是否出现登录选区的 I_LOGIN_8 = RuleImage(roi_front=(178,572,53,60), roi_back=(1,547,241,105), threshold=0.8, method="Template matching", file="./tasks/Restart/login/login_login_8.png") - # 登录时候不观看CG视频 - I_WATCH_VIDEO_CANCEL = RuleImage(roi_front=(466,396,130,61), roi_back=(466,396,130,61), threshold=0.8, method="Template matching", file="./tasks/Restart/login/login_watch_video_cancel.png") # 指定角色进入游戏,默认第一个 I_LOGIN_SPECIFIC_SERVE = RuleImage(roi_front=(0,0,120,120), roi_back=(0,0,120,120), threshold=0.8, method="Template matching", file="./tasks/Restart/login/login_login_specific_serve.png") # 下载插画 @@ -118,8 +114,6 @@ class RestartAssets: I_LOGIN_LOGIN_GOTO_BIND_PHONE = RuleImage(roi_front=(940,430,170,150), roi_back=(940,430,170,150), threshold=0.8, method="Template matching", file="./tasks/Restart/login/login_login_goto_bind_phone.png") # 登录界面 弹出框 确定绑定手机 I_LOGIN_LOGIN_ENSURE_BIND_PHONE = RuleImage(roi_front=(670,460,160,100), roi_back=(670,460,160,100), threshold=0.8, method="Template matching", file="./tasks/Restart/login/login_login_ensure_bind_phone.png") - # 登录界面 弹出框 取消绑定手机 - I_LOGIN_LOGIN_CANCEL_BIND_PHONE = RuleImage(roi_front=(450,460,160,100), roi_back=(450,460,160,100), threshold=0.8, method="Template matching", file="./tasks/Restart/login/login_login_cancel_bind_phone.png") # 登录界面 弹出框 阴阳师精灵 I_LOGIN_LOGIN_ONMYOJI_GENIE = RuleImage(roi_front=(80,110,280,120), roi_back=(80,110,280,120), threshold=0.8, method="Template matching", file="./tasks/Restart/login/login_login_onmyoji_genie.png") # 已有角色 @@ -130,8 +124,6 @@ class RestartAssets: I_EARLY_SERVER = RuleImage(roi_front=(596,269,115,33), roi_back=(596,269,115,33), threshold=0.8, method="Template matching", file="./tasks/Restart/login/login_early_server.png") # 取消体验服切换弹窗 I_EARLY_SERVER_CANCEL = RuleImage(roi_front=(435,404,172,56), roi_back=(435,404,172,56), threshold=0.8, method="Template matching", file="./tasks/Restart/login/login_early_server_cancel.png") - # 取消继续战斗 - I_CANCEL_BATTLE = RuleImage(roi_front=(471,395,129,55), roi_back=(367,227,545,296), threshold=0.8, method="Template matching", file="./tasks/Restart/login/login_cancel_battle.png") # 庭院卷轴收起状态标志(移植自mine) I_LOGIN_COURTYARD = RuleImage(roi_front=(40,640,100,50), roi_back=(40,640,100,50), threshold=0.8, method="Template matching", file="./tasks/Restart/login/login_courtyard.png") diff --git a/tasks/Restart/harvest/harvest_harvest_mail_confirm.png b/tasks/Restart/harvest/harvest_harvest_mail_confirm.png deleted file mode 100644 index 5495d260033a0f5e83d387706ee3a2908e0f7877..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5931 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 N002ovPDHLkV1hbkTZI4s diff --git a/tasks/Restart/harvest/image.json b/tasks/Restart/harvest/image.json index dc74bbfccd..e76f5ae282 100644 --- a/tasks/Restart/harvest/image.json +++ b/tasks/Restart/harvest/image.json @@ -62,15 +62,6 @@ "threshold": 0.9, "description": "有些邮件需要点击一次" }, - { - "itemName": "harvest_mail_confirm", - "imageName": "harvest_harvest_mail_confirm.png", - "roiFront": "687,543,168,64", - "roiBack": "687,543,168,64", - "method": "Template matching", - "threshold": 0.8, - "description": "确认收取邮件" - }, { "itemName": "harvest_soul", "imageName": "harvest_harvest_soul.png", @@ -251,4 +242,4 @@ "threshold": 0.8, "description": "邮件红点" } -] \ No newline at end of file +] diff --git a/tasks/Restart/login.py b/tasks/Restart/login.py index 453b38a909..e387032e22 100644 --- a/tasks/Restart/login.py +++ b/tasks/Restart/login.py @@ -46,7 +46,7 @@ def _app_handle_login(self) -> bool: self._burst() # 取消继续战斗 - if self.appear_then_click(self.I_CANCEL_BATTLE, interval=0.8): + if self.appear_then_click(self.I_UI_CANCEL_SAMLL, interval=0.8): logger.info('Cancel continue battle') continue # 确认进入庭院(优化:先检测加成图标确认在庭院页面,再检测式神录图标) @@ -79,7 +79,7 @@ def _app_handle_login(self) -> bool: logger.info('Download inbetweening') continue # 不观看视频 - if self.appear_then_click(self.I_WATCH_VIDEO_CANCEL, interval=0.6): + if self.appear_then_click(self.I_UI_CANCEL_SAMLL, interval=0.6): logger.info('Close video') continue # 右上角的红色的关闭 @@ -94,7 +94,7 @@ def _app_handle_login(self) -> bool: if self.appear_then_click(self.I_LOGIN_LOGIN_GOTO_BIND_PHONE): while 1: self.screenshot() - if self.appear_then_click(self.I_LOGIN_LOGIN_CANCEL_BIND_PHONE): + if self.appear_then_click(self.I_UI_CANCEL_SAMLL): logger.info("Close bind phone") break continue @@ -310,7 +310,7 @@ def harvest_mail(self) -> bool: self.screenshot() if timeout_timer.reached(): break - if self.appear_then_click(self.I_HARVEST_MAIL_CONFIRM, interval=0.8): + if self.appear_then_click(self.I_UI_CONFIRM, interval=0.8): break if self.appear_then_click(self.I_READ_ALL_MAIL, interval=1.5): diff --git a/tasks/Restart/login/image.json b/tasks/Restart/login/image.json index 5d13a6e205..26e04c4c3c 100644 --- a/tasks/Restart/login/image.json +++ b/tasks/Restart/login/image.json @@ -53,15 +53,6 @@ "threshold": 0.8, "description": "用于判断是否出现登录选区的" }, - { - "itemName": "watch_video_cancel", - "imageName": "login_watch_video_cancel.png", - "roiFront": "466,396,130,61", - "roiBack": "466,396,130,61", - "method": "Template matching", - "threshold": 0.8, - "description": "登录时候不观看CG视频" - }, { "itemName": "login_specific_serve", "imageName": "login_login_specific_serve.png", @@ -98,15 +89,6 @@ "threshold": 0.8, "description": "登录界面 弹出框 确定绑定手机" }, - { - "itemName": "login_login_cancel_bind_phone", - "imageName": "login_login_cancel_bind_phone.png", - "roiFront": "450,460,160,100", - "roiBack": "450,460,160,100", - "method": "Template matching", - "threshold": 0.8, - "description": "登录界面 弹出框 取消绑定手机" - }, { "itemName": "login_login_onmyoji_genie", "imageName": "login_login_onmyoji_genie.png", @@ -152,15 +134,6 @@ "threshold": 0.8, "description": "取消体验服切换弹窗" }, - { - "itemName": "cancel_battle", - "imageName": "login_cancel_battle.png", - "roiFront": "471,395,129,55", - "roiBack": "367,227,545,296", - "method": "Template matching", - "threshold": 0.8, - "description": "取消继续战斗" - }, { "itemName": "login_courtyard", "imageName": "login_courtyard.png", diff --git a/tasks/Restart/login/login_cancel_battle.png b/tasks/Restart/login/login_cancel_battle.png deleted file mode 100644 index 4e70bfc56cc6a6ec6f41c48ff965ef66a40e5596..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9223 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�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 MId$0@X|oUi13i^2+5i9m diff --git a/tasks/Restart/login/login_watch_video_cancel.png b/tasks/Restart/login/login_watch_video_cancel.png deleted file mode 100644 index 63801e80799e1e4d540b625042882f4b743d8740..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4832 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 Date: Tue, 13 Oct 2026 00:20:45 +0800 Subject: [PATCH 11/25] fix(Exploration): Correct realm raid ticket OCR region #1926 --- tasks/Exploration/assets.py | 2 +- tasks/Exploration/res/ocr.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tasks/Exploration/assets.py b/tasks/Exploration/assets.py index 91d5300af8..7f8ffc86af 100644 --- a/tasks/Exploration/assets.py +++ b/tasks/Exploration/assets.py @@ -154,7 +154,7 @@ class ExplorationAssets: # 探索右上角 突破卷的数量 O_REALM_RAID_NUMBER = RuleOcr(roi=(739,11,78,37), area=(739,11,78,37), mode="DigitCounter", method="Default", keyword="", name="realm_raid_number") # (点出困难28时候)探索右上角 突破卷的数量 - O_REALM_RAID_NUMBER1 = RuleOcr(roi=(936,10,82,36), area=(936,10,82,36), mode="DigitCounter", method="Default", keyword="", name="realm_raid_number1") + O_REALM_RAID_NUMBER1 = RuleOcr(roi=(920,12,78,30), area=(919,12,80,30), mode="DigitCounter", method="Default", keyword="", name="realm_raid_number1") # Swipe Rule Assets diff --git a/tasks/Exploration/res/ocr.json b/tasks/Exploration/res/ocr.json index c6dbd1e033..e50e538aaa 100644 --- a/tasks/Exploration/res/ocr.json +++ b/tasks/Exploration/res/ocr.json @@ -28,8 +28,8 @@ }, { "itemName": "realm_raid_number1", - "roiFront": "936,10,82,36", - "roiBack": "936,10,82,36", + "roiFront": "920,12,78,30", + "roiBack": "919,12,80,30", "mode": "DigitCounter", "method": "Default", "keyword": "", From 54803c503e353f7694d33784db4b6d1abe9aafd3 Mon Sep 17 00:00:00 2001 From: llBai <15292242703@163.com> Date: Tue, 13 Oct 2026 10:05:16 +0800 Subject: [PATCH 12/25] delete S_SWIPE_LEVEL_DOWN_PRO --- tasks/Exploration/assets.py | 3 +-- tasks/Exploration/base.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tasks/Exploration/assets.py b/tasks/Exploration/assets.py index 86d2853139..48198b5338 100644 --- a/tasks/Exploration/assets.py +++ b/tasks/Exploration/assets.py @@ -162,8 +162,7 @@ class ExplorationAssets: S_SWIPE_LEVEL_UP = RuleSwipe(roi_front=(1142,328,21,21), roi_back=(1143,444,21,21), mode="default", name="swipe_level_up") # 向下滑动章节 S_SWIPE_LEVEL_DOWN = RuleSwipe(roi_front=(1143,486,21,21), roi_back=(1143,367,21,23), mode="default", name="swipe_level_down") - S_SWIPE_LEVEL_DOWN_PRO = RuleSwipe(roi_front=(1143, 486, 21, 21), roi_back=(1143, 248, 21, 23), mode="default", name="swipe_level_down_pro") - # 往左滑动 + # 往左滑动 S_SWIPE_BACKGROUND_RIGHT = RuleSwipe(roi_front=(1093,148,21,21), roi_back=(397,140,21,21), mode="default", name="swipe_background_right") # 往右滑动 S_SWIPE_BACKGROUND_LEFT = RuleSwipe(roi_front=(420,142,21,21), roi_back=(1183,146,21,21), mode="default", name="swipe_background_left") diff --git a/tasks/Exploration/base.py b/tasks/Exploration/base.py index cd40c79318..623f444cc9 100644 --- a/tasks/Exploration/base.py +++ b/tasks/Exploration/base.py @@ -162,7 +162,7 @@ def open_expect_level(self): if self.appear_then_click(self.I_UI_CONFIRM_SAMLL, interval=1): continue self.device.click_record_clear() - self.swipe(self.S_SWIPE_LEVEL_DOWN_PRO) + self.swipe(self.S_SWIPE_LEVEL_DOWN) swipeCount += 1 debug_info = f"Swiped {swipeCount} times, current exploration level: {text1}" logger.info(debug_info) From 614b6b84766a46415aa048f30d2f8a6ea1450d54 Mon Sep 17 00:00:00 2001 From: llBai <15292242703@163.com> Date: Tue, 13 Oct 2026 10:06:32 +0800 Subject: [PATCH 13/25] Revert "delete S_SWIPE_LEVEL_DOWN_PRO" This reverts commit 54803c503e353f7694d33784db4b6d1abe9aafd3. --- tasks/Exploration/assets.py | 3 ++- tasks/Exploration/base.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tasks/Exploration/assets.py b/tasks/Exploration/assets.py index 48198b5338..86d2853139 100644 --- a/tasks/Exploration/assets.py +++ b/tasks/Exploration/assets.py @@ -162,7 +162,8 @@ class ExplorationAssets: S_SWIPE_LEVEL_UP = RuleSwipe(roi_front=(1142,328,21,21), roi_back=(1143,444,21,21), mode="default", name="swipe_level_up") # 向下滑动章节 S_SWIPE_LEVEL_DOWN = RuleSwipe(roi_front=(1143,486,21,21), roi_back=(1143,367,21,23), mode="default", name="swipe_level_down") - # 往左滑动 + S_SWIPE_LEVEL_DOWN_PRO = RuleSwipe(roi_front=(1143, 486, 21, 21), roi_back=(1143, 248, 21, 23), mode="default", name="swipe_level_down_pro") + # 往左滑动 S_SWIPE_BACKGROUND_RIGHT = RuleSwipe(roi_front=(1093,148,21,21), roi_back=(397,140,21,21), mode="default", name="swipe_background_right") # 往右滑动 S_SWIPE_BACKGROUND_LEFT = RuleSwipe(roi_front=(420,142,21,21), roi_back=(1183,146,21,21), mode="default", name="swipe_background_left") diff --git a/tasks/Exploration/base.py b/tasks/Exploration/base.py index 623f444cc9..cd40c79318 100644 --- a/tasks/Exploration/base.py +++ b/tasks/Exploration/base.py @@ -162,7 +162,7 @@ def open_expect_level(self): if self.appear_then_click(self.I_UI_CONFIRM_SAMLL, interval=1): continue self.device.click_record_clear() - self.swipe(self.S_SWIPE_LEVEL_DOWN) + self.swipe(self.S_SWIPE_LEVEL_DOWN_PRO) swipeCount += 1 debug_info = f"Swiped {swipeCount} times, current exploration level: {text1}" logger.info(debug_info) From e56482caf7bdd69efb85129ff3b9d706d31842fd Mon Sep 17 00:00:00 2001 From: llBai <15292242703@163.com> Date: Tue, 13 Oct 2026 10:06:57 +0800 Subject: [PATCH 14/25] Revert "add S_SWIPE_LEVEL_DOWN_PRO" This reverts commit 372ef8f3b4de4c7c27a7911f31f7f84df7900a2c. --- tasks/Exploration/assets.py | 1 - tasks/Exploration/base.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tasks/Exploration/assets.py b/tasks/Exploration/assets.py index 86d2853139..91d5300af8 100644 --- a/tasks/Exploration/assets.py +++ b/tasks/Exploration/assets.py @@ -162,7 +162,6 @@ class ExplorationAssets: S_SWIPE_LEVEL_UP = RuleSwipe(roi_front=(1142,328,21,21), roi_back=(1143,444,21,21), mode="default", name="swipe_level_up") # 向下滑动章节 S_SWIPE_LEVEL_DOWN = RuleSwipe(roi_front=(1143,486,21,21), roi_back=(1143,367,21,23), mode="default", name="swipe_level_down") - S_SWIPE_LEVEL_DOWN_PRO = RuleSwipe(roi_front=(1143, 486, 21, 21), roi_back=(1143, 248, 21, 23), mode="default", name="swipe_level_down_pro") # 往左滑动 S_SWIPE_BACKGROUND_RIGHT = RuleSwipe(roi_front=(1093,148,21,21), roi_back=(397,140,21,21), mode="default", name="swipe_background_right") # 往右滑动 diff --git a/tasks/Exploration/base.py b/tasks/Exploration/base.py index cd40c79318..623f444cc9 100644 --- a/tasks/Exploration/base.py +++ b/tasks/Exploration/base.py @@ -162,7 +162,7 @@ def open_expect_level(self): if self.appear_then_click(self.I_UI_CONFIRM_SAMLL, interval=1): continue self.device.click_record_clear() - self.swipe(self.S_SWIPE_LEVEL_DOWN_PRO) + self.swipe(self.S_SWIPE_LEVEL_DOWN) swipeCount += 1 debug_info = f"Swiped {swipeCount} times, current exploration level: {text1}" logger.info(debug_info) From bedff718b82df30e42864d5df7a7cf5a28cd9089 Mon Sep 17 00:00:00 2001 From: Enough1122 Date: Tue, 13 Oct 2026 20:46:15 +0800 Subject: [PATCH 15/25] =?UTF-8?q?fix(Duel):=20=E5=BC=80=E6=88=98=E5=89=8D?= =?UTF-8?q?=E7=AD=89=E5=BE=85=E5=A2=9E=E5=8A=A0=E8=B6=85=E6=97=B6=E4=B8=8E?= =?UTF-8?q?=E7=82=B9=E5=87=BB=E4=B8=8A=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/Duel/script_task.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tasks/Duel/script_task.py b/tasks/Duel/script_task.py index 4811eb8ccd..c6dd4eb2fd 100644 --- a/tasks/Duel/script_task.py +++ b/tasks/Duel/script_task.py @@ -191,7 +191,22 @@ def wait_battle(self) -> bool: self.duel_exit_battle() continue if ret is None and not battle_operated: # 进行战斗前的操作 - self.ui_click(self.O_D_HAND, self.O_D_AUTO, interval=0.8) + # 有超时、有点击上限的等待:战斗若提前结束就回顶部走结算, + # 开场动画点不动时停手等动画过去(连点10次会触发同键guard) + op_timer = Timer(45).start() + click_cnt = 0 + while not op_timer.reached(): + self.screenshot() + if self.appear(self.O_D_AUTO): + break + if self.is_battle_end(): + logger.info('battle ended during setup, go settlement') + break + if click_cnt < 6 and self.ocr_appear_click( + self.O_D_HAND, interval=2.0): + click_cnt += 1 + else: + sleep(2) self.green_mark(self.conf.duel_config.green_enable, self.conf.duel_config.green_mark) battle_operated = True self.reset_device('BATTLE_STATUS_S') From 985ac267a8b3249ea43154f8417b6c293b471d45 Mon Sep 17 00:00:00 2001 From: Enough1122 Date: Tue, 13 Oct 2026 23:52:19 +0800 Subject: [PATCH 16/25] refactor(Duel): reuse ui_click for pre-battle setup wait MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按维护者意见:删掉手搓的等待循环,改用已有的 ui_click(click, stop, interval, timeout): - 由 base_task.ui_click 负责「截图 → 判 stop → 点一次」的节奏, 不再自己维护 Timer / sleep / 点击计数。 - interval=6 让两次点击之间留给开场动画加载,timeout=45 保留原超时; 「手动」按钮点不到时 ui_click 会在超时后返回,不会触发同键 guard。 - 保留 is_battle_end 提前结算的兜底:ui_click 超时返回后走原有 顶部结算分支,不再需要内联 break。 Co-Authored-By: Claude Fable 5 --- tasks/Duel/script_task.py | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/tasks/Duel/script_task.py b/tasks/Duel/script_task.py index c6dd4eb2fd..6de684cb19 100644 --- a/tasks/Duel/script_task.py +++ b/tasks/Duel/script_task.py @@ -191,22 +191,9 @@ def wait_battle(self) -> bool: self.duel_exit_battle() continue if ret is None and not battle_operated: # 进行战斗前的操作 - # 有超时、有点击上限的等待:战斗若提前结束就回顶部走结算, - # 开场动画点不动时停手等动画过去(连点10次会触发同键guard) - op_timer = Timer(45).start() - click_cnt = 0 - while not op_timer.reached(): - self.screenshot() - if self.appear(self.O_D_AUTO): - break - if self.is_battle_end(): - logger.info('battle ended during setup, go settlement') - break - if click_cnt < 6 and self.ocr_appear_click( - self.O_D_HAND, interval=2.0): - click_cnt += 1 - else: - sleep(2) + # 等「自动」出现并点「手动」: + # 带超时,战斗提前结束时不会卡死在这里空转 + self.ui_click(self.O_D_HAND, self.O_D_AUTO, interval=6, timeout=45) self.green_mark(self.conf.duel_config.green_enable, self.conf.duel_config.green_mark) battle_operated = True self.reset_device('BATTLE_STATUS_S') From 5770f91eaecfa3bf1b2fec0127f31b11ec74cee3 Mon Sep 17 00:00:00 2001 From: huangrunheng <74492025+runhey@users.noreply.github.com> Date: Wed, 14 Oct 2026 00:07:11 +0800 Subject: [PATCH 17/25] Refactor script_task.py by cleaning up comments Removed commented code and added a reference link. --- tasks/Duel/script_task.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tasks/Duel/script_task.py b/tasks/Duel/script_task.py index 6de684cb19..9d02ea4433 100644 --- a/tasks/Duel/script_task.py +++ b/tasks/Duel/script_task.py @@ -191,8 +191,7 @@ def wait_battle(self) -> bool: self.duel_exit_battle() continue if ret is None and not battle_operated: # 进行战斗前的操作 - # 等「自动」出现并点「手动」: - # 带超时,战斗提前结束时不会卡死在这里空转 + # https://github.com/runhey/OnmyojiAutoScript/pull/1934 self.ui_click(self.O_D_HAND, self.O_D_AUTO, interval=6, timeout=45) self.green_mark(self.conf.duel_config.green_enable, self.conf.duel_config.green_mark) battle_operated = True From 60117f173343954ac03f634aa08c40076da298d1 Mon Sep 17 00:00:00 2001 From: davidyangkunlong <22984788@qq.com> Date: Thu, 15 Oct 2026 00:53:53 +0800 Subject: [PATCH 18/25] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=BE=A1=E9=AD=82?= =?UTF-8?q?=E6=BA=A2=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1 爬塔活动处理御魂溢出。 2 刷御魂处理御魂溢出。 --- tasks/Component/GeneralBattle/assets.py | 2 ++ tasks/Component/GeneralBattle/battle_wait.py | 10 +++++++++- tasks/Orochi/script_task.py | 8 ++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tasks/Component/GeneralBattle/assets.py b/tasks/Component/GeneralBattle/assets.py index 8be2b0ee69..f159f4d0ec 100644 --- a/tasks/Component/GeneralBattle/assets.py +++ b/tasks/Component/GeneralBattle/assets.py @@ -209,6 +209,8 @@ class GeneralBattleAssets: C_END_FRIENDS_32 = RuleClick(roi_front=(0,0,100,100), roi_back=(0,0,100,100), name="end_friends_32") # description C_END_FRIENDS_23 = RuleClick(roi_front=(0,0,100,100), roi_back=(0,0,100,100), name="end_friends_23") + # 御魂过多的【去清理】按钮 + C_OVERFLOW_GHOST = RuleClick(roi_front=(456, 381, 160, 82), roi_back=(456, 381, 160, 82), name="overflow_ghost") # Click Rule Assets diff --git a/tasks/Component/GeneralBattle/battle_wait.py b/tasks/Component/GeneralBattle/battle_wait.py index d453032f50..f6189d3ff7 100644 --- a/tasks/Component/GeneralBattle/battle_wait.py +++ b/tasks/Component/GeneralBattle/battle_wait.py @@ -158,7 +158,7 @@ class OptionSuccessDefault: 'C_END_MESSAGE_RIGHT_TOP', 'C_END_BUFF_AREA_1', 'C_END_BUFF_AREA_2', 'C_END_SOUL_RECORD', 'C_END_SOUL_DETAILS', 'C_END_1_1', 'C_END_1_2', 'C_END_1_3', 'C_END_1_4', - 'C_END_1_5', 'C_END_1_6', + 'C_END_1_5', 'C_END_1_6', "C_OVERFLOW_GHOST", ]) @@ -1152,6 +1152,10 @@ def _bw_completion_default(self, pub: PublicContext, pri: PrivateContext) -> Hoo def _bw_interrupt_default(self, pub: PublicContext, pri: PrivateContext) -> HookSignal: # 比如 御魂溢出 + + # 结算的时候御魂溢出提示,点击【知道了】 + self.appear_then_click(self.I_OVER_GHOST) + return HookSignal.CONTINUE def _bw_success_default(self, pub: PublicContext, pri: PrivateContext) -> HookSignal: @@ -1180,6 +1184,10 @@ def _bw_success_default(self, pub: PublicContext, pri: PrivateContext) -> HookSi while 1: self.screenshot() + # 发现御魂溢出,直接跳出,在interupt里面处理 + if self.appear(self.I_OVER_GHOST): + return HookSignal.CONTINUE + # 结算的时候御魂溢出提示,点击【知道了】 if self.appear(self.I_OVER_GHOST): self.click(self.I_OVER_GHOST) diff --git a/tasks/Orochi/script_task.py b/tasks/Orochi/script_task.py index e45acc6075..504f756b88 100644 --- a/tasks/Orochi/script_task.py +++ b/tasks/Orochi/script_task.py @@ -433,6 +433,10 @@ def battle_wait(self, random_click_swipt_enable: bool) -> bool: continue while 1: self.screenshot() + # 处理御魂溢出 + if self.appear_then_click(self.I_OVER_GHOST): + continue + action_click = random.choice([self.C_REWARD_1, self.C_REWARD_2, self.C_REWARD_3]) if not self.appear(self.I_GREED_GHOST): break @@ -445,6 +449,10 @@ def battle_wait(self, random_click_swipt_enable: bool) -> bool: appear_greed_ghost = self.appear(self.I_GREED_GHOST) while 1: self.screenshot() + # 处理御魂溢出 + if self.appear_then_click(self.I_OVER_GHOST): + continue + action_click = random.choice([self.C_REWARD_1, self.C_REWARD_2, self.C_REWARD_3]) if self.appear_then_click(self.I_REWARD, action=action_click, interval=1.5): continue From 84366fc59ea4b459679d2f0a5e833428321ac637 Mon Sep 17 00:00:00 2001 From: kunkun008 <77577702+kunkun008@users.noreply.github.com> Date: Thu, 15 Oct 2026 18:38:13 +0800 Subject: [PATCH 19/25] fix(Delegation): avoid jade confirm misclick and back-button dead loop - Raise OCR click debounce on task name from 1s to 3s so page-transition double-clicks do not hit the top-right finish-for-jade button. - Prefer GlobalGame I_UI_CANCEL (default threshold) when the jade confirm modal appears, both while entering and while exiting an in-progress task. - Replace ui_click_until_disappear(I_D_BACK) with a timed back loop that clears blocking cancel modals, avoiding GameTooManyClickError restarts. - Add enter/start timeouts so stuck states fail closed instead of looping. Refs: runhey/OnmyojiAutoScript#1162 --- tasks/Delegation/script_task.py | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/tasks/Delegation/script_task.py b/tasks/Delegation/script_task.py index 37726458e4..f5d43d9ec7 100644 --- a/tasks/Delegation/script_task.py +++ b/tasks/Delegation/script_task.py @@ -56,22 +56,44 @@ def ui_click(click, stop): if not self.ocr_appear(self.O_D_NAME): logger.warning(f'Delegation: {name} not found') return False + enter_timer = Timer(15).start() while 1: self.screenshot() if self.appear(self.I_D_START): break + if enter_timer.reached(): + logger.warning(f'Delegation: {name} enter timeout') + return False + + # 检测到弹出的勾玉确认框,优先点击取消保护勾玉 + if self.appear_then_click(self.I_UI_CANCEL, interval=1): + continue + # 如果出现’召回‘ ’返回‘ 说明这个是现在委派中 # 需要退出 if self.appear(self.I_D_BACK): logger.warning(f'Delegation: {name} is in delegation') - self.ui_click_until_disappear(self.I_D_BACK) - self.wait_until_appear(self.I_REWARDS_MIN) + back_timer = Timer(6).start() + while 1: + self.screenshot() + if not self.appear(self.I_D_BACK): + break + if back_timer.reached(): + logger.warning('Exit delegation detail timeout') + break + # 若此时被取消弹窗遮挡返回,优先点取消 + if self.appear_then_click(self.I_UI_CANCEL, interval=1): + continue + if self.appear_then_click(self.I_D_BACK, interval=1.2): + continue + self.wait_until_appear(self.I_REWARDS_MIN, wait_time=3) return False if self.appear_then_click(self.I_D_SKIP, interval=0.8): continue if self.appear_then_click(self.I_D_CONFIRM, interval=0.8): continue - if self.ocr_appear_click(self.O_D_NAME, interval=1): + # 点击委派任务名:防抖由 1s 提升至 3s,杜绝跨页面过渡时误触右上角"完成(30勾玉)" + if self.ocr_appear_click(self.O_D_NAME, interval=3): continue # 进入委派 fefe e fe logger.info(f'Enter Delegation: {name}') @@ -81,10 +103,14 @@ def ui_click(click, stop): ui_click(self.C_D_4, self.I_D_SELECT_4) # 委派开始 logger.info(f'Delegation: {name} start') + start_timer = Timer(10).start() while 1: self.screenshot() if not self.appear(self.I_D_START): break + if start_timer.reached(): + logger.warning(f'Delegation: {name} start timeout') + break if self.click(self.C_D_5, interval=0.8): continue if self.appear_then_click(self.I_D_START, interval=1.8): From 9afe3d323d01e369f49ce5df4005f6da70f46062 Mon Sep 17 00:00:00 2001 From: neptine <2234044577@qq.com> Date: Thu, 15 Oct 2026 22:45:33 +0800 Subject: [PATCH 20/25] fix(WantedQuests): Detect selected friends when inviting #1939 --- tasks/WantedQuests/script_task.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasks/WantedQuests/script_task.py b/tasks/WantedQuests/script_task.py index 1f0a1f8c84..1763440361 100644 --- a/tasks/WantedQuests/script_task.py +++ b/tasks/WantedQuests/script_task.py @@ -405,7 +405,7 @@ def invite_random(self, add_button: RuleImage): self.click(self.I_WQ_FRIEND_5) sleep(0.2) self.screenshot() - if not self.appear(self.I_SELECTED): + if not self.appear(self.I_WQ_INVITE_SELECTED): logger.warning('No friend selected') return False self.ui_click_until_disappear(self.I_INVITE_ENSURE) From 7e506bc3ac6e8f0fedb1050bf622fe5ea146e549 Mon Sep 17 00:00:00 2001 From: neptine <2234044577@qq.com> Date: Thu, 15 Oct 2026 23:24:29 +0800 Subject: [PATCH 21/25] fix(BaseTask): Skip task name mismatch validation --- tasks/base_task.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasks/base_task.py b/tasks/base_task.py index c9b048ab7b..15ee95f9d8 100644 --- a/tasks/base_task.py +++ b/tasks/base_task.py @@ -80,10 +80,10 @@ def get_task_name(self) -> str: uppercase_first_letter=True, ) - if model_task_name and model_task_name != path_task_name: - raise ScriptError( - f'Task name mismatch: model={model_task_name}, path={path_task_name}' - ) + # if model_task_name and model_task_name != path_task_name: + # raise ScriptError( + # f'Task name mismatch: model={model_task_name}, path={path_task_name}' + # ) return model_task_name or path_task_name def _burst(self) -> bool: From 43c84c8808752d9ec3d88a983073b4cb8983cd09 Mon Sep 17 00:00:00 2001 From: neptine <2234044577@qq.com> Date: Thu, 15 Oct 2026 23:48:33 +0800 Subject: [PATCH 22/25] fix(GeneralBattle): Close buff panel and start battle preparation --- tasks/Component/GeneralBattle/general_battle.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tasks/Component/GeneralBattle/general_battle.py b/tasks/Component/GeneralBattle/general_battle.py index 1969ec153a..f255580110 100644 --- a/tasks/Component/GeneralBattle/general_battle.py +++ b/tasks/Component/GeneralBattle/general_battle.py @@ -635,6 +635,7 @@ def check_and_open_buff(self, buff: BuffClass or list[BuffClass] = None): break if self.appear_then_click(self.I_BUFF, interval=1): continue + self.ui_click_until_disappear(self.I_PREPARE_HIGHLIGHT, interval=0.8) def boss_mark(self, enable=True) -> bool: if not enable or self._boss_mark_flag: From c2023476f9c95aae4bc5e7a7eacc917e719d7570 Mon Sep 17 00:00:00 2001 From: neptine <2234044577@qq.com> Date: Thu, 15 Oct 2026 23:50:26 +0800 Subject: [PATCH 23/25] fix(GeneralBattle): Close buff panel and start battle preparation - close the buff panel before clicking the prepare button\n- enable the 50% experience buff for EvoZone battles --- tasks/EvoZone/script_task.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tasks/EvoZone/script_task.py b/tasks/EvoZone/script_task.py index 773104d602..08ee52f71d 100644 --- a/tasks/EvoZone/script_task.py +++ b/tasks/EvoZone/script_task.py @@ -303,7 +303,10 @@ def is_in_evozone(screenshot=False) -> bool: pass if not self.appear(self.I_EVOZONE_FIRE): - self.run_general_battle(config=self.config.evo_zone.general_battle_config) + from tasks.Component.GeneralBuff.config_buff import BuffClass + self.run_general_battle(config=self.config.evo_zone.general_battle_config, + buff=BuffClass.EXP_50 + ) break # 回去 From 911e996d48c51a16255c43ded961e1eab0e9909d Mon Sep 17 00:00:00 2001 From: neptine <2234044577@qq.com> Date: Thu, 15 Oct 2026 23:53:30 +0800 Subject: [PATCH 24/25] fix(workflow): Correct auto-merge schedule comment --- .github/workflows/auto-merge-pr.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/auto-merge-pr.yaml b/.github/workflows/auto-merge-pr.yaml index d05e81c480..c415af0abc 100644 --- a/.github/workflows/auto-merge-pr.yaml +++ b/.github/workflows/auto-merge-pr.yaml @@ -2,8 +2,8 @@ name: Auto Merge Sync PR on: schedule: - # 每周五北京时间12点触发(UTC时间4点) - - cron: '0 4 * * 5' + # 每周五北京时间2点07分触发(UTC时间周四18点07分) + - cron: '7 18 * * 4' workflow_dispatch: permissions: From d8677dc0d7e847129b850d775d6714dfdb4706dd Mon Sep 17 00:00:00 2001 From: neptine <2234044577@qq.com> Date: Thu, 15 Oct 2026 23:57:40 +0800 Subject: [PATCH 25/25] Revert "fix(GeneralBattle): Close buff panel and start battle preparation" This reverts commit c2023476f9c95aae4bc5e7a7eacc917e719d7570. --- tasks/EvoZone/script_task.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tasks/EvoZone/script_task.py b/tasks/EvoZone/script_task.py index 08ee52f71d..773104d602 100644 --- a/tasks/EvoZone/script_task.py +++ b/tasks/EvoZone/script_task.py @@ -303,10 +303,7 @@ def is_in_evozone(screenshot=False) -> bool: pass if not self.appear(self.I_EVOZONE_FIRE): - from tasks.Component.GeneralBuff.config_buff import BuffClass - self.run_general_battle(config=self.config.evo_zone.general_battle_config, - buff=BuffClass.EXP_50 - ) + self.run_general_battle(config=self.config.evo_zone.general_battle_config) break # 回去