From 2bb8a9980e2d344f8a268aa4e3c30200abfeb189 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 15 Oct 2024 00:50:26 +0800 Subject: [PATCH] Fix: Wait list end after swiping (#648) --- .../share/dungeon/ui_list/LIST_END_CHECK.png | Bin 0 -> 13319 bytes module/ui/draggable_list.py | 14 ++++- .../dungeon/assets/assets_dungeon_ui_list.py | 10 ++++ tasks/dungeon/ui/llist.py | 53 +++++++++++++++++- 4 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 assets/share/dungeon/ui_list/LIST_END_CHECK.png diff --git a/assets/share/dungeon/ui_list/LIST_END_CHECK.png b/assets/share/dungeon/ui_list/LIST_END_CHECK.png new file mode 100644 index 0000000000000000000000000000000000000000..1e44407b1e86b7a0de11fe0161f3a1e42dd2bce8 GIT binary patch literal 13319 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 Xrp=32Ex@A|AkZyKJBz9tkN)^S%)Y(N literal 0 HcmV?d00001 diff --git a/module/ui/draggable_list.py b/module/ui/draggable_list.py index b35616eae..491285b71 100644 --- a/module/ui/draggable_list.py +++ b/module/ui/draggable_list.py @@ -143,6 +143,13 @@ class DraggableList: if direction == 'right': return 'left' + def wait_bottom_appear(self, main: ModuleBase, skip_first_screenshot=True): + """ + Returns: + bool: If waited + """ + return False + def insight_row(self, row: Keyword, main: ModuleBase, skip_first_screenshot=True) -> bool: """ Args: @@ -180,8 +187,11 @@ class DraggableList: self.drag_page(self.drag_direction, main=main) # Wait for bottoming out - main.wait_until_stable(self.search_button, timer=Timer( - 0, count=0), timeout=Timer(1.5, count=5)) + self.wait_bottom_appear(main, skip_first_screenshot=False) + main.wait_until_stable( + self.search_button, timer=Timer(0, count=0), + timeout=Timer(1.5, count=5) + ) skip_first_screenshot = True if self.cur_buttons and last_buttons == set(self.cur_buttons): if bottom_check.reached(): diff --git a/tasks/dungeon/assets/assets_dungeon_ui_list.py b/tasks/dungeon/assets/assets_dungeon_ui_list.py index 1c0ac3faf..3c5e48ea0 100644 --- a/tasks/dungeon/assets/assets_dungeon_ui_list.py +++ b/tasks/dungeon/assets/assets_dungeon_ui_list.py @@ -23,6 +23,16 @@ LIST_DESCENDING = ButtonWrapper( button=(1125, 643, 1143, 661), ), ) +LIST_END_CHECK = ButtonWrapper( + name='LIST_END_CHECK', + share=Button( + file='./assets/share/dungeon/ui_list/LIST_END_CHECK.png', + area=(465, 587, 556, 622), + search=(445, 567, 576, 642), + color=(218, 210, 215), + button=(465, 587, 556, 622), + ), +) OCR_DUNGEON_LIST = ButtonWrapper( name='OCR_DUNGEON_LIST', share=Button( diff --git a/tasks/dungeon/ui/llist.py b/tasks/dungeon/ui/llist.py index db072b566..c4bdaf921 100644 --- a/tasks/dungeon/ui/llist.py +++ b/tasks/dungeon/ui/llist.py @@ -8,7 +8,7 @@ from module.base.base import ModuleBase from module.base.button import ClickButton from module.base.decorator import run_once from module.base.timer import Timer -from module.base.utils import area_center, area_limit, area_offset, crop, image_size +from module.base.utils import area_center, area_limit, area_offset, color_similarity_2d, crop, image_size from module.logger import logger from module.ocr.ocr import Ocr, OcrResultButton from module.ocr.utils import merge_result_button, split_and_pair_button_attr, split_and_pair_buttons @@ -157,6 +157,13 @@ class DraggableDungeonList(DraggableList): # limit_entrance: True to ensure the teleport button is insight limit_entrance = False + def wait_bottom_appear(self, main: "DungeonUIList", skip_first_screenshot=True): + """ + Returns: + bool: If waited + """ + return main.dungeon_list_wait_list_end(skip_first_screenshot=skip_first_screenshot) + def load_rows(self, main: ModuleBase, allow_early_access=False): """ Args: @@ -251,6 +258,43 @@ class DungeonUIList(UI): LIST_SORTING.set(current, main=self) return True + def dungeon_list_wait_list_end(self, skip_first_screenshot=True): + """ + When swiping down at list end, wait until list rebound + + Returns: + bool: If waited + """ + logger.info('dungeon_list_wait_list_end') + timeout = Timer(1, count=3).start() + empty = False + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + # End + if timeout.reached(): + logger.warning('Wait dungeon_list_wait_list_end timeout') + return True + # Check color + image = self.image_crop(LIST_END_CHECK, copy=False) + mask = color_similarity_2d(image, (255, 255, 255)) + cv2.inRange(mask, 0, 235, dst=mask) + mean = cv2.mean(mask)[0] + if mean > 30: + if empty: + # rebound, having rows at bottom now + return True + else: + # Not at bottom from the very beginning + return False + else: + # Blank background + empty = True + continue + def _dungeon_insight_index(self, dungeon: DungeonList): """ Insight a dungeon using pre-defined dungeon indexes from DUNGEON_LIST @@ -350,8 +394,11 @@ class DungeonUIList(UI): # Drag down DUNGEON_LIST.drag_page('down', main=self) - self.wait_until_stable(DUNGEON_LIST.search_button, timer=Timer( - 0, count=0), timeout=Timer(1.5, count=5)) + self.dungeon_list_wait_list_end(skip_first_screenshot=False) + self.wait_until_stable( + DUNGEON_LIST.search_button, timer=Timer(0, count=0), + timeout=Timer(1.5, count=5) + ) self._dungeon_list_reset()