Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion module/device/method/minitouch.py
Original file line number Diff line number Diff line change
Expand Up @@ -718,14 +718,16 @@ 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
builder.down(*points[0]).commit().wait(10)
builder.send()
for point in points[1:]:
builder.move(*point).commit().wait(10)
builder.send()
builder.wait(hold_time)
builder.send()
builder.up().commit()
Expand Down
50 changes: 50 additions & 0 deletions module/island/island.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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}")
Expand Down
38 changes: 4 additions & 34 deletions module/island/island_air_drop.py
Original file line number Diff line number Diff line change
Expand Up @@ -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("[岛屿-每日补给] 当前页面没有可用补给目标")
Expand Down Expand Up @@ -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偏移
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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()
Expand Down
44 changes: 2 additions & 42 deletions module/island/island_pearl_sell.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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):
"""切换到好友排名页签。"""
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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
Expand Down
Loading