diff --git a/alas.py b/alas.py index c4d5ca19d..f382b001a 100644 --- a/alas.py +++ b/alas.py @@ -513,6 +513,10 @@ class AzurLaneAutoScript: from module.daemon.os_daemon import AzurLaneDaemon AzurLaneDaemon(config=self.config, device=self.device, task="OpsiDaemon").run() + def event_story(self): + from module.eventstory.eventstory import EventStory + EventStory(config=self.config, device=self.device, task="EventStory").run() + def azur_lane_uncensored(self): from module.daemon.uncensored import AzurLaneUncensored AzurLaneUncensored(config=self.config, device=self.device, task="AzurLaneUncensored").run() diff --git a/assets/cn/meta_reward/SYNC_ENTER.png b/assets/cn/meta_reward/SYNC_ENTER.png index c200b54af..5e1eaf6bb 100644 Binary files a/assets/cn/meta_reward/SYNC_ENTER.png and b/assets/cn/meta_reward/SYNC_ENTER.png differ diff --git a/assets/en/guild/OCR_GUILD_OPERATIONS_PROGRESS.png b/assets/en/guild/OCR_GUILD_OPERATIONS_PROGRESS.png new file mode 100644 index 000000000..9876394b4 Binary files /dev/null and b/assets/en/guild/OCR_GUILD_OPERATIONS_PROGRESS.png differ diff --git a/config/template.json b/config/template.json index 7c13bb677..d0d9ae109 100644 --- a/config/template.json +++ b/config/template.json @@ -2523,6 +2523,14 @@ "Storage": {} } }, + "EventStory": { + "EventStory": { + "SkipBattle": true + }, + "Storage": { + "Storage": {} + } + }, "Benchmark": { "Benchmark": { "DeviceType": "emulator", diff --git a/module/campaign/gems_farming.py b/module/campaign/gems_farming.py index 021fb7db3..296613224 100644 --- a/module/campaign/gems_farming.py +++ b/module/campaign/gems_farming.py @@ -47,7 +47,7 @@ class GemsCampaignOverride(CampaignBase): return result if self.handle_popup_cancel('IGNORE_LOW_EMOTION'): - self.config.GEMS_EMOTION_TRIGGRED = True + self.config.GEMS_EMOTION_TRIGGERED = True logger.hr('EMOTION WITHDRAW') while 1: @@ -282,18 +282,12 @@ class GemsFarming(CampaignRun, FleetEquipment, Dock): max_level = 70 scanner = ShipScanner(level=(max_level, max_level), emotion=(10, 150), - fleet=self.fleet_to_attack, status='free') + fleet=[0, self.fleet_to_attack], status='free') scanner.disable('rarity') - ships = scanner.scan(self.device.image) - if ships: - # Don't need to change current - return ships - - scanner.set_limitation(fleet=0) if self.config.GemsFarming_CommonDD in ['any', 'favourite', 'z20_or_z21']: # Change to any ship - return scanner.scan(self.device.image, output=False) + return scanner.scan(self.device.image) candidates = self.find_candidates(self.get_templates(self.config.GemsFarming_CommonDD), scanner) if candidates: @@ -397,7 +391,7 @@ class GemsFarming(CampaignRun, FleetEquipment, Dock): logger.hr('TRIGGERED LV32 LIMIT') return True - if self.campaign.map_is_auto_search and self.campaign.config.GEMS_EMOTION_TRIGGRED: + if self.campaign.map_is_auto_search and self.campaign.config.GEMS_EMOTION_TRIGGERED: self._trigger_emotion = True logger.hr('TRIGGERED EMOTION LIMIT') return True @@ -443,7 +437,7 @@ class GemsFarming(CampaignRun, FleetEquipment, Dock): self._trigger_lv32 = False self._trigger_emotion = False self.campaign.config.LV32_TRIGGERED = False - self.campaign.config.GEMS_EMOTION_TRIGGRED = False + self.campaign.config.GEMS_EMOTION_TRIGGERED = False # Scheduler if self.config.task_switched(): diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 0473e6076..779ede9b2 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -12912,6 +12912,28 @@ } } }, + "EventStory": { + "EventStory": { + "SkipBattle": { + "type": "lock", + "value": true, + "option": [ + true + ], + "option_bold": [ + true + ] + } + }, + "Storage": { + "Storage": { + "type": "storage", + "value": {}, + "valuetype": "ignore", + "display": "disabled" + } + } + }, "Benchmark": { "Benchmark": { "DeviceType": { diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index c37cb3ae9..95e99d33f 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -924,6 +924,11 @@ Daemon: OpsiDaemon: RepairShip: true SelectEnemy: true +EventStory: + SkipBattle: + type: checkbox + value: false + option: [ true, false ] Benchmark: DeviceType: value: emulator diff --git a/module/config/argument/menu.json b/module/config/argument/menu.json index ecc8415c6..97158f225 100644 --- a/module/config/argument/menu.json +++ b/module/config/argument/menu.json @@ -114,6 +114,7 @@ "tasks": [ "Daemon", "OpsiDaemon", + "EventStory", "Benchmark", "AzurLaneUncensored", "GameManager", diff --git a/module/config/argument/override.yaml b/module/config/argument/override.yaml index f9233790b..6aadd5572 100644 --- a/module/config/argument/override.yaml +++ b/module/config/argument/override.yaml @@ -465,6 +465,16 @@ OpsiHazard1Leveling: OpsiFleet: Submarine: false +# ==================== Tool ==================== + +EventStory: + EventStory: + SkipBattle: + type: lock + value: true + option: [ true, ] + option_bold: [ true, ] + # ==================== GGHandler ==================== GGHandler: Timeout: diff --git a/module/config/argument/task.yaml b/module/config/argument/task.yaml index 5166c5c48..4bbd8e351 100644 --- a/module/config/argument/task.yaml +++ b/module/config/argument/task.yaml @@ -416,6 +416,8 @@ Tool: - Daemon OpsiDaemon: - OpsiDaemon + EventStory: + - EventStory Benchmark: - Benchmark AzurLaneUncensored: diff --git a/module/config/config_generated.py b/module/config/config_generated.py index f2b8748b5..692c84cb8 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -537,6 +537,9 @@ class GeneratedConfig: OpsiDaemon_RepairShip = True OpsiDaemon_SelectEnemy = True + # Group `EventStory` + EventStory_SkipBattle = False # True, False + # Group `Benchmark` Benchmark_DeviceType = 'emulator' # emulator, plone_cloud_with_adb, phone_cloud_without_adb, android_phone, android_phone_vmos Benchmark_TestScene = 'screenshot_click' # screenshot_click, screenshot, click diff --git a/module/config/config_manual.py b/module/config/config_manual.py index d29ceba72..f92b3f0df 100644 --- a/module/config/config_manual.py +++ b/module/config/config_manual.py @@ -100,7 +100,7 @@ class ManualConfig: """ module.campaign.gems_farming """ - GEMS_EMOTION_TRIGGRED = False + GEMS_EMOTION_TRIGGERED = False """ module.handler diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index b086afe30..c76a8c473 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -290,6 +290,10 @@ "name": "OpSi Semi-auto", "help": "" }, + "EventStory": { + "name": "Event Story", + "help": "" + }, "Benchmark": { "name": "Performance Test", "help": "" @@ -3232,6 +3236,18 @@ "help": "Clean nearby enemies and resources, and find new enemies or materials after cleaning, which usually clears the entire map. If some of them haven't been cleared, you need to solve them manually" } }, + "EventStory": { + "_info": { + "name": "Event Story", + "help": "Complete the event story, only applicable to events aired on or after 20241219, please wait for about 3 minutes" + }, + "SkipBattle": { + "name": "Kill game to skip battles", + "help": "", + "True": "Enabled", + "False": "False" + } + }, "Benchmark": { "_info": { "name": "Performance Test", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 998f6621e..cf9b353a2 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -290,6 +290,10 @@ "name": "セイレーン作戦半自動", "help": "" }, + "EventStory": { + "name": "Event Story", + "help": "" + }, "Benchmark": { "name": "機能テスト", "help": "" @@ -3232,6 +3236,18 @@ "help": "OpsiDaemon.SelectEnemy.help" } }, + "EventStory": { + "_info": { + "name": "EventStory._info.name", + "help": "EventStory._info.help" + }, + "SkipBattle": { + "name": "EventStory.SkipBattle.name", + "help": "EventStory.SkipBattle.help", + "True": "True", + "False": "False" + } + }, "Benchmark": { "_info": { "name": "Benchmark._info.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index e26d36306..a72c217cc 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -290,6 +290,10 @@ "name": "大世界半自动", "help": "" }, + "EventStory": { + "name": "活动剧情", + "help": "" + }, "Benchmark": { "name": "性能测试", "help": "" @@ -3232,6 +3236,18 @@ "help": "清理附近的敌人和物资,清理完后又会找到新的敌人或物资,这样通常能清理整个海域,如果有遗漏或者点击错误,需要手动解决" } }, + "EventStory": { + "_info": { + "name": "活动剧情", + "help": "完成活动剧情,仅适用于上线时间20241219及之后的活动,请等待约3分钟" + }, + "SkipBattle": { + "name": "杀游戏跳过战斗", + "help": "", + "True": "已启用", + "False": "False" + } + }, "Benchmark": { "_info": { "name": "性能测试", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index c336533fd..c8147c193 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -290,6 +290,10 @@ "name": "大世界半自動", "help": "" }, + "EventStory": { + "name": "活動劇情", + "help": "" + }, "Benchmark": { "name": "性能測試", "help": "" @@ -3232,6 +3236,18 @@ "help": "清理附近的敵人和物資,清理完後又會找到新的敵人或物資,這樣通常能清理整個海域,如果有遺漏或者點擊錯誤,需要手動解決" } }, + "EventStory": { + "_info": { + "name": "活動劇情", + "help": "完成活動劇情,僅適用於上線時間20241219及以後的活動,請等待約3分鐘" + }, + "SkipBattle": { + "name": "關遊戲跳過戰鬥", + "help": "", + "True": "已启用", + "False": "False" + } + }, "Benchmark": { "_info": { "name": "性能測試", diff --git a/module/guild/assets.py b/module/guild/assets.py index 910ae66dd..14c304dd2 100644 --- a/module/guild/assets.py +++ b/module/guild/assets.py @@ -34,4 +34,4 @@ GUILD_REPORT_CLAIMED = Button(area={'cn': (738, 595, 1078, 637), 'en': (851, 602 GUILD_REPORT_CLOSE = Button(area={'cn': (1059, 93, 1102, 136), 'en': (1059, 93, 1102, 136), 'jp': (1059, 93, 1102, 136), 'tw': (1059, 93, 1102, 136)}, color={'cn': (71, 31, 32), 'en': (71, 31, 32), 'jp': (71, 31, 32), 'tw': (71, 31, 32)}, button={'cn': (1059, 93, 1102, 136), 'en': (1059, 93, 1102, 136), 'jp': (1059, 93, 1102, 136), 'tw': (1059, 93, 1102, 136)}, file={'cn': './assets/cn/guild/GUILD_REPORT_CLOSE.png', 'en': './assets/en/guild/GUILD_REPORT_CLOSE.png', 'jp': './assets/jp/guild/GUILD_REPORT_CLOSE.png', 'tw': './assets/tw/guild/GUILD_REPORT_CLOSE.png'}) GUILD_SUPPLY = Button(area={'cn': (1077, 617, 1233, 658), 'en': (1079, 619, 1231, 656), 'jp': (1077, 614, 1233, 655), 'tw': (1079, 619, 1231, 656)}, color={'cn': (84, 104, 154), 'en': (137, 87, 91), 'jp': (98, 100, 107), 'tw': (137, 87, 91)}, button={'cn': (1077, 617, 1233, 658), 'en': (1079, 619, 1231, 656), 'jp': (1077, 614, 1233, 655), 'tw': (1079, 619, 1231, 656)}, file={'cn': './assets/cn/guild/GUILD_SUPPLY.png', 'en': './assets/en/guild/GUILD_SUPPLY.png', 'jp': './assets/jp/guild/GUILD_SUPPLY.png', 'tw': './assets/tw/guild/GUILD_SUPPLY.png'}) OCR_GUILD_EXCHANGE_LIMIT = Button(area={'cn': (960, 383, 975, 403), 'en': (999, 383, 1018, 402), 'jp': (971, 384, 985, 403), 'tw': (962, 384, 975, 403)}, color={'cn': (59, 46, 47), 'en': (91, 93, 103), 'jp': (95, 101, 107), 'tw': (72, 57, 59)}, button={'cn': (960, 383, 975, 403), 'en': (999, 383, 1018, 402), 'jp': (971, 384, 985, 403), 'tw': (962, 384, 975, 403)}, file={'cn': './assets/cn/guild/OCR_GUILD_EXCHANGE_LIMIT.png', 'en': './assets/en/guild/OCR_GUILD_EXCHANGE_LIMIT.png', 'jp': './assets/jp/guild/OCR_GUILD_EXCHANGE_LIMIT.png', 'tw': './assets/tw/guild/OCR_GUILD_EXCHANGE_LIMIT.png'}) -OCR_GUILD_OPERATIONS_PROGRESS = Button(area={'cn': (1064, 501, 1114, 521), 'en': (1064, 501, 1114, 521), 'jp': (1064, 501, 1114, 521), 'tw': (1064, 501, 1114, 521)}, color={'cn': (89, 94, 107), 'en': (89, 94, 107), 'jp': (89, 94, 107), 'tw': (89, 94, 107)}, button={'cn': (1064, 501, 1114, 521), 'en': (1064, 501, 1114, 521), 'jp': (1064, 501, 1114, 521), 'tw': (1064, 501, 1114, 521)}, file={'cn': './assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png', 'en': './assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png', 'jp': './assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png', 'tw': './assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png'}) +OCR_GUILD_OPERATIONS_PROGRESS = Button(area={'cn': (1064, 501, 1114, 521), 'en': (928, 501, 978, 521), 'jp': (1064, 501, 1114, 521), 'tw': (1064, 501, 1114, 521)}, color={'cn': (89, 94, 107), 'en': (83, 88, 101), 'jp': (89, 94, 107), 'tw': (89, 94, 107)}, button={'cn': (1064, 501, 1114, 521), 'en': (928, 501, 978, 521), 'jp': (1064, 501, 1114, 521), 'tw': (1064, 501, 1114, 521)}, file={'cn': './assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png', 'en': './assets/en/guild/OCR_GUILD_OPERATIONS_PROGRESS.png', 'jp': './assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png', 'tw': './assets/cn/guild/OCR_GUILD_OPERATIONS_PROGRESS.png'}) diff --git a/module/meta_reward/assets.py b/module/meta_reward/assets.py index b83bd797f..f4657b919 100644 --- a/module/meta_reward/assets.py +++ b/module/meta_reward/assets.py @@ -11,6 +11,6 @@ META_REWARD_NOTICE = Button(area={'cn': (1070, 508, 1075, 523), 'en': (1070, 508 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, 944, 370), 'tw': (866, 351, 943, 370)}, color={'cn': (183, 175, 177), 'en': (132, 117, 119), 'jp': (185, 176, 179), 'tw': (183, 175, 177)}, button={'cn': (866, 351, 943, 370), 'en': (866, 351, 943, 370), 'jp': (866, 351, 944, 370), 'tw': (866, 351, 943, 370)}, file={'cn': './assets/cn/meta_reward/SYNC_ENTER.png', 'en': './assets/en/meta_reward/SYNC_ENTER.png', 'jp': './assets/jp/meta_reward/SYNC_ENTER.png', 'tw': './assets/cn/meta_reward/SYNC_ENTER.png'}) +SYNC_ENTER = Button(area={'cn': (866, 351, 944, 370), 'en': (866, 351, 943, 370), 'jp': (866, 351, 944, 370), 'tw': (866, 351, 944, 370)}, color={'cn': (185, 176, 179), 'en': (132, 117, 119), 'jp': (185, 176, 179), 'tw': (185, 176, 179)}, button={'cn': (866, 351, 944, 370), 'en': (866, 351, 943, 370), 'jp': (866, 351, 944, 370), 'tw': (866, 351, 944, 370)}, file={'cn': './assets/cn/meta_reward/SYNC_ENTER.png', 'en': './assets/en/meta_reward/SYNC_ENTER.png', 'jp': './assets/jp/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': (564, 340, 720, 377), 'tw': (581, 339, 707, 377)}, color={'cn': (168, 112, 111), 'en': (129, 80, 80), 'jp': (176, 119, 119), 'tw': (168, 112, 111)}, button={'cn': (581, 339, 707, 377), 'en': (581, 339, 707, 377), 'jp': (564, 340, 720, 377), 'tw': (581, 339, 707, 377)}, file={'cn': './assets/cn/meta_reward/SYNC_TAP.png', 'en': './assets/en/meta_reward/SYNC_TAP.png', 'jp': './assets/jp/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 e96cb9f07..ac93beb16 100644 --- a/module/meta_reward/meta_reward.py +++ b/module/meta_reward/meta_reward.py @@ -72,7 +72,7 @@ class BeaconReward(Combat, UI): logger.info(f'Meta reward receive finished, received={received}') return received - def meta_sync_notice_appear(self): + def meta_sync_notice_appear(self, interval=0): """ "sync" is the period that you gather meta points to 100% and get a meta ship @@ -82,11 +82,9 @@ class BeaconReward(Combat, UI): Page: in: page_meta """ - if self.appear(SYNC_REWARD_NOTICE, threshold=30): - logger.info('Found meta sync red dot') + if self.appear(SYNC_REWARD_NOTICE, threshold=30, interval=interval): return True else: - logger.info('No meta sync red dot') return False def meta_sync_receive(self, skip_first_screenshot=True): @@ -130,6 +128,11 @@ class BeaconReward(Combat, UI): if self.handle_get_ship(): received = True continue + if self.meta_sync_notice_appear(interval=3): + logger.info(f'meta_sync_notice_appear -> {SYNC_ENTER}') + self.device.click(SYNC_ENTER) + received = True + continue if self.appear_then_click(SYNC_TAP, offset=(20, 20), interval=3): received = True continue @@ -147,7 +150,10 @@ class BeaconReward(Combat, UI): self.ui_ensure(page_meta) if self.meta_sync_notice_appear(): + logger.info('Found meta sync red dot') self.meta_sync_receive() + else: + logger.info('No meta sync red dot') if self.meta_reward_notice_appear(): self.meta_reward_receive() diff --git a/module/os/operation_siren.py b/module/os/operation_siren.py index cd70c1c30..4295ae137 100644 --- a/module/os/operation_siren.py +++ b/module/os/operation_siren.py @@ -496,7 +496,7 @@ class OperationSiren(OSMap): with self.config.multi_set(): next_run = self.config.Scheduler_NextRun for task in ['OpsiObscure', 'OpsiAbyssal', 'OpsiArchive', 'OpsiStronghold', 'OpsiMeowfficerFarming', - 'OpsiMonthBoss', 'OpsiShop']: + 'OpsiMonthBoss', 'OpsiShop', 'OpsiHazard1Leveling']: keys = f'{task}.Scheduler.NextRun' current = self.config.cross_get(keys=keys, default=DEFAULT_TIME) if current < next_run: diff --git a/module/retire/retirement.py b/module/retire/retirement.py index 9843e73c2..b6b0a16eb 100644 --- a/module/retire/retirement.py +++ b/module/retire/retirement.py @@ -551,6 +551,7 @@ class Retirement(Enhancement, QuickRetireSettingHandler): """ swipe_count = 0 disappear_confirm = Timer(2, count=6) + top_checked = False while 1: if skip_first_screenshot: skip_first_screenshot = False @@ -572,17 +573,22 @@ class Retirement(Enhancement, QuickRetireSettingHandler): break else: continue - - if RETIRE_CONFIRM_SCROLL.at_bottom(main=self): - logger.info('Scroll bar reached end, stop') - break - - # Swipe next page - if swipe_count >= 7: - logger.info('Reached maximum swipes to find common CV') - break - RETIRE_CONFIRM_SCROLL.next_page(main=self) - swipe_count += 1 + + if not top_checked: + top_checked = True + logger.info('Find common CV from bottom to top') + RETIRE_CONFIRM_SCROLL.set_bottom(main=self) + continue + else: + if RETIRE_CONFIRM_SCROLL.at_top(main=self): + logger.info('Scroll bar reached top, stop') + break + # Swipe prev page + if swipe_count >= 7: + logger.info('Reached maximum swipes to find common CV') + break + RETIRE_CONFIRM_SCROLL.prev_page(main=self) + swipe_count += 1 return button diff --git a/module/retire/scanner.py b/module/retire/scanner.py index 9aa809c81..66524a862 100644 --- a/module/retire/scanner.py +++ b/module/retire/scanner.py @@ -64,6 +64,10 @@ class Ship: elif isinstance(value, tuple): if not (value[0] <= self.__dict__[key] <= value[1]): return False + # list means should be in the list + elif isinstance(value, list): + if self.__dict__[key] not in value: + return False return True @@ -397,6 +401,8 @@ class ShipScanner(Scanner): lower = self.sub_scanners[key].limit_value(lower) upper = self.sub_scanners[key].limit_value(upper) self.limitaion[key] = (lower, upper) + elif isinstance(value, list): + self.limitaion[key] = [self.sub_scanners[key].limit_value(v) for v in value] else: self.limitaion[key] = self.sub_scanners[key].limit_value(value) diff --git a/module/submodule/utils.py b/module/submodule/utils.py index 800dabe5d..5fdda4c93 100644 --- a/module/submodule/utils.py +++ b/module/submodule/utils.py @@ -17,6 +17,7 @@ def get_available_func(): return ( 'Daemon', 'OpsiDaemon', + 'EventStory', 'AzurLaneUncensored', 'Benchmark', 'GameManager', diff --git a/submodule/AlasFpyBridge/fpy.py b/submodule/AlasFpyBridge/fpy.py index 509c225ff..34988f04e 100644 --- a/submodule/AlasFpyBridge/fpy.py +++ b/submodule/AlasFpyBridge/fpy.py @@ -44,7 +44,8 @@ class FgoAutoScript(AzurLaneAutoScript): app = FGOpy( self.config.FpyEmulator_LaunchPath, { - "Special Drop": "FpyLimit_SpecialDrop", + "Special Drop": lambda: + setattr(self.config, "FpyLimit_SpecialDrop", max(0, getattr(self.config, "FpyLimit_SpecialDrop") - 1)), }, ) assert app.run("ping") diff --git a/submodule/AlasFpyBridge/module/FGOpy.py b/submodule/AlasFpyBridge/module/FGOpy.py index 1450b6bee..aec6435b0 100644 --- a/submodule/AlasFpyBridge/module/FGOpy.py +++ b/submodule/AlasFpyBridge/module/FGOpy.py @@ -63,9 +63,7 @@ class FGOpy(HeadlessCliApplication): return prompt, datetime, level, module, content = match.groups() getattr(logger, level.lower())(content) - item = self.counter.get(content) - if item: - setattr(self.config, item, getattr(self.config, item) - 1) + self.counter.get(content, lambda: None)() if self.first_log: self.first_log = False diff --git a/submodule/AlasFpyBridge/module/config/argument/args.json b/submodule/AlasFpyBridge/module/config/argument/args.json index 5c1ed01ee..a312b7519 100644 --- a/submodule/AlasFpyBridge/module/config/argument/args.json +++ b/submodule/AlasFpyBridge/module/config/argument/args.json @@ -83,7 +83,7 @@ "Interval": { "type": "input", "value": "00:05", - "validate": "\\d+:\\d" + "validate": "\\d+:\\d+" } }, "Storage": { @@ -176,7 +176,7 @@ "Interval": { "type": "input", "value": "07:00", - "validate": "\\d+:\\d" + "validate": "\\d+:\\d+" } }, "Storage": { diff --git a/submodule/AlasFpyBridge/module/config/argument/argument.yaml b/submodule/AlasFpyBridge/module/config/argument/argument.yaml index 8759bbdfd..ddf8a1155 100644 --- a/submodule/AlasFpyBridge/module/config/argument/argument.yaml +++ b/submodule/AlasFpyBridge/module/config/argument/argument.yaml @@ -44,7 +44,7 @@ FpyEmulator: FpyInterval: Interval: value: 07:00 - validate: "\\d+:\\d" + validate: "\\d+:\\d+" FpyTeam: Index: diff --git a/submodule/AlasFpyBridge/module/config/i18n/en-US.json b/submodule/AlasFpyBridge/module/config/i18n/en-US.json index c8c09855e..849390e3f 100644 --- a/submodule/AlasFpyBridge/module/config/i18n/en-US.json +++ b/submodule/AlasFpyBridge/module/config/i18n/en-US.json @@ -20,7 +20,7 @@ "Task": { "Fpy": { "name": "FGO-py", - "help": "Requries FGO-py v11.2.0 or higher" + "help": "Requries FGO-py v20.1.2 or higher" }, "FpyHeartbeat": { "name": "Heartbeat", diff --git a/submodule/AlasFpyBridge/module/config/i18n/ja-JP.json b/submodule/AlasFpyBridge/module/config/i18n/ja-JP.json index c56ef424d..ebbd7ff92 100644 --- a/submodule/AlasFpyBridge/module/config/i18n/ja-JP.json +++ b/submodule/AlasFpyBridge/module/config/i18n/ja-JP.json @@ -20,7 +20,7 @@ "Task": { "Fpy": { "name": "FGO-py設定", - "help": "FGO-py v11.2.0以降が必要です" + "help": "FGO-py v20.1.2以降が必要です" }, "FpyHeartbeat": { "name": "心拍", diff --git a/submodule/AlasFpyBridge/module/config/i18n/zh-CN.json b/submodule/AlasFpyBridge/module/config/i18n/zh-CN.json index 3c55f459a..d6d39dfaa 100644 --- a/submodule/AlasFpyBridge/module/config/i18n/zh-CN.json +++ b/submodule/AlasFpyBridge/module/config/i18n/zh-CN.json @@ -20,7 +20,7 @@ "Task": { "Fpy": { "name": "FGO-py设置", - "help": "需要FGO-py v11.2.0或更高" + "help": "需要FGO-py v20.1.2或更高" }, "FpyHeartbeat": { "name": "心跳", diff --git a/submodule/AlasFpyBridge/module/utils/headlessCliApplication.py b/submodule/AlasFpyBridge/module/utils/headlessCliApplication.py index 8149bfdd4..c86538e91 100644 --- a/submodule/AlasFpyBridge/module/utils/headlessCliApplication.py +++ b/submodule/AlasFpyBridge/module/utils/headlessCliApplication.py @@ -9,7 +9,7 @@ class HeadlessCliApplication: """Wrap a cli application to provide programmable interactive access""" def __init__(self, launch): - self.pipe = Popen([launch], stdin=PIPE, stdout=PIPE, stderr=STDOUT, text=True) + self.pipe = Popen([launch], stdin=PIPE, stdout=PIPE, stderr=STDOUT, encoding="utf-8", text=True) def f(): while True: