diff --git a/assets/share/base/page/MAP_EXIT.2.png b/assets/share/base/page/MAP_EXIT.2.png new file mode 100644 index 000000000..6a4dcb099 Binary files /dev/null and b/assets/share/base/page/MAP_EXIT.2.png differ diff --git a/tasks/base/assets/assets_base_page.py b/tasks/base/assets/assets_base_page.py index 0bb0d9dde..c43a575ae 100644 --- a/tasks/base/assets/assets_base_page.py +++ b/tasks/base/assets/assets_base_page.py @@ -280,13 +280,22 @@ MAP_CHECK = ButtonWrapper( ) MAP_EXIT = ButtonWrapper( name='MAP_EXIT', - share=Button( - file='./assets/share/base/page/MAP_EXIT.png', - area=(27, 46, 44, 74), - search=(7, 26, 64, 94), - color=(142, 144, 148), - button=(27, 46, 44, 74), - ), + share=[ + Button( + file='./assets/share/base/page/MAP_EXIT.png', + area=(27, 46, 44, 74), + search=(7, 26, 64, 94), + color=(142, 144, 148), + button=(27, 46, 44, 74), + ), + Button( + file='./assets/share/base/page/MAP_EXIT.2.png', + area=(27, 46, 44, 74), + search=(7, 26, 64, 94), + color=(160, 187, 206), + button=(27, 46, 44, 74), + ), + ], ) MAP_GOTO_WORLD = ButtonWrapper( name='MAP_GOTO_WORLD', diff --git a/tasks/base/main_page.py b/tasks/base/main_page.py index acd41fdcd..93f514aa7 100644 --- a/tasks/base/main_page.py +++ b/tasks/base/main_page.py @@ -5,11 +5,9 @@ from module.config.server import VALID_LANG from module.exception import RequestHumanTakeover, ScriptError from module.logger import logger from module.ocr.ocr import OcrWhiteLetterOnComplexBackground -from tasks.base.assets.assets_base_main_page import OCR_MAP_NAME, ROGUE_LEAVE_FOR_NOW -from tasks.base.assets.assets_base_page import CLOSE, MAP_EXIT -from tasks.base.page import Page, page_gacha, page_main +from tasks.base.assets.assets_base_main_page import OCR_MAP_NAME +from tasks.base.page import Page, page_main from tasks.base.popup import PopupHandler -from tasks.daily.assets.assets_daily_trial import START_TRIAL from tasks.map.keywords import KEYWORDS_MAP_PLANE, MapPlane @@ -158,49 +156,3 @@ class MainPage(PopupHandler): self.handle_lang_check(page=page_main) return True - - def ui_leave_special(self): - """ - Leave from: - - Rogue domains - - Character trials - - Returns: - bool: If left a special plane - - Pages: - in: Any - out: page_main - """ - if not self.appear(MAP_EXIT): - return False - - logger.info('UI leave special') - skip_first_screenshot = True - clicked = False - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - - # End - if clicked: - if self.appear(page_main.check_button): - logger.info(f'Leave to {page_main}') - break - - if self.appear_then_click(MAP_EXIT, interval=2): - continue - if self.handle_popup_confirm(): - continue - if self.match_template_color(START_TRIAL, interval=2): - logger.info(f'{START_TRIAL} -> {CLOSE}') - self.device.click(CLOSE) - clicked = True - continue - if self.handle_ui_close(page_gacha.check_button, interval=2): - continue - if self.appear_then_click(ROGUE_LEAVE_FOR_NOW, interval=2): - clicked = True - continue diff --git a/tasks/base/ui.py b/tasks/base/ui.py index 09d18db42..0c159cce3 100644 --- a/tasks/base/ui.py +++ b/tasks/base/ui.py @@ -4,13 +4,14 @@ from module.base.timer import Timer from module.exception import GameNotRunningError, GamePageUnknownError from module.logger import logger from module.ocr.ocr import Ocr -from tasks.base.assets.assets_base_page import MAP_EXIT +from tasks.base.assets.assets_base_main_page import ROGUE_LEAVE_FOR_NOW +from tasks.base.assets.assets_base_page import CLOSE, MAIN_GOTO_CHARACTER, MAP_EXIT from tasks.base.main_page import MainPage -from tasks.base.page import Page, page_main +from tasks.base.page import Page, page_gacha, page_main from tasks.combat.assets.assets_combat_finish import COMBAT_EXIT from tasks.combat.assets.assets_combat_interact import MAP_LOADING from tasks.combat.assets.assets_combat_prepare import COMBAT_PREPARE -from tasks.daily.assets.assets_daily_trial import INFO_CLOSE +from tasks.daily.assets.assets_daily_trial import INFO_CLOSE, START_TRIAL from tasks.login.assets.assets_login import LOGIN_CONFIRM @@ -24,6 +25,8 @@ class UI(MainPage): page (Page): interval: """ + if page == page_main: + return self.is_in_main(interval=interval) return self.appear(page.check_button, interval=interval) def ui_get_current_page(self, skip_first_screenshot=True): @@ -139,7 +142,7 @@ class UI(MainPage): for page in Page.iter_pages(): if page.parent is None or page.check_button is None: continue - if self.appear(page.check_button, interval=5): + if self.ui_page_appear(page, interval=5): logger.info(f'Page switch: {page} -> {page.parent}') self.handle_lang_check(page) if self.ui_page_confirm(page): @@ -297,14 +300,41 @@ class UI(MainPage): if additional(): continue - def is_in_main(self): - if self.appear(page_main.check_button): - if self.image_color_count(page_main.check_button, color=(235, 235, 235), threshold=234, count=400): - return True - if self.appear(MAP_EXIT): + def is_in_main(self, interval=0): + self.device.stuck_record_add(MAIN_GOTO_CHARACTER) + + if interval and not self.interval_is_reached(MAIN_GOTO_CHARACTER, interval=interval): + return False + + appear = False + if MAIN_GOTO_CHARACTER.match_template_binary(self.device.image): + if self.image_color_count(MAIN_GOTO_CHARACTER, color=(235, 235, 235), threshold=234, count=400): + appear = True + if not appear: + if MAP_EXIT.match_template_binary(self.device.image): + if self.image_color_count(MAP_EXIT, color=(235, 235, 235), threshold=221, count=50): + appear = True + + if appear and interval: + self.interval_reset(MAIN_GOTO_CHARACTER, interval=interval) + + return appear + + def is_in_map_exit(self, interval=0): + self.device.stuck_record_add(MAP_EXIT) + + if interval and not self.interval_is_reached(MAP_EXIT, interval=interval): + return False + + appear = False + if MAP_EXIT.match_template_binary(self.device.image): if self.image_color_count(MAP_EXIT, color=(235, 235, 235), threshold=221, count=50): - return True - return False + appear = True + + if appear and interval: + self.interval_reset(MAP_EXIT, interval=interval) + + return appear def ui_goto_main(self): return self.ui_ensure(destination=page_main) @@ -380,3 +410,50 @@ class UI(MainPage): button (Button): """ pass + + def ui_leave_special(self): + """ + Leave from: + - Rogue domains + - Character trials + + Returns: + bool: If left a special plane + + Pages: + in: Any + out: page_main + """ + if not self.is_in_map_exit(): + return False + + logger.info('UI leave special') + skip_first_screenshot = True + clicked = False + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + # End + if clicked: + if self.is_in_main(): + logger.info(f'Leave to {page_main}') + break + + if self.is_in_map_exit(interval=2): + self.device.click(MAP_EXIT) + continue + if self.handle_popup_confirm(): + continue + if self.match_template_color(START_TRIAL, interval=2): + logger.info(f'{START_TRIAL} -> {CLOSE}') + self.device.click(CLOSE) + clicked = True + continue + if self.handle_ui_close(page_gacha.check_button, interval=2): + continue + if self.appear_then_click(ROGUE_LEAVE_FOR_NOW, interval=2): + clicked = True + continue diff --git a/tasks/daily/trail.py b/tasks/daily/trail.py index f911b1491..a07459f8f 100644 --- a/tasks/daily/trail.py +++ b/tasks/daily/trail.py @@ -90,7 +90,8 @@ class CharacterTrial(UI): if self.match_template_color(START_TRIAL): break - if self.appear_then_click(MAP_EXIT): + if self.is_in_map_exit(interval=2): + self.device.click(MAP_EXIT) continue if self.handle_popup_confirm(): continue diff --git a/tasks/forgotten_hall/ui.py b/tasks/forgotten_hall/ui.py index a07c08753..14e9c3d59 100644 --- a/tasks/forgotten_hall/ui.py +++ b/tasks/forgotten_hall/ui.py @@ -210,7 +210,8 @@ class ForgottenHallUI(DungeonUI, ForgottenHallTeam): logger.info("Forgotten hall dungeon exited") break - if self.appear_then_click(MAP_EXIT): + if self.is_in_map_exit(interval=2): + self.device.click(MAP_EXIT) continue if self.handle_popup_confirm(): continue diff --git a/tasks/rogue/entry/entry.py b/tasks/rogue/entry/entry.py index 35b647919..448e33888 100644 --- a/tasks/rogue/entry/entry.py +++ b/tasks/rogue/entry/entry.py @@ -292,7 +292,8 @@ class RogueEntry(RouteBase, RogueRewardHandler, RoguePathHandler, DungeonUI): if self.handle_ui_back(self._is_page_rogue_path): continue # From ui_leave_special() - if self.appear_then_click(MAP_EXIT, interval=2): + if self.is_in_map_exit(interval=2): + self.device.click(MAP_EXIT) continue if self.handle_popup_confirm(): continue