diff --git a/assets/cn/meta_reward/SYNC_ENTER.png b/assets/cn/meta_reward/SYNC_ENTER.png new file mode 100644 index 0000000000..c200b54af8 Binary files /dev/null and b/assets/cn/meta_reward/SYNC_ENTER.png differ diff --git a/assets/cn/meta_reward/SYNC_REWARD_NOTICE.png b/assets/cn/meta_reward/SYNC_REWARD_NOTICE.png new file mode 100644 index 0000000000..cb2239e385 Binary files /dev/null and b/assets/cn/meta_reward/SYNC_REWARD_NOTICE.png differ diff --git a/assets/cn/meta_reward/SYNC_TAP.png b/assets/cn/meta_reward/SYNC_TAP.png new file mode 100644 index 0000000000..448a82a031 Binary files /dev/null and b/assets/cn/meta_reward/SYNC_TAP.png differ diff --git a/module/base/utils.py b/module/base/utils.py index 9bce6f0049..2eff5f8133 100644 --- a/module/base/utils.py +++ b/module/base/utils.py @@ -714,7 +714,7 @@ def get_bbox(image, threshold=0): return x[0], y[0], x[-1] + 1, y[-1] + 1 -def get_bbox_reversed(image, threshold=0): +def get_bbox_reversed(image, threshold=255): """ Similar to `get_bbox` but for black contents on white background. diff --git a/module/handler/info_handler.py b/module/handler/info_handler.py index 23fdd1bd62..e71cee07d8 100644 --- a/module/handler/info_handler.py +++ b/module/handler/info_handler.py @@ -173,7 +173,8 @@ def handle_urgent_commission(self, drop=None): if not self.device.app_is_running(): logger.error('Detected hot fixes from game server, game died') raise GameNotRunningError - if self.match_template_color(LOGIN_CHECK, offset=(30, 30)): + # Use template match without color match due to maintenance popup + if self.appear(LOGIN_CHECK, offset=(30, 30)): logger.error('Account logged out, ' 'probably because account kicked by server maintenance or another log in') # Kill game, because game patches after maintenance can only be downloaded at game startup diff --git a/module/meta_reward/assets.py b/module/meta_reward/assets.py index 7909d4162f..2633d96d8f 100644 --- a/module/meta_reward/assets.py +++ b/module/meta_reward/assets.py @@ -11,3 +11,6 @@ REWARD_CHECK = Button(area={'cn': (31, 486, 64, 543), 'en': (35, 487, 62, 541), 'jp': (31, 486, 64, 543), 'tw': (31, 486, 64, 543)}, color={'cn': (199, 164, 165), 'en': (203, 169, 170), 'jp': (206, 172, 174), 'tw': (199, 164, 165)}, button={'cn': (31, 486, 64, 543), 'en': (35, 487, 62, 541), 'jp': (31, 486, 64, 543), 'tw': (31, 486, 64, 543)}, file={'cn': './assets/cn/meta_reward/REWARD_CHECK.png', 'en': './assets/en/meta_reward/REWARD_CHECK.png', 'jp': './assets/jp/meta_reward/REWARD_CHECK.png', 'tw': './assets/cn/meta_reward/REWARD_CHECK.png'}) REWARD_ENTER = Button(area={'cn': (1109, 535, 1187, 554), 'en': (1106, 532, 1199, 544), 'jp': (1108, 535, 1188, 554), 'tw': (1109, 535, 1187, 554)}, color={'cn': (199, 195, 201), 'en': (213, 212, 217), 'jp': (215, 207, 214), 'tw': (199, 195, 201)}, button={'cn': (1109, 535, 1187, 554), 'en': (1106, 532, 1199, 544), 'jp': (1108, 535, 1188, 554), 'tw': (1109, 535, 1187, 554)}, file={'cn': './assets/cn/meta_reward/REWARD_ENTER.png', 'en': './assets/en/meta_reward/REWARD_ENTER.png', 'jp': './assets/jp/meta_reward/REWARD_ENTER.png', 'tw': './assets/cn/meta_reward/REWARD_ENTER.png'}) REWARD_RECEIVE = Button(area={'cn': (1031, 601, 1215, 638), 'en': (1067, 608, 1182, 633), 'jp': (1043, 604, 1203, 635), 'tw': (1031, 601, 1215, 638)}, color={'cn': (149, 62, 62), 'en': (164, 92, 93), 'jp': (150, 64, 64), 'tw': (149, 62, 62)}, button={'cn': (1031, 601, 1215, 638), 'en': (1067, 608, 1182, 633), 'jp': (1043, 604, 1203, 635), 'tw': (1031, 601, 1215, 638)}, file={'cn': './assets/cn/meta_reward/REWARD_RECEIVE.png', 'en': './assets/en/meta_reward/REWARD_RECEIVE.png', 'jp': './assets/jp/meta_reward/REWARD_RECEIVE.png', 'tw': './assets/cn/meta_reward/REWARD_RECEIVE.png'}) +SYNC_ENTER = Button(area={'cn': (866, 351, 943, 370), 'en': (866, 351, 943, 370), 'jp': (866, 351, 943, 370), 'tw': (866, 351, 943, 370)}, color={'cn': (183, 175, 177), 'en': (183, 175, 177), 'jp': (183, 175, 177), 'tw': (183, 175, 177)}, button={'cn': (866, 351, 943, 370), 'en': (866, 351, 943, 370), 'jp': (866, 351, 943, 370), 'tw': (866, 351, 943, 370)}, file={'cn': './assets/cn/meta_reward/SYNC_ENTER.png', 'en': './assets/cn/meta_reward/SYNC_ENTER.png', 'jp': './assets/cn/meta_reward/SYNC_ENTER.png', 'tw': './assets/cn/meta_reward/SYNC_ENTER.png'}) +SYNC_REWARD_NOTICE = Button(area={'cn': (977, 337, 981, 352), 'en': (977, 337, 981, 352), 'jp': (977, 337, 981, 352), 'tw': (977, 337, 981, 352)}, color={'cn': (250, 182, 57), 'en': (250, 182, 57), 'jp': (250, 182, 57), 'tw': (250, 182, 57)}, button={'cn': (977, 337, 981, 352), 'en': (977, 337, 981, 352), 'jp': (977, 337, 981, 352), 'tw': (977, 337, 981, 352)}, file={'cn': './assets/cn/meta_reward/SYNC_REWARD_NOTICE.png', 'en': './assets/cn/meta_reward/SYNC_REWARD_NOTICE.png', 'jp': './assets/cn/meta_reward/SYNC_REWARD_NOTICE.png', 'tw': './assets/cn/meta_reward/SYNC_REWARD_NOTICE.png'}) +SYNC_TAP = Button(area={'cn': (581, 339, 707, 377), 'en': (581, 339, 707, 377), 'jp': (581, 339, 707, 377), 'tw': (581, 339, 707, 377)}, color={'cn': (168, 112, 111), 'en': (168, 112, 111), 'jp': (168, 112, 111), 'tw': (168, 112, 111)}, button={'cn': (581, 339, 707, 377), 'en': (581, 339, 707, 377), 'jp': (581, 339, 707, 377), 'tw': (581, 339, 707, 377)}, file={'cn': './assets/cn/meta_reward/SYNC_TAP.png', 'en': './assets/cn/meta_reward/SYNC_TAP.png', 'jp': './assets/cn/meta_reward/SYNC_TAP.png', 'tw': './assets/cn/meta_reward/SYNC_TAP.png'}) diff --git a/module/meta_reward/meta_reward.py b/module/meta_reward/meta_reward.py index 66512e98bf..27eb629fa4 100644 --- a/module/meta_reward/meta_reward.py +++ b/module/meta_reward/meta_reward.py @@ -23,26 +23,6 @@ def meta_reward_notice_appear(self): logger.info('No meta reward red dot') return False - def meta_reward_enter(self, skip_first_screenshot=True): - """ - Pages: - in: page_meta - out: REWARD_CHECK - """ - logger.info('Meta reward enter') - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - - if self.appear_then_click(REWARD_ENTER, offset=(20, 20), interval=3): - continue - - # End - if self.appear(REWARD_CHECK, offset=(20, 20)): - break - def meta_reward_receive(self, skip_first_screenshot=True): """ Args: @@ -52,7 +32,7 @@ def meta_reward_receive(self, skip_first_screenshot=True): bool: If received. Pages: - in: REWARD_CHECK + in: page_meta or REWARD_CHECK out: REWARD_CHECK """ logger.hr('Meta reward receive', level=1) @@ -64,6 +44,14 @@ def meta_reward_receive(self, skip_first_screenshot=True): else: self.device.screenshot() + # End + # REWARD_CHECK appears and REWARD_RECEIVE gets gray + if self.appear(REWARD_CHECK, offset=(20, 20)) and \ + self.image_color_count(REWARD_RECEIVE, color=(49, 52, 49), threshold=221, count=400): + break + + if self.appear_then_click(REWARD_ENTER, offset=(20, 20), interval=3): + continue if self.match_template_color(REWARD_RECEIVE, offset=(20, 20), interval=3): self.device.click(REWARD_RECEIVE) confirm_timer.reset() @@ -81,15 +69,72 @@ def meta_reward_receive(self, skip_first_screenshot=True): confirm_timer.reset() continue + logger.info(f'Meta reward receive finished, received={received}') + return received + + def meta_sync_notice_appear(self): + """ + "sync" is the period that you gather meta points to 100% and get a meta ship + + Returns: + bool: If appear. + + Page: + in: page_meta + """ + if self.appear(SYNC_REWARD_NOTICE, threshold=30): + logger.info('Found meta sync red dot') + return True + else: + logger.info('No meta sync red dot') + return False + + def meta_sync_receive(self, skip_first_screenshot=True): + """ + Args: + skip_first_screenshot: + + Returns: + bool: If received. + + Pages: + in: SYNC_ENTER + out: SYNC_ENTER if meta ship synced < 100% + REWARD_ENTER if meta ship synced >= 100% + """ + logger.hr('Meta sync receive', level=1) + received = False + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + # End - if self.appear(REWARD_CHECK, offset=(20, 20)) and \ - self.image_color_count(REWARD_RECEIVE, color=(49, 52, 49), threshold=221, count=400): - if confirm_timer.reached(): + # Sync progress >= 100% + if self.appear(REWARD_ENTER, offset=(20, 20)): + logger.info('meta_sync_receive ends at REWARD_ENTER') + break + if self.appear(SYNC_ENTER, offset=(20, 20)): + if not self.meta_sync_notice_appear(): + logger.info('meta_sync_receive ends at SYNC_ENTER') break - else: - confirm_timer.reset() - logger.info(f'Meta reward receive finished, received={received}') + # Click + if self.handle_popup_confirm('META_REWARD'): + # Lock new META ships + continue + if self.handle_get_items(): + received = True + continue + if self.handle_get_ship(): + received = True + continue + if self.appear_then_click(SYNC_TAP, offset=(20, 20), interval=3): + received = True + continue + + logger.info(f'Meta sync receive finished, received={received}') return received def run(self): @@ -101,8 +146,11 @@ def run(self): self.ui_ensure(page_meta) + if self.config.SERVER in ['cn']: + if self.meta_sync_notice_appear(): + self.meta_sync_receive() + if self.meta_reward_notice_appear(): - self.meta_reward_enter() self.meta_reward_receive()