From 0298548d4a10b668dd74ab299a37b31c7406ed44 Mon Sep 17 00:00:00 2001 From: SilverFox Date: Sun, 26 Jul 2026 23:38:31 +0800 Subject: [PATCH] =?UTF-8?q?fix(island):=20=E4=BF=AE=E5=A4=8D=20=E5=B2=9B?= =?UTF-8?q?=E5=B1=BF-=E6=AF=8F=E6=97=A5=E8=A1=A5=E7=BB=99/=E7=8F=8D?= =?UTF-8?q?=E7=8F=A0=E9=87=87=E8=B4=AD=20=E5=9C=A8=E8=BE=83=E6=85=A2?= =?UTF-8?q?=E7=9A=84=E8=AE=BE=E5=A4=87=E4=B8=8A=E5=B7=A5=E4=BD=9C=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/device/method/minitouch.py | 4 ++- module/island/island.py | 50 ++++++++++++++++++++++++++++++ module/island/island_air_drop.py | 38 +++-------------------- module/island/island_pearl_sell.py | 44 ++------------------------ 4 files changed, 59 insertions(+), 77 deletions(-) diff --git a/module/device/method/minitouch.py b/module/device/method/minitouch.py index f0b8e1475..a71d88580 100644 --- a/module/device/method/minitouch.py +++ b/module/device/method/minitouch.py @@ -718,6 +718,9 @@ def drag_minitouch(self, p1, p2, point_random=(-10, -10, 10, 10)): builder.move(*p2).commit().wait(140) builder.send() + builder.up().commit() + builder.send() + def island_swipe_hold_minitouch(self, p1, p2, hold_time): points = insert_swipe(p0=p1, p3=p2) builder = self.minitouch_builder @@ -725,7 +728,6 @@ def island_swipe_hold_minitouch(self, p1, p2, hold_time): builder.send() for point in points[1:]: builder.move(*point).commit().wait(10) - builder.send() builder.wait(hold_time) builder.send() builder.up().commit() diff --git a/module/island/island.py b/module/island/island.py index 6adc0f935..6db9c1c94 100644 --- a/module/island/island.py +++ b/module/island/island.py @@ -221,6 +221,54 @@ def is_in_friend_island(self): access_map = self.appear(ISLAND_ACCESS_MAP, offset=(20, 20)) return leave and access_map + def check_visit_friend_island(self, visit_button): + """点击好友拜访按钮并等待进入好友岛屿。 + + 检测逻辑分为两个阶段: + 1. 等待 ISLAND_ACCESS_MAP(右上角地图入口)出现,表示已开始加载好友岛 + 2. 等待 AIR_DROP_RUN_AWAY(顶部"离开"按钮)也出现,确认场景完全加载完毕 + 只有两者同时出现(is_in_friend_island() 为 True),才视为成功进入好友岛屿。 + """ + click_timer = Timer(3).start() + self.device.click(visit_button) + self.device.sleep(3) + for _ in self.loop(timeout=30, skip_first=False): + if self.is_in_friend_island(): + logger.info("[岛屿] 二次检测拜访状态......") + # 在等待的过程中, 先后会出现黑底黄鸡loading、UI(一闪而过)、白底沙漏loading + # 因此等待1s后进行二次确认, 避免中间UI一闪而过时出现误判 + self.device.sleep(1) + self.device.screenshot() + if self.is_in_friend_island(): + self._island_expect_friend = True + logger.info("[岛屿] 成功进入好友岛屿") + return True + if self.appear(CANT_ACCESS, offset=(20, 20)): + logger.info("[岛屿] 好友不可访问") + return False + if click_timer.reached(): + self.device.click(visit_button) + click_timer.reset() + if self.ui_additional(): + continue + logger.warning("[岛屿] 拜访好友超时") + return False + + def exit_friend_island(self): + """退出好友岛屿。""" + logger.info("[岛屿] 退出好友岛屿") + self._island_expect_friend = False + for _ in self.loop(timeout=30): + if self.appear_then_click(AIR_DROP_RUN_AWAY, offset=(20, 20), interval=2): + continue + if self.appear(ISLAND_GOTO_MAP): + logger.info("[岛屿] 成功退出好友岛屿") + return True + if self.ui_additional(): + continue + logger.warning("[岛屿] 退出好友岛屿超时") + return False + def _wait_island_map_entry(self, timeout=3): last_status = None for _ in self.loop(timeout=timeout, skip_first=False): @@ -346,6 +394,8 @@ def get_friend_destination_check_button(name): self.appear(ISLAND_CHECK, offset=(20, 20)) or (in_friend and self.is_in_friend_island()) ): + self.device.sleep(1) + logger.info(f"[岛屿] 岛屿地图进入成功: {destination}") return True logger.warning(f"[岛屿] 岛屿地图进入目的地超时: {destination}") diff --git a/module/island/island_air_drop.py b/module/island/island_air_drop.py index e06121856..efb0255f5 100644 --- a/module/island/island_air_drop.py +++ b/module/island/island_air_drop.py @@ -154,17 +154,10 @@ def find_air_drop(self): visit_button = self.calculate_visit_position( air_drop_button_x, air_drop_button_y ) - result = self.check_visit(visit_button) - if result == "skip": - logger.info("[岛屿-每日补给] 无法访问,跳过当前补给") + if not self.check_visit_friend_island(visit_button): continue - elif result == "success": - logger.info("[岛屿-每日补给] 成功进入拜访状态,返回True") - return True - elif result == "timeout": - self.island_error = True - return False has_clickable_air_drop = True + return True # 如果当前页面所有补给都不可用(全部skip或timeout) if not has_clickable_air_drop: logger.info("[岛屿-每日补给] 当前页面没有可用补给目标") @@ -199,21 +192,6 @@ def find_air_drop(self): logger.info("[岛屿-每日补给] 未检测到可用补给") return False - def check_visit(self, visit_button): - number = 20 - self.device.click(visit_button) - self.device.sleep(5) - while number: - self.device.screenshot() - if self.appear(ISLAND_ACCESS_MAP, offset=1): - return "success" - if self.appear(CANT_ACCESS, similarity=0.85): - return "skip" - self.device.sleep(1) - self.device.click(visit_button) - number -= 1 - return "timeout" - def calculate_visit_position(self, air_drop_button_x, air_drop_button_y): visit_button_x1 = air_drop_button_x + 225 # x偏移 @@ -244,15 +222,6 @@ def visit_swipe(self, distance): self.device.click(stop_button) self.device.click_record_clear() - def island_access_map_check(self): - while True: - self.device.screenshot() - if self.appear(ISLAND_ACCESS_MAP): - return False - if self.appear(CANT_ACCESS): - return True - self.device.sleep(0.5) - def island_air_drop(self): self.device.click(ISLAND_AIR_DROP_A) sleep(0.1) @@ -265,6 +234,7 @@ def island_air_drop(self): self.device.click(ISLAND_AIR_DROP_B) sleep(0.1) self.device.click(ISLAND_AIR_DROP_C) + sleep(0.5) def run_and_get(self): self.island_up(3000) @@ -299,7 +269,7 @@ def run_and_get(self): break self.island_down(500) self.island_air_drop() - self.device.click(AIR_DROP_RUN_AWAY) + self.exit_friend_island() def test(self): image = self.device.screenshot() diff --git a/module/island/island_pearl_sell.py b/module/island/island_pearl_sell.py index b308dd0a7..91b111448 100644 --- a/module/island/island_pearl_sell.py +++ b/module/island/island_pearl_sell.py @@ -361,20 +361,6 @@ def back_to_pearl_shop_or_map(self): continue return False - def exit_friend_island(self): - """退出好友岛屿。""" - logger.info("[岛屿-珍珠采购] 退出好友岛屿") - self._island_expect_friend = False - for _ in self.loop(timeout=20): - if self.appear_then_click(AIR_DROP_RUN_AWAY, offset=(20, 20), interval=2): - continue - if self.appear(ISLAND_ACCESS_MAP, offset=(20, 20)): - return True - if self.ui_additional(): - continue - logger.warning("[岛屿-珍珠采购] 退出好友岛屿超时") - return False - # ==================== 好友排名 ==================== def visit_friend_by_rank(self, mode, threshold): @@ -399,7 +385,7 @@ def visit_friend_by_rank(self, mode, threshold): self._rank_visit_target_selected = True logger.info(f"[岛屿-珍珠采购] 选择好友珍珠价格 {target['price']}") - return self.click_rank_visit(target["visit_button"]) + return self.check_visit_friend_island(target["visit_button"]) def switch_to_friend_rank_tab(self): """切换到好友排名页签。""" @@ -530,33 +516,6 @@ def rank_price_button_from_visit(self, visit_button, index): area, f"OCR_ISLAND_PEARL_RANK_PRICE_FROM_VISIT_{index}" ) - def click_rank_visit(self, visit_button): - """点击好友排名拜访按钮并等待进入好友岛屿。 - - 检测逻辑分为两个阶段: - 1. 等待 ISLAND_ACCESS_MAP(右上角地图入口)出现,表示已开始加载好友岛 - 2. 等待 AIR_DROP_RUN_AWAY(顶部"离开"按钮)也出现,确认场景完全加载完毕 - 只有两者同时出现(is_in_friend_island() 为 True),才视为成功进入好友岛屿。 - """ - click_timer = Timer(3).start() - self.device.click(visit_button) - self.device.sleep(3) - for _ in self.loop(timeout=30, skip_first=False): - if self.is_in_friend_island(): - self._island_expect_friend = True - logger.info("[岛屿-珍珠采购] 成功进入好友岛屿") - return True - if self.appear(CANT_ACCESS, offset=(20, 20)): - logger.info("[岛屿-珍珠采购] 好友不可访问") - return False - if click_timer.reached(): - self.device.click(visit_button) - click_timer.reset() - if self.ui_additional(): - continue - logger.warning("[岛屿-珍珠采购] 拜访好友超时") - return False - # ==================== OCR ==================== def ocr_pearl_price(self, kind): @@ -687,6 +646,7 @@ def trade_pearl(self, action, count): logger.warning(f"[岛屿-珍珠采购] 打开珍珠{self._action_name(action)}弹窗超时") return False + self.device.sleep(0.5) if not self.adjust_trade_count(count): logger.warning(f"[岛屿-珍珠采购] 珍珠{self._action_name(action)}数量未调整到目标: {count}") return False