diff --git a/assets/mask/MASK_OS_MAP_UI.png b/assets/mask/MASK_OS_MAP_UI.png index ff53bce8f..6a0ac83b3 100644 Binary files a/assets/mask/MASK_OS_MAP_UI.png and b/assets/mask/MASK_OS_MAP_UI.png differ diff --git a/campaign/campaign_war_archives/campaign_base.py b/campaign/campaign_war_archives/campaign_base.py index 25306b479..6c70ad3fa 100644 --- a/campaign/campaign_war_archives/campaign_base.py +++ b/campaign/campaign_war_archives/campaign_base.py @@ -60,6 +60,7 @@ class CampaignBase(CampaignBase_): increase as more war archives campaigns are added """ confirm_timer = Timer(1.5, count=4) + loading_checked = False for _ in range(20): if skip_first_screenshot: skip_first_screenshot = False @@ -73,14 +74,25 @@ class CampaignBase(CampaignBase_): # before starting next search attempt while not self.appear(WAR_ARCHIVES_CHECK): self.ui_ensure(destination=page_archives) + loading_checked = False - while not self._archives_loading_complete(): - self.device.screenshot() - + # check entrance first, because game can remember last scrolling position + # if you stays at page_campaign_menu + # and bypass _archives_loading_complete if reached entrance entrance = self._get_archives_entrance(name) if entrance is not None: return entrance + if not loading_checked: + # _archives_loading_complete might take 1~2s if archive list is not at top + while not self._archives_loading_complete(): + self.device.screenshot() + loading_checked = True + + entrance = self._get_archives_entrance(name) + if entrance is not None: + return entrance + if WAR_ARCHIVES_SCROLL.appear(main=self): confirm_timer.clear() if WAR_ARCHIVES_SCROLL.at_bottom(main=self): diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 9441da7ba..0a3324ae8 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -298,6 +298,7 @@ "cn_channel-2", "cn_channel-3", "cn_channel-4", + "cn_channel-5", "en-0", "en-1", "en-2", diff --git a/module/config/config_generated.py b/module/config/config_generated.py index e791cb850..33184fe80 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -20,7 +20,7 @@ class GeneratedConfig: # Group `Emulator` Emulator_Serial = 'auto' Emulator_PackageName = 'auto' # auto, com.bilibili.azurlane, com.YoStarEN.AzurLane, com.YoStarJP.AzurLane, com.hkmanjuu.azurlane.gp, com.bilibili.blhx.huawei, com.bilibili.blhx.honor, com.bilibili.blhx.mi, com.tencent.tmgp.bilibili.blhx, com.bilibili.blhx.baidu, com.bilibili.blhx.qihoo, com.bilibili.blhx.nearme.gamecenter, com.bilibili.blhx.vivo, com.bilibili.blhx.mz, com.bilibili.blhx.dl, com.bilibili.blhx.lenovo, com.bilibili.blhx.uc, com.bilibili.blhx.mzw, com.yiwu.blhx.yx15, com.bilibili.blhx.m4399, com.bilibili.blhx.bilibiliMove, com.hkmanjuu.azurlane.gp.mc - Emulator_ServerName = 'disabled' # disabled, cn_android-0, cn_android-1, cn_android-2, cn_android-3, cn_android-4, cn_android-5, cn_android-6, cn_android-7, cn_android-8, cn_android-9, cn_android-10, cn_android-11, cn_android-12, cn_android-13, cn_android-14, cn_android-15, cn_android-16, cn_android-17, cn_android-18, cn_android-19, cn_android-20, cn_android-21, cn_android-22, cn_android-23, cn_android-24, cn_android-25, cn_android-26, cn_android-27, cn_android-28, cn_ios-0, cn_ios-1, cn_ios-2, cn_ios-3, cn_ios-4, cn_ios-5, cn_ios-6, cn_ios-7, cn_ios-8, cn_ios-9, cn_ios-10, cn_channel-0, cn_channel-1, cn_channel-2, cn_channel-3, cn_channel-4, en-0, en-1, en-2, en-3, en-4, en-5, jp-0, jp-1, jp-2, jp-3, jp-4, jp-5, jp-6, jp-7, jp-8, jp-9, jp-10, jp-11, jp-12, jp-13, jp-14, jp-15, jp-16, jp-17 + Emulator_ServerName = 'disabled' # disabled, cn_android-0, cn_android-1, cn_android-2, cn_android-3, cn_android-4, cn_android-5, cn_android-6, cn_android-7, cn_android-8, cn_android-9, cn_android-10, cn_android-11, cn_android-12, cn_android-13, cn_android-14, cn_android-15, cn_android-16, cn_android-17, cn_android-18, cn_android-19, cn_android-20, cn_android-21, cn_android-22, cn_android-23, cn_android-24, cn_android-25, cn_android-26, cn_android-27, cn_android-28, cn_ios-0, cn_ios-1, cn_ios-2, cn_ios-3, cn_ios-4, cn_ios-5, cn_ios-6, cn_ios-7, cn_ios-8, cn_ios-9, cn_ios-10, cn_channel-0, cn_channel-1, cn_channel-2, cn_channel-3, cn_channel-4, cn_channel-5, en-0, en-1, en-2, en-3, en-4, en-5, jp-0, jp-1, jp-2, jp-3, jp-4, jp-5, jp-6, jp-7, jp-8, jp-9, jp-10, jp-11, jp-12, jp-13, jp-14, jp-15, jp-16, jp-17 Emulator_ScreenshotMethod = 'auto' # auto, ADB, ADB_nc, uiautomator2, aScreenCap, aScreenCap_nc, DroidCast, DroidCast_raw, nemu_ipc, ldopengl Emulator_ControlMethod = 'MaaTouch' # ADB, uiautomator2, minitouch, Hermit, MaaTouch Emulator_ScreenshotDedithering = False diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 493c66e34..fbd5c4922 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -407,6 +407,7 @@ "cn_channel-2": "[国服] 十字军行动", "cn_channel-3": "[国服] 龙骑兵行动", "cn_channel-4": "[国服] 冥王星行动", + "cn_channel-5": "[国服] 群岛计划", "en-0": "[EN] Avrora", "en-1": "[EN] Lexington", "en-2": "[EN] Sandy", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index d203249c8..4add61527 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -407,6 +407,7 @@ "cn_channel-2": "[国服] 十字军行动", "cn_channel-3": "[国服] 龙骑兵行动", "cn_channel-4": "[国服] 冥王星行动", + "cn_channel-5": "[国服] 群岛计划", "en-0": "[EN] Avrora", "en-1": "[EN] Lexington", "en-2": "[EN] Sandy", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 1d6722c0d..7ec6b8f5c 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -407,6 +407,7 @@ "cn_channel-2": "[国服] 十字军行动", "cn_channel-3": "[国服] 龙骑兵行动", "cn_channel-4": "[国服] 冥王星行动", + "cn_channel-5": "[国服] 群岛计划", "en-0": "[EN] Avrora", "en-1": "[EN] Lexington", "en-2": "[EN] Sandy", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 0bb41b2ef..e3fe244b0 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -407,6 +407,7 @@ "cn_channel-2": "[国服] 十字军行动", "cn_channel-3": "[国服] 龙骑兵行动", "cn_channel-4": "[国服] 冥王星行动", + "cn_channel-5": "[国服] 群岛计划", "en-0": "[EN] Avrora", "en-1": "[EN] Lexington", "en-2": "[EN] Sandy", diff --git a/module/config/server.py b/module/config/server.py index 3cf519518..5feef9318 100644 --- a/module/config/server.py +++ b/module/config/server.py @@ -81,7 +81,7 @@ VALID_SERVER_LIST = { '莱特湾', '硫磺岛', '冲绳岛', '阿留申群岛', '马耳他' ], 'cn_channel': [ - '皇家巡游', '大西洋宪章', '十字军行动', '龙骑兵行动', '冥王星行动' + '皇家巡游', '大西洋宪章', '十字军行动', '龙骑兵行动', '冥王星行动', '群岛计划', ], 'en': [ 'Avrora', 'Lexington', 'Sandy', 'Washington', 'Amagi', diff --git a/module/exercise/exercise.py b/module/exercise/exercise.py index ed7e49ca2..bac6ec0e8 100644 --- a/module/exercise/exercise.py +++ b/module/exercise/exercise.py @@ -183,9 +183,6 @@ class Exercise(ExerciseCombat): return True return False - def server_support_ocr_reset_remain(self) -> bool: - return self.config.SERVER in ['cn', 'en', 'jp'] - def _get_exercise_reset_remain(self): """ Returns: @@ -218,12 +215,7 @@ class Exercise(ExerciseCombat): logger.attr('Exercise_ExerciseStrategy', self.config.Exercise_ExerciseStrategy) self.preserve, admiral_interval = self._get_exercise_strategy() - if not self.server_support_ocr_reset_remain(): - logger.info(f'Server {self.config.SERVER} does not yet support OCR exercise reset remain time') - logger.info('Please contact the developer to improve as soon as possible') - remain_time = datetime.timedelta(days=0) - else: - remain_time = OCR_PERIOD_REMAIN.ocr(self.device.image) + remain_time = OCR_PERIOD_REMAIN.ocr(self.device.image) logger.info(f'Exercise period remain: {remain_time}') if admiral_interval is not None and remain_time: diff --git a/module/handler/info_handler.py b/module/handler/info_handler.py index b9a357c12..f8049115d 100644 --- a/module/handler/info_handler.py +++ b/module/handler/info_handler.py @@ -200,24 +200,30 @@ class InfoHandler(ModuleBase): return False if self.appear(USE_DATA_KEY, offset=(20, 20)): - skip_first_screenshot = True - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - + # enable USE_DATA_KEY_NOTIFIED + for _ in self.loop(): enabled = self.image_color_count( USE_DATA_KEY_NOTIFIED, color=(140, 207, 66), threshold=180, count=10) if enabled: break - if self.appear(USE_DATA_KEY, offset=(20, 20), interval=5): self.device.click(USE_DATA_KEY_NOTIFIED) continue self.config.USE_DATA_KEY = False # Reset on success as task can be stopped before can be recovered - return self.handle_popup_confirm('USE_DATA_KEY') + + # click confirm + # POPUP_CONFIRM from data key page has minor differece from the standard one + # so we just bind clicking it + self.interval_clear(USE_DATA_KEY, interval=5) + for _ in self.loop(): + if not self.appear(USE_DATA_KEY, offset=(20, 20)): + break + if self.appear(USE_DATA_KEY, offset=(20, 20), interval=5): + self.device.click(POPUP_CONFIRM) + continue + + return True return False @@ -550,4 +556,4 @@ class InfoHandler(ModuleBase): self.wait_until_manjuu_disappear() return True else: - return False \ No newline at end of file + return False