diff --git a/assets/cn/campaign/EVENT_20201126_ENTRANCE_TEMP.png b/assets/cn/campaign/EVENT_20201126_ENTRANCE_TEMP.png new file mode 100644 index 000000000..a040e09df Binary files /dev/null and b/assets/cn/campaign/EVENT_20201126_ENTRANCE_TEMP.png differ diff --git a/assets/cn/campaign/EVENT_20201126_PT_ICON.png b/assets/cn/campaign/EVENT_20201126_PT_ICON.png new file mode 100644 index 000000000..9738e3723 Binary files /dev/null and b/assets/cn/campaign/EVENT_20201126_PT_ICON.png differ diff --git a/assets/cn/campaign/EVENT_20260417_PT_ICON.png b/assets/cn/campaign/EVENT_20260417_PT_ICON.png new file mode 100644 index 000000000..5755ff792 Binary files /dev/null and b/assets/cn/campaign/EVENT_20260417_PT_ICON.png differ diff --git a/assets/shop/os/METARedBookT1_2.png b/assets/shop/os/METARedBookT1_2.png new file mode 100644 index 000000000..511eb6981 Binary files /dev/null and b/assets/shop/os/METARedBookT1_2.png differ diff --git a/assets/shop/os/OrdnanceTestingReportT3_6.png b/assets/shop/os/OrdnanceTestingReportT3_6.png new file mode 100644 index 000000000..9d7165c0a Binary files /dev/null and b/assets/shop/os/OrdnanceTestingReportT3_6.png differ diff --git a/assets/shop/os/RepairPackFull2_2.png b/assets/shop/os/RepairPackFull2_2.png new file mode 100644 index 000000000..a1d28a657 Binary files /dev/null and b/assets/shop/os/RepairPackFull2_2.png differ diff --git a/assets/shop/os/RepairPackFull_2.png b/assets/shop/os/RepairPackFull_2.png new file mode 100644 index 000000000..f7fb659be Binary files /dev/null and b/assets/shop/os/RepairPackFull_2.png differ diff --git a/assets/shop/os/TuningSampleOffence_4.png b/assets/shop/os/TuningSampleOffence_4.png new file mode 100644 index 000000000..49bd0d7ee Binary files /dev/null and b/assets/shop/os/TuningSampleOffence_4.png differ diff --git a/campaign/Readme.md b/campaign/Readme.md index 8c0b4af22..1224a2b41 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -289,3 +289,4 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20260402 | event 20260326 cn | The Vagabond’s Recruitment Plan | - | - | - | 漫遊者招募計劃 | | 20260416 | event 20220915 cn | Violet Tempest Blooming Lycoris | - | - | - | 復刻紫絳槿嵐 | | 20260417 | event 20260417 cn | Vacation Lane – Beachside Brilliance | 假日航线闪耀海滨 | Vacation Lane – Beachside Brilliance | バケーションレーン・きらめく砂浜 | - | +| 20260417 | event 20201126 cn | Vacation Lane Rerun | 复刻假日航线 | Vacation Lane Rerun | バケーションレーン(復刻) | - | diff --git a/campaign/event_20201126_cn/campaign_base.py b/campaign/event_20201126_cn/campaign_base.py index 705ee7f5f..4ef11bf88 100644 --- a/campaign/event_20201126_cn/campaign_base.py +++ b/campaign/event_20201126_cn/campaign_base.py @@ -1,7 +1,9 @@ from module.base.button import Button +from module.campaign.assets import EVENT_20201126_ENTRANCE_TEMP, EVENT_20201126_PT_ICON from module.campaign.campaign_base import CampaignBase as CampaignBase_ from module.exception import CampaignNameError from module.logger import logger +from module.ui.page import page_campaign_menu, page_event, page_main_white EVENT_ANIMATION = Button(area=(49, 229, 119, 400), color=(118, 215, 240), button=(49, 229, 119, 400), name='EVENT_ANIMATION') @@ -16,6 +18,19 @@ class CampaignBase(CampaignBase_): Mode switch is meaningless. """ + def ui_goto_event(self): + if self.appear(EVENT_20201126_PT_ICON, offset=(20, 20)) and self.ui_page_appear(page_event): + logger.info('Already at EVENT_20201126') + return True + self.ui_ensure(page_campaign_menu) + if self.is_event_entrance_available(): + self.ui_ensure(page_main_white) + self.ui_click(EVENT_20201126_ENTRANCE_TEMP, + check_button=EVENT_20201126_PT_ICON, + appear_button=EVENT_20201126_ENTRANCE_TEMP) + return True + + @staticmethod def _campaign_separate_name(name): """ diff --git a/campaign/event_20220915_cn/campaign_base.py b/campaign/event_20220915_cn/campaign_base.py index 0bfa458fa..fc5e5f21b 100644 --- a/campaign/event_20220915_cn/campaign_base.py +++ b/campaign/event_20220915_cn/campaign_base.py @@ -1,7 +1,7 @@ from module.base.utils import get_color, red_overlay_transparency from module.campaign.campaign_base import CampaignBase as CampaignBase_ from module.handler.assets import MAP_ENEMY_SEARCHING -from module.map.assets import SWITCH_OVER +from module.ui.page import page_event class CampaignBase(CampaignBase_): @@ -12,3 +12,9 @@ class CampaignBase(CampaignBase_): return red_overlay_transparency( MAP_ENEMY_SEARCHING.color, get_color(self.device.image, MAP_ENEMY_SEARCHING.area) ) > self.MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD + + def handle_exp_info(self): + # Random background hits EXP_INFO_B + if self.ui_page_appear(page_event): + return False + return super().handle_exp_info() diff --git a/campaign/event_20260417_cn/campaign_base.py b/campaign/event_20260417_cn/campaign_base.py index ab259d729..598566bf9 100644 --- a/campaign/event_20260417_cn/campaign_base.py +++ b/campaign/event_20260417_cn/campaign_base.py @@ -1,12 +1,23 @@ from module.base.button import Button +from module.campaign.assets import EVENT_20260417_PT_ICON from module.campaign.campaign_base import CampaignBase as CampaignBase_ from module.logger import logger +from module.ui.page import page_campaign_menu, page_event EVENT_ANIMATION = Button(area=(49, 229, 119, 400), color=(118, 215, 240), button=(49, 229, 119, 400), name='EVENT_ANIMATION') class CampaignBase(CampaignBase_): + def ui_goto_event(self): + if self.appear(EVENT_20260417_PT_ICON, offset=(20, 20)) and self.ui_page_appear(page_event): + logger.info('Already at EVENT_20260417') + return True + self.ui_ensure(page_campaign_menu) + if self.is_event_entrance_available(): + self.ui_goto(page_event) + return True + @staticmethod def _campaign_ocr_result_process(result): result = CampaignBase_._campaign_ocr_result_process(result) diff --git a/campaign/war_archives_20220915_cn/campaign_base.py b/campaign/war_archives_20220915_cn/campaign_base.py index bd651f5a0..2c904a5a8 100644 --- a/campaign/war_archives_20220915_cn/campaign_base.py +++ b/campaign/war_archives_20220915_cn/campaign_base.py @@ -1,7 +1,7 @@ from module.base.utils import get_color, red_overlay_transparency -from ..campaign_war_archives.campaign_base import CampaignBase as CampaignBase_ from module.handler.assets import MAP_ENEMY_SEARCHING -from module.map.assets import SWITCH_OVER +from module.ui.page import page_event +from ..campaign_war_archives.campaign_base import CampaignBase as CampaignBase_ class CampaignBase(CampaignBase_): @@ -12,3 +12,9 @@ class CampaignBase(CampaignBase_): return red_overlay_transparency( MAP_ENEMY_SEARCHING.color, get_color(self.device.image, MAP_ENEMY_SEARCHING.area) ) > self.MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD + + def handle_exp_info(self): + # Random background hits EXP_INFO_B + if self.ui_page_appear(page_event): + return False + return super().handle_exp_info() diff --git a/deploy/git.py b/deploy/git.py index 669870a7c..45e1bd2f3 100644 --- a/deploy/git.py +++ b/deploy/git.py @@ -71,7 +71,10 @@ class GitManager(DeployConfig): @property def goc_client(self): client = GitOverCdnClient( - url='https://vip.123pan.cn/1818706573/pack/LmeSzinc_AzurLaneAutoScript_master', + url=[ + 'https://vip.123pan.cn/1818706573/pack/LmeSzinc_AzurLaneAutoScript_master', + 'https://1818706573.v.123yx.com/1818706573/pack/LmeSzinc_AzurLaneAutoScript_master', + ], folder=self.root_filepath, source='origin', branch='master', @@ -102,4 +105,4 @@ class GitManager(DeployConfig): if __name__ == '__main__': self = GitManager() - self.goc_client.get_status() \ No newline at end of file + self.goc_client.get_status() diff --git a/deploy/git_over_cdn/client.py b/deploy/git_over_cdn/client.py index a8fb5b5d2..4aa6d9258 100644 --- a/deploy/git_over_cdn/client.py +++ b/deploy/git_over_cdn/client.py @@ -52,10 +52,14 @@ class GitOverCdnClient: def __init__(self, url, folder, source='origin', branch='master', git='git'): """ Args: - url: http://127.0.0.1:22251/pack/LmeSzinc_AzurLaneAutoScript_master/ + url (str | list[str]): http://127.0.0.1:22251/pack/LmeSzinc_AzurLaneAutoScript_master/ folder: D:/AzurLaneAutoScript """ - self.url = url.strip('/') + if isinstance(url, str): + self.urls = [url.strip('/')] + else: + self.urls = [u.strip('/') for u in url] + self.url = self.urls[0] self.folder = folder.replace('\\', '/') self.source = source self.branch = branch @@ -100,29 +104,31 @@ class GitOverCdnClient: @cached_property def latest_commit(self) -> str: - try: + for url_base in self.urls: + self.url = url_base url = self.urlpath('/latest.json') self.logger.info(f'Fetch url: {url}') - resp = self.session.get(url, timeout=3) - except Exception as e: - self.logger.error(f'Failed to get remote commit: {e}') - return '' - - if resp.status_code == 200: try: - info = json.loads(resp.text) - commit = info['commit'] - self.logger.attr('LatestCommit', commit) - return commit - except json.JSONDecodeError: - self.logger.error(f'Failed to get remote commit, response is not a json: {resp.text}') - return '' - except KeyError: - self.logger.error(f'Failed to get remote commit, key "commit" is not found: {resp.text}') - return '' - else: - self.logger.error(f'Failed to get remote commit, status={resp.status_code}, text={resp.text}') - return '' + resp = self.session.get(url, timeout=3) + except Exception as e: + self.logger.error(f'Failed to get remote commit: {e}') + continue + + if resp.status_code == 200: + try: + info = json.loads(resp.text) + commit = info['commit'] + self.logger.attr('LatestCommit', commit) + return commit + except json.JSONDecodeError: + self.logger.error(f'Failed to get remote commit, response is not a json: {resp.text}') + except KeyError: + self.logger.error(f'Failed to get remote commit, key "commit" is not found: {resp.text}') + else: + self.logger.error(f'Failed to get remote commit, status={resp.status_code}, text={resp.text}') + + self.url = self.urls[0] + return '' def download_pack(self): try: diff --git a/module/campaign/assets.py b/module/campaign/assets.py index 119235fa1..13d6fc6e7 100644 --- a/module/campaign/assets.py +++ b/module/campaign/assets.py @@ -11,10 +11,13 @@ CHAPTER_20241219_SP = Button(area={'cn': (17, 372, 34, 388), 'en': (17, 372, 34, CHAPTER_NEXT = Button(area={'cn': (1216, 362, 1232, 388), 'en': (1216, 362, 1232, 388), 'jp': (1216, 362, 1232, 388), 'tw': (1216, 362, 1232, 388)}, color={'cn': (121, 150, 198), 'en': (121, 150, 198), 'jp': (121, 150, 198), 'tw': (121, 150, 198)}, button={'cn': (1216, 362, 1232, 388), 'en': (1216, 362, 1232, 388), 'jp': (1216, 362, 1232, 388), 'tw': (1216, 362, 1232, 388)}, file={'cn': './assets/cn/campaign/CHAPTER_NEXT.png', 'en': './assets/en/campaign/CHAPTER_NEXT.png', 'jp': './assets/jp/campaign/CHAPTER_NEXT.png', 'tw': './assets/tw/campaign/CHAPTER_NEXT.png'}) CHAPTER_PREV = Button(area={'cn': (42, 360, 58, 387), 'en': (42, 360, 58, 387), 'jp': (42, 360, 58, 387), 'tw': (42, 360, 58, 387)}, color={'cn': (105, 133, 169), 'en': (105, 133, 169), 'jp': (105, 133, 169), 'tw': (105, 133, 169)}, button={'cn': (42, 360, 58, 387), 'en': (42, 360, 58, 387), 'jp': (42, 360, 58, 387), 'tw': (42, 360, 58, 387)}, file={'cn': './assets/cn/campaign/CHAPTER_PREV.png', 'en': './assets/en/campaign/CHAPTER_PREV.png', 'jp': './assets/jp/campaign/CHAPTER_PREV.png', 'tw': './assets/tw/campaign/CHAPTER_PREV.png'}) COMMISSION_NOTICE_AT_CAMPAIGN = Button(area={'cn': (1077, 637, 1083, 643), 'en': (1077, 637, 1083, 643), 'jp': (1077, 637, 1083, 643), 'tw': (1077, 637, 1083, 643)}, color={'cn': (172, 72, 49), 'en': (172, 72, 49), 'jp': (172, 72, 49), 'tw': (172, 72, 49)}, button={'cn': (1077, 637, 1083, 643), 'en': (1077, 637, 1083, 643), 'jp': (1077, 637, 1083, 643), 'tw': (1077, 637, 1083, 643)}, file={'cn': './assets/cn/campaign/COMMISSION_NOTICE_AT_CAMPAIGN.png', 'en': './assets/en/campaign/COMMISSION_NOTICE_AT_CAMPAIGN.png', 'jp': './assets/jp/campaign/COMMISSION_NOTICE_AT_CAMPAIGN.png', 'tw': './assets/tw/campaign/COMMISSION_NOTICE_AT_CAMPAIGN.png'}) +EVENT_20201126_ENTRANCE_TEMP = Button(area={'cn': (1023, 368, 1100, 407), 'en': (1023, 368, 1100, 407), 'jp': (1023, 368, 1100, 407), 'tw': (1023, 368, 1100, 407)}, color={'cn': (160, 208, 243), 'en': (160, 208, 243), 'jp': (160, 208, 243), 'tw': (160, 208, 243)}, button={'cn': (1023, 368, 1100, 407), 'en': (1023, 368, 1100, 407), 'jp': (1023, 368, 1100, 407), 'tw': (1023, 368, 1100, 407)}, file={'cn': './assets/cn/campaign/EVENT_20201126_ENTRANCE_TEMP.png', 'en': './assets/cn/campaign/EVENT_20201126_ENTRANCE_TEMP.png', 'jp': './assets/cn/campaign/EVENT_20201126_ENTRANCE_TEMP.png', 'tw': './assets/cn/campaign/EVENT_20201126_ENTRANCE_TEMP.png'}) +EVENT_20201126_PT_ICON = Button(area={'cn': (1108, 102, 1133, 127), 'en': (1108, 102, 1133, 127), 'jp': (1108, 102, 1133, 127), 'tw': (1108, 102, 1133, 127)}, color={'cn': (231, 121, 159), 'en': (231, 121, 159), 'jp': (231, 121, 159), 'tw': (231, 121, 159)}, button={'cn': (1108, 102, 1133, 127), 'en': (1108, 102, 1133, 127), 'jp': (1108, 102, 1133, 127), 'tw': (1108, 102, 1133, 127)}, file={'cn': './assets/cn/campaign/EVENT_20201126_PT_ICON.png', 'en': './assets/cn/campaign/EVENT_20201126_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20201126_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20201126_PT_ICON.png'}) EVENT_20221124_ENTRANCE = Button(area={'cn': (1037, 162, 1077, 195), 'en': (1037, 162, 1077, 195), 'jp': (1037, 162, 1077, 195), 'tw': (1037, 162, 1077, 195)}, color={'cn': (207, 168, 148), 'en': (207, 168, 148), 'jp': (207, 168, 148), 'tw': (207, 168, 148)}, button={'cn': (1037, 162, 1077, 195), 'en': (1037, 162, 1077, 195), 'jp': (1037, 162, 1077, 195), 'tw': (1037, 162, 1077, 195)}, file={'cn': './assets/cn/campaign/EVENT_20221124_ENTRANCE.png', 'en': './assets/cn/campaign/EVENT_20221124_ENTRANCE.png', 'jp': './assets/cn/campaign/EVENT_20221124_ENTRANCE.png', 'tw': './assets/cn/campaign/EVENT_20221124_ENTRANCE.png'}) EVENT_20221124_PT_ICON = Button(area={'cn': (1106, 109, 1135, 130), 'en': (1071, 109, 1101, 129), 'jp': (1106, 109, 1135, 130), 'tw': (1106, 109, 1135, 130)}, color={'cn': (151, 116, 139), 'en': (152, 115, 138), 'jp': (151, 116, 139), 'tw': (151, 116, 139)}, button={'cn': (1106, 109, 1135, 130), 'en': (1071, 109, 1101, 129), 'jp': (1106, 109, 1135, 130), 'tw': (1106, 109, 1135, 130)}, file={'cn': './assets/cn/campaign/EVENT_20221124_PT_ICON.png', 'en': './assets/en/campaign/EVENT_20221124_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20221124_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20221124_PT_ICON.png'}) EVENT_20230817_STORY = Button(area={'cn': (610, 320, 670, 380), 'en': (610, 320, 670, 380), 'jp': (610, 320, 670, 380), 'tw': (610, 320, 670, 380)}, color={'cn': (183, 180, 190), 'en': (183, 180, 190), 'jp': (183, 180, 190), 'tw': (183, 180, 190)}, button={'cn': (610, 320, 670, 380), 'en': (610, 320, 670, 380), 'jp': (610, 320, 670, 380), 'tw': (610, 320, 670, 380)}, file={'cn': './assets/cn/campaign/EVENT_20230817_STORY.png', 'en': './assets/en/campaign/EVENT_20230817_STORY.png', 'jp': './assets/jp/campaign/EVENT_20230817_STORY.png', 'tw': './assets/tw/campaign/EVENT_20230817_STORY.png'}) EVENT_20250724_PT_ICON = Button(area={'cn': (1102, 106, 1139, 121), 'en': (1067, 108, 1104, 123), 'jp': (1102, 106, 1139, 121), 'tw': (1102, 106, 1139, 121)}, color={'cn': (95, 103, 93), 'en': (97, 101, 94), 'jp': (95, 103, 93), 'tw': (95, 103, 93)}, button={'cn': (1102, 106, 1139, 121), 'en': (1067, 108, 1104, 123), 'jp': (1102, 106, 1139, 121), 'tw': (1102, 106, 1139, 121)}, file={'cn': './assets/cn/campaign/EVENT_20250724_PT_ICON.png', 'en': './assets/en/campaign/EVENT_20250724_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20250724_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20250724_PT_ICON.png'}) +EVENT_20260417_PT_ICON = Button(area={'cn': (1110, 106, 1133, 130), 'en': (1110, 106, 1133, 130), 'jp': (1110, 106, 1133, 130), 'tw': (1110, 106, 1133, 130)}, color={'cn': (119, 177, 213), 'en': (119, 177, 213), 'jp': (119, 177, 213), 'tw': (119, 177, 213)}, button={'cn': (1110, 106, 1133, 130), 'en': (1110, 106, 1133, 130), 'jp': (1110, 106, 1133, 130), 'tw': (1110, 106, 1133, 130)}, file={'cn': './assets/cn/campaign/EVENT_20260417_PT_ICON.png', 'en': './assets/cn/campaign/EVENT_20260417_PT_ICON.png', 'jp': './assets/cn/campaign/EVENT_20260417_PT_ICON.png', 'tw': './assets/cn/campaign/EVENT_20260417_PT_ICON.png'}) OCR_COIN = Button(area={'cn': (815, 23, 922, 51), 'en': (815, 23, 922, 51), 'jp': (815, 23, 922, 51), 'tw': (815, 23, 922, 51)}, color={'cn': (61, 61, 73), 'en': (61, 61, 73), 'jp': (61, 61, 73), 'tw': (61, 61, 73)}, button={'cn': (815, 23, 922, 51), 'en': (815, 23, 922, 51), 'jp': (815, 23, 922, 51), 'tw': (815, 23, 922, 51)}, file={'cn': './assets/cn/campaign/OCR_COIN.png', 'en': './assets/en/campaign/OCR_COIN.png', 'jp': './assets/jp/campaign/OCR_COIN.png', 'tw': './assets/tw/campaign/OCR_COIN.png'}) OCR_COIN_LIMIT = Button(area={'cn': (807, 0, 944, 19), 'en': (807, 0, 944, 19), 'jp': (807, 0, 944, 19), 'tw': (807, 0, 944, 19)}, color={'cn': (206, 206, 206), 'en': (206, 206, 206), 'jp': (206, 206, 206), 'tw': (206, 206, 206)}, button={'cn': (807, 0, 944, 19), 'en': (807, 0, 944, 19), 'jp': (807, 0, 944, 19), 'tw': (807, 0, 944, 19)}, file={'cn': './assets/cn/campaign/OCR_COIN_LIMIT.png', 'en': './assets/en/campaign/OCR_COIN_LIMIT.png', 'jp': './assets/jp/campaign/OCR_COIN_LIMIT.png', 'tw': './assets/tw/campaign/OCR_COIN_LIMIT.png'}) OCR_EVENT_PT = Button(area={'cn': (1196, 109, 1280, 131), 'en': (1190, 109, 1280, 129), 'jp': (1196, 109, 1280, 131), 'tw': (1196, 109, 1280, 131)}, color={'cn': (121, 110, 59), 'en': (88, 78, 51), 'jp': (121, 110, 59), 'tw': (121, 110, 59)}, button={'cn': (1196, 109, 1280, 131), 'en': (1190, 109, 1280, 129), 'jp': (1196, 109, 1280, 131), 'tw': (1196, 109, 1280, 131)}, file={'cn': './assets/cn/campaign/OCR_EVENT_PT.png', 'en': './assets/en/campaign/OCR_EVENT_PT.png', 'jp': './assets/jp/campaign/OCR_EVENT_PT.png', 'tw': './assets/tw/campaign/OCR_EVENT_PT.png'}) diff --git a/module/campaign/run.py b/module/campaign/run.py index 4f7eee2b9..dc2214645 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -177,6 +177,7 @@ class CampaignRun(CampaignEvent, ShopStatus): logger.info(f'Stage name {name} is from campaign_main') folder = 'campaign_main' else: + folder = self.config.cross_get('GemsFarming.Campaign.Event') if folder is not None: logger.info(f'Stage name {name} is from event {folder}') else: diff --git a/module/config/argument/args.json b/module/config/argument/args.json index c6ee1449b..3691f1b9f 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1967,23 +1967,27 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ], - "display": "hide", "option_cn": [ + "event_20201126_cn", "event_20260417_cn" ], "option_en": [ + "event_20201126_cn", "event_20260417_cn" ], "option_jp": [ + "event_20201126_cn", "event_20260417_cn" ], "option_tw": [ "event_20220915_cn" ], "option_bold": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ] @@ -2385,25 +2389,30 @@ "value": "12-4" }, "Event": { - "type": "state", + "type": "select", "value": "campaign_main", "option": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ], "option_cn": [ + "event_20201126_cn", "event_20260417_cn" ], "option_en": [ + "event_20201126_cn", "event_20260417_cn" ], "option_jp": [ + "event_20201126_cn", "event_20260417_cn" ], "option_tw": [ "event_20220915_cn" ], "option_bold": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ] @@ -2799,25 +2808,30 @@ "value": "12-4" }, "Event": { - "type": "state", + "type": "select", "value": "campaign_main", "option": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ], "option_cn": [ + "event_20201126_cn", "event_20260417_cn" ], "option_en": [ + "event_20201126_cn", "event_20260417_cn" ], "option_jp": [ + "event_20201126_cn", "event_20260417_cn" ], "option_tw": [ "event_20220915_cn" ], "option_bold": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ] @@ -3230,7 +3244,7 @@ "display": "hide" }, "Event": { - "type": "state", + "type": "select", "value": "campaign_main", "option": [ "raid_20260212" @@ -4606,25 +4620,30 @@ "display": "hide" }, "Event": { - "type": "state", + "type": "select", "value": "campaign_main", "option": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ], "option_cn": [ + "event_20201126_cn", "event_20260417_cn" ], "option_en": [ + "event_20201126_cn", "event_20260417_cn" ], "option_jp": [ + "event_20201126_cn", "event_20260417_cn" ], "option_tw": [ "event_20220915_cn" ], "option_bold": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ] @@ -5038,25 +5057,30 @@ "display": "hide" }, "Event": { - "type": "state", + "type": "select", "value": "campaign_main", "option": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ], "option_cn": [ + "event_20201126_cn", "event_20260417_cn" ], "option_en": [ + "event_20201126_cn", "event_20260417_cn" ], "option_jp": [ + "event_20201126_cn", "event_20260417_cn" ], "option_tw": [ "event_20220915_cn" ], "option_bold": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ] @@ -5470,25 +5494,30 @@ "display": "hide" }, "Event": { - "type": "state", + "type": "select", "value": "campaign_main", "option": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ], "option_cn": [ + "event_20201126_cn", "event_20260417_cn" ], "option_en": [ + "event_20201126_cn", "event_20260417_cn" ], "option_jp": [ + "event_20201126_cn", "event_20260417_cn" ], "option_tw": [ "event_20220915_cn" ], "option_bold": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ] @@ -5902,25 +5931,30 @@ "display": "hide" }, "Event": { - "type": "state", + "type": "select", "value": "campaign_main", "option": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ], "option_cn": [ + "event_20201126_cn", "event_20260417_cn" ], "option_en": [ + "event_20201126_cn", "event_20260417_cn" ], "option_jp": [ + "event_20201126_cn", "event_20260417_cn" ], "option_tw": [ "event_20220915_cn" ], "option_bold": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ] @@ -6324,25 +6358,30 @@ "display": "hide" }, "Event": { - "type": "state", + "type": "select", "value": "campaign_main", "option": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ], "option_cn": [ + "event_20201126_cn", "event_20260417_cn" ], "option_en": [ + "event_20201126_cn", "event_20260417_cn" ], "option_jp": [ + "event_20201126_cn", "event_20260417_cn" ], "option_tw": [ "event_20220915_cn" ], "option_bold": [ + "event_20201126_cn", "event_20220915_cn", "event_20260417_cn" ] @@ -6753,7 +6792,7 @@ "display": "hide" }, "Event": { - "type": "state", + "type": "select", "value": "campaign_main", "option": [ "raid_20260212" @@ -6995,7 +7034,7 @@ "display": "hide" }, "Event": { - "type": "state", + "type": "select", "value": "campaign_main", "option": [ "coalition_20260122" diff --git a/module/config/argument/override.yaml b/module/config/argument/override.yaml index c86a198b9..8af6d75c7 100644 --- a/module/config/argument/override.yaml +++ b/module/config/argument/override.yaml @@ -28,8 +28,6 @@ Main3: Event: campaign_main GemsFarming: Campaign: - Event: - value: campaign_main Mode: normal UseClearMode: true UseFleetLock: true @@ -57,14 +55,10 @@ GemsFarming: Event: Campaign: Mode: normal - Event: - type: state AmbushEvade: true Event2: Campaign: Mode: normal - Event: - type: state AmbushEvade: true EventA: Scheduler: @@ -73,8 +67,6 @@ EventA: ServerUpdate: 00:00 Campaign: Name: dynamic - Event: - type: state Mode: normal Use2xBook: false AmbushEvade: true @@ -92,8 +84,6 @@ EventB: ServerUpdate: 00:00 Campaign: Name: dynamic - Event: - type: state Mode: normal Use2xBook: false AmbushEvade: true @@ -111,8 +101,6 @@ EventC: ServerUpdate: 00:00 Campaign: Name: dynamic - Event: - type: state Mode: normal Use2xBook: false AmbushEvade: true @@ -130,8 +118,6 @@ EventD: ServerUpdate: 00:00 Campaign: Name: dynamic - Event: - type: state Mode: normal Use2xBook: false AmbushEvade: true @@ -149,8 +135,6 @@ EventSp: ServerUpdate: 00:00 Campaign: Name: sp - Event: - type: state Mode: normal Use2xBook: false AmbushEvade: true @@ -166,8 +150,6 @@ EventSp: Raid: Campaign: Name: dynamic - Event: - type: state Mode: normal UseClearMode: true UseFleetLock: true @@ -212,8 +194,6 @@ RaidDaily: ServerUpdate: 00:00 Campaign: Name: dynamic - Event: - type: state Mode: normal UseClearMode: true UseFleetLock: true @@ -245,8 +225,6 @@ Coalition: FailureInterval: 30 ServerUpdate: 00:00 Campaign: - Event: - type: state Name: dynamic Event: type: state @@ -279,8 +257,6 @@ CoalitionSp: ServerUpdate: 00:00 Campaign: Name: sp - Event: - type: state Mode: normal UseClearMode: true UseFleetLock: true diff --git a/module/config/config_updater.py b/module/config/config_updater.py index 2eec48ae3..c4c89767f 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -657,17 +657,24 @@ class ConfigUpdater: if not is_template: for task in EVENTS + GEMS_FARMINGS + RAIDS + COALITIONS: opts = deep_get(self.args, keys=f'{task}.Campaign.Event.option_{server}', default=[]) - if not deep_get(new, keys=f'{task}.Campaign.Event', default='campaign_main') in opts: + if opts and not deep_get(new, keys=f'{task}.Campaign.Event', default='campaign_main') in opts: deep_set(new, keys=f'{task}.Campaign.Event', value=opts[0]) + for task in ['GemsFarming']: + opts = deep_get(self.args, keys=f'{task}.Campaign.Event.option_{server}', default=[]) + if opts and deep_get(new, keys=f'{task}.Campaign.Event', default='campaign_main') not in opts: + deep_set(new, + keys=f'{task}.Campaign.Event', + value=opts[0]) # War archive does not allow campaign_main for task in WAR_ARCHIVES: - if deep_get(new, keys=f'{task}.Campaign.Event', default='campaign_main') == 'campaign_main': + opts = deep_get(self.args, keys=f'{task}.Campaign.Event.option_{server}', default=[]) + if opts and deep_get(new, keys=f'{task}.Campaign.Event', default='campaign_main') == 'campaign_main': deep_set(new, keys=f'{task}.Campaign.Event', - value=deep_get(self.args, f'{task}.Campaign.Event.option_{server}')[0]) + value=opts[0]) # Events does not allow default stage 12-4 def default_stage(t, stage): diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index d70bc9f1c..e2bdae9a6 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -736,7 +736,7 @@ "event_20201002_en": "Counterattack Within the Fjord", "event_20201012_cn": "Sundered Blue Rerun", "event_20201029_cn": "Universe in Unison", - "event_20201126_cn": "Vacation Lane", + "event_20201126_cn": "Vacation Lane Rerun", "event_20201229_cn": "Inverted Orthant Rerun", "event_20210121_cn": "Empyreal Tragicomedy Rerun", "event_20210225_cn": "Khorovod of Dawns Rime Rerun", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 65ba08d61..978bc8cde 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -736,7 +736,7 @@ "event_20201002_en": "Counterattack Within the Fjord", "event_20201012_cn": "奔る彩帆の青(復刻)", "event_20201029_cn": "激唱のユニバース", - "event_20201126_cn": "バケーションレーン", + "event_20201126_cn": "バケーションレーン(復刻)", "event_20201229_cn": "虚畳なりし限象(復刻)", "event_20210121_cn": "悲歎せし焔海の詩(復刻)", "event_20210225_cn": "暁射す氷華の嵐(復刻)", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 8ad517b7d..80081b8f3 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -736,7 +736,7 @@ "event_20201002_en": "Counterattack Within the Fjord", "event_20201012_cn": "复刻划破海空之翼", "event_20201029_cn": "激唱的UNIVERSE", - "event_20201126_cn": "假日航线", + "event_20201126_cn": "复刻假日航线", "event_20201229_cn": "复刻负象限作战", "event_20210121_cn": "复刻神圣的悲喜剧", "event_20210225_cn": "复刻破晓冰华", diff --git a/module/os_shop/port_shop.py b/module/os_shop/port_shop.py index 0f765bfef..56e0554e8 100644 --- a/module/os_shop/port_shop.py +++ b/module/os_shop/port_shop.py @@ -1,4 +1,5 @@ from typing import List + from module.base.button import ButtonGrid from module.base.decorator import cached_property from module.base.template import Template @@ -6,9 +7,9 @@ from module.logger import logger from module.map_detection.utils import Points from module.os_handler.map_event import MapEventHandler from module.os_handler.os_status import OSStatus +from module.os_shop.item import OSShopItem as Item, OSShopItemGrid as ItemGrid from module.os_shop.selector import Selector from module.os_shop.ui import OSShopUI, OS_SHOP_SCROLL -from module.os_shop.item import OSShopItem as Item, OSShopItemGrid as ItemGrid from module.statistics.utils import load_folder @@ -133,19 +134,21 @@ class PortShop(OSStatus, OSShopUI, Selector, MapEventHandler): while True: pre_pos = self.pre_scroll(pre_pos, cur_pos) - _items = self.os_shop_get_items(i, cur_pos) - for _ in range(2): + _items = [] + for _ in range(3): + _items = self.os_shop_get_items(i, cur_pos) if not len(_items) or any(not item.is_known_item() for item in _items): logger.warning('Empty OS shop or empty items, confirming') self.device.sleep((0.3, 0.5)) self.device.screenshot() - _items = self.os_shop_get_items(i, cur_pos) continue else: - items += _items logger.info(f'Found {len(_items)} items in shop {i + 1} at pos {cur_pos:.2f}') break + # always add items, even if last item list contains unknown items + # so any known items can be scanned + items += _items if OS_SHOP_SCROLL.at_bottom(main=self): logger.info('OS shop reach bottom, stop') diff --git a/module/webui/app.py b/module/webui/app.py index a97266786..5668feead 100644 --- a/module/webui/app.py +++ b/module/webui/app.py @@ -340,6 +340,7 @@ class AlasGUI(Frame): @use_scope("groups") def set_group(self, group, arg_dict, config, task): group_name = group[0] + server = to_server(deep_get(config, "Alas.Emulator.PackageName", "cn")) output_list: List[Output] = [] for arg, arg_dict in deep_iter(arg_dict, depth=1): @@ -371,11 +372,22 @@ class AlasGUI(Frame): output_kwargs["value"] = value # Options options = output_kwargs.pop("option", []) - server = to_server(deep_get(config, 'Alas.Emulator.PackageName', 'cn')) - available_events = deep_get(self.ALAS_ARGS, keys=f'{task}.{group_name}.{arg_name}.option_{server}') - if available_events is not None: - options = [opt for opt in options if opt in available_events] + server_options = output_kwargs.get(f"option_{server}") + if output_kwargs["widget_type"] == "select" and isinstance(server_options, list) and server_options: + options = server_options output_kwargs["options"] = options + if ( + task == "GemsFarming" + and group_name == "Campaign" + and arg_name == "Event" + and output_kwargs["widget_type"] == "select" + and len(options) == 1 + ): + continue + if output_kwargs["widget_type"] == "select" and len(options) == 1: + only_option = options[0] + if only_option in output_kwargs.get("option_bold", []): + output_kwargs["widget_type"] = "state" # Options label options_label = [] for opt in options: