From 9e135993ce338e7fd0c3028ef42184c55eeb667d Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Fri, 12 Jan 2024 18:00:35 +0800 Subject: [PATCH 01/14] Upd: [EN] ACADEMY_CHECK --- assets/en/ui/ACADEMY_CHECK.png | Bin 8667 -> 9370 bytes module/ui/assets.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/en/ui/ACADEMY_CHECK.png b/assets/en/ui/ACADEMY_CHECK.png index 7e00c6d3b5e47cbadf8116a702d5f5a8db5c4692..9ecfd530a9e0cf62b713ac39e2d7ade30be96968 100644 GIT binary patch delta 4054 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 delta 3337 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 diff --git a/module/ui/assets.py b/module/ui/assets.py index 1c1d8562b..5a49855cd 100644 --- a/module/ui/assets.py +++ b/module/ui/assets.py @@ -4,7 +4,7 @@ from module.base.template import Template # This file was automatically generated by dev_tools/button_extract.py. # Don't modify it manually. -ACADEMY_CHECK = Button(area={'cn': (121, 14, 175, 39), 'en': (120, 22, 234, 36), 'jp': (121, 14, 174, 40), 'tw': (119, 12, 178, 44)}, color={'cn': (147, 163, 200), 'en': (130, 147, 189), 'jp': (159, 174, 208), 'tw': (125, 139, 176)}, button={'cn': (121, 14, 175, 39), 'en': (120, 22, 234, 36), 'jp': (121, 14, 174, 40), 'tw': (119, 12, 178, 44)}, file={'cn': './assets/cn/ui/ACADEMY_CHECK.png', 'en': './assets/en/ui/ACADEMY_CHECK.png', 'jp': './assets/jp/ui/ACADEMY_CHECK.png', 'tw': './assets/tw/ui/ACADEMY_CHECK.png'}) +ACADEMY_CHECK = Button(area={'cn': (121, 14, 175, 39), 'en': (122, 19, 258, 35), 'jp': (121, 14, 174, 40), 'tw': (119, 12, 178, 44)}, color={'cn': (147, 163, 200), 'en': (132, 149, 191), 'jp': (159, 174, 208), 'tw': (125, 139, 176)}, button={'cn': (121, 14, 175, 39), 'en': (122, 19, 258, 35), 'jp': (121, 14, 174, 40), 'tw': (119, 12, 178, 44)}, file={'cn': './assets/cn/ui/ACADEMY_CHECK.png', 'en': './assets/en/ui/ACADEMY_CHECK.png', 'jp': './assets/jp/ui/ACADEMY_CHECK.png', 'tw': './assets/tw/ui/ACADEMY_CHECK.png'}) ACADEMY_GOTO_GAME_ROOM = Button(area={'cn': (1074, 340, 1103, 374), 'en': (1074, 340, 1103, 374), 'jp': (1074, 340, 1103, 374), 'tw': (1074, 340, 1103, 374)}, color={'cn': (208, 185, 150), 'en': (208, 185, 150), 'jp': (208, 185, 150), 'tw': (208, 185, 150)}, button={'cn': (1074, 340, 1103, 374), 'en': (1074, 340, 1103, 374), 'jp': (1074, 340, 1103, 374), 'tw': (1074, 340, 1103, 374)}, file={'cn': './assets/cn/ui/ACADEMY_GOTO_GAME_ROOM.png', 'en': './assets/en/ui/ACADEMY_GOTO_GAME_ROOM.png', 'jp': './assets/jp/ui/ACADEMY_GOTO_GAME_ROOM.png', 'tw': './assets/tw/ui/ACADEMY_GOTO_GAME_ROOM.png'}) ACADEMY_GOTO_MUNITIONS = Button(area={'cn': (1046, 188, 1137, 210), 'en': (1039, 185, 1145, 209), 'jp': (1057, 188, 1126, 210), 'tw': (1044, 184, 1139, 213)}, color={'cn': (133, 135, 165), 'en': (115, 120, 153), 'jp': (129, 133, 162), 'tw': (113, 119, 149)}, button={'cn': (1046, 188, 1137, 210), 'en': (1039, 185, 1145, 209), 'jp': (1057, 188, 1126, 210), 'tw': (1044, 184, 1139, 213)}, file={'cn': './assets/cn/ui/ACADEMY_GOTO_MUNITIONS.png', 'en': './assets/en/ui/ACADEMY_GOTO_MUNITIONS.png', 'jp': './assets/jp/ui/ACADEMY_GOTO_MUNITIONS.png', 'tw': './assets/tw/ui/ACADEMY_GOTO_MUNITIONS.png'}) BACK_ARROW = Button(area={'cn': (33, 44, 47, 64), 'en': (33, 44, 47, 64), 'jp': (33, 44, 47, 64), 'tw': (33, 44, 47, 64)}, color={'cn': (112, 118, 152), 'en': (112, 118, 152), 'jp': (112, 118, 152), 'tw': (112, 118, 152)}, button={'cn': (33, 31, 81, 78), 'en': (33, 31, 81, 78), 'jp': (33, 31, 81, 78), 'tw': (33, 31, 81, 78)}, file={'cn': './assets/cn/ui/BACK_ARROW.png', 'en': './assets/en/ui/BACK_ARROW.png', 'jp': './assets/jp/ui/BACK_ARROW.png', 'tw': './assets/tw/ui/BACK_ARROW.png'}) From 928a35f53ca0e15f0a82b2a6b91f89e141761a80 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Fri, 12 Jan 2024 18:01:50 +0800 Subject: [PATCH 02/14] Fix: Lower edge threshold in event_20211229_cn to the standard nowadays --- campaign/event_20211229_cn/a1.py | 5 +++-- campaign/event_20211229_cn/b1.py | 5 +++-- campaign/event_20211229_cn/bs1.py | 4 ++-- campaign/event_20211229_cn/c1.py | 4 ++-- campaign/event_20211229_cn/d1.py | 4 ++-- campaign/event_20211229_cn/ds1.py | 4 ++-- campaign/event_20211229_cn/sp.py | 4 ++-- 7 files changed, 16 insertions(+), 14 deletions(-) diff --git a/campaign/event_20211229_cn/a1.py b/campaign/event_20211229_cn/a1.py index c0e51cf14..7273d10d8 100644 --- a/campaign/event_20211229_cn/a1.py +++ b/campaign/event_20211229_cn/a1.py @@ -54,17 +54,18 @@ class Config: # ===== End of generated config ===== INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (80, 255 - 40), + 'height': (80, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 } + HOMO_EDGE_COLOR_RANGE = (0, 17) MAP_SWIPE_MULTIPLY = (1.141, 1.162) MAP_SWIPE_MULTIPLY_MINITOUCH = (1.103, 1.123) MAP_SWIPE_MULTIPLY_MAATOUCH = (1.071, 1.090) diff --git a/campaign/event_20211229_cn/b1.py b/campaign/event_20211229_cn/b1.py index f00413606..e99cc0b57 100644 --- a/campaign/event_20211229_cn/b1.py +++ b/campaign/event_20211229_cn/b1.py @@ -63,18 +63,19 @@ class Config: MOVABLE_NORMAL_ENEMY_TURN = (2,) MAP_SIREN_MOVE_WAIT = 1.0 INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (150, 255 - 24), + 'height': (80, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 } HOMO_EDGE_COLOR_RANGE = (0, 17) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 180 MAP_SWIPE_MULTIPLY = (1.033, 1.053) MAP_SWIPE_MULTIPLY_MINITOUCH = (0.999, 1.018) MAP_SWIPE_MULTIPLY_MAATOUCH = (0.970, 0.988) diff --git a/campaign/event_20211229_cn/bs1.py b/campaign/event_20211229_cn/bs1.py index be4632caf..02b3fd4c5 100644 --- a/campaign/event_20211229_cn/bs1.py +++ b/campaign/event_20211229_cn/bs1.py @@ -54,13 +54,13 @@ class Config: # ===== End of generated config ===== INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (150, 255 - 24), + 'height': (150, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 diff --git a/campaign/event_20211229_cn/c1.py b/campaign/event_20211229_cn/c1.py index c1dc008de..6b37ac2d8 100644 --- a/campaign/event_20211229_cn/c1.py +++ b/campaign/event_20211229_cn/c1.py @@ -54,13 +54,13 @@ class Config: # ===== End of generated config ===== INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (150, 255 - 24), + 'height': (150, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 diff --git a/campaign/event_20211229_cn/d1.py b/campaign/event_20211229_cn/d1.py index f9e7f1cf4..aa9277389 100644 --- a/campaign/event_20211229_cn/d1.py +++ b/campaign/event_20211229_cn/d1.py @@ -63,13 +63,13 @@ class Config: MOVABLE_NORMAL_ENEMY_TURN = (2,) MAP_SIREN_MOVE_WAIT = 1.0 INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (150, 255 - 24), + 'height': (150, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 diff --git a/campaign/event_20211229_cn/ds1.py b/campaign/event_20211229_cn/ds1.py index bb2815cf6..059d6b4ac 100644 --- a/campaign/event_20211229_cn/ds1.py +++ b/campaign/event_20211229_cn/ds1.py @@ -55,13 +55,13 @@ class Config: # ===== End of generated config ===== INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (150, 255 - 24), + 'height': (150, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 diff --git a/campaign/event_20211229_cn/sp.py b/campaign/event_20211229_cn/sp.py index 9aa0384d3..9b5770f4e 100644 --- a/campaign/event_20211229_cn/sp.py +++ b/campaign/event_20211229_cn/sp.py @@ -65,13 +65,13 @@ class Config: # ===== End of generated config ===== INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (150, 255 - 24), + 'height': (150, 255 - 17), 'width': (0.9, 10), 'prominence': 10, 'distance': 35, } EDGE_LINES_FIND_PEAKS_PARAMETERS = { - 'height': (255 - 24, 255), + 'height': (255 - 17, 255), 'prominence': 10, 'distance': 50, 'wlen': 1000 From 26b2ad293ab119e128bb53c08e1c4ee67607db44 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Fri, 12 Jan 2024 18:29:25 +0800 Subject: [PATCH 03/14] Fix: Slow OCR is detected as commission flashing bug --- module/commission/commission.py | 65 +++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/module/commission/commission.py b/module/commission/commission.py index 9518dfbe2..23c898275 100644 --- a/module/commission/commission.py +++ b/module/commission/commission.py @@ -324,13 +324,14 @@ class RewardCommission(UI, InfoHandler): self.daily_choose, self.urgent_choose = self._commission_choose(self.daily, self.urgent) return daily, urgent - def _commission_start_click(self, comm, is_urgent=False): + def _commission_start_click(self, comm, is_urgent=False, skip_first_screenshot=True): """ Start a commission. Args: comm (Commission): is_urgent (bool): + skip_first_screenshot: Returns: bool: If success @@ -345,14 +346,37 @@ class RewardCommission(UI, InfoHandler): comm_timer = Timer(7) count = 0 while 1: - if comm_timer.reached(): - self.device.click(comm.button) - self.device.sleep(0.3) - comm_timer.reset() + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() - if self.handle_popup_confirm('COMMISSION_START'): + # End + if self.info_bar_count(): + break + if count >= 3: + # Restart game and handle commission recommend bug. + # After you click "Recommend", your ships appear and then suddenly disappear. + # At the same time, the icon of commission is flashing. + logger.warning('Triggered commission list flashing bug') + raise GameStuckError('Triggered commission list flashing bug') + + # Click + if self.appear_then_click(COMMISSION_START, offset=(5, 20), interval=7): + self.interval_reset(COMMISSION_ADVICE) comm_timer.reset() - pass + continue + if self.handle_popup_confirm('COMMISSION_START'): + self.interval_reset(COMMISSION_ADVICE) + comm_timer.reset() + continue + # Accidentally entered dock + if self.appear(DOCK_CHECK, offset=(20, 20), interval=3): + logger.info(f'equip_enter {DOCK_CHECK} -> {BACK_ARROW}') + self.device.click(BACK_ARROW) + comm_timer.reset() + continue + # Check if is the right commission if self.appear(COMMISSION_ADVICE, offset=(5, 20), interval=7): area = (0, 0, image_size(self.device.image)[0], COMMISSION_ADVICE.button[1]) current = self.commission_detect(area=area) @@ -369,28 +393,15 @@ class RewardCommission(UI, InfoHandler): logger.warning('No selected commission detected, assuming correct') self.device.click(COMMISSION_ADVICE) count += 1 + self.interval_reset(COMMISSION_ADVICE) + self.interval_clear(COMMISSION_START) comm_timer.reset() - pass - if self.appear_then_click(COMMISSION_START, offset=(5, 20), interval=7): - comm_timer.reset() - pass - # Accidentally entered dock - if self.appear(DOCK_CHECK, offset=(20, 20), interval=3): - logger.info(f'equip_enter {DOCK_CHECK} -> {BACK_ARROW}') - self.device.click(BACK_ARROW) continue - - # End - if self.info_bar_count(): - break - if count >= 3: - # Restart game and handle commission recommend bug. - # After you click "Recommend", your ships appear and then suddenly disappear. - # At the same time, the icon of commission is flashing. - logger.warning('Triggered commission list flashing bug') - raise GameStuckError('Triggered commission list flashing bug') - - self.device.screenshot() + # Enter + if comm_timer.reached(): + self.device.click(comm.button) + self.device.sleep(0.3) + comm_timer.reset() return True From 290456637c3f26746ca21b201bc406e650c1ee7d Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Fri, 12 Jan 2024 18:40:47 +0800 Subject: [PATCH 04/14] Fix: Allow enter map with is_combat_loading --- module/map/map_operation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/module/map/map_operation.py b/module/map/map_operation.py index 98e1b873b..82cf85301 100644 --- a/module/map/map_operation.py +++ b/module/map/map_operation.py @@ -221,6 +221,10 @@ class MapOperation(MysteryHandler, FleetPreparation, Retirement, FastForwardHand # End if self.map_is_auto_search: if self.is_auto_search_running(): + logger.info('is_auto_search_running appeared') + break + if hasattr(self, 'is_combat_loading') and self.is_combat_loading(): + logger.warning('Entered map with is_combat_loading appeared') break else: if self.handle_in_map_with_enemy_searching(): From 7a34a686a68f772a37a68cbdadec6090ec480759 Mon Sep 17 00:00:00 2001 From: LA-DI-DA <11174151+0O0o0oOoO00@users.noreply.github.com> Date: Tue, 16 Jan 2024 22:22:39 +0800 Subject: [PATCH 05/14] Adj: flexible consume coins limit --- config/template.json | 2 +- module/config/argument/args.json | 4 ++-- module/config/argument/argument.yaml | 2 +- module/config/config_generated.py | 2 +- module/config/i18n/zh-CN.json | 2 +- module/shop/shop_general.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/config/template.json b/config/template.json index bf6a97c35..dec8552a7 100644 --- a/config/template.json +++ b/config/template.json @@ -1498,7 +1498,7 @@ "UseGems": false, "Refresh": false, "BuySkinBox": false, - "ConsumeCoins": false, + "ConsumeCoins": 550000, "Filter": "BookRedT3 > BookYellowT3 > BookBlueT3 > BookRedT2\n> Cube\n> FoodT6 > FoodT5" }, "Storage": { diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 109b0bbd8..4a0019518 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -7974,8 +7974,8 @@ "value": false }, "ConsumeCoins": { - "type": "checkbox", - "value": false + "type": "input", + "value": 550000 }, "Filter": { "type": "textarea", diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index abff1e83f..eafce870b 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -429,7 +429,7 @@ GeneralShop: UseGems: false Refresh: false BuySkinBox: false - ConsumeCoins: false + ConsumeCoins: 550000 Filter: |- BookRedT3 > BookYellowT3 > BookBlueT3 > BookRedT2 > Cube diff --git a/module/config/config_generated.py b/module/config/config_generated.py index dfb8b5e75..9d9750d81 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -255,7 +255,7 @@ class GeneratedConfig: GeneralShop_UseGems = False GeneralShop_Refresh = False GeneralShop_BuySkinBox = False - GeneralShop_ConsumeCoins = False + GeneralShop_ConsumeCoins = 550000 GeneralShop_Filter = 'BookRedT3 > BookYellowT3 > BookBlueT3 > BookRedT2\n> Cube\n> FoodT6 > FoodT5' # Group `GuildShop` diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 12069a807..32389836c 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -1580,7 +1580,7 @@ }, "ConsumeCoins": { "name": "消耗溢出物资", - "help": "物资超过550000时购买所有消耗物资的物品" + "help": "设置为0则不启用,默认为550000" }, "Filter": { "name": "商店过滤器", diff --git a/module/shop/shop_general.py b/module/shop/shop_general.py index 04375290f..f0a7429c6 100644 --- a/module/shop/shop_general.py +++ b/module/shop/shop_general.py @@ -117,7 +117,7 @@ class GeneralShop(ShopClerk, ShopUI, ShopStatus): Returns: bool: whether item is custom """ - if self.config.GeneralShop_ConsumeCoins and self._currency >= 550000: + if self.config.GeneralShop_ConsumeCoins and self._currency >= self.config.GeneralShop_ConsumeCoins: if item.cost == 'Coins': return True From d29f93c1c1e22d157c24f212329881c3b53f05b3 Mon Sep 17 00:00:00 2001 From: somegituser Date: Tue, 23 Jan 2024 14:05:05 +0800 Subject: [PATCH 06/14] add: wararchive Dreamwaker's Butterfly & Mirror Involution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增作战档案: 蝶海梦花&镜位螺旋 --- .../TEMPLATE_DREAMWAKERS_BUTTERFLY.png | Bin 0 -> 54064 bytes .../TEMPLATE_MIRROR_INVOLUTION.png | Bin 0 -> 35337 bytes campaign/Readme.md | 2 + .../war_archives_20200917_cn/campaign_base.py | 129 ++++++++++++++++++ campaign/war_archives_20200917_cn/ht1.py | 89 ++++++++++++ campaign/war_archives_20200917_cn/ht2.py | 84 ++++++++++++ campaign/war_archives_20200917_cn/ht3.py | 94 +++++++++++++ campaign/war_archives_20200917_cn/ht4.py | 111 +++++++++++++++ campaign/war_archives_20200917_cn/ht5.py | 105 ++++++++++++++ campaign/war_archives_20200917_cn/ht6.py | 109 +++++++++++++++ campaign/war_archives_20200917_cn/hts1.py | 86 ++++++++++++ campaign/war_archives_20200917_cn/hts2.py | 82 +++++++++++ campaign/war_archives_20200917_cn/t1.py | 86 ++++++++++++ campaign/war_archives_20200917_cn/t2.py | 96 +++++++++++++ campaign/war_archives_20200917_cn/t3.py | 105 ++++++++++++++ campaign/war_archives_20200917_cn/t4.py | 109 +++++++++++++++ campaign/war_archives_20200917_cn/t5.py | 106 ++++++++++++++ campaign/war_archives_20200917_cn/t6.py | 101 ++++++++++++++ campaign/war_archives_20200917_cn/ts1.py | 83 +++++++++++ campaign/war_archives_20200917_cn/ts2.py | 82 +++++++++++ campaign/war_archives_20210527_cn/a1.py | 70 ++++++++++ campaign/war_archives_20210527_cn/a2.py | 75 ++++++++++ campaign/war_archives_20210527_cn/a3.py | 75 ++++++++++ campaign/war_archives_20210527_cn/b1.py | 79 +++++++++++ campaign/war_archives_20210527_cn/b2.py | 76 +++++++++++ campaign/war_archives_20210527_cn/b3.py | 81 +++++++++++ campaign/war_archives_20210527_cn/c1.py | 77 +++++++++++ campaign/war_archives_20210527_cn/c2.py | 81 +++++++++++ campaign/war_archives_20210527_cn/c3.py | 82 +++++++++++ campaign/war_archives_20210527_cn/d1.py | 85 ++++++++++++ campaign/war_archives_20210527_cn/d2.py | 93 +++++++++++++ campaign/war_archives_20210527_cn/d3.py | 100 ++++++++++++++ module/campaign/run.py | 1 + module/config/argument/args.json | 14 +- module/config/i18n/en-US.json | 4 +- module/config/i18n/ja-JP.json | 4 +- module/config/i18n/zh-CN.json | 4 +- module/config/i18n/zh-TW.json | 4 +- module/war_archives/assets.py | 2 + module/war_archives/dictionary.py | 2 + 40 files changed, 2658 insertions(+), 10 deletions(-) create mode 100644 assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png create mode 100644 assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png create mode 100644 campaign/war_archives_20200917_cn/campaign_base.py create mode 100644 campaign/war_archives_20200917_cn/ht1.py create mode 100644 campaign/war_archives_20200917_cn/ht2.py create mode 100644 campaign/war_archives_20200917_cn/ht3.py create mode 100644 campaign/war_archives_20200917_cn/ht4.py create mode 100644 campaign/war_archives_20200917_cn/ht5.py create mode 100644 campaign/war_archives_20200917_cn/ht6.py create mode 100644 campaign/war_archives_20200917_cn/hts1.py create mode 100644 campaign/war_archives_20200917_cn/hts2.py create mode 100644 campaign/war_archives_20200917_cn/t1.py create mode 100644 campaign/war_archives_20200917_cn/t2.py create mode 100644 campaign/war_archives_20200917_cn/t3.py create mode 100644 campaign/war_archives_20200917_cn/t4.py create mode 100644 campaign/war_archives_20200917_cn/t5.py create mode 100644 campaign/war_archives_20200917_cn/t6.py create mode 100644 campaign/war_archives_20200917_cn/ts1.py create mode 100644 campaign/war_archives_20200917_cn/ts2.py create mode 100644 campaign/war_archives_20210527_cn/a1.py create mode 100644 campaign/war_archives_20210527_cn/a2.py create mode 100644 campaign/war_archives_20210527_cn/a3.py create mode 100644 campaign/war_archives_20210527_cn/b1.py create mode 100644 campaign/war_archives_20210527_cn/b2.py create mode 100644 campaign/war_archives_20210527_cn/b3.py create mode 100644 campaign/war_archives_20210527_cn/c1.py create mode 100644 campaign/war_archives_20210527_cn/c2.py create mode 100644 campaign/war_archives_20210527_cn/c3.py create mode 100644 campaign/war_archives_20210527_cn/d1.py create mode 100644 campaign/war_archives_20210527_cn/d2.py create mode 100644 campaign/war_archives_20210527_cn/d3.py diff --git a/assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png b/assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png new file mode 100644 index 0000000000000000000000000000000000000000..363ae71062f8453c1e3a642638a8c785b22337ac GIT binary patch literal 54064 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 literal 0 HcmV?d00001 diff --git a/assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png b/assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png new file mode 100644 index 0000000000000000000000000000000000000000..277834964feac64ecc44358652412b63945dd6bf GIT binary patch literal 35337 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 literal 0 HcmV?d00001 diff --git a/campaign/Readme.md b/campaign/Readme.md index 4adb53c05..71371a3ea 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -37,6 +37,8 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20230420 | war archives 20220210 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | 北境序曲 | | 20230511 | war archives 20220414 cn | Aurora Noctis | 永夜幻光 | Aurora Noctis | 極夜照らす幻光 | 永夜幻光 | | 20230831 | war archives 20201229 cn | Inverted Orthant | 负象限作战 | Inverted Orthant | 虚畳なりし限象 | - | +| 20240118 | war archives 20200917 cn | Dreamwaker's Butterfly | 蝶海梦花 | Dreamwaker's Butterfly | 刹那觀る胡蝶の夢 | - | +| 20240118 | war archives 20210527 cn | Mirror Involution | 镜位螺旋 | Mirror Involution | 照らす螺旋の鏡海 | - | | 20200227 | event 20200227 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | - | | 20200312 | event 20200312 cn | The Solomon Ranger | 复刻斯图尔特的硝烟 | The Solomon Ranger Rerun | 南洋に靡く硝煙(復刻) | - | | 20200326 | event 20200326 cn | Microlayer Medley | 微层混合 | Microlayer Medley | 闇靄払う銀翼 | - | diff --git a/campaign/war_archives_20200917_cn/campaign_base.py b/campaign/war_archives_20200917_cn/campaign_base.py new file mode 100644 index 000000000..97465d2d8 --- /dev/null +++ b/campaign/war_archives_20200917_cn/campaign_base.py @@ -0,0 +1,129 @@ +from module.base.button import Button +from module.base.utils import * +from ..campaign_war_archives.campaign_base import CampaignBase as CampaignBase_ +from module.exception import CampaignNameError +from module.logger import logger + +# Here manually type coordinates, because the ball appears in event Dreamwaker's Butterfly only. +BALL = Button(area=(571, 283, 696, 387), color=(), button=(597, 274, 671, 343)) + + +class CampaignBase(CampaignBase_): + STAGE_INCREASE = [ + 'TS1 > T1 > T2 > T3 > T4 > TS2 > T5 > T6', + 'HTS1 > HT1 > HT2 > HT3', + 'HT4 > HTS2 > HT5 > HT6', + ] + + def campaign_set_chapter(self, name, mode='normal'): + """ + Args: + name (str): Campaign name, such as '7-2', 'd3', 'sp3'. + mode (str): 'normal' or 'hard'. + """ + chapter, stage = self._campaign_separate_name(name) + name = chapter + stage + + if chapter.isdigit(): + self.ui_goto_campaign() + self.campaign_ensure_mode('normal') + self.campaign_ensure_chapter(index=chapter) + if mode == 'hard': + self.campaign_ensure_mode('hard') + + elif chapter in 'abcd' or chapter == 'ex_sp': + self.ui_goto_event() + if chapter in 'ab': + self.campaign_ensure_mode('normal') + elif chapter in 'cd': + self.campaign_ensure_mode('hard') + elif chapter == 'ex_sp': + self.campaign_ensure_mode('ex') + self.campaign_ensure_chapter(index=chapter) + + elif chapter == 'sp': + self.ui_goto_sp() + self.campaign_ensure_chapter(index=chapter) + + elif chapter in ['t', 'ts', 'ht', 'hts']: + self.ui_goto_event() + # Campaign ball + if stage in ['1', '6']: + self._campaign_ball_set('blue') + else: + self._campaign_ball_set('red') + # Campaign mode + if chapter in ['t', 'ts']: + self.campaign_ensure_mode('normal') + if chapter in ['ht', 'hts']: + self.campaign_ensure_mode('hard') + if chapter == 'ex_sp': + self.campaign_ensure_mode('ex') + # Get stage + self.campaign_ensure_chapter(index=1) + else: + logger.warning(f'Unknown campaign chapter: {name}') + + @staticmethod + def _campaign_get_chapter_index(name): + """ + Args: + name (str, int): + + Returns: + int + """ + if isinstance(name, int): + return name + else: + if name.isdigit(): + return int(name) + elif name in ['a', 'c', 'sp', 'ex_sp', 'ts', 't', 'ht', 'hts']: + return 1 + elif name in ['b', 'd', 'ex_ex']: + return 2 + else: + raise CampaignNameError + + def _campaign_ball_get(self): + """ + Returns: + str: 'blue' or 'red'. + """ + color = get_color(self.device.image, BALL.area) + # Blue: (93, 127, 182), Red: (186, 116, 124) + index = np.argmax(color) + if index == 0: + return 'red' + elif index == 2: + return 'blue' + else: + logger.warning(f'Unknown campaign ball color: {color}') + return 'unknown' + + def _campaign_ball_set(self, status): + """ + Args: + status (str): 'blue' or 'red'. + """ + skip_first_screenshot = True + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + current = self._campaign_ball_get() + logger.attr('Campaign_ball', current) + + if current == status: + break + else: + if self.is_in_stage(): + self.device.click(BALL) + self.device.sleep(3) + # wait until is_in_stage + while 1: + self.device.screenshot() + if self.is_in_stage(): + break diff --git a/campaign/war_archives_20200917_cn/ht1.py b/campaign/war_archives_20200917_cn/ht1.py new file mode 100644 index 000000000..47552a5fb --- /dev/null +++ b/campaign/war_archives_20200917_cn/ht1.py @@ -0,0 +1,89 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase + +MAP = CampaignMap('HT1') +MAP.shape = 'K7' +# MAP.camera_data = ['D2', 'D5', 'H2', 'H5'] +MAP.camera_data = ['D3', 'D5', 'H3', 'H5'] +MAP.camera_data_spawn_point = ['H5', 'D5'] +MAP.map_data = """ + -- -- ++ -- -- MB -- -- ++ -- -- + -- ++ ++ ++ Me -- Me ++ ++ ++ -- + ++ Me -- ++ ++ -- ++ ++ -- Me ++ + ME -- ME ++ ++ -- ++ ++ ME -- ME + -- -- -- ME MS -- MS ME -- -- -- + ME -- MS -- -- __ -- -- MS -- ME + ++ Me -- -- SP -- SP -- -- Me ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['blue'] + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_WALK_USE_CURRENT_FLEET = True + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ht2.py b/campaign/war_archives_20200917_cn/ht2.py new file mode 100644 index 000000000..9e49b92a3 --- /dev/null +++ b/campaign/war_archives_20200917_cn/ht2.py @@ -0,0 +1,84 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT2') +MAP.shape = 'H7' +# MAP.camera_data = ['D2', 'D5', 'E2', 'E5'] +MAP.camera_data = ['D3', 'D5', 'E3', 'E5'] +MAP.camera_data_spawn_point = ['E5'] +MAP.portal_data = [('E5', 'E1'), ('E1', 'E5')] +MAP.map_data = """ + -- ++ -- ME -- ME ++ ++ + ME -- Me __ -- -- MB ++ + -- -- -- -- ME -- ++ ME + ++ ME ++ ++ ++ ++ MS -- + -- ++ Me Me -- Me -- ME + MS -- -- -- -- -- -- ++ + -- ME ++ ++ SP SP -- MS +""" +MAP.map_data_loop = """ + -- ++ -- ME -- ME ++ ++ + ME -- Me __ -- -- MB ++ + -- -- -- -- ME -- ++ ME + ++ ME ++ -- -- -- MS -- + -- ++ Me Me -- Me -- ME + MS -- -- -- -- -- -- ++ + -- ME ++ ++ SP SP -- MS +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 10 20 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'CAred'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ht3.py b/campaign/war_archives_20200917_cn/ht3.py new file mode 100644 index 000000000..7963c6e05 --- /dev/null +++ b/campaign/war_archives_20200917_cn/ht3.py @@ -0,0 +1,94 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT3') +MAP.shape = 'I9' +# MAP.camera_data = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +# MAP.camera_data_spawn_point = ['D7', 'D6'] +MAP.camera_data = ['D3', 'D5', 'D7', 'F3', 'F5', 'F7'] +MAP.camera_data_spawn_point = ['D5'] +MAP.portal_data = [('I2', 'A1'), ('A1', 'I2'), ('I9', 'H1'), ('H1', 'I9')] +MAP.map_data = """ + -- -- -- ++ ME -- ME -- ++ + -- -- MB ++ -- -- -- -- -- + ++ ++ ++ ++ -- ++ ++ -- ME + -- MS -- Me -- Me ++ -- -- + ME -- ++ -- __ -- -- -- ME + -- -- SP -- -- Me ++ ++ ++ + Me -- -- SP ++ -- ++ MB -- + -- MS -- -- -- MS ++ -- -- + ++ -- Me -- ME -- ++ -- -- +""" +MAP.map_data_loop = """ + -- -- -- -- ME -- ME -- ++ + -- -- MB -- -- -- -- -- -- + ++ ++ ++ -- -- ++ ++ -- ME + -- MS -- Me -- Me ++ -- -- + ME -- ++ -- __ -- -- -- ME + -- -- SP -- -- Me -- -- -- + Me -- -- SP ++ -- ++ MB -- + -- MS -- -- -- MS ++ -- -- + ++ -- Me -- ME -- ++ -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'CAred'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ht4.py b/campaign/war_archives_20200917_cn/ht4.py new file mode 100644 index 000000000..45f874dfb --- /dev/null +++ b/campaign/war_archives_20200917_cn/ht4.py @@ -0,0 +1,111 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT4') +MAP.shape = 'K9' +MAP.camera_data = ['D2', 'D5', 'D7', 'H2', 'H5', 'H7'] +MAP.camera_data_spawn_point = ['D2', 'D7'] +MAP.portal_data = [('I5', 'C5'), ('C5', 'I5'), ('E5', 'E3'), ('E3', 'E5'), ('G5', 'G7'), ('G7', 'G5')] +MAP.map_data = """ + Me -- -- ++ Me -- ME -- ME ++ ++ + -- MS -- ++ -- SP -- __ -- MS -- + -- -- Me ++ -- -- -- ME -- -- -- + ME -- ++ ++ ++ ++ ++ ++ ++ -- ME + -- -- -- ++ -- MB -- ++ -- -- -- + ME -- ++ ++ ++ ++ ++ ++ ++ -- ME + -- -- -- ME -- -- -- ++ Me -- -- + -- MS -- __ -- SP -- ++ -- MS -- + ++ ++ ME -- ME -- Me ++ -- -- Me +""" +MAP.map_data_loop = """ + Me -- -- ++ Me -- ME -- ME ++ ++ + -- MS -- -- -- SP -- __ -- MS -- + -- -- Me ++ -- -- -- ME -- -- -- + ME -- ++ ++ -- ++ -- ++ ++ -- ME + -- -- -- ++ -- MB -- ++ -- -- -- + ME -- ++ ++ -- ++ -- ++ ++ -- ME + -- -- -- ME -- -- -- ++ Me -- -- + -- MS -- __ -- SP -- -- -- MS -- + ++ ++ ME -- ME -- Me ++ -- -- Me +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 10 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BB', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.82 + MAP_SWIPE_MULTIPLY = 1.88 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.config.MAP_HAS_MOVABLE_ENEMY: + self.fleet_2_push_forward() + + if self.clear_siren(): + return True + if self.map_is_clear_mode: + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(1,)): + return True + + return self.battle_default() + + def battle_2(self): + if self.clear_siren(): + return True + if self.map_is_clear_mode: + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(1,)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ht5.py b/campaign/war_archives_20200917_cn/ht5.py new file mode 100644 index 000000000..c928c2252 --- /dev/null +++ b/campaign/war_archives_20200917_cn/ht5.py @@ -0,0 +1,105 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT5') +MAP.shape = 'I9' +# MAP.camera_data = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +# MAP.camera_data_spawn_point = ['F7', 'D2'] +MAP.camera_data = ['D3', 'D5', 'D7', 'F3', 'F5', 'F7'] +MAP.camera_data_spawn_point = ['F7', 'D3'] +MAP.portal_data = [('D3', 'F3'), ('G4', 'G6'), ('F7', 'D7'), ('C6', 'C4')] +MAP.map_data = """ + ++ -- -- -- ++ -- MB -- ++ + -- ME -- ME ++ MS -- MS -- + Me -- SP -- ++ -- __ -- -- + -- ME -- Me ++ Me -- ME -- + ++ ++ ++ ++ -- ++ ++ ++ ++ + -- ME -- Me ++ Me -- ME -- + -- -- __ -- ++ -- SP -- Me + -- MS -- MS ++ ME -- ME -- + ++ -- MB -- ++ -- -- -- ++ +""" +MAP.map_data_loop = """ + ++ -- -- -- ++ -- MB -- ++ + -- ME -- ME ++ MS -- MS -- + Me -- SP -- -- -- __ -- -- + -- ME -- Me ++ Me -- ME -- + ++ ++ -- ++ -- ++ -- ++ ++ + -- ME -- Me ++ Me -- ME -- + -- -- __ -- -- -- SP -- Me + -- MS -- MS ++ ME -- ME -- + ++ -- MB -- ++ -- -- -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BB', 'CV'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.map_is_clear_mode: + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(1,)): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ht6.py b/campaign/war_archives_20200917_cn/ht6.py new file mode 100644 index 000000000..6e062757f --- /dev/null +++ b/campaign/war_archives_20200917_cn/ht6.py @@ -0,0 +1,109 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT6') +MAP.shape = 'K10' +# MAP.camera_data = ['D2', 'D6', 'D8', 'H2', 'H6', 'H8'] +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D6', 'G6'] +MAP.map_data = """ + -- -- -- ME -- Me -- ME -- -- -- + -- ++ ++ -- MS -- MS -- ++ ++ -- + -- ++ ME -- -- __ -- -- ME ++ -- + Me -- -- ++ ++ -- ++ ++ -- -- Me + ++ ME -- ++ MS -- MS ++ -- ME ++ + ++ ME -- -- -- MB -- -- -- ME ++ + -- -- ++ Me -- -- -- Me ++ -- -- + -- ++ ++ ++ SP -- SP ++ ++ ++ -- + ++ -- -- ++ ++ -- ++ ++ -- -- ++ + -- -- -- ++ ++ -- ++ ++ -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, K10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['BB', 'CV', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.446 + MAP_SWIPE_MULTIPLY = 1.495 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + + if self.clear_siren(): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(1,)): + return True + + return self.battle_default() + + def battle_2(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(1,)): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20200917_cn/hts1.py b/campaign/war_archives_20200917_cn/hts1.py new file mode 100644 index 000000000..18d0c2144 --- /dev/null +++ b/campaign/war_archives_20200917_cn/hts1.py @@ -0,0 +1,86 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase + +MAP = CampaignMap('HTS1') +MAP.shape = 'H6' +MAP.camera_data = ['D2', 'D4', 'E2', 'E4'] +MAP.camera_data_spawn_point = ['E4'] +MAP.map_data = """ + MB -- ++ ++ ++ ++ -- -- + -- ME -- -- -- ++ ++ ++ + ++ -- -- -- Me -- -- ++ + ++ ++ ++ ++ -- -- ME -- + -- -- -- -- ++ ++ -- SP + -- ++ -- -- -- ++ SP -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 1}, + {'battle': 1, 'enemy': 1}, + # {'battle': 2, 'siren': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + # MAP_SIREN_TEMPLATE = ['srzl2'] + # MOVABLE_ENEMY_TURN = (0,) + # MAP_HAS_SIREN = True + # MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['blue'] + FLEET_2 = 0 + MAP_IS_ONE_TIME_STAGE = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/hts2.py b/campaign/war_archives_20200917_cn/hts2.py new file mode 100644 index 000000000..a8dc704ec --- /dev/null +++ b/campaign/war_archives_20200917_cn/hts2.py @@ -0,0 +1,82 @@ +from module.exception import CampaignEnd +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .hts1 import Config as ConfigBase + +MAP = CampaignMap('HTS2') +MAP.shape = 'H8' +MAP.camera_data = ['D2', 'D6', 'E2', 'E6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ MM -- -- -- -- -- -- + ++ ++ ++ ++ -- -- -- ++ + -- -- -- -- -- ++ -- ++ + -- -- -- ++ ++ ++ -- ++ + -- ++ -- -- ++ -- -- -- + -- -- ++ -- -- ++ -- ++ + -- -- SP ++ MM ++ -- ++ + MM -- -- ++ ++ ++ -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + self.goto(A8, expected='story') + self.goto(E7, expected='story') + self.goto(B1, expected='story') + self.goto(G8, expected='story') + + raise CampaignEnd() diff --git a/campaign/war_archives_20200917_cn/t1.py b/campaign/war_archives_20200917_cn/t1.py new file mode 100644 index 000000000..fbbcd2eee --- /dev/null +++ b/campaign/war_archives_20200917_cn/t1.py @@ -0,0 +1,86 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase + +MAP = CampaignMap('T1') +MAP.shape = 'K7' +# MAP.camera_data = ['D2', 'D5', 'H2', 'H5'] +MAP.camera_data = ['D3', 'D5', 'H3', 'H5'] +MAP.camera_data_spawn_point = ['H5', 'D5'] +MAP.map_data = """ + -- -- ++ -- -- MB -- -- ++ -- -- + -- ++ ++ ++ Me -- Me ++ ++ ++ -- + ++ Me -- ++ ++ -- ++ ++ -- Me ++ + ME -- ME ++ ++ -- ++ ++ ME -- ME + -- -- -- ME MS -- MS ME -- -- -- + ME -- MS -- -- __ -- -- MS -- ME + ++ Me -- -- SP -- SP -- -- Me ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1, 'boss': 1}, + {'battle': 4, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['DD', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['blue'] + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_WALK_USE_CURRENT_FLEET = True + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/t2.py b/campaign/war_archives_20200917_cn/t2.py new file mode 100644 index 000000000..adcf86e83 --- /dev/null +++ b/campaign/war_archives_20200917_cn/t2.py @@ -0,0 +1,96 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T2') +MAP.shape = 'H7' +# MAP.camera_data = ['D2', 'D5', 'E2', 'E5'] +MAP.camera_data = ['D3', 'D5', 'E3', 'E5'] +MAP.camera_data_spawn_point = ['E5'] +MAP.portal_data = [('E5', 'E1'), ('E1', 'E5')] +MAP.map_data = """ + -- ++ -- ME -- ME ++ ++ + ME -- Me __ -- -- MB ++ + -- -- -- -- ME -- ++ ME + ++ ME ++ ++ ++ ++ MS -- + -- ++ Me Me -- Me -- ME + MS -- -- -- -- -- -- ++ + -- ME ++ ++ SP SP -- MS +""" +MAP.map_data_loop = """ + -- ++ -- ME -- ME ++ ++ + ME -- Me __ -- -- MB ++ + -- -- -- -- ME -- ++ ME + ++ ME ++ -- -- -- MS -- + -- ++ Me Me -- Me -- ME + MS -- -- -- -- -- -- ++ + -- ME ++ ++ SP SP -- MS +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/t3.py b/campaign/war_archives_20200917_cn/t3.py new file mode 100644 index 000000000..81bf22941 --- /dev/null +++ b/campaign/war_archives_20200917_cn/t3.py @@ -0,0 +1,105 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T3') +MAP.shape = 'I9' +# MAP.camera_data = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +# MAP.camera_data_spawn_point = ['D7', 'D6'] +MAP.camera_data = ['D3', 'D5', 'D7', 'F3', 'F5', 'F7'] +MAP.camera_data_spawn_point = ['D5'] +MAP.portal_data = [('I2', 'A1'), ('A1', 'I2'), ('I9', 'H1'), ('H1', 'I9')] +MAP.map_data = """ + -- -- -- ++ ME -- ME -- ++ + -- -- MB ++ -- -- -- -- -- + ++ ++ ++ ++ -- ++ ++ -- ME + -- MS -- Me -- Me ++ -- -- + ME -- ++ -- __ -- -- -- ME + -- -- SP -- -- Me ++ ++ ++ + Me -- -- SP ++ -- ++ MB -- + -- MS -- -- -- MS ++ -- -- + ++ -- Me -- ME -- ++ -- -- +""" +MAP.map_data_loop = """ + -- -- -- -- ME -- ME -- ++ + -- -- MB -- -- -- -- -- -- + ++ ++ ++ -- -- ++ ++ -- ME + -- MS -- Me -- Me ++ -- -- + ME -- ++ -- __ -- -- -- ME + -- -- SP -- -- Me -- -- -- + Me -- -- SP ++ -- ++ MB -- + -- MS -- -- -- MS ++ -- -- + ++ -- Me -- ME -- ++ -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CAred'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/t4.py b/campaign/war_archives_20200917_cn/t4.py new file mode 100644 index 000000000..7bed81f24 --- /dev/null +++ b/campaign/war_archives_20200917_cn/t4.py @@ -0,0 +1,109 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T4') +MAP.shape = 'K9' +MAP.camera_data = ['D2', 'D5', 'D7', 'H2', 'H5', 'H7'] +MAP.camera_data_spawn_point = ['D2', 'D7'] +MAP.portal_data = [('I5', 'C5'), ('C5', 'I5'), ('E5', 'E3'), ('E3', 'E5'), ('G5', 'G7'), ('G7', 'G5')] +MAP.map_data = """ + Me -- -- ++ Me -- ME -- ME ++ ++ + -- MS -- ++ -- SP -- __ -- MS -- + -- -- Me ++ -- -- -- ME -- -- -- + ME -- ++ ++ ++ ++ ++ ++ ++ -- ME + -- -- -- ++ -- MB -- ++ -- -- -- + ME -- ++ ++ ++ ++ ++ ++ ++ -- ME + -- -- -- ME -- -- -- ++ Me -- -- + -- MS -- __ -- SP -- ++ -- MS -- + ++ ++ ME -- ME -- Me ++ -- -- Me +""" +MAP.map_data_loop = """ + Me -- -- ++ Me -- ME -- ME ++ ++ + -- MS -- -- -- SP -- __ -- MS -- + -- -- Me ++ -- -- -- ME -- -- -- + ME -- ++ ++ -- ++ -- ++ ++ -- ME + -- -- -- ++ -- MB -- ++ -- -- -- + ME -- ++ ++ -- ++ -- ++ ++ -- ME + -- -- -- ME -- -- -- ++ Me -- -- + -- MS -- __ -- SP -- -- -- MS -- + ++ ++ ME -- ME -- Me ++ -- -- Me +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 10 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2, 'boss': 1}, + {'battle': 5, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.82 + MAP_SWIPE_MULTIPLY = 1.88 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.config.MAP_HAS_MOVABLE_ENEMY: + self.fleet_2_push_forward() + + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/t5.py b/campaign/war_archives_20200917_cn/t5.py new file mode 100644 index 000000000..682d6de26 --- /dev/null +++ b/campaign/war_archives_20200917_cn/t5.py @@ -0,0 +1,106 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T5') +MAP.shape = 'I9' +# MAP.camera_data = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +# MAP.camera_data_spawn_point = ['F7', 'D2'] +MAP.camera_data = ['D3', 'D5', 'D7', 'F3', 'F5', 'F7'] +MAP.camera_data_spawn_point = ['F7', 'D3'] +MAP.portal_data = [('D3', 'F3'), ('G4', 'G6'), ('F7', 'D7'), ('C6', 'C4')] +MAP.map_data = """ + ++ -- -- -- ++ -- MB -- ++ + -- ME -- ME ++ MS -- MS -- + Me -- SP -- ++ -- __ -- -- + -- ME -- Me ++ Me -- ME -- + ++ ++ ++ ++ -- ++ ++ ++ ++ + -- ME -- Me ++ Me -- ME -- + -- -- __ -- ++ -- SP -- Me + -- MS -- MS ++ ME -- ME -- + ++ -- MB -- ++ -- -- -- ++ +""" +MAP.map_data_loop = """ + ++ -- -- -- ++ -- MB -- ++ + -- ME -- ME ++ MS -- MS -- + Me -- SP -- -- -- __ -- -- + -- ME -- Me ++ Me -- ME -- + ++ ++ -- ++ -- ++ -- ++ ++ + -- ME -- Me ++ Me -- ME -- + -- -- __ -- -- -- SP -- Me + -- MS -- MS ++ ME -- ME -- + ++ -- MB -- ++ -- -- -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'CAred'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_PORTAL = True + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20200917_cn/t6.py b/campaign/war_archives_20200917_cn/t6.py new file mode 100644 index 000000000..586a2c81f --- /dev/null +++ b/campaign/war_archives_20200917_cn/t6.py @@ -0,0 +1,101 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T6') +MAP.shape = 'K10' +# MAP.camera_data = ['D2', 'D6', 'D8', 'H2', 'H6', 'H8'] +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D6', 'G6'] +MAP.map_data = """ + -- -- -- ME -- Me -- ME -- -- -- + -- ++ ++ -- MS -- MS -- ++ ++ -- + -- ++ ME -- -- __ -- -- ME ++ -- + Me -- -- ++ ++ -- ++ ++ -- -- Me + ++ ME -- ++ MS -- MS ++ -- ME ++ + ++ ME -- -- -- MB -- -- -- ME ++ + -- -- ++ Me -- -- -- Me ++ -- -- + -- ++ ++ ++ SP -- SP ++ ++ ++ -- + ++ -- -- ++ ++ -- ++ ++ -- -- ++ + -- -- -- ++ ++ -- ++ ++ -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, K10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CA', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.446 + MAP_SWIPE_MULTIPLY = 1.495 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(1,)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ts1.py b/campaign/war_archives_20200917_cn/ts1.py new file mode 100644 index 000000000..0cbef5675 --- /dev/null +++ b/campaign/war_archives_20200917_cn/ts1.py @@ -0,0 +1,83 @@ +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase + +MAP = CampaignMap('TS1') +MAP.shape = 'H6' +MAP.camera_data = ['D2', 'D4', 'E2', 'E4'] +MAP.camera_data_spawn_point = ['E4'] +MAP.map_data = """ + MB -- ++ ++ ++ ++ -- -- + -- ME -- -- -- ++ ++ ++ + ++ -- -- -- Me -- -- ++ + ++ ++ ++ ++ -- -- ME -- + -- -- -- -- ++ ++ -- SP + -- ++ -- -- -- ++ SP -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 1}, + {'battle': 1, 'enemy': 1}, + # {'battle': 2, 'siren': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + # MAP_SIREN_TEMPLATE = ['srzl2'] + # MOVABLE_ENEMY_TURN = (0,) + # MAP_HAS_SIREN = True + # MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['blue'] + FLEET_2 = 0 + MAP_IS_ONE_TIME_STAGE = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20200917_cn/ts2.py b/campaign/war_archives_20200917_cn/ts2.py new file mode 100644 index 000000000..7fa487ff5 --- /dev/null +++ b/campaign/war_archives_20200917_cn/ts2.py @@ -0,0 +1,82 @@ +from module.exception import CampaignEnd +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .campaign_base import CampaignBase +from .ts1 import Config as ConfigBase + +MAP = CampaignMap('TS2') +MAP.shape = 'H8' +MAP.camera_data = ['D2', 'D6', 'E2', 'E6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ MM -- -- -- -- -- -- + ++ ++ ++ ++ -- -- -- ++ + -- -- -- -- -- ++ -- ++ + -- -- -- ++ ++ ++ -- ++ + -- ++ -- -- ++ -- -- -- + -- -- ++ -- -- ++ -- ++ + -- -- SP ++ MM ++ -- ++ + MM -- -- ++ ++ ++ -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + self.goto(A8, expected='story') + self.goto(E7, expected='story') + self.goto(B1, expected='story') + self.goto(G8, expected='story') + + raise CampaignEnd() diff --git a/campaign/war_archives_20210527_cn/a1.py b/campaign/war_archives_20210527_cn/a1.py new file mode 100644 index 000000000..f550a6693 --- /dev/null +++ b/campaign/war_archives_20210527_cn/a1.py @@ -0,0 +1,70 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('A1') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ++ ++ -- ME -- Me ++ -- -- + ++ ++ Me -- -- -- -- -- SP + ME -- -- -- ++ MS -- ME SP + -- -- ME -- ++ __ ME -- ++ + MB -- ++ MS -- ME -- -- -- + -- -- -- -- ME -- Me ++ ME + -- ++ -- ME -- -- -- ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1, 'boss': 1}, + {'battle': 4, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Dewey'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.778 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.719 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210527_cn/a2.py b/campaign/war_archives_20210527_cn/a2.py new file mode 100644 index 000000000..7a4d812ab --- /dev/null +++ b/campaign/war_archives_20210527_cn/a2.py @@ -0,0 +1,75 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A2') +MAP.shape = 'H8' +MAP.camera_data = ['D2', 'D6', 'E2', 'E6'] +MAP.camera_data_spawn_point = ['E6', 'D6'] +MAP.map_data = """ + -- ++ ++ ++ -- MB -- ++ + -- ME -- ME -- ME -- -- + ++ -- MS -- ME ++ Me -- + -- Me ++ -- Me -- -- -- + ME -- ++ ME -- __ ME MS + -- MS -- Me -- ++ -- -- + ++ -- ME -- -- -- ME ++ + ++ -- -- SP SP -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['DD'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.512 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.462 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210527_cn/a3.py b/campaign/war_archives_20210527_cn/a3.py new file mode 100644 index 000000000..f639acd8a --- /dev/null +++ b/campaign/war_archives_20210527_cn/a3.py @@ -0,0 +1,75 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6', 'D6'] +MAP.map_data = """ + ++ ++ -- ++ ++ -- -- ME ++ ++ + -- -- MB -- ME -- MS -- ++ ++ + -- ME -- ME MS Me -- ME -- -- + -- ++ -- ++ -- __ -- Me -- MS + ME ++ -- ++ ME Me ++ -- ME -- + -- -- -- Me -- -- ME -- -- -- + -- ME -- -- SP ++ -- ++ SP ++ + -- ++ ++ ++ -- SP -- SP -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.512 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.462 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210527_cn/b1.py b/campaign/war_archives_20210527_cn/b1.py new file mode 100644 index 000000000..450ed9faf --- /dev/null +++ b/campaign/war_archives_20210527_cn/b1.py @@ -0,0 +1,79 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('B1') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D2', 'D6'] +MAP.map_data = """ + -- ME -- ME -- -- -- -- ++ ++ + ++ -- MS -- -- Me -- -- MB ++ + ++ -- -- MS Me ++ -- Me -- -- + SP -- ME -- ME -- ME ++ -- ++ + SP -- ++ ++ -- __ -- ++ -- ME + -- -- ++ ++ Me ME -- ME -- -- + ME -- MS -- -- -- Me -- ++ ++ + -- ++ -- ME -- MS -- ++ ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2, 'boss': 1}, + {'battle': 5, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Hammann', 'CL'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210527_cn/b2.py b/campaign/war_archives_20210527_cn/b2.py new file mode 100644 index 000000000..4e55be47b --- /dev/null +++ b/campaign/war_archives_20210527_cn/b2.py @@ -0,0 +1,76 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B2') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6'] +MAP.map_data = """ + ++ ++ -- ME -- -- MS ++ ++ ++ + ++ ++ -- ++ ++ -- -- -- -- ME + -- Me -- -- ME -- Me -- ++ -- + ME ++ MS MB -- -- ME -- ++ -- + -- ++ -- -- ME __ -- MS ++ ME + -- ++ -- Me -- -- Me -- -- -- + ME -- ME -- -- ++ ++ -- -- SP + ++ ++ ++ MS -- ME -- -- SP ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Atlanta', 'CL'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.523 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.472 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210527_cn/b3.py b/campaign/war_archives_20210527_cn/b3.py new file mode 100644 index 000000000..0dd6f7a45 --- /dev/null +++ b/campaign/war_archives_20210527_cn/b3.py @@ -0,0 +1,81 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B3') +MAP.shape = 'I9' +MAP.camera_data = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +MAP.camera_data_spawn_point = ['F7', 'D7'] +MAP.map_data = """ + ++ -- ME -- -- -- ME -- ++ + ++ ++ ++ -- MB -- ++ ++ ++ + ME -- -- -- ++ -- -- -- ME + -- ME Me -- Me -- Me ME -- + -- ++ ++ -- __ -- ++ ++ -- + MS ++ ++ -- Me -- ++ ++ MS + -- ME MS -- -- -- MS ME -- + ME Me -- ++ -- ++ -- Me ME + ++ -- -- SP -- SP -- -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Dewey', 'Northampton', 'CA'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.477 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.428 + INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40 + # EDGE_LINES_HOUGHLINES_THRESHOLD = 40 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210527_cn/c1.py b/campaign/war_archives_20210527_cn/c1.py new file mode 100644 index 000000000..b74817698 --- /dev/null +++ b/campaign/war_archives_20210527_cn/c1.py @@ -0,0 +1,77 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('C1') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ++ ++ -- ME -- Me ++ -- -- + ++ ++ Me -- -- -- -- -- SP + ME -- -- -- ++ MS -- ME SP + -- -- ME -- ++ __ ME -- ++ + MB -- ++ MS -- ME -- -- -- + -- -- -- -- ME -- Me ++ ME + -- ++ -- ME -- -- -- ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Dewey', 'CA'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.778 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.719 + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210527_cn/c2.py b/campaign/war_archives_20210527_cn/c2.py new file mode 100644 index 000000000..583f5ffb8 --- /dev/null +++ b/campaign/war_archives_20210527_cn/c2.py @@ -0,0 +1,81 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C2') +MAP.shape = 'H8' +MAP.camera_data = ['D2', 'D6', 'E2', 'E6'] +MAP.camera_data_spawn_point = ['E6', 'D6'] +MAP.map_data = """ + -- ++ ++ ++ -- MB -- ++ + -- ME -- ME -- ME -- -- + ++ -- MS -- ME ++ Me -- + -- Me ++ -- Me -- -- -- + ME -- ++ ME -- __ ME MS + -- MS -- Me -- ++ -- -- + ++ -- ME -- -- -- ME ++ + ++ -- -- SP SP -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Atlanta', 'CA'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.512 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.462 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210527_cn/c3.py b/campaign/war_archives_20210527_cn/c3.py new file mode 100644 index 000000000..8d7870d0f --- /dev/null +++ b/campaign/war_archives_20210527_cn/c3.py @@ -0,0 +1,82 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6', 'D6'] +MAP.map_data = """ + ++ ++ -- ++ ++ -- -- ME ++ ++ + -- -- MB -- ME -- MS -- ++ ++ + -- ME -- ME MS Me -- ME -- -- + -- ++ -- ++ -- __ -- Me -- MS + ME ++ -- ++ ME Me ++ -- ME -- + -- -- -- Me -- -- ME -- -- -- + -- ME -- -- SP ++ -- ++ SP ++ + -- ++ ++ ++ -- SP -- SP -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Northampton', 'CA', 'BB'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.512 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.462 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210527_cn/d1.py b/campaign/war_archives_20210527_cn/d1.py new file mode 100644 index 000000000..28114906d --- /dev/null +++ b/campaign/war_archives_20210527_cn/d1.py @@ -0,0 +1,85 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('D1') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D2', 'D6'] +MAP.map_data = """ + -- ME -- ME -- -- -- -- ++ ++ + ++ -- MS -- -- Me -- -- MB ++ + ++ -- -- MS Me ++ -- Me -- -- + SP -- ME -- ME -- ME ++ -- ++ + SP -- ++ ++ -- __ -- ++ -- ME + -- -- ++ ++ Me ME -- ME -- -- + ME -- MS -- -- -- Me -- ++ ++ + -- ++ -- ME -- MS -- ++ ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Hammann', 'Atlanta', 'CA'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210527_cn/d2.py b/campaign/war_archives_20210527_cn/d2.py new file mode 100644 index 000000000..5029fd762 --- /dev/null +++ b/campaign/war_archives_20210527_cn/d2.py @@ -0,0 +1,93 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D2') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6'] +MAP.map_data = """ + ++ ++ -- ME -- -- MS ++ ++ ++ + ++ ++ -- ++ ++ -- -- -- -- ME + -- Me -- -- ME -- Me -- ++ -- + ME ++ MS MB -- -- ME -- ++ -- + -- ++ -- -- ME __ -- MS ++ ME + -- ++ -- Me -- -- Me -- -- -- + ME -- ME -- -- ++ ++ -- -- SP + ++ ++ ++ MS -- ME -- -- SP ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Dewey', 'Northampton', 'BB'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.523 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.472 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210527_cn/d3.py b/campaign/war_archives_20210527_cn/d3.py new file mode 100644 index 000000000..b8c4419c9 --- /dev/null +++ b/campaign/war_archives_20210527_cn/d3.py @@ -0,0 +1,100 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D3') +MAP.shape = 'I9' +MAP.camera_data = ['D2', 'D6', 'D7', 'F2', 'F6', 'F7'] +MAP.camera_data_spawn_point = ['F7', 'D7'] +MAP.map_data = """ + ++ -- ME -- -- -- ME -- ++ + ++ ++ ++ -- MB -- ++ ++ ++ + ME -- -- -- ++ -- -- -- ME + -- ME Me -- Me -- Me ME -- + -- ++ ++ -- __ -- ++ ++ -- + MS ++ ++ -- Me -- ++ ++ MS + -- ME MS -- -- -- MS ME -- + ME Me -- ++ -- ++ -- Me ME + ++ -- -- SP -- SP -- -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Atlanta', 'Northampton', 'CV'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = 1.477 + MAP_SWIPE_MULTIPLY_MINITOUCH = 1.428 + INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40 + # EDGE_LINES_HOUGHLINES_THRESHOLD = 40 + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.fleet_2_protect(): + return True + if self.clear_siren(): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/module/campaign/run.py b/module/campaign/run.py index b1956f5b1..134c0f121 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -228,6 +228,7 @@ class CampaignRun(CampaignEvent): 'event_20200917_cn', 'event_20221124_cn', 'event_20230525_cn', + 'war_archives_20200917_cn', # chapter T 'event_20211125_cn', 'event_20231026_cn', diff --git a/module/config/argument/args.json b/module/config/argument/args.json index b13a783d9..d142d4ffa 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3383,16 +3383,18 @@ "war_archives_20211014_cn", "war_archives_20211028_cn", "war_archives_20220210_cn", - "war_archives_20220414_cn" + "war_archives_20220414_cn", + "war_archives_20200917_cn", + "war_archives_20210527_cn" ], "option_bold": [ "war_archives_20201229_cn", - "war_archives_20220414_cn" + "war_archives_20210527_cn" ], - "cn": "war_archives_20201229_cn", - "en": "war_archives_20201229_cn", - "jp": "war_archives_20201229_cn", - "tw": "war_archives_20220414_cn" + "cn": "war_archives_20210527_cn", + "en": "war_archives_20210527_cn", + "jp": "war_archives_20210527_cn", + "tw": "war_archives_20210527_cn" }, "Mode": { "type": "select", diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index c387bdfbb..9066dbd56 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -740,7 +740,9 @@ "war_archives_20211014_cn": "archives Crescendo of Polaris", "war_archives_20211028_cn": "archives Skybound Oratorio", "war_archives_20220210_cn": "archives Northern Overture", - "war_archives_20220414_cn": "archives Aurora Noctis" + "war_archives_20220414_cn": "archives Aurora Noctis", + "war_archives_20200917_cn": "archives Dreamwaker's Butterfly", + "war_archives_20210527_cn": "archives Mirror Involution" }, "Mode": { "name": "Level Mode", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 3033718fe..81efc15ac 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -740,7 +740,9 @@ "war_archives_20211014_cn": "檔案 激奏のポラリス", "war_archives_20211028_cn": "檔案 神穹を衝く聖歌", "war_archives_20220210_cn": "檔案 凍絶の北海", - "war_archives_20220414_cn": "檔案 極夜照らす幻光" + "war_archives_20220414_cn": "檔案 極夜照らす幻光", + "war_archives_20200917_cn": "檔案 刹那觀る胡蝶の夢", + "war_archives_20210527_cn": "檔案 照らす螺旋の鏡海" }, "Mode": { "name": "Campaign.Mode.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 08ef51932..d11475c64 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -740,7 +740,9 @@ "war_archives_20211014_cn": "档案 激奏的Polaris", "war_archives_20211028_cn": "档案 穹顶下的圣咏曲", "war_archives_20220210_cn": "档案 北境序曲", - "war_archives_20220414_cn": "档案 永夜幻光" + "war_archives_20220414_cn": "档案 永夜幻光", + "war_archives_20200917_cn": "档案 蝶海梦花", + "war_archives_20210527_cn": "档案 镜位螺旋" }, "Mode": { "name": "关卡模式", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 9acf969e4..70af5f137 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -740,7 +740,9 @@ "war_archives_20211014_cn": "archives Crescendo of Polaris", "war_archives_20211028_cn": "檔案 穹頂下的聖詠曲", "war_archives_20220210_cn": "檔案 北境序曲", - "war_archives_20220414_cn": "檔案 永夜幻光" + "war_archives_20220414_cn": "檔案 永夜幻光", + "war_archives_20200917_cn": "檔案 蝶海夢花", + "war_archives_20210527_cn": "檔案 鏡位螺旋" }, "Mode": { "name": "地圖模式", diff --git a/module/war_archives/assets.py b/module/war_archives/assets.py index c0f66a7d2..f86430741 100644 --- a/module/war_archives/assets.py +++ b/module/war_archives/assets.py @@ -10,6 +10,7 @@ TEMPLATE_AURORA_NOCTIS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE TEMPLATE_CRESCENDO_OF_POLARIS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_CRESCENDO_OF_POLARIS.png', 'en': './assets/en/war_archives/TEMPLATE_CRESCENDO_OF_POLARIS.png', 'jp': './assets/jp/war_archives/TEMPLATE_CRESCENDO_OF_POLARIS.png', 'tw': './assets/cn/war_archives/TEMPLATE_CRESCENDO_OF_POLARIS.png'}) TEMPLATE_CRIMSON_ECHOES = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_CRIMSON_ECHOES.png', 'en': './assets/en/war_archives/TEMPLATE_CRIMSON_ECHOES.png', 'jp': './assets/jp/war_archives/TEMPLATE_CRIMSON_ECHOES.png', 'tw': './assets/cn/war_archives/TEMPLATE_CRIMSON_ECHOES.png'}) TEMPLATE_DIVERGENT_CHESSBOARD = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_DIVERGENT_CHESSBOARD.png', 'en': './assets/en/war_archives/TEMPLATE_DIVERGENT_CHESSBOARD.png', 'jp': './assets/jp/war_archives/TEMPLATE_DIVERGENT_CHESSBOARD.png', 'tw': './assets/tw/war_archives/TEMPLATE_DIVERGENT_CHESSBOARD.png'}) +TEMPLATE_DREAMWAKERS_BUTTERFLY = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png', 'en': './assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png', 'jp': './assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png', 'tw': './assets/cn/war_archives/TEMPLATE_DREAMWAKERS_BUTTERFLY.png'}) TEMPLATE_EMPYREAL_TRAGICOMEDY = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_EMPYREAL_TRAGICOMEDY.png', 'en': './assets/en/war_archives/TEMPLATE_EMPYREAL_TRAGICOMEDY.png', 'jp': './assets/cn/war_archives/TEMPLATE_EMPYREAL_TRAGICOMEDY.png', 'tw': './assets/cn/war_archives/TEMPLATE_EMPYREAL_TRAGICOMEDY.png'}) TEMPLATE_ENCIRCLING_GRAF_SPEE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_ENCIRCLING_GRAF_SPEE.png', 'en': './assets/en/war_archives/TEMPLATE_ENCIRCLING_GRAF_SPEE.png', 'jp': './assets/jp/war_archives/TEMPLATE_ENCIRCLING_GRAF_SPEE.png', 'tw': './assets/tw/war_archives/TEMPLATE_ENCIRCLING_GRAF_SPEE.png'}) TEMPLATE_FALLEN_WINGS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_FALLEN_WINGS.png', 'en': './assets/en/war_archives/TEMPLATE_FALLEN_WINGS.png', 'jp': './assets/jp/war_archives/TEMPLATE_FALLEN_WINGS.png', 'tw': './assets/tw/war_archives/TEMPLATE_FALLEN_WINGS.png'}) @@ -18,6 +19,7 @@ TEMPLATE_INK_STAINED_STEEL_SAKURA = Template(file={'cn': './assets/cn/war_archiv TEMPLATE_INVERTED_ORTHANT = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png', 'en': './assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png', 'jp': './assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png', 'tw': './assets/cn/war_archives/TEMPLATE_INVERTED_ORTHANT.png'}) TEMPLATE_IRIS_OF_LIGHT_AND_DARK = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_IRIS_OF_LIGHT_AND_DARK.png', 'en': './assets/en/war_archives/TEMPLATE_IRIS_OF_LIGHT_AND_DARK.png', 'jp': './assets/jp/war_archives/TEMPLATE_IRIS_OF_LIGHT_AND_DARK.png', 'tw': './assets/cn/war_archives/TEMPLATE_IRIS_OF_LIGHT_AND_DARK.png'}) TEMPLATE_MICROLAYER_MEDLEY = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png', 'en': './assets/en/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png', 'jp': './assets/cn/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png', 'tw': './assets/cn/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png'}) +TEMPLATE_MIRROR_INVOLUTION = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'en': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'jp': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'tw': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png'}) TEMPLATE_NORTHERN_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'en': './assets/en/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'jp': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'tw': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png'}) TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png', 'en': './assets/en/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png', 'jp': './assets/cn/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png', 'tw': './assets/cn/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png'}) TEMPLATE_SKYBOUND_ORATORIO = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png', 'en': './assets/en/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png', 'jp': './assets/cn/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png', 'tw': './assets/cn/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png'}) diff --git a/module/war_archives/dictionary.py b/module/war_archives/dictionary.py index e830afeea..54c6ef876 100644 --- a/module/war_archives/dictionary.py +++ b/module/war_archives/dictionary.py @@ -24,4 +24,6 @@ dic_archives_template = { 'war_archives_20220210_cn': TEMPLATE_NORTHERN_OVERTURE, 'war_archives_20220414_cn': TEMPLATE_AURORA_NOCTIS, 'war_archives_20201229_cn': TEMPLATE_INVERTED_ORTHANT, + 'war_archives_20200917_cn': TEMPLATE_DREAMWAKERS_BUTTERFLY, + 'war_archives_20210527_cn': TEMPLATE_MIRROR_INVOLUTION, } From c4e3c8966d5ffe948eb84e6cdfceaa79a2e13c8a Mon Sep 17 00:00:00 2001 From: RilyLC <94281898+RilyLC@users.noreply.github.com> Date: Thu, 25 Jan 2024 21:32:31 +0800 Subject: [PATCH 07/14] Upd:[TW]Event:Mirror Involution Rerun (#3449) --- campaign/Readme.md | 3 +- config/template.json | 2 +- module/config/argument/args.json | 58 ++++++++++++++++---------------- module/config/i18n/en-US.json | 6 ++-- module/config/i18n/ja-JP.json | 6 ++-- module/config/i18n/zh-CN.json | 6 ++-- module/config/i18n/zh-TW.json | 8 ++--- 7 files changed, 45 insertions(+), 44 deletions(-) diff --git a/campaign/Readme.md b/campaign/Readme.md index 71371a3ea..a6e81db8a 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -174,4 +174,5 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20231221 | event 20231221 cn | Light-Chasing Sea of Stars | 星海逐光 | Light-Chasing Sea of Stars | 光追う星の海 | - | | 20240104 | event 20210225 cn | Khorovod of Dawn's Rime | - | - | - | 復刻破曉冰華 | | 20240111 | event 20211229 cn | Tower of Transcendence Rerun | 复刻逆转彩虹之塔 | Tower of Transcendence Rerun | 遡望せし虹彩の塔(復刻)    | - | -| 20240111 | event 20230803 cn | Anthem of Remembrance | - | - | - | 奏響鳶尾之歌 | \ No newline at end of file +| 20240111 | event 20230803 cn | Anthem of Remembrance | - | - | - | 奏響鳶尾之歌 | +| 20240125 | event 20210527 cn | Mirror Involution Rerun | - | - | - | 復刻鏡位螺旋 | \ No newline at end of file diff --git a/config/template.json b/config/template.json index 69856c0cf..8b36e871d 100644 --- a/config/template.json +++ b/config/template.json @@ -632,7 +632,7 @@ }, "Campaign": { "Name": "D3", - "Event": "war_archives_20201229_cn", + "Event": "war_archives_20210527_cn", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, diff --git a/module/config/argument/args.json b/module/config/argument/args.json index d142d4ffa..472ee571d 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1680,13 +1680,13 @@ ], "display": "hide", "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -2012,13 +2012,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -2459,13 +2459,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -3375,26 +3375,26 @@ "war_archives_20200806_cn", "war_archives_20200820_cn", "war_archives_20200903_cn", + "war_archives_20200917_cn", "war_archives_20201029_cn", "war_archives_20201229_cn", "war_archives_20210325_cn", + "war_archives_20210527_cn", "war_archives_20210624_cn", "war_archives_20210819_cn", "war_archives_20211014_cn", "war_archives_20211028_cn", "war_archives_20220210_cn", - "war_archives_20220414_cn", - "war_archives_20200917_cn", - "war_archives_20210527_cn" + "war_archives_20220414_cn" ], "option_bold": [ - "war_archives_20201229_cn", + "war_archives_20220414_cn", "war_archives_20210527_cn" ], "cn": "war_archives_20210527_cn", "en": "war_archives_20210527_cn", "jp": "war_archives_20210527_cn", - "tw": "war_archives_20210527_cn" + "tw": "war_archives_20220414_cn" }, "Mode": { "type": "select", @@ -3846,13 +3846,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -4310,13 +4310,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -4774,13 +4774,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -5238,13 +5238,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -5692,13 +5692,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20211229_cn", - "event_20230803_cn" + "event_20210527_cn", + "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 9066dbd56..f3447e4eb 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -732,17 +732,17 @@ "war_archives_20200806_cn": "archives The Enigma and the Shark", "war_archives_20200820_cn": "archives Scherzo of Iron and Blood", "war_archives_20200903_cn": "archives Stars of the Shimmering Fjord", + "war_archives_20200917_cn": "archives Dreamwakers Butterfly", "war_archives_20201029_cn": "archives Universe in Unison", "war_archives_20201229_cn": "archives Inverted Orthant", "war_archives_20210325_cn": "archives Ashen Simulacrum", + "war_archives_20210527_cn": "archives Mirror Involution", "war_archives_20210624_cn": "archives Swirling Cherry Blossoms", "war_archives_20210819_cn": "archives Microlayer Medley", "war_archives_20211014_cn": "archives Crescendo of Polaris", "war_archives_20211028_cn": "archives Skybound Oratorio", "war_archives_20220210_cn": "archives Northern Overture", - "war_archives_20220414_cn": "archives Aurora Noctis", - "war_archives_20200917_cn": "archives Dreamwaker's Butterfly", - "war_archives_20210527_cn": "archives Mirror Involution" + "war_archives_20220414_cn": "archives Aurora Noctis" }, "Mode": { "name": "Level Mode", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 81efc15ac..e4aaad352 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -732,17 +732,17 @@ "war_archives_20200806_cn": "檔案 鉄血鮫とエニグマ", "war_archives_20200820_cn": "檔案 黒鉄の楽章 誓いの海", "war_archives_20200903_cn": "檔案 輝ける峡湾の星", + "war_archives_20200917_cn": "檔案 刹那觀る胡蝶の夢", "war_archives_20201029_cn": "檔案 激唱のユニバース", "war_archives_20201229_cn": "檔案 虚畳なりし限象", "war_archives_20210325_cn": "檔案 開かれし紺碧の砂箱", + "war_archives_20210527_cn": "檔案 照らす螺旋の鏡海", "war_archives_20210624_cn": "檔案 翳りし満ちる影の華", "war_archives_20210819_cn": "檔案 闇靄払う銀翼", "war_archives_20211014_cn": "檔案 激奏のポラリス", "war_archives_20211028_cn": "檔案 神穹を衝く聖歌", "war_archives_20220210_cn": "檔案 凍絶の北海", - "war_archives_20220414_cn": "檔案 極夜照らす幻光", - "war_archives_20200917_cn": "檔案 刹那觀る胡蝶の夢", - "war_archives_20210527_cn": "檔案 照らす螺旋の鏡海" + "war_archives_20220414_cn": "檔案 極夜照らす幻光" }, "Mode": { "name": "Campaign.Mode.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index d11475c64..c1b4978e0 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -732,17 +732,17 @@ "war_archives_20200806_cn": "档案 最重要的宝物", "war_archives_20200820_cn": "档案 铁血音符誓言", "war_archives_20200903_cn": "档案 峡湾间的星辰", + "war_archives_20200917_cn": "档案 蝶海梦花", "war_archives_20201029_cn": "档案 激唱的UNIVERSE", "war_archives_20201229_cn": "档案 负象限作战", "war_archives_20210325_cn": "档案 箱庭疗法", + "war_archives_20210527_cn": "档案 镜位螺旋", "war_archives_20210624_cn": "档案 浮樱影华", "war_archives_20210819_cn": "档案 微层混合", "war_archives_20211014_cn": "档案 激奏的Polaris", "war_archives_20211028_cn": "档案 穹顶下的圣咏曲", "war_archives_20220210_cn": "档案 北境序曲", - "war_archives_20220414_cn": "档案 永夜幻光", - "war_archives_20200917_cn": "档案 蝶海梦花", - "war_archives_20210527_cn": "档案 镜位螺旋" + "war_archives_20220414_cn": "档案 永夜幻光" }, "Mode": { "name": "关卡模式", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 70af5f137..ebca7d092 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -677,7 +677,7 @@ "event_20210415_tw": "復刻圍剿施佩伯爵", "event_20210422_cn": "復興的讚美詩", "event_20210429_tw": "復刻墨染的鋼鐵之花", - "event_20210527_cn": "鏡位螺旋", + "event_20210527_cn": "復刻鏡位螺旋", "event_20210527_tw": "微層混合", "event_20210610_tw": "復刻夜幕下的歸途", "event_20210624_cn": "復刻-浮櫻影華", @@ -732,17 +732,17 @@ "war_archives_20200806_cn": "archives The Enigma and the Shark", "war_archives_20200820_cn": "archives Scherzo of Iron and Blood", "war_archives_20200903_cn": "archives Stars of the Shimmering Fjord", + "war_archives_20200917_cn": "archives Dreamwakers Butterfly", "war_archives_20201029_cn": "archives Universe in Unison", "war_archives_20201229_cn": "archives Inverted Orthant", "war_archives_20210325_cn": "archives Ashen Simulacrum", + "war_archives_20210527_cn": "archives Mirror Involution", "war_archives_20210624_cn": "archives Swirling Cherry Blossoms", "war_archives_20210819_cn": "archives Microlayer Medley", "war_archives_20211014_cn": "archives Crescendo of Polaris", "war_archives_20211028_cn": "檔案 穹頂下的聖詠曲", "war_archives_20220210_cn": "檔案 北境序曲", - "war_archives_20220414_cn": "檔案 永夜幻光", - "war_archives_20200917_cn": "檔案 蝶海夢花", - "war_archives_20210527_cn": "檔案 鏡位螺旋" + "war_archives_20220414_cn": "檔案 永夜幻光" }, "Mode": { "name": "地圖模式", From 9dd7d5b2b69f5da34be5a4a5b31eed7449b48558 Mon Sep 17 00:00:00 2001 From: Zuosizhu <2839299264@qq.com> Date: Fri, 26 Jan 2024 23:22:19 +0800 Subject: [PATCH 08/14] Add: Campaign_15 Adj: GemsFarming return to 15-1 if gg_on --- campaign/campaign_main/campaign_15_1.py | 81 ++++++++++++++++++++++ campaign/campaign_main/campaign_15_2.py | 85 +++++++++++++++++++++++ campaign/campaign_main/campaign_15_3.py | 85 +++++++++++++++++++++++ campaign/campaign_main/campaign_15_4.py | 89 +++++++++++++++++++++++++ module/campaign/campaign_event.py | 2 +- module/config/argument/args.json | 27 +++++--- module/handler/assets.py | 6 ++ module/handler/auto_search.py | 15 ++++- module/handler/fast_forward.py | 1 + 9 files changed, 379 insertions(+), 12 deletions(-) create mode 100644 campaign/campaign_main/campaign_15_1.py create mode 100644 campaign/campaign_main/campaign_15_2.py create mode 100644 campaign/campaign_main/campaign_15_3.py create mode 100644 campaign/campaign_main/campaign_15_4.py diff --git a/campaign/campaign_main/campaign_15_1.py b/campaign/campaign_main/campaign_15_1.py new file mode 100644 index 000000000..d08a2ea3d --- /dev/null +++ b/campaign/campaign_main/campaign_15_1.py @@ -0,0 +1,81 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('15-1') +MAP.shape = 'H7' +MAP.camera_data = ['D2', 'D5', 'E2', 'E5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + Me ME ME ++ ME MB ++ ++ + ME ME ME ME Me ME MB ++ + ++ ME ME ME Me ME ME MB + ++ ME ME ME ME __ Me ME + ME ME ME ME ME Me ME ME + ME ME ME ME ++ ME ME ME + ME SP SP ME Me ME ME ME +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'mystery': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['0'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = False + MAP_HAS_MOVABLE_ENEMY = False + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = True + MAP_HAS_MYSTERY = True + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/campaign_main/campaign_15_2.py b/campaign/campaign_main/campaign_15_2.py new file mode 100644 index 000000000..14da35ce9 --- /dev/null +++ b/campaign/campaign_main/campaign_15_2.py @@ -0,0 +1,85 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + + +MAP = CampaignMap('15-2') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ME ME ME ME Me ME ++ ++ ++ + ME ME ME ++ ME ME ME SP SP + ME ME ME Me ME ME ME ME ME + ME ME ME ME ME ME ME Me ME + ME ME ++ ME Me ME ME ME ME + Me ME ME __ ME ++ ++ ++ ME + ++ MB ME ME ME ++ ME MB ME + ++ MB ME ME ME ME ME ME ME +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'mystery': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['0'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = False + MAP_HAS_MOVABLE_ENEMY = False + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = True + MAP_HAS_MYSTERY = True + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/campaign_main/campaign_15_3.py b/campaign/campaign_main/campaign_15_3.py new file mode 100644 index 000000000..155e5495e --- /dev/null +++ b/campaign/campaign_main/campaign_15_3.py @@ -0,0 +1,85 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + + +MAP = CampaignMap('15-3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6'] +MAP.map_data = """ + ME ME ++ ME ME ME ME ME ME ME + ME ME ++ Me ME Me ME Me ME ME + ME ME ME ME Me ME ++ ME ME ME + ++ ME ME ME ME Me ++ ++ __ ME + Me ME ME ++ Me ME ME ME ME Me + ME ME ME ME ME ME ME ME ME ME + Me ME __ ME ME ME ME ME ++ ++ + ++ ++ ++ Me ME ME SP SP ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'mystery': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['0'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = False + MAP_HAS_MOVABLE_ENEMY = False + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = True + MAP_HAS_MYSTERY = True + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/campaign_main/campaign_15_4.py b/campaign/campaign_main/campaign_15_4.py new file mode 100644 index 000000000..574a06150 --- /dev/null +++ b/campaign/campaign_main/campaign_15_4.py @@ -0,0 +1,89 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + + +MAP = CampaignMap('15-4') +MAP.shape = 'K9' +MAP.camera_data = ['D2', 'D6', 'D7', 'H2', 'H6', 'H7'] +MAP.camera_data_spawn_point = ['H2'] +MAP.map_data = """ + ME ME ME ME Me ME ME ++ ++ ME ME + ME ME ME ME ME ME ME ++ ++ ME ME + ++ ME ME ME ME ME ME SP SP ME Me + ++ ME ME ++ ++ ME ME ME ME ME ME + ME Me ME MA ++ ME ME ME ME ME ME + ME ME ME ME ME ME ME ++ ME ME Me + ME ME __ ME ME ME ME ME ME ME ++ + ME ME ++ ME Me ME ME ME ME ME ME + ME Me ME ME ME Me ++ ++ ++ ME ME +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 5, 'mystery': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6}, + {'battle': 7, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['0'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = False + MAP_HAS_MOVABLE_ENEMY = False + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = True + MAP_HAS_MYSTERY = True + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=2): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_7(self): + return self.fleet_boss.clear_boss() diff --git a/module/campaign/campaign_event.py b/module/campaign/campaign_event.py index 4465a5e4b..658856db2 100644 --- a/module/campaign/campaign_event.py +++ b/module/campaign/campaign_event.py @@ -29,7 +29,7 @@ class CampaignEvent(CampaignStatus): from module.config.utils import deep_get _gg_on = deep_get(self.config.data, keys='GameManager.GGHandler.Enabled') if _gg_on: - campaign_to_go = '14-1' + campaign_to_go = '15-1' else: campaign_to_go = '2-4' logger.info(f'Reset GemsFarming to {campaign_to_go}') diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 8d1710ea9..84d06f7a4 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -2829,7 +2829,11 @@ "Scheduler": { "Enable": { "type": "checkbox", - "value": false + "value": false, + "option": [ + true, + false + ] }, "NextRun": { "type": "datetime", @@ -2924,13 +2928,20 @@ "event_20230525_cn", "event_20230803_cn", "event_20230817_cn", - "event_20230914_cn" + "event_20230914_cn", + "event_20231026_cn", + "event_20231123_cn", + "event_20231221_cn" ], "display": "disabled", - "cn": "event_20230914_cn", - "en": "event_20230914_cn", - "jp": "event_20230914_cn", - "tw": "event_20201229_cn" + "option_bold": [ + "event_20210527_cn", + "event_20211229_cn" + ], + "cn": "event_20211229_cn", + "en": "event_20211229_cn", + "jp": "event_20211229_cn", + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -3853,8 +3864,8 @@ "war_archives_20220414_cn" ], "option_bold": [ - "war_archives_20220414_cn", - "war_archives_20210527_cn" + "war_archives_20210527_cn", + "war_archives_20220414_cn" ], "cn": "war_archives_20210527_cn", "en": "war_archives_20210527_cn", diff --git a/module/handler/assets.py b/module/handler/assets.py index e2dc0cb29..bff37d587 100644 --- a/module/handler/assets.py +++ b/module/handler/assets.py @@ -11,11 +11,17 @@ AUTO_SEARCH_MENU_EXIT = Button(area={'cn': (419, 609, 475, 637), 'en': (421, 611 AUTO_SEARCH_OFF = Button(area={'cn': (867, 588, 883, 604), 'en': (830, 588, 846, 604), 'jp': (849, 588, 865, 604), 'tw': (867, 588, 883, 604)}, color={'cn': (94, 92, 94), 'en': (90, 89, 92), 'jp': (99, 99, 109), 'tw': (94, 92, 94)}, button={'cn': (867, 588, 883, 604), 'en': (830, 588, 846, 604), 'jp': (849, 588, 865, 604), 'tw': (867, 588, 883, 604)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_OFF.png', 'en': './assets/en/handler/AUTO_SEARCH_OFF.png', 'jp': './assets/jp/handler/AUTO_SEARCH_OFF.png', 'tw': './assets/tw/handler/AUTO_SEARCH_OFF.png'}) AUTO_SEARCH_ON = Button(area={'cn': (867, 588, 883, 604), 'en': (830, 588, 846, 604), 'jp': (849, 588, 865, 604), 'tw': (867, 588, 883, 604)}, color={'cn': (140, 167, 120), 'en': (139, 168, 112), 'jp': (140, 167, 122), 'tw': (140, 167, 120)}, button={'cn': (867, 588, 883, 604), 'en': (830, 588, 846, 604), 'jp': (849, 588, 865, 604), 'tw': (867, 588, 883, 604)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_ON.png', 'en': './assets/en/handler/AUTO_SEARCH_ON.png', 'jp': './assets/jp/handler/AUTO_SEARCH_ON.png', 'tw': './assets/tw/handler/AUTO_SEARCH_ON.png'}) AUTO_SEARCH_SET_ALL = Button(area={'cn': (832, 207, 851, 226), 'en': (940, 322, 959, 340), 'jp': (832, 207, 851, 226), 'tw': (832, 207, 851, 226)}, color={'cn': (32, 32, 38), 'en': (39, 40, 41), 'jp': (38, 37, 38), 'tw': (39, 41, 41)}, button={'cn': (832, 207, 851, 226), 'en': (940, 322, 959, 340), 'jp': (832, 207, 851, 226), 'tw': (832, 207, 851, 226)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_ALL.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_ALL.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_ALL.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_ALL.png'}) +AUTO_SEARCH_SET_ALL_15 = Button(area={'cn': (832, 161, 851, 180), 'en': (832, 161, 851, 180), 'jp': (832, 161, 851, 180), 'tw': (832, 161, 851, 180)}, color={'cn': (74, 101, 55), 'en': (74, 101, 55), 'jp': (74, 101, 55), 'tw': (74, 101, 55)}, button={'cn': (832, 161, 851, 180), 'en': (832, 161, 851, 180), 'jp': (832, 161, 851, 180), 'tw': (832, 161, 851, 180)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_ALL_15.png', 'en': './assets/cn/handler/AUTO_SEARCH_SET_ALL_15.png', 'jp': './assets/cn/handler/AUTO_SEARCH_SET_ALL_15.png', 'tw': './assets/cn/handler/AUTO_SEARCH_SET_ALL_15.png'}) AUTO_SEARCH_SET_BOSS = Button(area={'cn': (635, 207, 653, 226), 'en': (616, 208, 634, 226), 'jp': (635, 207, 653, 226), 'tw': (635, 207, 653, 226)}, color={'cn': (30, 30, 33), 'en': (42, 40, 43), 'jp': (37, 36, 37), 'tw': (37, 39, 39)}, button={'cn': (635, 207, 653, 226), 'en': (616, 208, 634, 226), 'jp': (635, 207, 653, 226), 'tw': (635, 207, 653, 226)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_BOSS.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_BOSS.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_BOSS.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_BOSS.png'}) +AUTO_SEARCH_SET_BOSS_15 = Button(area={'cn': (635, 161, 653, 180), 'en': (635, 161, 653, 180), 'jp': (635, 161, 653, 180), 'tw': (635, 161, 653, 180)}, color={'cn': (37, 37, 39), 'en': (37, 37, 39), 'jp': (37, 37, 39), 'tw': (37, 37, 39)}, button={'cn': (635, 161, 653, 180), 'en': (635, 161, 653, 180), 'jp': (635, 161, 653, 180), 'tw': (635, 161, 653, 180)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_BOSS_15.png', 'en': './assets/cn/handler/AUTO_SEARCH_SET_BOSS_15.png', 'jp': './assets/cn/handler/AUTO_SEARCH_SET_BOSS_15.png', 'tw': './assets/cn/handler/AUTO_SEARCH_SET_BOSS_15.png'}) AUTO_SEARCH_SET_MOB = Button(area={'cn': (496, 207, 515, 226), 'en': (477, 208, 496, 226), 'jp': (496, 207, 515, 226), 'tw': (496, 207, 515, 226)}, color={'cn': (69, 96, 51), 'en': (77, 106, 57), 'jp': (73, 100, 52), 'tw': (73, 101, 55)}, button={'cn': (496, 207, 515, 226), 'en': (477, 208, 496, 226), 'jp': (496, 207, 515, 226), 'tw': (496, 207, 515, 226)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_MOB.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_MOB.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_MOB.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_MOB.png'}) +AUTO_SEARCH_SET_MOB_15 = Button(area={'cn': (496, 161, 515, 180), 'en': (496, 161, 515, 180), 'jp': (496, 161, 515, 180), 'tw': (496, 161, 515, 180)}, color={'cn': (39, 39, 40), 'en': (39, 39, 40), 'jp': (39, 39, 40), 'tw': (39, 39, 40)}, button={'cn': (496, 161, 515, 180), 'en': (496, 161, 515, 180), 'jp': (496, 161, 515, 180), 'tw': (496, 161, 515, 180)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_MOB_15.png', 'en': './assets/cn/handler/AUTO_SEARCH_SET_MOB_15.png', 'jp': './assets/cn/handler/AUTO_SEARCH_SET_MOB_15.png', 'tw': './assets/cn/handler/AUTO_SEARCH_SET_MOB_15.png'}) AUTO_SEARCH_SET_STANDBY = Button(area={'cn': (932, 207, 950, 226), 'en': (813, 322, 832, 340), 'jp': (932, 207, 950, 226), 'tw': (932, 207, 950, 226)}, color={'cn': (30, 30, 37), 'en': (41, 41, 42), 'jp': (37, 36, 37), 'tw': (37, 38, 39)}, button={'cn': (932, 207, 950, 226), 'en': (813, 322, 832, 340), 'jp': (932, 207, 950, 226), 'tw': (932, 207, 950, 226)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_STANDBY.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_STANDBY.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_STANDBY.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_STANDBY.png'}) +AUTO_SEARCH_SET_STANDBY_15 = Button(area={'cn': (932, 161, 950, 180), 'en': (932, 161, 950, 180), 'jp': (932, 161, 950, 180), 'tw': (932, 161, 950, 180)}, color={'cn': (37, 37, 39), 'en': (37, 37, 39), 'jp': (37, 37, 39), 'tw': (37, 37, 39)}, button={'cn': (932, 161, 950, 180), 'en': (932, 161, 950, 180), 'jp': (932, 161, 950, 180), 'tw': (932, 161, 950, 180)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_STANDBY_15.png', 'en': './assets/cn/handler/AUTO_SEARCH_SET_STANDBY_15.png', 'jp': './assets/cn/handler/AUTO_SEARCH_SET_STANDBY_15.png', 'tw': './assets/cn/handler/AUTO_SEARCH_SET_STANDBY_15.png'}) AUTO_SEARCH_SET_SUB_AUTO = Button(area={'cn': (578, 457, 597, 476), 'en': (577, 460, 595, 478), 'jp': (578, 457, 597, 476), 'tw': (578, 457, 597, 476)}, color={'cn': (69, 96, 52), 'en': (41, 39, 41), 'jp': (39, 37, 39), 'tw': (73, 100, 53)}, button={'cn': (578, 457, 597, 476), 'en': (577, 460, 595, 478), 'jp': (578, 457, 597, 476), 'tw': (578, 457, 597, 476)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_SUB_AUTO.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_SUB_AUTO.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_SUB_AUTO.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_SUB_AUTO.png'}) +AUTO_SEARCH_SET_SUB_AUTO_15 = Button(area={'cn': (578, 389, 597, 408), 'en': (578, 389, 597, 408), 'jp': (578, 389, 597, 408), 'tw': (578, 389, 597, 408)}, color={'cn': (42, 42, 43), 'en': (42, 42, 43), 'jp': (42, 42, 43), 'tw': (42, 42, 43)}, button={'cn': (578, 389, 597, 408), 'en': (578, 389, 597, 408), 'jp': (578, 389, 597, 408), 'tw': (578, 389, 597, 408)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_SUB_AUTO_15.png', 'en': './assets/cn/handler/AUTO_SEARCH_SET_SUB_AUTO_15.png', 'jp': './assets/cn/handler/AUTO_SEARCH_SET_SUB_AUTO_15.png', 'tw': './assets/cn/handler/AUTO_SEARCH_SET_SUB_AUTO_15.png'}) AUTO_SEARCH_SET_SUB_STANDBY = Button(area={'cn': (894, 457, 913, 476), 'en': (855, 460, 874, 478), 'jp': (894, 457, 913, 476), 'tw': (894, 457, 913, 476)}, color={'cn': (32, 31, 34), 'en': (75, 104, 54), 'jp': (73, 100, 52), 'tw': (35, 36, 38)}, button={'cn': (894, 457, 913, 476), 'en': (855, 460, 874, 478), 'jp': (894, 457, 913, 476), 'tw': (894, 457, 913, 476)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_SUB_STANDBY.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_SUB_STANDBY.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_SUB_STANDBY.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_SUB_STANDBY.png'}) +AUTO_SEARCH_SET_SUB_STANDBY_15 = Button(area={'cn': (894, 389, 913, 408), 'en': (894, 389, 913, 408), 'jp': (894, 389, 913, 408), 'tw': (894, 389, 913, 408)}, color={'cn': (74, 101, 55), 'en': (74, 101, 55), 'jp': (74, 101, 55), 'tw': (74, 101, 55)}, button={'cn': (894, 389, 913, 408), 'en': (894, 389, 913, 408), 'jp': (894, 389, 913, 408), 'tw': (894, 389, 913, 408)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_SUB_STANDBY_15.png', 'en': './assets/cn/handler/AUTO_SEARCH_SET_SUB_STANDBY_15.png', 'jp': './assets/cn/handler/AUTO_SEARCH_SET_SUB_STANDBY_15.png', 'tw': './assets/cn/handler/AUTO_SEARCH_SET_SUB_STANDBY_15.png'}) BATTLE_PASS_NOTICE = Button(area={'cn': (554, 483, 726, 540), 'en': (716, 488, 869, 533), 'jp': (554, 483, 726, 540), 'tw': (554, 483, 726, 540)}, color={'cn': (107, 152, 207), 'en': (89, 138, 201), 'jp': (107, 152, 207), 'tw': (107, 152, 207)}, button={'cn': (863, 173, 929, 217), 'en': (863, 173, 929, 217), 'jp': (863, 173, 929, 217), 'tw': (863, 173, 929, 217)}, file={'cn': './assets/cn/handler/BATTLE_PASS_NOTICE.png', 'en': './assets/en/handler/BATTLE_PASS_NOTICE.png', 'jp': './assets/cn/handler/BATTLE_PASS_NOTICE.png', 'tw': './assets/cn/handler/BATTLE_PASS_NOTICE.png'}) BOOK_BOX_AUTO = Button(area={'cn': (737, 614, 756, 631), 'en': (739, 615, 754, 630), 'jp': (808, 614, 825, 631), 'tw': (807, 613, 826, 632)}, color={'cn': (67, 74, 82), 'en': (57, 64, 74), 'jp': (59, 62, 68), 'tw': (62, 66, 71)}, button={'cn': (737, 614, 756, 631), 'en': (739, 615, 754, 630), 'jp': (808, 614, 825, 631), 'tw': (807, 613, 826, 632)}, file={'cn': './assets/cn/handler/BOOK_BOX_AUTO.png', 'en': './assets/en/handler/BOOK_BOX_AUTO.png', 'jp': './assets/jp/handler/BOOK_BOX_AUTO.png', 'tw': './assets/tw/handler/BOOK_BOX_AUTO.png'}) BOOK_BOX_PREP = Button(area={'cn': (922, 600, 940, 617), 'en': (906, 604, 922, 619), 'jp': (921, 602, 939, 621), 'tw': (906, 604, 922, 619)}, color={'cn': (88, 122, 68), 'en': (29, 32, 29), 'jp': (35, 35, 36), 'tw': (29, 32, 29)}, button={'cn': (922, 600, 940, 617), 'en': (906, 604, 922, 619), 'jp': (921, 602, 939, 621), 'tw': (906, 604, 922, 619)}, file={'cn': './assets/cn/handler/BOOK_BOX_PREP.png', 'en': './assets/en/handler/BOOK_BOX_PREP.png', 'jp': './assets/jp/handler/BOOK_BOX_PREP.png', 'tw': './assets/tw/handler/BOOK_BOX_PREP.png'}) diff --git a/module/handler/auto_search.py b/module/handler/auto_search.py index 9f1bed545..5dd35f1bc 100644 --- a/module/handler/auto_search.py +++ b/module/handler/auto_search.py @@ -15,6 +15,14 @@ AUTO_SEARCH_SETTINGS = [ AUTO_SEARCH_SET_SUB_AUTO, AUTO_SEARCH_SET_SUB_STANDBY ] +AUTO_SEARCH_SETTINGS_15 = [ + AUTO_SEARCH_SET_MOB_15, + AUTO_SEARCH_SET_BOSS_15, + AUTO_SEARCH_SET_ALL_15, + AUTO_SEARCH_SET_STANDBY_15, + AUTO_SEARCH_SET_SUB_AUTO_15, + AUTO_SEARCH_SET_SUB_STANDBY_15 +] dic_setting_name_to_index = { 'fleet1_mob_fleet2_boss': 0, 'fleet1_boss_fleet2_mob': 1, @@ -131,8 +139,9 @@ class AutoSearchHandler(EnemySearchingHandler): bool: If selected to the correct option. """ active = [] - - for index, button in enumerate(AUTO_SEARCH_SETTINGS): + self.AUTO_SEARCH_SETTINGS = AUTO_SEARCH_SETTINGS_15 if 'campaign_15' in self.config.campaign_name \ + else AUTO_SEARCH_SETTINGS + for index, button in enumerate(self.AUTO_SEARCH_SETTINGS): if self.image_color_count(button, color=(156, 255, 82), threshold=221, count=20): active.append(index) @@ -150,7 +159,7 @@ class AutoSearchHandler(EnemySearchingHandler): logger.info('Selected to the correct auto search setting') return True else: - self.device.click(AUTO_SEARCH_SETTINGS[target_index]) + self.device.click(self.AUTO_SEARCH_SETTINGS[target_index]) return False def auto_search_setting_ensure(self, setting, skip_first_screenshot=True): diff --git a/module/handler/fast_forward.py b/module/handler/fast_forward.py index bbd7110e1..54da7fa90 100644 --- a/module/handler/fast_forward.py +++ b/module/handler/fast_forward.py @@ -99,6 +99,7 @@ class FastForwardHandler(AutoSearchHandler): > 12-1 > 12-2 > 12-3 > 12-4 > 13-1 > 13-2 > 13-3 > 13-4 > 14-1 > 14-2 > 14-3 > 14-4 + > 15-1 > 15-2 > 15-3 > 15-4 """, 'A1 > A2 > A3', 'B1 > B2 > B3', From f2ce895db0814e2272156525a98a424ce007d47a Mon Sep 17 00:00:00 2001 From: Zuosizhu <2839299264@qq.com> Date: Sat, 27 Jan 2024 09:24:17 +0800 Subject: [PATCH 09/14] Adj: Disable auto clear map for 15-3/15-4, for there's new mechanism --- module/handler/fast_forward.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/handler/fast_forward.py b/module/handler/fast_forward.py index 54da7fa90..9678ba690 100644 --- a/module/handler/fast_forward.py +++ b/module/handler/fast_forward.py @@ -99,7 +99,7 @@ class FastForwardHandler(AutoSearchHandler): > 12-1 > 12-2 > 12-3 > 12-4 > 13-1 > 13-2 > 13-3 > 13-4 > 14-1 > 14-2 > 14-3 > 14-4 - > 15-1 > 15-2 > 15-3 > 15-4 + > 15-1 > 15-2 """, 'A1 > A2 > A3', 'B1 > B2 > B3', From d854d876d940b0dfe23f4efad8d1308aab1a9167 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 30 Jan 2024 00:20:16 +0800 Subject: [PATCH 10/14] Fix: Handle win32com import error --- deploy/alas.py | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/deploy/alas.py b/deploy/alas.py index a770215ba..f5e46f0d4 100644 --- a/deploy/alas.py +++ b/deploy/alas.py @@ -1,3 +1,5 @@ +import pickle + from deploy.config import DeployConfig from deploy.logger import logger from deploy.utils import * @@ -23,11 +25,39 @@ class AlasManager(DeployConfig): Yields: str, str, str: executable_path, process_name, process_id """ + for _ in range(2): + try: + from win32com.client import GetObject + except ModuleNotFoundError: + # No module named pywin32 + logger.info('pywin32 not installed, skip') + return False + except (pickle.UnpicklingError, EOFError) as e: + # _pickle.UnpicklingError: invalid load key, '\x00'. + # EOFError: Ran out of input + logger.error(f'{type(e).__name__}: {e}') + import sys + import win32api + # From win32com/client/__init__.py + gen_path = os.path.join(win32api.GetTempPath(), "gen_py", + "%d.%d" % (sys.version_info[0], sys.version_info[1])) + # From win32com/client/gencache.py + file = os.path.join(gen_path, "dicts.dat") + # Try deleting it + file = os.path.abspath(file).replace('\\', '/') + if os.path.exists(file): + logger.info(f'win32com dicts.dat exists, removing: {file}') + os.remove(file) + continue + else: + logger.warning(f'Cannot find win32com dicts.dat') + continue try: - from win32com.client import GetObject - except ModuleNotFoundError: - logger.info('pywin32 not installed, skip') - return False + _ = GetObject + except UnboundLocalError: + logger.warning('Unable to import win32com.client, please fix it manually, ' + 'see https://github.com/LmeSzinc/AzurLaneAutoScript/issues/2382') + exit(1) try: wmi = GetObject('winmgmts:') From 640365584d83ddcfb995e55aa3b956af808e6fbc Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Tue, 30 Jan 2024 00:29:10 +0800 Subject: [PATCH 11/14] Fix: Handle missing / in StockCounter --- module/shop/clerk.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/module/shop/clerk.py b/module/shop/clerk.py index a8d6a0a50..ed30d1f58 100644 --- a/module/shop/clerk.py +++ b/module/shop/clerk.py @@ -1,3 +1,5 @@ +import re + import cv2 from module.base.timer import Timer @@ -19,6 +21,22 @@ class StockCounter(DigitCounter): return 255 - image + def after_process(self, result): + result = super().after_process(result) + + if re.match(f'^\d\d$', result): + # 55 -> 5/5 + new = f'{result[0]}/{result[1]}' + logger.info(f'StockCounter result {result} is revised to {new}') + result = new + if re.match(f'^\d{4,}$', result): + # 1515 -> 15/15 + new = f'{result[0:2]}/{result[2:4]}' + logger.info(f'StockCounter result {result} is revised to {new}') + result = new + + return result + SHOP_SELECT_PR = [SHOP_SELECT_PR1, SHOP_SELECT_PR2, SHOP_SELECT_PR3] OCR_SHOP_SELECT_STOCK = StockCounter(SHOP_SELECT_STOCK) From b04b349206b6117f34840de4a342696e8498323c Mon Sep 17 00:00:00 2001 From: weeswelai <52352067+weeswelai@users.noreply.github.com> Date: Wed, 31 Jan 2024 04:47:12 +0800 Subject: [PATCH 12/14] Add: Add raid event Spring Festive Fiasco(raid_20240130) --- assets/cn/raid/HUANCHANG_OCR_PT.png | Bin 0 -> 5352 bytes assets/cn/raid/HUANCHANG_OCR_REMAIN_EASY.png | Bin 0 -> 3748 bytes assets/cn/raid/HUANCHANG_OCR_REMAIN_EX.png | Bin 0 -> 3565 bytes assets/cn/raid/HUANCHANG_OCR_REMAIN_HARD.png | Bin 0 -> 3708 bytes .../cn/raid/HUANCHANG_OCR_REMAIN_NORMAL.png | Bin 0 -> 3762 bytes assets/cn/raid/HUANCHANG_RAID_EASY.png | Bin 0 -> 7219 bytes assets/cn/raid/HUANCHANG_RAID_EX.png | Bin 0 -> 6060 bytes assets/cn/raid/HUANCHANG_RAID_HARD.png | Bin 0 -> 6834 bytes assets/cn/raid/HUANCHANG_RAID_NORMAL.png | Bin 0 -> 7004 bytes assets/cn/ui/RAID_CHECK.png | Bin 9755 -> 6111 bytes assets/en/raid/HUANCHANG_OCR_PT.png | Bin 0 -> 5352 bytes assets/en/raid/HUANCHANG_OCR_REMAIN_EASY.png | Bin 0 -> 3748 bytes assets/en/raid/HUANCHANG_OCR_REMAIN_EX.png | Bin 0 -> 3565 bytes assets/en/raid/HUANCHANG_OCR_REMAIN_HARD.png | Bin 0 -> 3708 bytes .../en/raid/HUANCHANG_OCR_REMAIN_NORMAL.png | Bin 0 -> 3762 bytes assets/en/raid/HUANCHANG_RAID_EASY.png | Bin 0 -> 7081 bytes assets/en/raid/HUANCHANG_RAID_EX.png | Bin 0 -> 6077 bytes assets/en/raid/HUANCHANG_RAID_HARD.png | Bin 0 -> 6901 bytes assets/en/raid/HUANCHANG_RAID_NORMAL.png | Bin 0 -> 7446 bytes assets/en/ui/RAID_CHECK.png | Bin 7835 -> 4527 bytes assets/jp/raid/HUANCHANG_OCR_PT.png | Bin 0 -> 5352 bytes assets/jp/raid/HUANCHANG_OCR_REMAIN_EASY.png | Bin 0 -> 3785 bytes assets/jp/raid/HUANCHANG_OCR_REMAIN_EX.png | Bin 0 -> 3565 bytes assets/jp/raid/HUANCHANG_OCR_REMAIN_HARD.png | Bin 0 -> 3749 bytes .../jp/raid/HUANCHANG_OCR_REMAIN_NORMAL.png | Bin 0 -> 3794 bytes assets/jp/raid/HUANCHANG_RAID_EASY.png | Bin 0 -> 7156 bytes assets/jp/raid/HUANCHANG_RAID_EX.png | Bin 0 -> 6100 bytes assets/jp/raid/HUANCHANG_RAID_HARD.png | Bin 0 -> 6808 bytes assets/jp/raid/HUANCHANG_RAID_NORMAL.png | Bin 0 -> 7172 bytes assets/jp/ui/RAID_CHECK.png | Bin 11133 -> 6921 bytes campaign/Readme.md | 3 ++- module/config/argument/args.json | 22 ++++++++++-------- module/config/i18n/en-US.json | 1 + module/config/i18n/ja-JP.json | 1 + module/config/i18n/zh-CN.json | 1 + module/raid/assets.py | 9 +++++++ module/raid/raid.py | 20 ++++++++++++++++ module/ui/assets.py | 2 +- 38 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 assets/cn/raid/HUANCHANG_OCR_PT.png create mode 100644 assets/cn/raid/HUANCHANG_OCR_REMAIN_EASY.png create mode 100644 assets/cn/raid/HUANCHANG_OCR_REMAIN_EX.png create mode 100644 assets/cn/raid/HUANCHANG_OCR_REMAIN_HARD.png create mode 100644 assets/cn/raid/HUANCHANG_OCR_REMAIN_NORMAL.png create mode 100644 assets/cn/raid/HUANCHANG_RAID_EASY.png create mode 100644 assets/cn/raid/HUANCHANG_RAID_EX.png create mode 100644 assets/cn/raid/HUANCHANG_RAID_HARD.png create mode 100644 assets/cn/raid/HUANCHANG_RAID_NORMAL.png create mode 100644 assets/en/raid/HUANCHANG_OCR_PT.png create mode 100644 assets/en/raid/HUANCHANG_OCR_REMAIN_EASY.png create mode 100644 assets/en/raid/HUANCHANG_OCR_REMAIN_EX.png create mode 100644 assets/en/raid/HUANCHANG_OCR_REMAIN_HARD.png create mode 100644 assets/en/raid/HUANCHANG_OCR_REMAIN_NORMAL.png create mode 100644 assets/en/raid/HUANCHANG_RAID_EASY.png create mode 100644 assets/en/raid/HUANCHANG_RAID_EX.png create mode 100644 assets/en/raid/HUANCHANG_RAID_HARD.png create mode 100644 assets/en/raid/HUANCHANG_RAID_NORMAL.png create mode 100644 assets/jp/raid/HUANCHANG_OCR_PT.png create mode 100644 assets/jp/raid/HUANCHANG_OCR_REMAIN_EASY.png create mode 100644 assets/jp/raid/HUANCHANG_OCR_REMAIN_EX.png create mode 100644 assets/jp/raid/HUANCHANG_OCR_REMAIN_HARD.png create mode 100644 assets/jp/raid/HUANCHANG_OCR_REMAIN_NORMAL.png create mode 100644 assets/jp/raid/HUANCHANG_RAID_EASY.png create mode 100644 assets/jp/raid/HUANCHANG_RAID_EX.png create mode 100644 assets/jp/raid/HUANCHANG_RAID_HARD.png create mode 100644 assets/jp/raid/HUANCHANG_RAID_NORMAL.png diff --git a/assets/cn/raid/HUANCHANG_OCR_PT.png b/assets/cn/raid/HUANCHANG_OCR_PT.png new file mode 100644 index 0000000000000000000000000000000000000000..c324e0666d800962edeea1845e2b846f402f573c GIT binary patch literal 5352 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 a;t2UjZY^*uUM=fq5nF3}t5QqP2mb}aTBLRW literal 0 HcmV?d00001 diff --git a/assets/cn/raid/HUANCHANG_OCR_REMAIN_EASY.png b/assets/cn/raid/HUANCHANG_OCR_REMAIN_EASY.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a413492d934956829ebde7ac69184411443647 GIT binary patch literal 3748 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 i42uwGi2k-8*mE&xeD&=66x~N4KY6-L1;Fyx1 zl&avFo0y&&l$w}QS$HzlhJk@k&eO#)q~g|_yZ+fSsWJyXy3akdc|)V5MW&$;P~OJNPL_6$J`gXa!0;g>z*Vd61KshRjlmdBOVh2{%?$PZ{GbU_;DK} z^L&2AnR92}JzV_znYpzv$T_26Gz3ONU^E0qLtr!nMnhmwgusUC^^w4;xnb_^-#_n8 z3DSAAVQvwZ;x_+jtJP!g^WU!ZT6k;rk*%xNI2rC++EaMv#BKi{k4~@Gd7LLY4e0&{ zMn@v}cx~7Uyv`nWz5ji3_T;Sm6?ZnxId-yy=fQ;Q>Q5HdofcR-lYxzaVMogCJly!&7A|IhNH7tSdjKWiev$iu+!q2B!V{9LnD zt9I4C{&x1~*_%0LA`xDhMx3?tax#xN6_VmME>;3|Af~)KRbJV&7YHh?pFT${7C8P$$R&n z3H$B0-`cbLsXRB(d%LgeOi%3z4PAOgSFY@>YjuUeJ&vkklXdxjWRmCXHOM9h(fl_jB|3LQ_NE zU%$F6zODayS6^Z5=AG~3Wlkp+)@{p~HRbT9!eH4ecU{A$J^kVE zKw{~7aCCY-`}}iP+U}B#?;gI?&YkmnS!U99FaO^bEB_fvo?BUeEjs}e#09B6;`Yl! zrfuA3rCic0fA@c?xO?F6`!9>m{OUFnyDj9#z|6o9!)thK%J0L{UnSy>etyBb@a*4J zk$3l%n!K5_-+umnQ~BV^8~3-~oqTm$oo|DFqxS+})RpD``h+S>Hp7)L4VOJF^y zg>65;Z#`-8#lugxtUtScJ}@j3V(m9k?)LN__nb5S*%W`pPaEDi?kWr%d$IH`QmuTz z$S&SyW1huQ76FTZMZh9p5wHk+5&{#dBZKC&Frg9ajF@2x!67rc0)E=(!&sY=GYvaO z$iFhOLw(&NIr>ZNx2ZnD!sRS?1*K|`YtY`U&OT2tCyaSLvw8a+9E&*UUWV1C`@1AJ zQIWMBXSXfXw&`n&uWe>b#WN&szjSR$?eg#h)&M|58OtbjdQHrk0(`tnX4QS&E-6O# z&C3Bwv|_hZBB(~#(yfD{!AF(|g4@QXIDvX?#mQnJmg^w37w~ z8W$5avooS$L+u_SD^Jq;s@1hOE)8bo4FGvftzpvJDXP0mC%eUWCha7_Y0V8Yx`CeY zy>sP~C}G+dTRA0vwA3(2(;>+|ty1ReV4FlU;^U{ufoEkC!ZgjJ?ZVsyMl;DxEq^

je5`qpp6JC0HISM=#>(Y5WFw*~cCp^X->iOq;lZ?rQ`XLsVYfQ^L$!w7h(LUBw zB<)c2g<_?8M*-D@G=5<5^G#{p;-j3x$t~OIGQ)oQz3OZ{#1()5>!`6OXgG9I@n&nv zb@&2@NvDMLcO+9LNgci{VA8_*W9h*flrP+Tc} z)1cT$$A}FxlA2AIUYMRgzSAymTI%mX94cJ{N?G0&llPb-yQjvAkMn!=iaZv9=LOZp z8fDX*5jr73kYWE!%^?@$`+vSl54p|hV8{j05%G(>14XP?+IRWf>r9+IKXZ45DkUV~ z93i*5qE>+z@bz9bhutiZMC#b>XK>XAoyF0k#NsBAXyGI8#PD#PSF4?tSFE{_^LNXG z#_aGqC2XqCZN(d|s?uzr-I=4dz3UZBN6fk6HY~&mFSZenUCei3HR#!MhM>;KvXwP5 z_K6Gvq)mEcuTo=foi}s=DyQzky^x6ySpl!7f4+JDyS9V+tB0%+BzCZQM~~O-TySOL z{73Q}roaDpPk(pwDEzN}>gl;hD{{al11{Q=4YS zosL9kf|kdp#&i1g%Uk=^WzJ5R6Sf|FK4}xuI4g56XSqUspiu!O^>@ujAh(DT#AE5Y z5W4Deuc10xR@lBj>Q7-ElHx_!trEyYk91ETyYX5I{)*(1a!3s|=};S2lD(xY0-vV9 c;sMhaiJ;S$JggE_l2>L7M`J?UQHiJi18BTSB>(^b literal 0 HcmV?d00001 diff --git a/assets/cn/raid/HUANCHANG_RAID_EASY.png b/assets/cn/raid/HUANCHANG_RAID_EASY.png new file mode 100644 index 0000000000000000000000000000000000000000..b9518ea7bd9e5b72ba834e0f046a5e8efc43dbf0 GIT binary patch literal 7219 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 literal 0 HcmV?d00001 diff --git a/assets/cn/raid/HUANCHANG_RAID_HARD.png b/assets/cn/raid/HUANCHANG_RAID_HARD.png new file mode 100644 index 0000000000000000000000000000000000000000..50d88ba998d73fdf105df00c58cdb2768b1ebf24 GIT binary patch literal 6834 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 literal 0 HcmV?d00001 diff --git a/assets/cn/raid/HUANCHANG_RAID_NORMAL.png b/assets/cn/raid/HUANCHANG_RAID_NORMAL.png new file mode 100644 index 0000000000000000000000000000000000000000..c08f986f2871f40a1a8785465c1a60e034939d28 GIT binary patch literal 7004 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 wCgk=u480lp@>k&7`i8(a1OP(LE?IPulI;@~ literal 0 HcmV?d00001 diff --git a/assets/cn/ui/RAID_CHECK.png b/assets/cn/ui/RAID_CHECK.png index 669f8d7b5507cdb0e4238f6842b45196f085f666..cd042ece2e2071a2f4bfdde199f997ef5c0a01ff 100644 GIT binary patch delta 3544 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 literal 9755 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 diff --git a/assets/en/raid/HUANCHANG_OCR_PT.png b/assets/en/raid/HUANCHANG_OCR_PT.png new file mode 100644 index 0000000000000000000000000000000000000000..c324e0666d800962edeea1845e2b846f402f573c GIT binary patch literal 5352 zcmeI0`#%$GAIB#p5~{m9)v&siV^KMl)163EMmcq0B z4s*DjV&*i$4&<22caPmrC2csdki?G|+%>Khg772yLoe;0bk=ZI~Hm!HoyAFsRj z!n=J;0f7A(wpQnz;>H(gVE+O?_|7o)n`Z5>KOe}rJxP*2vnK_UEO+*?mwZsy(aPYX z2X5u(lV1BO;K!7nKe=!^L7J{&S(D~YweWHg>g z9P<71!NDJvQD0Z)Q9fh2cN6Y__1R3lj+L97713YcW)~PMqE}a>#NBR>_BPeD5sw6Os$1m<8w+?|4aw1l4T)W)QyA}i-LaP;Zo;;40pdND_pLM~ z<&z1~V=3{D!eP`4)U^w!omy%u+c=w*@( z%(}>J3pCouCe1fKHVfrg_Xrxr(QL_!`;$CxopC#huK_8V6_Xpa`5pB3ZgjMf^34Qso;*ee3nk)i zaCvAbhzKc3^q8QJ$)ioP>epaRuxcf#{W`yEA#T`O^q#u7^CfHBh zF94cWx-sL3(TmDJ%jMqQ-o?wa6uwIv>7m{*@qLW|Szd`|ZN8+BjopZk4A@BKu8qzO zd7k)1HcV=1G_Dd{W)Q`{8NjZg1>lS#zfn0hlsJDuqHmeBsXZ&ASkQTEYQ35q6tvlp z`wT%W=BpUevE|hH!_lccj|kTuXk#Kr)R;8^tiFloPZeUXsaFa;jiiB4qL4@B*5Sb) ze!VxD10emx!%gP~QhYdY!PR{M{7yLANX1#Wu~daqV8yO1&GGtT*d;g5K<`0kS}zx~ zm^eQ|-^J@YE9-k)Kcy5~nqvu~34B;8T;MKxG5gK?(s1`#6LeU5imsxID8@%v86xo$ zspavaQTwM!IZ@5$7&sUh1xMN-az@~ho!B4B5DD|!Ep$O}&;k-4=dXZY9H`n{M&&6o z+F=g}=;iE&b6RCVEot=jSU+KJc%2P*#iQNJFW)8hCU}&0euPvQP;j- zD;FIJxM$#ICSPm}GfpXPojh}ilt!8X%M7F-BE*l;G&lH~Fr~DUlIOwsgf3}?h0Gel5Q9VS=-qQvN#*(ppsuO0#zh3m2DXcHO}4mw`VI8Dn32_tS{Ll}Z-d>Q&#ZO+MX*o=E;!uMVZT71Pq z)rA)LwExeWo76n;2gD>ahp@m4EMz(guX4vj*#y4Oy75(1<2er@jd*A2Hho@m2@xM3 z|2;1gm0|~<|69SuyCz&BPi!=kGCL>jspCN@|K#?}Wvf$EZ9~hLL*9^5#YB^U)vNL5 z&|}&v)$sd942)=_gJdK?F~1ajp=w7ujy7L~SdEAcX|mgIvXtr+>ThMbZ!w$vz&xbj zeTxmEe&|)3YXzOt8GEsmZ_=UX=O!2TEaq(@f+-?<2**4p!4*)$!;i~y%1>1Qb^`#X z>JHVS4-HBS9QN6}lFahb`)P!ZHeZ9{jSh?9`aYkC$kDl`cZmboMEAH44)NtbHpu@9 z@)g{hX{(udH5mCuILnA{d{xMZ{JI8fwYxMO8CXeKpKMb& ztPl@g%k|JWNv!@=W1T^24zKv)cnMb*tn-lmBqPii>je6Rt@t6^6i|Lmz; zOAAdqoh++bB>6mn)Y5!gWB*eNr6|ar`{FMLHAm=&$dCGt>h_t<-j>rX7uC(py;k)z z$iL^p%Z(3eBJyV#wogOWiXto|Ip*VdxC0*U#MXVh|CvtSn_wrA?b+w^aDLH2(I>CZt5%BUvYSn0ofsu;A)9n5P{1m?ifjWAe#Sz?MJKFg0 zw1+Q4b^11=nnXU0AWmjp=B#3mkq6OH3pFAN$BUu|Wj~7krU$D<=8JtTgRIzAddioD zpS_89(aD2u!0|lilaB*U{R^*SkkQEyjTHBG)}7fbyMn(?;GBdFYQG2{moNtY5$4pT zXdj)iSf2G=!g%{gEyj>)rx*4JvjAcQRL6j{0X3aU6ouv~x-X$Gb+>7vrlxTxrgvj= zd`u8kq8KZi0wmDg1e9x!W*b?Iu`6*xiiNY0Io;nh_${+baTjV-F&AF<8I+qDG2m1s z5Y6*&6C1mAf9)?PQ5)$nAU9BYDmr8LOXYIf<)&~xQA003sor|BWw&XCyr~u-M{`qN zuK5B_g@(Kw&xB0%CsZr9YBQFs=LIrS`>D1WW+YQHU2jO&D+-? a;t2UjZY^*uUM=fq5nF3}t5QqP2mb}aTBLRW literal 0 HcmV?d00001 diff --git a/assets/en/raid/HUANCHANG_OCR_REMAIN_EASY.png b/assets/en/raid/HUANCHANG_OCR_REMAIN_EASY.png new file mode 100644 index 0000000000000000000000000000000000000000..f3a413492d934956829ebde7ac69184411443647 GIT binary patch literal 3748 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 i42uwGi2k-8*mE&xeD&=66x~N4KY6-L1;Fyx1 zl&avFo0y&&l$w}QS$HzlhJk@k&eO#)q~g|_yZ+fSsWJyXy3akdc|)V5MW&$;P~OJNPL_6$J`gXa!0;g>z*Vd61KshRjlmdBOVh2{%?$PZ{GbU_;DK} z^L&2AnR92}JzV_znYpzv$T_26Gz3ONU^E0qLtr!nMnhmwgusUC^^w4;xnb_^-#_n8 z3DSAAVQvwZ;x_+jtJP!g^WU!ZT6k;rk*%xNI2rC++EaMv#BKi{k4~@Gd7LLY4e0&{ zMn@v}cx~7Uyv`nWz5ji3_T;Sm6?ZnxId-yy=fQ;Q>Q5HdofcR-lYxzaVMogCJly!&7A|IhNH7tSdjKWiev$iu+!q2B!V{9LnD zt9I4C{&x1~*_%0LA`xDhMx3?tax#xN6_VmME>;3|Af~)KRbJV&7YHh?pFT${7C8P$$R&n z3H$B0-`cbLsXRB(d%LgeOi%3z4PAOgSFY@>YjuUeJ&vkklXdxjWRmCXHOM9h(fl_jB|3LQ_NE zU%$F6zODayS6^Z5=AG~3Wlkp+)@{p~HRbT9!eH4ecU{A$J^kVE zKw{~7aCCY-`}}iP+U}B#?;gI?&YkmnS!U99FaO^bEB_fvo?BUeEjs}e#09B6;`Yl! zrfuA3rCic0fA@c?xO?F6`!9>m{OUFnyDj9#z|6o9!)thK%J0L{UnSy>etyBb@a*4J zk$3l%n!K5_-+umnQ~BV^8~3-~oqTm$oo|DFqxS+})RpD``h+S>Hp7)L4VOJF^y zg>65;Z#`-8#lugxtUtScJ}@j3V(m9k?)LN__nb5S*%W`pPaEDi?kWr%d$IH`QmuTz z$S&SyW1huQ76FTZMZh9p5wHk+5&{#dBZKC&Frg9ajF@2x!67rc0)E=(!&sY=GYvaO z$iFhOLw(&NIr>ZNx2ZnD!sRS?1*K|`YtY`U&OT2tCyaSLvw8a+9E&*UUWV1C`@1AJ zQIWMBXSXfXw&`n&uWe>b#WN&szjSR$?eg#h)&M|58OtbjdQHrk0(`tnX4QS&E-6O# z&C3Bwv|_hZBB(~#(yfD{!AF(|g4@QXIDvX?#mQnJmg^w37w~ z8W$5avooS$L+u_SD^Jq;s@1hOE)8bo4FGvftzpvJDXP0mC%eUWCha7_Y0V8Yx`CeY zy>sP~C}G+dTRA0vwA3(2(;>+|ty1ReV4FlU;^U{ufoEkC!ZgjJ?ZVsyMl;DxEq^

je5`qpp6JC0HISM=#>(Y5WFw*~cCp^X->iOq;lZ?rQ`XLsVYfQ^L$!w7h(LUBw zB<)c2g<_?8M*-D@G=5<5^G#{p;-j3x$t~OIGQ)oQz3OZ{#1()5>!`6OXgG9I@n&nv zb@&2@NvDMLcO+9LNgci{VA8_*W9h*flrP+Tc} z)1cT$$A}FxlA2AIUYMRgzSAymTI%mX94cJ{N?G0&llPb-yQjvAkMn!=iaZv9=LOZp z8fDX*5jr73kYWE!%^?@$`+vSl54p|hV8{j05%G(>14XP?+IRWf>r9+IKXZ45DkUV~ z93i*5qE>+z@bz9bhutiZMC#b>XK>XAoyF0k#NsBAXyGI8#PD#PSF4?tSFE{_^LNXG z#_aGqC2XqCZN(d|s?uzr-I=4dz3UZBN6fk6HY~&mFSZenUCei3HR#!MhM>;KvXwP5 z_K6Gvq)mEcuTo=foi}s=DyQzky^x6ySpl!7f4+JDyS9V+tB0%+BzCZQM~~O-TySOL z{73Q}roaDpPk(pwDEzN}>gl;hD{{al11{Q=4YS zosL9kf|kdp#&i1g%Uk=^WzJ5R6Sf|FK4}xuI4g56XSqUspiu!O^>@ujAh(DT#AE5Y z5W4Deuc10xR@lBj>Q7-ElHx_!trEyYk91ETyYX5I{)*(1a!3s|=};S2lD(xY0-vV9 c;sMhaiJ;S$JggE_l2>L7M`J?UQHiJi18BTSB>(^b literal 0 HcmV?d00001 diff --git a/assets/en/raid/HUANCHANG_RAID_EASY.png b/assets/en/raid/HUANCHANG_RAID_EASY.png new file mode 100644 index 0000000000000000000000000000000000000000..1670be12b1f25b1190a574c6ff7e13666c2ec7c4 GIT binary patch literal 7081 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 literal 0 HcmV?d00001 diff --git a/assets/en/raid/HUANCHANG_RAID_EX.png b/assets/en/raid/HUANCHANG_RAID_EX.png new file mode 100644 index 0000000000000000000000000000000000000000..25c40d4059bbabafafa83d0059e959324da944a8 GIT binary patch literal 6077 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 IKYnTd1zUJiumAu6 literal 0 HcmV?d00001 diff --git a/assets/en/raid/HUANCHANG_RAID_HARD.png b/assets/en/raid/HUANCHANG_RAID_HARD.png new file mode 100644 index 0000000000000000000000000000000000000000..24c47cca679501a5d32a36819a6bb792f42c654c GIT binary patch literal 6901 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 f1PBDa30ujq#{Kf>0w?`~;sbGgLq&cpu!Mq&y- literal 0 HcmV?d00001 diff --git a/assets/en/raid/HUANCHANG_RAID_NORMAL.png b/assets/en/raid/HUANCHANG_RAID_NORMAL.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5084cf12c6371617f9dc78fe7f89c0bcf6a328 GIT binary patch literal 7446 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 literal 0 HcmV?d00001 diff --git a/assets/en/ui/RAID_CHECK.png b/assets/en/ui/RAID_CHECK.png index 2c45aa1fde31e679dea75df69349468d1916ea71..51ead1cd649068cfe520015b3e71a49bba05d960 100644 GIT binary patch delta 1917 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 IM6N<$f*VJU=Kufz diff --git a/assets/jp/raid/HUANCHANG_OCR_PT.png b/assets/jp/raid/HUANCHANG_OCR_PT.png new file mode 100644 index 0000000000000000000000000000000000000000..c324e0666d800962edeea1845e2b846f402f573c GIT binary patch literal 5352 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 a;t2UjZY^*uUM=fq5nF3}t5QqP2mb}aTBLRW literal 0 HcmV?d00001 diff --git a/assets/jp/raid/HUANCHANG_OCR_REMAIN_EASY.png b/assets/jp/raid/HUANCHANG_OCR_REMAIN_EASY.png new file mode 100644 index 0000000000000000000000000000000000000000..8c5dbbdcf12a6c5c9f006eee433d5e45cf9b0937 GIT binary patch literal 3785 zcmeI!`&SZn6aetATH(=*?Zi3iWTNeqJy4I9_#%l46*Vo$w3mvBZA(NH13eO@$E@k} zY*wyOdR&HCW;!-66r*0I-NnvCIf65HI?jvr;tvQ31m`Q z9&M0}24KS({C@0V=8FZ{!+UU?J7m!zHdX6S>h!$e8Y9GR3ftBE-Xo)HIpwDViO_t4 zSDRspMkRlq7>6|f5YKLmtoTC6hw!s}B8<*;d&L#-nX)_O&e&uP=P30(K~RB{NB z`~bFhcx~g|DOiaJ)~kx6D#Mwk@D2;mleEaL@2YZ$H7uguOi>UJSvd+PBcGRe_||Xi zml`i)gIkky)&tl9VGnGScH+&#@xa{4wg!9y!r@8asrdNi9A~;dvde9AIoVGlyWeDI z;{w1Ee!OH-BAIMcsVVUXhJJs{XTS(!UUR7@7Peq8-W|kqJ>IG2<9;q{QUG`kRYG!2 zjXt8IM=yrWbLDCIOlFXGeW`R)UDl`izLT-jS0{rFKBfSS$-rZict~QU#?xL1Kr@6} z#o!12m3WvO+!?}pD+&!X6?_AcX>gDDx_RG-PJr&(j(%MHj<7+P8%3_XOOuqWZsPvj z`{RvhxxCJ>XoNzigSPr!t>A=zpk0;~zc%(8o}iuH+s$;csk%P-?I=hgSPy`{_7cv# zojQKR`Bj?#GLF^lHm$1P?Rzbm#R@FfZ@yK~oK4=4z1={KR%JByky?2_3jJX1)#N1~< zTKbwUpTiWoNkEL4x&V3 zg&m<^+r6vIDr*_2#|PtO&5)-a$?Nr=#S;16FV5S56a>=LJrI00y8*GLNvT@G8Z(r` z0vS4Aw-u9R=%#AbJ>6L+Ii~Xn=2TlnvLv`1enjDFqvllc!9vhnbLiK wta(W)7gD3-pVX&h_P`oef&U_~=w?I;!PP$Q$}2~s_Hze3E_Q#@-ju?B0A8y>g8%>k literal 0 HcmV?d00001 diff --git a/assets/jp/raid/HUANCHANG_OCR_REMAIN_EX.png b/assets/jp/raid/HUANCHANG_OCR_REMAIN_EX.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5f303df53daa51aa96bcf316a61e0e4ca6546d GIT binary patch literal 3565 zcmeAS@N?(olHy`uVBq!ia0y~yU-L1;Fyx1 zl&avFo0y&&l$w}QS$Hzl2B^8;)5S5Q;?|qH=d*98Nw61~mOe1ue6XoCbb@2;>h*iS zZgBqGp5A__D8n;h`WJ%_3z#LPCM2-!7cf-2-Y0zA^YyZyit6+GotNCm*ZF*6y8ijq z;hrETkPGg=pD6^?d)B1FbjI5wzc%Vz>Gv)E^YMmdZG^5WP(mtC_^}@EmZdB}whgP* z0U%{A;^bkSxoNJ-a!bA3tp=RF(d3)9TN+Xa750 zCtIsN*;BUMS$j$5t@FPg=5}nnV}HY6t29fdI{_HpHS=Gdd44x%SNW_Sx5a<&fA9Z4 z>;5B++b1{G?Z5tV~=|VrSjk zzdfqc;;PBfIC;$Qq!Vr%tQUX8L#D(x@c z@N;86Fhx6Tj>-ERXE6Uvjkx5GS>+vu(^4&0s=W=fzUk-0@%L`sEnjiwQ-zY;*-7Ad z-2OZ-tm5CcKl5u$q^|DVe(!wQ=Di!ltv>q){fT}u|I;F!Idj>n)&UcYgYnxxdyH?d ze04l*(x2@jwb9Y#SI+s|1R+=mfXH;;=9|vbotBe8h!t4tbP;(OndsO ze(sz(7R&j)LE(|HYeGv!+0(as%WKzL#K;^!{Jq`q*ujJgufN<{XuDGFtGWzdySsef zC!6w9vtGiJvc>s1-^Cjq-xN$Y_xyG1p%X`@y6>*b+deLtG3D_m?dE=aIcuo-39hAv z{PD9JlY1)92nWwLZ@H}ijJp_-X=d9M)x=uafa!J=jE2By2#kinXb6mkz-S1JhQMeD i42uwGi2k-8*mE&xeD&=66x~N4KY6-L1;Fyx1 zl&avFo0y&&l$w}QS$HzlhJk_4-P6S}q~g|_yN2CQt}!0?_*~(z@R>%IYJ(=@I}SW@ zlSQ~Q^Ayk4%1+jrfB1>;63_XU$`T8bZ|Dk@@iy*e7PtD)$Ra0kknhDoUqRcmZ|?3a z*q&|k;kT|%)XUt@yX@b;)MNp=WE6~sz-S1JhQMeDjE2By2#kyn_>o(a0&1Sf9TKnq zU9I8dp?OTAYsRGuUt_QHwl7bWJZ#sS|JhZ?DdxzsRnBs=mI@>Z?*DUq`m&F5qRW8V z9yC6g6?E4?~PGI{Tc{$~DzuZ?UyOMwH-3K{5PCH$@VKkZwHtGGA3u0BX5aDOig#_DKx+T2TY9(fYWc1>z3E>g zV|7<;(%HWKamn(!kbg!e9$DmF-hK7H66;^>24MTi&uRP1SFW+PnMpmtXUt0X{>zbl zedE7L&+jikt7N|=*4;MW|892P-O!R#df^%`j!~s13;%QPyAXU+Z`a5S|c($ zb@RW^zyA0?&z!G!*tf#k?)T|Rxsn^NZ2rp~t|%>?{NHEes!vfHEk!{3)D_O{4YggT z_pfSW)vj5yz6I<_-4`#n?)Sd^|L%W%xU2T^u?bFsvyYeNZQZL0*06km&gqZ2c6V2; zoW*~>^jxCN@`zi@za1BUyL$TN1yh2qm;O|J_&D;yGk_3i38Z1Csz?e$^)v%1s8 zkGnqDvrGE9P~U2Q`}n#|tIogL;ywNU&YbwIKR;-Hg@k~|_0mGY*Y2e^zBmhB%9DOq z<|tq0?(Y~jH?(m2{U5xcJ2=E|pWXKU_ihif*6(ll!SSXj>aTZEy5nx4*Mx z{cXe6M2T6;&wi;`b${piM-^}GUF6!pz{bE}!K>M_@cpM-`G)T+?=9c0{?kw6RFUEQ z-miKk-#^c&)q7g%?e}CTHykPl`y%pd7)coW7aF*Zv zdiZsDvjVG>0zrQE)WZHf%sdPX9~3^ZPmnXuy$!&xZNnUg5t--R7&A#UgwI1wj0d*Kg!DtAO90CpTU+Wp!7*_Vr{&0KE3J;Ke MPgg&ebxsLQ0H7*3Z2$lO literal 0 HcmV?d00001 diff --git a/assets/jp/raid/HUANCHANG_OCR_REMAIN_NORMAL.png b/assets/jp/raid/HUANCHANG_OCR_REMAIN_NORMAL.png new file mode 100644 index 0000000000000000000000000000000000000000..ed98d808c0c45eb0d6955f2c582b2cbd7af0ceeb GIT binary patch literal 3794 zcmeI!`&-gy6aetATFb{v*k_k3<5%cI{FBg`vJS9fF1EX_FNe5sQt&q+s!=Y%~y%j5&+83%-atkB&s6 zl8ISQ(FXxwCpP#nVW&%G?h zN>Lv3S>4zBM!9XbEn*xsDlk;Da05MmYIlX!r}u$Z`dnYb)!eo=Uz0S#J$BV`&S7rIp0qr7-$!#_)#IQ{=YOe5Z3YXLm_^y(l7=*^^cW zlXI>U%YP9V?YXQ6T(+qN1#V<8VRTZ_RGXkBsyL=OkV+?>9&$SN&<9os1tCDPqUcpc zmi3ddHy1t@*ks7-TtLIk#osnYl-Ba5h@0S+IeRRXlqc8Jq!4@ab2Jf55Hq)z*kQFu zRy~RXzTB!*{X0#(4huMN=@u(;Vvl!?-}0L?@iJe)%~aqSFj^3f|mtZ_uIS00DKp1V1_&CnrvV4hBYW|+|+s(-4 z%C&tCuCq&-+=Om2oy?%wTnqW;$(pKauXe~Z8YLt9`JB%HI>cT>z`7q0wkEbRm1E$h zQKZOy6c-Qrsb9iYTq%O3Kf!ewm;gZk_S9W&LJfyV7bXn8v}xkZGzryx&Mg}xhM=3R zD9@p?(>oR+HwF!p0ATvF)bcwt-eNy_=pU;BOD8m+0D%)`e;+9^Iw{ zR#oJwXtB)GydxybTLY0QeOZ`isx0x&H$L)A{|(lD8OB1}$BH93CQslwVh%<-yOIwn zP}Ou^d_wtNNOgV6peoJs70Ewe5MOa0I0_g506gH#U-r3UsQm}$DMhmde27@qQ`)5U zwQbx%^}XHBTzas&{3>;KARG}~{M7o>Qco+9Ir5cU64Z@|91)!#<%KZ@CN6>bl|QPo zmHBHA(*!C`U!HpW=1qricD8F{;R_!h))@xg`Qs`uH~EDbilt|=UK_~Vi|+RDfF_UC z^+iZ?v?+%n{6iKNOUyk^pu8*!O7!h4)lNFU3$UrIUv literal 0 HcmV?d00001 diff --git a/assets/jp/raid/HUANCHANG_RAID_EASY.png b/assets/jp/raid/HUANCHANG_RAID_EASY.png new file mode 100644 index 0000000000000000000000000000000000000000..ef4719266fd223078aac5ff42477c1aee94816e1 GIT binary patch literal 7156 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 literal 0 HcmV?d00001 diff --git a/assets/jp/raid/HUANCHANG_RAID_EX.png b/assets/jp/raid/HUANCHANG_RAID_EX.png new file mode 100644 index 0000000000000000000000000000000000000000..8f142d4ce1025ef69df691134d15f74eb23d9f6c GIT binary patch literal 6100 zcmeH~`#%%PVbZ8kNiWs&6_74;_qe2(Blml%&9#kO#>RA75kiOXMYC@y zmzWhX%qR|yd#qvD<`Qdj8D^W?=DRw-egB1TpI<(o-`=0k^Zk0f-mg#EZxH(Y5YrH;l;fS z(L4L@>(n2|V}QEj&%Cd&hpvon>5Yw6B+U(_+CGAnB*5qif_c&I_g^mkZG9u~jleeo z-w6CKfxCNwLz~|N0C&r;tP2j;In-j{&lu@_$^7S^nXUC}&J11sSA88^1c<54#YXBz z;2!p3B^_XTE$Cs_y;U0(Sz6EarOR#eYXa~aaQWt#VK1D zrV}+YoDtC$Hl8&X-_mkn_ZLL{YpXf|jnABTqryKXy_2&ipd=(P5&E;9VFUr>Wo~I` zJlvWGby0Hi@P6w^n7KawC*!p{zGqvk!-FHyp@pH?RNF{RIct^j^cz3O%er@=8szGr z*K2%a-_LIJPtdn69@l8l&0QVgn5E6}t;cnLMeYTurz}@o8F0tc>{(rDJM`{L-Ougx zt+Qev6sD$7)E*IB>yOELLD!V;C`HzH&lS4%a3kx`76fPcd(DUZ)@LYgH1TVg{Y1bwKV5CC)|I zvAy;6^@3ysdtoqj5|oco#913^WXiaQippc{)D+TFvtP38d-Dqd{UgTqkyU`oZLv|D z`uQsBW}mLuz&X5Twosn07~o07u^@OSVa)*jfyH1H;&H{+7J*EfoDNp(^69)fa6p#@AyYOBIfd+r z&^A1C2)Xi-gO&6K2N#ESLAM#ZGc+9*OE-J0EtYfR2VF|7oA6j_&_z14rxrZiZ>mnq zDxN_6wEyrIoZY1*rM|G~JnNPpQfN<^VW8*>75cO^Bl$i=e^&=kZ;h(xBV;7Q!IuGqaNS3RZ95ecG1+rQ(}=6w$6pe zw)Vf9+5Dq98b^DSY!#65%YJDGD_3oditbqG_WDim*z+vyZJ^l2>wFzNAyj2!M~v;? z4QY(dz3;0v+p&Rm8%eh}%oOpLktF58!Gkx0s`L&Oc$3asR?}(J%>J3EEPhuKsnIgZ)d`Xwy+(yjd2I+rQeYB?`~|wP!mYVa1p$|a%9LS z#wX<1U1?A(@k8ia_x~yu+q=R$);xA@sbXFq^_9=q1qYN6Q}nXCOD!L#*ct$BgAC5y zTMA-M_L;}NLBiwU3o+%EKekC2I`n`zj>Rd81!ux@h$!yyah*ON&3{0wHkoI&oYQNq zqsdpmJKy|y79bUaYF&p+Rrd; zHlV-kw=O+u2Pf=d*0$?c7KwVsjFh>xb%Z|Bis8M5t;blinnxKFdX>5hFVrX*76(I> zHHkBkBtCY7(S}!cQ6ja!YS69t{;TdaExkrA!8@_$pG{E6k$EBk(1&dl_6BR_N{+ZV8N9ZuFKp`9(%<&`DS^tIWUxn6z82;&IjP zpdj+|h9qQo;dLwJxaWyRxwi?DU<3lUHv_Aya1Z5fd|XFR65rzM^@)zLWp<=&+i3kW z`uG($Jfyr*y}%)!hw(@vUEqlJ?rR+XQb8&9V+4>K<_r<8WNC(zV`}qwV{^}w&ChX7 zf|LlD(3gcOPnQ)Hke5&Ts~y(Tnt+C>DY@e*x|0wpgrXNyFNv;-jft&V!jy>k!X9o| zVf@(8c~!B;sWGxAJfZ;iWFRMQ=d#CP%Ehk=b$BvkXg)rAZc&6?b7^nc?PguhIa9%w z4fY0hM^U0&#^ISB6<2)LdY7i=7u_9?tb;1{N5;%MuGtckv65_O#eJxd%Bq*Yilk4_x8E}eQ>A77PoWNBWX!N(&PHE%1~ zF30&7t7YF?GjpPT+IkU+=dq=TISUV{R3}_Rz+rQh1EtXFUK>hebM#vD)l^b-(#|!Z zfwj**^#ku0tR;;FWqm~5n4B}9&68luQ%#_fOL_7L(X^b7=2pAj@n#>F8bJWoHy8YH2^%c%6$raB6lY+ylh%l3k2%HY!C z!a-%m~GfII6 z7Yz?0XwNooC7KCH{r#Q+zHn_4^m=PE*;VTD^rli@9e>OscXS1!(vZ_5+~(;PfRP5e zaV+PI)2wIK)p9L$c!)=Ue*{dX0O*YDt+8X>wr-0dOfCy#e?>R~WTg_*?4#C|K2F%% z|Lc?FxCprpY-LL-HotgozF;BCq+i6(Br&H@$Z}(Kz5c=TcpRdAd1}Lv2ez*0HrB9v z!*T7|(%1cGZnmA7X=(MT<+aUOc0j8cFz>{q&ff-PBNhGy-DaL(B6sc96xUjJU95RB z93})pX9+^hlUZjs6;e8HT7I%kh>bKN<_E{2NhT~hR}srm&Us01+B!{-=kzD?0!Ehw z+;KlA^%931M2oPq)Y7Pztsp$;qGD`#-*c#6C>*imE&UrbrzM?(CE8o!mfd2@zee|9 z(YK>Q*Kbuhz7V5sL>kWvG5IS{sQL=cH8D4r@X|1vk1H(m@RR+BV-j@6nrG^Ux7iw* z0fQpG1XE9mtPk6W-<@f{!-JrB$z=JI|sX77UJaKIB zC779y+~$FWT`Q1dcl&H`mVe#D9!WPPB6k$am95OWRleFlvX)g&gfxdBR#whvP0n~d zc6>Xx_S!u#v!lX$U7NW0Zs0thYDngZ;%cjlsx1=Vp7o%^s*pNa&l3&CTdCyX2(~Zz z&RiF_kPd6+m3BT)wIv}JXQiVrajq6WGP~sG<5}LvUba+qgpBXo{P&6Pjz}|_f6=9P zU`v~XIUf?*Vn7iot6tSxM>rSO9)@mlSAQYK+^H38>s&3J6!968p$G(`fqF@`|EZAw zk_X?dKA%xGvDQl*8bp>U?2j&N9@?7@<4*~q`Sz&}NW@D1z=AohL+1IB-+^D}qRroN zo5XVFu~Yvrer4Z{=`SOvUJ#r<8tYO`iH)^zvKK#c&zl)dYXpt!Xhc1(>9e7rV0wii zJf;)Tk7YG=>}PdFVq#E};nuK#$qX<-qI!KTfcVv~fjV#1bYUc!$71QH>|IK4)xum* z-TRbgkPb<_h!V1~!S~(-cXyQ>NpZq<4J7xqznS(--fHSb>7>tQGbL-za2EXeQbteo zv8XA@%d}&7Ip^JfsdT$+rUh^B2#!)aW}GF)N#)4sok7OgknSiirH)|9%|@ z`8b!y#GyI7Juz$9pS(g)JA7Pfw$q%PL~;A)3O!nWlju$7AFl`~EUfy@3BSHaJ{x=& zLVOt`;F4j%Tc7z%@$>Q4VmNbrkehhw0a(ky4*RrQU9pFb#jHhs=vRfy`jE6{J*sHr z+=YbUPph3&!^2eSvVrca-$%u!2w?+!<;k*0GMht^8qBx#jleeo-w6C45ZE0O7f8QB Y*{uoRV@sFwzr5JN7GhKLuj}{z3p65A!TRKBzWcpZ+ka*uRD_(euv4~K)!`y&1YKWZCt-5>4@zwR50 z{0cV#fsPp2TAp`}8U8^>{9A#Mt-gfI7l-KH50xVwy!d+O;gJvbv#zs0h@dBKE0kWA z2!4kB@*~+4DfalXx0j_)A{Msm)7oTB>@&;gr#GTh+TAN#Pdp_V8Irj7up7s8UV;+YD*8y7;j&Ags0`3giYiol8X zG!|CsoqM^Gz8<~F$Zn9ObBA=ynm7}|Pe&(isPEl>LDlJCD{HlkIblco#`}o5W8Ozx z*=h|k(vve<6=u)S@zo0Py!iAB-cV1d-Q*i%X{E+>N*~=Zid2xY7+mwm$MjL0ega(1 zjOCo5@47hSVg>0|>g`!y@Q=s78^w>rCdn(0d{LebswhRN zv#IPXVw2P5xp{M(fn@i<7%?Z?c5T6YaD(-o+s=}nQYGZ`M)OXn@ue5hJN#||y+!71 z%2i=-EwLB#y&&|1fx=tOS-Rtb4Bslgxp|rLg6?SUnHcagTRCcNbd$qeE;%#zDX1hU zYcXVVf>>QXKXm1{_rQLIe|)1+(fF(!`|4_s`V+Cu`i&lQ8-kMb(WYKO2k{I3Ra3OE z<(to$1UPpA2A$Pr(rI`;9)JDr0%K+^pC>wpxI`zV-}i0??FWIvE~)X;aOEW$ZS1BP zuZ|wXNOG2=LK0g=Bq{#G*DT@mcb}6dKU<~W#c(N-Qw8S@VGFXJn0gdv45qlUmtHv= zZbX};CFf+^y)c(^S?jj9}f#J2Z_A9?Yl zU3jBrm`8TF*aWcAXYNVhGGwbG?EA^Y4$>dCIsyF-Ym?zb1ue-o+gPT6ys>%ns(X;k zo2&{RccMFu_0l}^cqcHP*rhv+)KD@TeDB-W7FEokzG%*6wP;KZe0)B^u5fbyk|LY zEUb;udCJCu>9-qwpXcT2rYifQ_p0mzGlZPa)5L}m(=+ZzeEqAW9?fId!v;N8$_i16 zwZdM`CEVon&sAj$ab-8{n>qT?Vd38!N->-Q+LG%(rydY1mP6?nfaQAjG}%n@{RTTkvUqhkRAU5N#|m ze(*bOBRK)F;sc0hLX*@*a*8H>t_SDwx@WM<)sE&g0n>){ptRp=y5aGhUpq^`xLCsy z{=a-Y&nDw6u0mC23eDL?!{Nk+%@)qrm?qxn_gZByPx!QS)+Zgw(HmX{)oW4Fw-%n`4dp7zpd<|4HH{CoWGhiuCIv>ZoQq(YK@ ze4Ylx?KhmbXFk;iIDH<2$I103u2TBu&6~XkI5z?8iV1pOmCXhP%p_$xZ^kkrpC2C` zx~TA?ckaMq%_zPeta+zEy4#`yBmx3y-HbuUT#r#vxU80zKS@n0Ld`GM*P&}64sG&) zCm#Hik}D*?HoxfB9i|qD-?fNt!t-*`%U#0tnG-WP`eSw@$C;sL&dpf=3EBe!86HPL z)8T1WB^4##8ozN1mh>K^PK0sOB+;qn9i)s&WMg6w9m z-N@(~!^_cs?9-cn&qbZBJ=Q7q_pT!#kk9$Pnl``)8;pfH&~=>Xz9_~jg*Dwq6IK%V zUqd%fz<@w->-N=sxts2-KVP8Vj!Syd8zMdajz4slDMqSo`eL(Y{f|Eu-)AJ@KP~)d zUD3rm<3)|yBE2c{@f6_}4$_Bzmt&Bs4k z+?8WZ*Fydc3l#<$n;4#Z8N=JD3j)2LEh*VAC;!v7S*C@T;FZ_ zg7EU*(}X6Yl^=DwJ`nOku2NZ1==a<6OVvexp%9S>lN?`vRiACgJ7}*)9ZaU}9`L}4 zU+3zg%1S$;g#9R4G;PybWdW@SQMok0B#*t;6wStDNK(Z~E>o<*cG)dob8vJzXww+j zj06`m?!BT3@F|e+`)C z0Ln0m2gzl4wi5_=Q|#D z<%jG<#4+9aXR+Mnr3WqZIPLbT_2S~@a@_9^Tdm^MpdQ|bSN8s+`M5T0RZf3v6(Yf8 zpE7Db+gc#IPTwE4ximO8J?pfeQl)j5HidU339yW`u(vq|wEOeexbQ250mE7k>oQO( z-tvIz?xcF3nfL1zYl&7$oXS7Y3DsEWlckU^{mFoRcVtweiOL_A02!Rteq8QAJKo>p zVLv-p^0cPpX|6g)^$q-|^tr_G2d5fCPL&wVeIol0!^em6rZ=3>%Prr#w8$1ul~l0{ z{)q<%GQW<76$Q$i2cNpLW*v`IaC@QAxsAq24aqh{u}z-=FJ+3<3#sFyv-Z5-%aML| zZr3o!ZD6th4OLte8M%DQ4Kj3AynMcVBFrQKId~{}b$PcBKt@l`!TdSXp}kz)V8yzf zp#vAeirB*HOe&i@JWU5Tv#sOadUS7$C+}rG9>ba3oP*U0p3Z4&M7y*h>pi(%GJT_h zV+UJ+BI(|#7k8BWhep#0UW zmeu}?D3@YAD>e(H*buKYi%#c}ZJ1g}Jqs7<5?S*7?9aBT`s}Yry%Gh7gK6P{q8!`p zN+}E;K2GkdnKM|Y;C47lrY*U|&Qn_PLyf^9s8b)uXUNj&s|!pzzm?h@sS7g{+~uV* zx){7UJJRM+&bqA6K7D}iyf~XN7E3S0B&QE!7AWC`pbrlVBG(?AUe;M=deQ_1Z=IIX zuq%GEYd4<5HZ6va?34kp#iV%p zauRQ~0#SdvE)nNup56DDx=;4Wa^9D@2OzDjGFNHYQr#ILkdT^&6AL69*M+G~zZg2Tp z;jHO=kJ_MAXuU8BXscd_pR}f7^Y67op!a4x?b{+_!+3avI8_qtJvO)@={DfqD3ueE z7P0XS)+HgQ^C=*+-$e(y<&=hk75U@p=1GjHn}S+SnA`{E()9J}I9?a`!H>*r^0HHN zG@>Gajn{8jPIs${@SvM1)w?veb|YMN$DPTr?76v=F!||c8DwN7JDs(Ssnnn8*GNx0 zvx~kGd{y~5kJJ@|aaJx5RGQ8&^Ym2STqlJS9}T~4K@d>^QtI}?vAW~Vdh#RozpYJj zb@zeA)1;?Rl{W7Jy$-+@8BMTzN9f@Kthp zs#bfqzL@{=Q>^lRIWOxT4ZG^|7+p!i?2!J5ZqUPC<3{<0Y$Jzs&JORp8rzjzy}0~Z zpPr0`o64eDdZbIkH2QbvP}%#W*%vQVL*q9eTjxtfRwEEzo1@dQlH&#??|EW5LNP(`qcI-^3n7ai%9?Fx{}gy5+Z2$z>Z}_LJxy zy?`hK@r+pgHvi<@Lde=hnq!QCK>jYDkgy#lE0eDHT}F?G10iKm1~GA30g6hkcD9L~ z9imCO^Q68dQ>7=>vO1559nt9O>WFytKuwwf9jlegP%J&b$o~Ww$SWh%GP6k$Z)|&zwxiCnLoe< zIn`R89*t7YA(((l7BdCc=xPJS}YY#Ve*~m7(q25k7WOW zM>5HbTo@cww@Vx?U2+k)3U{cDtQT@yn?kuOJ9BMCla1zw_DsPo5zXf zh6=-Uj;!?j2=4EgU&V>KBUue{rV59qJcwf+`yZ!?k;GI^Y2MlT6aUxq3xWUB2)q{x bH|v2&sXJlEbb&-5w}!Q~aElbIk`1cCo@UgCQ3~^Wn#H7m5wmj*5sIAp0S`&j0Yeu5ZsT&->H!-tYZc?)&q+DHowGdYgA{ z1^@thu4kQo1pxk~dED?(dxK{C$@CX3&1Mwgd?n%%#xDYUEzB2i>L%v8?{3%NYyQ5! z`d+&k6WZZx4*(cHcXc{-IeKW0jrs#9`E6veq4;0$BS~gE&Vc_J*{CzTH)-W1?y(l+ z)>{J;l1|F!#4ABp5icJcoVa#)>A`VHh^=Hx4LRhB^q#lxccr0ZcEzs z`18iwhLf~Ccb__b>u;Umi~pKWmc!u;(?c~qg>xamrv?}LX3MI6n=h%x(PYXZZ4KbB z>nj6a8TiV;R|dW^@c)*9J8Fb-6H24s3)V~a>gn-J+#(7GQ{Pw&_J5eVGy%zmhOPQ# zMVLSYEj^&=N^ulqFg@4J*JBDX;-N^X*63Cajukhj1|p@h@81FdZx8hg_b~{dM*ZW)H8v^y_MVd7{?}b>EMA3Hd#hI!P^F*p zkJ&wwQ=$~`nIFJ#djfPhz@+^Z3ZSJ60OV)QB+g9T>vGxn8*3xd0_03iY!E;U_SrNj zn(4;XXx(l-8x*&3iD>TDxYY5YryXO%m~8y8Y(KlY{`!DJ^f2K7XW(hD1Mcr9J9jY| z?LI<$Z9rC+A%VDN-kcV zU!_X8#%!ZqRlMPR@r5Tfw(~hld|75j`wfWJh8+NaEg|;om__P%{Vpw4lB|*$kCQ;C zdHXv?ig6ByVque;NNg|4=*Wa5Tcx8!lF8~p9DJAlHgY7jbST^HVQ1I_>G_1$NXMPu z9svMCHg}c9!imE*xatcE=J7>aSif$E3U(v zT8wSUeQ3oYw(bV2b8`Nz;CesPs|5t-mjJ+>lB`NUdU0jbDdPsxV1?Q26}_A|smr6( z#G=QBx2voA!yntha-U02armOspycrPsqe0C;iTn`j@aJkyMWNVE95w}JN&p*`3zgf z1C1CNX>9}m3cB}pnoecjY#DR9V)0PVyQ`ewhTUjo(1vYyhUp@WCM3)6-kd5O%roW0 z^LWC1{A4_tMO8d{MDeFkd2x%s0HG{pG*-@Jfz+N2S(Yw$^7OKsM0GdT;$d2AB2(go zbk5O4Q+~?U>T30rtQBl2W{A!h7$A4*(vHnV#!0QYu?gl8!ivZ65aw2smFKZI zFGqfVGSC1HuU#DanG|TPeH8#0xjb9w!#WXTd5C7FUWm@x-z?PEgjv5^MC#|P(nE3h zqb6>rZBUBkbA?Z_7y(-C7sr3^Zd;PUIU0MDPjrE&n#DiMWl{{=7F)=>UnVgI7!764ti;PbGAtSfH z@-!gXkQ8IWL{x&etC~-ZgbcL`QH_f%<4DhT*WL??4eOv~SeOVkoovX2)FU4`@p|BY z6Q@%b4QaB;>Yq^=or7WV(Kixq$ninK_?k-(C#8sPOjDh-m7qk1|9Mq0IgzJ!cW95r zzvf0@Nt;*h!(Xmtz>E6O+a-^p7_=H2X_z<8$MF?N?8u6nQ@T1DHClg;y>WZIHhqDC zqjB|jF?H;~C9Q%oL?+G*ec&>P;P;9AMvhSJy`u%VbLnWp1Fq_3brrWpH*~1!jm7B4 za{sJswQl!QJFb_2svIY0=j@+v(ZF}ynSMZWfR8_^>yTgdOsX7b#qvEq?g_JNFFq;{ z+-}-JHH>YFS*y^pB)%~znH05kL|ny=eIR}r$6xWW27d>RrE(@|O+e&ad`+Lebe_%e zLY6+UB@}xc$?JM(8sO-Kc^nbuCo1B^9cn~%`v;WWUF+p9O2=+3bPi1~!*CF*sZkXC zKUTA?C<=h?1%L zvz~gHdej}B5Xwtk;5}q+T9bl|`VO{ry1cq#QgXl<$v|d|*PB%Od@}L|h5Da3;N3+O z;5quEC#A{>q8p@aC@0@;ae}ir;GzsqobIEBlzM14u;)u1t$bWruQ`n`Pc$6c$t3{U zp1NO}^C}k6j}?o@_tV|`I_lH5uV;jTwB(RKn1i-12X~Z!1CW$IeaN0xQ>2Yd% zyK5dLRknR>?#;6~C+B}SQ{(N}ZD8gTXvxekKof!K($?KyGOG_}V-C+jDOd;5iQ*4S zKPkmbx=|1P#D_f*#EI#<`(j|{4`jdFO<8=GPB6fB)&vO;W}Iw~+g;mNHV(Cpdu+Ju z5qiJv(&he)ddUej5yQ0$6xqOj8e@*5)U` z*YbgW!FC+ut|A3a6`f%*aDP94nYyPDCUp;vk9fCKiU!wFE$UY%Ppq&*ZlgoTwp%J~RSQC6A?(xN(Gy3nYBZ7@w3&Pf(iz*Z6o!m=Q)=)R2txV;9Uo0Rcwe!b zQ4(YKz%GyRp5H@QyuozK+Mn_0oGY`HmGAw5-}<@@m64#fx7+u{QS{A5j&XkRbPDxw zzfkjY@(d;Z&xl+mXrgbXU#);PWFcjoR!(5G=Vc~`=DsPo_WU$)rYjVb@ieuW<fbLiv(K+ou7x+^nduDMq++cjUkcSoPiPV_uWU#@-EgT zU;3NBgAQk~jHJC?W4JGm@v@?}5--+84i9vAl0$Nzy8^*P zGOXqgF-BOe$FyOB-;Z9TGgWeN#LnCk2|RxcZJCS!NtUrVX(~$5%oXBlybhPK$l~`W z;L#RjwNDh<8&mLCRAT?@Tt?QhCY(w;?Mwc-70b$i365p{wl1RJhQi;@478bxs+Pk10^Wz6KwH8V=k^0=# zNqPp&KGqfXk#O)FsYlor9GSQln~or)#zK`E73dL$=K8#xQf-m0L}+xCP^IT`hCk2Y zlw((XQmhh$y;HKEqZ5?P#`34>mdX*0>`jH$Wwmy-pUJpe-<4X#ag2ruOFsp@{L31) zD;evzT!wOPMr@Q)U0*NgtoN}?R&M_`JsbtcATB$@U{H2E@(-fIytr(!R5agmJFK{1{>Ae6LY+hO54p}jAvwoSp2TJKDGBz z+E6|F(>)<&vCSNt>v_5b2x-vv>$bE<9Z-|A=(nDoF*OdbL=AZ&-EH` zhT?;lR~tYsle0TA_^nSF`}h2Q2EyxWQlQ;xN_NI^$oX6!K7YtEw#|I5?z&=oY#nr@((+-4F=2eMkRo) zwolR;8!fV?nz*-M_hi9BEl0DQSp2gb3r|-+R2O<~ctK|&ZM_7_?ayg_%Mm!SSd<6O9XqVaoV?*Y3u1#(vG-&Zck9MPT-NhZ zXV?y{DUbD8;@6yrBAYYi&9X`;P+vrexfZ@$n_jv#nP>I0oXBvoGZo&AqN-T@(dnfO zZp`Hm<+o`ZPQy#1_qOPy3`%)GmY*;Dg27UBk9VC(NL86%`t+Q)#w^RV)~)1(uwy`A z!423HT&4b;eTTb1{t#QK9@U zRjRUnt1w+$r=FB8863_fJnThR=e4=U+h1Cn)fR;4?{iX@Qe4m~e%HF+(F8BnVfxHq z;C7S5N1HP5Et(?tv@D3#jYzmNsX646zGA>wE4ie)eDIXXZNoLe4HP|aa{Yc6H`Vy* zKgLf8KH>kxRS{t=9I}$rM{&Azj?^2aE zNt=|oI?XIE-OZ)cVg*WpZALaP@70*IMv=mmAI;&g4<-}v)l2Y6(7J3FqCb{-RxyU> z`{cndUJbLs&%zqAwvUFV2F7FUo4|wA+PvohYHtY8G{L5OITrFP;6Lf*d-I<-JcXxj zc?+j}7eeM{QmFMR(pJcqUnF1GR|fuXGoZjvsI`v(sDpVmb`C#Rd;#m~40WnHef9VM E0>~)If&c&j literal 0 HcmV?d00001 diff --git a/assets/jp/ui/RAID_CHECK.png b/assets/jp/ui/RAID_CHECK.png index 041f2cd8452b3fc2ca1f18e80b98ad40af0d8f9a..2df3ee5a7f334ff0c3c3cc824a86e75578f88200 100644 GIT binary patch literal 6921 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 diff --git a/campaign/Readme.md b/campaign/Readme.md index 4adb53c05..681299eff 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -172,4 +172,5 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20231221 | event 20231221 cn | Light-Chasing Sea of Stars | 星海逐光 | Light-Chasing Sea of Stars | 光追う星の海 | - | | 20240104 | event 20210225 cn | Khorovod of Dawn's Rime | - | - | - | 復刻破曉冰華 | | 20240111 | event 20211229 cn | Tower of Transcendence Rerun | 复刻逆转彩虹之塔 | Tower of Transcendence Rerun | 遡望せし虹彩の塔(復刻)    | - | -| 20240111 | event 20230803 cn | Anthem of Remembrance | - | - | - | 奏響鳶尾之歌 | \ No newline at end of file +| 20240111 | event 20230803 cn | Anthem of Remembrance | - | - | - | 奏響鳶尾之歌 | +| 20240130 | raid 20240130 | Spring Festive Fiasco | 寰昌宇定家事忙 | Spring Festive Fiasco | 新春宴会狂騒曲 | - | \ No newline at end of file diff --git a/module/config/argument/args.json b/module/config/argument/args.json index b13a783d9..2614dc913 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -2865,15 +2865,16 @@ "raid_20220630", "raid_20221027", "raid_20230118", - "raid_20230629" + "raid_20230629", + "raid_20240130" ], "option_bold": [ - "raid_20230629", + "raid_20240130", "raid_20221027" ], - "cn": "raid_20230629", - "en": "raid_20230629", - "jp": "raid_20230629", + "cn": "raid_20240130", + "en": "raid_20240130", + "jp": "raid_20240130", "tw": "raid_20221027" }, "Mode": { @@ -6093,15 +6094,16 @@ "raid_20220630", "raid_20221027", "raid_20230118", - "raid_20230629" + "raid_20230629", + "raid_20240130" ], "option_bold": [ - "raid_20230629", + "raid_20240130", "raid_20221027" ], - "cn": "raid_20230629", - "en": "raid_20230629", - "jp": "raid_20230629", + "cn": "raid_20240130", + "en": "raid_20240130", + "jp": "raid_20240130", "tw": "raid_20221027" }, "Mode": { diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index c387bdfbb..8f9c763ea 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -718,6 +718,7 @@ "raid_20221027": "Fight On Royal Maids!(Part 3)", "raid_20230118": "Winter Pathfinder", "raid_20230629": "Reflections of the Oasis", + "raid_20240130": "Spring Festive Fiasco", "war_archives_20180607_cn": "archives Ink Stained Steel Sakura", "war_archives_20180726_cn": "archives Iris of Light and Dark", "war_archives_20181020_en": "archives Strive Wish and Strategize", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 3033718fe..df19a860b 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -718,6 +718,7 @@ "raid_20221027": "戦え!ロイヤルメイド隊3rd", "raid_20230118": "冬の案内人", "raid_20230629": "緑地伽話", + "raid_20240130": "新春宴会狂騒曲", "war_archives_20180607_cn": "檔案 墨染まりし鋼の桜", "war_archives_20180726_cn": "檔案 光と影のアイリス", "war_archives_20181020_en": "檔案 努力希望と計画", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 08ef51932..1135a1c5f 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -718,6 +718,7 @@ "raid_20221027": "战斗!皇家女仆队3rd", "raid_20230118": "冬日的寻路人", "raid_20230629": "绿洲往事", + "raid_20240130": "寰昌宇定家事忙", "war_archives_20180607_cn": "档案 墨染的钢铁之花", "war_archives_20180726_cn": "档案 光与影的鸢尾之华", "war_archives_20181020_en": "档案 努力希望和计划", diff --git a/module/raid/assets.py b/module/raid/assets.py index 7310a3091..3c813b3ed 100644 --- a/module/raid/assets.py +++ b/module/raid/assets.py @@ -32,6 +32,15 @@ GORIZIA_RAID_EASY = Button(area={'cn': (1071, 515, 1118, 538), 'en': (1071, 520, GORIZIA_RAID_EX = Button(area={'cn': (978, 210, 1050, 242), 'en': (978, 210, 1050, 242), 'jp': (978, 210, 1050, 242), 'tw': (978, 210, 1050, 242)}, color={'cn': (166, 186, 137), 'en': (166, 186, 137), 'jp': (166, 186, 137), 'tw': (166, 186, 137)}, button={'cn': (978, 210, 1050, 242), 'en': (978, 210, 1050, 242), 'jp': (978, 210, 1050, 242), 'tw': (978, 210, 1050, 242)}, file={'cn': './assets/cn/raid/GORIZIA_RAID_EX.png', 'en': './assets/en/raid/GORIZIA_RAID_EX.png', 'jp': './assets/jp/raid/GORIZIA_RAID_EX.png', 'tw': './assets/tw/raid/GORIZIA_RAID_EX.png'}) GORIZIA_RAID_HARD = Button(area={'cn': (1072, 348, 1118, 370), 'en': (1065, 352, 1116, 368), 'jp': (1056, 345, 1126, 371), 'tw': (1072, 348, 1118, 370)}, color={'cn': (169, 172, 162), 'en': (183, 185, 177), 'jp': (215, 217, 212), 'tw': (169, 172, 162)}, button={'cn': (1072, 348, 1118, 370), 'en': (1065, 352, 1116, 368), 'jp': (1056, 345, 1126, 371), 'tw': (1072, 348, 1118, 370)}, file={'cn': './assets/cn/raid/GORIZIA_RAID_HARD.png', 'en': './assets/en/raid/GORIZIA_RAID_HARD.png', 'jp': './assets/jp/raid/GORIZIA_RAID_HARD.png', 'tw': './assets/cn/raid/GORIZIA_RAID_HARD.png'}) GORIZIA_RAID_NORMAL = Button(area={'cn': (1108, 430, 1153, 453), 'en': (1087, 435, 1163, 451), 'jp': (1105, 429, 1157, 454), 'tw': (1108, 430, 1153, 453)}, color={'cn': (177, 179, 171), 'en': (189, 191, 183), 'jp': (196, 198, 192), 'tw': (177, 179, 171)}, button={'cn': (1108, 430, 1153, 453), 'en': (1087, 435, 1163, 451), 'jp': (1105, 429, 1157, 454), 'tw': (1108, 430, 1153, 453)}, file={'cn': './assets/cn/raid/GORIZIA_RAID_NORMAL.png', 'en': './assets/en/raid/GORIZIA_RAID_NORMAL.png', 'jp': './assets/jp/raid/GORIZIA_RAID_NORMAL.png', 'tw': './assets/cn/raid/GORIZIA_RAID_NORMAL.png'}) +HUANCHANG_OCR_PT = Button(area={'cn': (1166, 604, 1279, 635), 'en': (1166, 604, 1279, 635), 'jp': (1166, 604, 1279, 635), 'tw': (1166, 604, 1279, 635)}, color={'cn': (143, 143, 144), 'en': (143, 143, 144), 'jp': (143, 143, 144), 'tw': (143, 143, 144)}, button={'cn': (1166, 604, 1279, 635), 'en': (1166, 604, 1279, 635), 'jp': (1166, 604, 1279, 635), 'tw': (1166, 604, 1279, 635)}, file={'cn': './assets/cn/raid/HUANCHANG_OCR_PT.png', 'en': './assets/en/raid/HUANCHANG_OCR_PT.png', 'jp': './assets/jp/raid/HUANCHANG_OCR_PT.png', 'tw': './assets/cn/raid/HUANCHANG_OCR_PT.png'}) +HUANCHANG_OCR_REMAIN_EASY = Button(area={'cn': (961, 522, 983, 540), 'en': (961, 522, 983, 540), 'jp': (961, 548, 983, 567), 'tw': (961, 522, 983, 540)}, color={'cn': (143, 141, 140), 'en': (143, 141, 140), 'jp': (136, 134, 134), 'tw': (143, 141, 140)}, button={'cn': (961, 522, 983, 540), 'en': (961, 522, 983, 540), 'jp': (961, 548, 983, 567), 'tw': (961, 522, 983, 540)}, file={'cn': './assets/cn/raid/HUANCHANG_OCR_REMAIN_EASY.png', 'en': './assets/en/raid/HUANCHANG_OCR_REMAIN_EASY.png', 'jp': './assets/jp/raid/HUANCHANG_OCR_REMAIN_EASY.png', 'tw': './assets/cn/raid/HUANCHANG_OCR_REMAIN_EASY.png'}) +HUANCHANG_OCR_REMAIN_EX = Button(area={'cn': (1082, 16, 1151, 42), 'en': (1082, 16, 1151, 42), 'jp': (1082, 16, 1151, 42), 'tw': (1082, 16, 1151, 42)}, color={'cn': (54, 54, 54), 'en': (54, 54, 54), 'jp': (54, 54, 54), 'tw': (54, 54, 54)}, button={'cn': (1082, 16, 1151, 42), 'en': (1082, 16, 1151, 42), 'jp': (1082, 16, 1151, 42), 'tw': (1082, 16, 1151, 42)}, file={'cn': './assets/cn/raid/HUANCHANG_OCR_REMAIN_EX.png', 'en': './assets/en/raid/HUANCHANG_OCR_REMAIN_EX.png', 'jp': './assets/jp/raid/HUANCHANG_OCR_REMAIN_EX.png', 'tw': './assets/cn/raid/HUANCHANG_OCR_REMAIN_EX.png'}) +HUANCHANG_OCR_REMAIN_HARD = Button(area={'cn': (1145, 522, 1167, 540), 'en': (1145, 522, 1167, 540), 'jp': (1146, 548, 1168, 567), 'tw': (1145, 522, 1167, 540)}, color={'cn': (163, 162, 162), 'en': (163, 162, 162), 'jp': (159, 157, 158), 'tw': (163, 162, 162)}, button={'cn': (1145, 522, 1167, 540), 'en': (1145, 522, 1167, 540), 'jp': (1146, 548, 1168, 567), 'tw': (1145, 522, 1167, 540)}, file={'cn': './assets/cn/raid/HUANCHANG_OCR_REMAIN_HARD.png', 'en': './assets/en/raid/HUANCHANG_OCR_REMAIN_HARD.png', 'jp': './assets/jp/raid/HUANCHANG_OCR_REMAIN_HARD.png', 'tw': './assets/cn/raid/HUANCHANG_OCR_REMAIN_HARD.png'}) +HUANCHANG_OCR_REMAIN_NORMAL = Button(area={'cn': (1054, 522, 1076, 540), 'en': (1054, 522, 1076, 540), 'jp': (1054, 548, 1076, 567), 'tw': (1054, 522, 1076, 540)}, color={'cn': (146, 148, 147), 'en': (146, 148, 147), 'jp': (136, 136, 135), 'tw': (146, 148, 147)}, button={'cn': (1054, 522, 1076, 540), 'en': (1054, 522, 1076, 540), 'jp': (1054, 548, 1076, 567), 'tw': (1054, 522, 1076, 540)}, file={'cn': './assets/cn/raid/HUANCHANG_OCR_REMAIN_NORMAL.png', 'en': './assets/en/raid/HUANCHANG_OCR_REMAIN_NORMAL.png', 'jp': './assets/jp/raid/HUANCHANG_OCR_REMAIN_NORMAL.png', 'tw': './assets/cn/raid/HUANCHANG_OCR_REMAIN_NORMAL.png'}) +HUANCHANG_RAID_EASY = Button(area={'cn': (951, 458, 995, 511), 'en': (950, 456, 993, 516), 'jp': (952, 484, 995, 538), 'tw': (951, 458, 995, 511)}, color={'cn': (104, 104, 104), 'en': (93, 93, 92), 'jp': (98, 97, 97), 'tw': (104, 104, 104)}, button={'cn': (951, 458, 995, 511), 'en': (950, 456, 993, 516), 'jp': (952, 484, 995, 538), 'tw': (951, 458, 995, 511)}, file={'cn': './assets/cn/raid/HUANCHANG_RAID_EASY.png', 'en': './assets/en/raid/HUANCHANG_RAID_EASY.png', 'jp': './assets/jp/raid/HUANCHANG_RAID_EASY.png', 'tw': './assets/cn/raid/HUANCHANG_RAID_EASY.png'}) +HUANCHANG_RAID_EX = Button(area={'cn': (1111, 328, 1170, 357), 'en': (1114, 328, 1173, 357), 'jp': (1111, 352, 1170, 381), 'tw': (1111, 328, 1170, 357)}, color={'cn': (126, 160, 161), 'en': (126, 160, 161), 'jp': (126, 160, 161), 'tw': (126, 160, 161)}, button={'cn': (1111, 328, 1170, 357), 'en': (1114, 328, 1173, 357), 'jp': (1111, 352, 1170, 381), 'tw': (1111, 328, 1170, 357)}, file={'cn': './assets/cn/raid/HUANCHANG_RAID_EX.png', 'en': './assets/en/raid/HUANCHANG_RAID_EX.png', 'jp': './assets/jp/raid/HUANCHANG_RAID_EX.png', 'tw': './assets/cn/raid/HUANCHANG_RAID_EX.png'}) +HUANCHANG_RAID_HARD = Button(area={'cn': (1135, 458, 1179, 511), 'en': (1135, 456, 1179, 516), 'jp': (1135, 484, 1177, 538), 'tw': (1135, 458, 1179, 511)}, color={'cn': (119, 118, 119), 'en': (106, 105, 106), 'jp': (107, 107, 108), 'tw': (119, 118, 119)}, button={'cn': (1135, 458, 1179, 511), 'en': (1135, 456, 1179, 516), 'jp': (1135, 484, 1177, 538), 'tw': (1135, 458, 1179, 511)}, file={'cn': './assets/cn/raid/HUANCHANG_RAID_HARD.png', 'en': './assets/en/raid/HUANCHANG_RAID_HARD.png', 'jp': './assets/jp/raid/HUANCHANG_RAID_HARD.png', 'tw': './assets/cn/raid/HUANCHANG_RAID_HARD.png'}) +HUANCHANG_RAID_NORMAL = Button(area={'cn': (1044, 458, 1088, 511), 'en': (1044, 456, 1088, 516), 'jp': (1044, 484, 1087, 538), 'tw': (1044, 458, 1088, 511)}, color={'cn': (111, 112, 112), 'en': (109, 110, 110), 'jp': (99, 101, 100), 'tw': (111, 112, 112)}, button={'cn': (1044, 458, 1088, 511), 'en': (1044, 456, 1088, 516), 'jp': (1044, 484, 1087, 538), 'tw': (1044, 458, 1088, 511)}, file={'cn': './assets/cn/raid/HUANCHANG_RAID_NORMAL.png', 'en': './assets/en/raid/HUANCHANG_RAID_NORMAL.png', 'jp': './assets/jp/raid/HUANCHANG_RAID_NORMAL.png', 'tw': './assets/cn/raid/HUANCHANG_RAID_NORMAL.png'}) IRIS_OCR_PT = Button(area={'cn': (1140, 607, 1280, 641), 'en': (1140, 607, 1280, 641), 'jp': (1140, 607, 1280, 641), 'tw': (1140, 607, 1280, 641)}, color={'cn': (40, 43, 36), 'en': (40, 43, 36), 'jp': (40, 43, 36), 'tw': (40, 43, 36)}, button={'cn': (1140, 607, 1280, 641), 'en': (1140, 607, 1280, 641), 'jp': (1140, 607, 1280, 641), 'tw': (1140, 607, 1280, 641)}, file={'cn': './assets/cn/raid/IRIS_OCR_PT.png', 'en': './assets/en/raid/IRIS_OCR_PT.png', 'jp': './assets/jp/raid/IRIS_OCR_PT.png', 'tw': './assets/tw/raid/IRIS_OCR_PT.png'}) IRIS_OCR_REMAIN_EASY = Button(area={'cn': (1047, 514, 1103, 534), 'en': (1046, 514, 1106, 534), 'jp': (1048, 515, 1113, 535), 'tw': (1046, 515, 1106, 535)}, color={'cn': (50, 49, 44), 'en': (68, 66, 59), 'jp': (56, 56, 50), 'tw': (53, 49, 48)}, button={'cn': (1047, 514, 1103, 534), 'en': (1046, 514, 1106, 534), 'jp': (1048, 515, 1113, 535), 'tw': (1046, 515, 1106, 535)}, file={'cn': './assets/cn/raid/IRIS_OCR_REMAIN_EASY.png', 'en': './assets/en/raid/IRIS_OCR_REMAIN_EASY.png', 'jp': './assets/jp/raid/IRIS_OCR_REMAIN_EASY.png', 'tw': './assets/tw/raid/IRIS_OCR_REMAIN_EASY.png'}) IRIS_OCR_REMAIN_HARD = Button(area={'cn': (1166, 312, 1221, 332), 'en': (1165, 312, 1225, 332), 'jp': (1167, 313, 1232, 333), 'tw': (1165, 313, 1222, 332)}, color={'cn': (48, 44, 38), 'en': (65, 61, 53), 'jp': (51, 48, 41), 'tw': (50, 46, 45)}, button={'cn': (1166, 312, 1221, 332), 'en': (1165, 312, 1225, 332), 'jp': (1167, 313, 1232, 333), 'tw': (1165, 313, 1222, 332)}, file={'cn': './assets/cn/raid/IRIS_OCR_REMAIN_HARD.png', 'en': './assets/en/raid/IRIS_OCR_REMAIN_HARD.png', 'jp': './assets/jp/raid/IRIS_OCR_REMAIN_HARD.png', 'tw': './assets/tw/raid/IRIS_OCR_REMAIN_HARD.png'}) diff --git a/module/raid/raid.py b/module/raid/raid.py index 70b0a692a..adc39d6a5 100644 --- a/module/raid/raid.py +++ b/module/raid/raid.py @@ -25,6 +25,16 @@ class RaidCounter(DigitCounter): return image +class HuanChangCounter(Digit): + """ + The limit on number of raid event "Spring Festive Fiasco" is vertical, + Ocr numbers on the top half. + """ + def ocr(self, image, direct_ocr=False): + result = super().ocr(image, direct_ocr) + return (result, 0, 15) + + def raid_name_shorten(name): """ Args: @@ -47,6 +57,8 @@ def raid_name_shorten(name): return "KUYBYSHEY" elif name == "raid_20230629": return "GORIZIA" + elif name == "raid_20240130": + return "HUANCHANG" else: raise ScriptError(f'Unknown raid name: {name}') @@ -109,6 +121,12 @@ def raid_ocr(raid, mode): return Digit(button, letter=(198, 223, 140), threshold=128) else: return DigitCounter(button, letter=(82, 89, 66), threshold=128) + elif raid == "HUANCHANG": + if mode == 'ex': + return Digit(button, letter=(255, 255, 255), threshold=180) + else: + # Vertical count + return HuanChangCounter(button, letter=(255, 255, 255), threshold=80) except KeyError: raise ScriptError(f'Raid entrance asset not exists: {key}') @@ -133,6 +151,8 @@ def pt_ocr(raid): return Digit(button, letter=(16, 24, 33), threshold=64) elif raid == 'GORIZIA': return Digit(button, letter=(255, 255, 255), threshold=64) + elif raid == "HUANCHANG": + return Digit(button, letter=(23, 20, 6), threshold=128) except KeyError: # raise ScriptError(f'Raid pt ocr asset not exists: {key}') return None diff --git a/module/ui/assets.py b/module/ui/assets.py index 5a49855cd..cf1ed2bac 100644 --- a/module/ui/assets.py +++ b/module/ui/assets.py @@ -64,7 +64,7 @@ MISSION_CHECK = Button(area={'cn': (120, 15, 173, 40), 'en': (123, 18, 221, 37), MUNITIONS_CHECK = Button(area={'cn': (32, 621, 86, 647), 'en': (25, 622, 85, 644), 'jp': (23, 625, 80, 645), 'tw': (31, 619, 88, 649)}, color={'cn': (151, 147, 147), 'en': (174, 171, 171), 'jp': (99, 91, 91), 'tw': (127, 121, 121)}, button={'cn': (32, 621, 86, 647), 'en': (25, 622, 85, 644), 'jp': (23, 625, 80, 645), 'tw': (31, 619, 88, 649)}, file={'cn': './assets/cn/ui/MUNITIONS_CHECK.png', 'en': './assets/en/ui/MUNITIONS_CHECK.png', 'jp': './assets/jp/ui/MUNITIONS_CHECK.png', 'tw': './assets/tw/ui/MUNITIONS_CHECK.png'}) OS_CHECK = Button(area={'cn': (613, 17, 627, 34), 'en': (613, 17, 627, 34), 'jp': (613, 17, 627, 34), 'tw': (613, 17, 627, 34)}, color={'cn': (58, 117, 146), 'en': (58, 117, 146), 'jp': (58, 117, 146), 'tw': (58, 117, 146)}, button={'cn': (613, 17, 627, 34), 'en': (613, 17, 627, 34), 'jp': (613, 17, 627, 34), 'tw': (613, 17, 627, 34)}, file={'cn': './assets/cn/ui/OS_CHECK.png', 'en': './assets/en/ui/OS_CHECK.png', 'jp': './assets/jp/ui/OS_CHECK.png', 'tw': './assets/tw/ui/OS_CHECK.png'}) PLAYER_CHECK = Button(area={'cn': (28, 668, 139, 688), 'en': (11, 649, 157, 705), 'jp': (26, 668, 139, 689), 'tw': (28, 668, 139, 688)}, color={'cn': (237, 204, 127), 'en': (197, 156, 97), 'jp': (237, 205, 128), 'tw': (237, 204, 127)}, button={'cn': (28, 668, 139, 688), 'en': (11, 649, 157, 705), 'jp': (26, 668, 139, 689), 'tw': (28, 668, 139, 688)}, file={'cn': './assets/cn/ui/PLAYER_CHECK.png', 'en': './assets/en/ui/PLAYER_CHECK.png', 'jp': './assets/jp/ui/PLAYER_CHECK.png', 'tw': './assets/tw/ui/PLAYER_CHECK.png'}) -RAID_CHECK = Button(area={'cn': (117, 13, 226, 39), 'en': (116, 15, 197, 34), 'jp': (113, 10, 229, 41), 'tw': (116, 12, 227, 39)}, color={'cn': (153, 174, 162), 'en': (115, 135, 121), 'jp': (138, 158, 146), 'tw': (143, 122, 101)}, button={'cn': (117, 13, 226, 39), 'en': (116, 15, 197, 34), 'jp': (113, 10, 229, 41), 'tw': (116, 12, 227, 39)}, file={'cn': './assets/cn/ui/RAID_CHECK.png', 'en': './assets/en/ui/RAID_CHECK.png', 'jp': './assets/jp/ui/RAID_CHECK.png', 'tw': './assets/tw/ui/RAID_CHECK.png'}) +RAID_CHECK = Button(area={'cn': (107, 13, 216, 38), 'en': (107, 15, 188, 34), 'jp': (107, 13, 217, 40), 'tw': (116, 12, 227, 39)}, color={'cn': (129, 131, 129), 'en': (85, 87, 85), 'jp': (127, 129, 127), 'tw': (143, 122, 101)}, button={'cn': (107, 13, 216, 38), 'en': (107, 15, 188, 34), 'jp': (107, 13, 217, 40), 'tw': (116, 12, 227, 39)}, file={'cn': './assets/cn/ui/RAID_CHECK.png', 'en': './assets/en/ui/RAID_CHECK.png', 'jp': './assets/jp/ui/RAID_CHECK.png', 'tw': './assets/tw/ui/RAID_CHECK.png'}) RESEARCH_CHECK = Button(area={'cn': (118, 15, 170, 39), 'en': (119, 14, 259, 36), 'jp': (117, 14, 171, 40), 'tw': (117, 13, 172, 40)}, color={'cn': (165, 179, 215), 'en': (118, 133, 174), 'jp': (135, 154, 195), 'tw': (148, 165, 205)}, button={'cn': (118, 15, 170, 39), 'en': (119, 14, 259, 36), 'jp': (117, 14, 171, 40), 'tw': (117, 13, 172, 40)}, file={'cn': './assets/cn/ui/RESEARCH_CHECK.png', 'en': './assets/en/ui/RESEARCH_CHECK.png', 'jp': './assets/jp/ui/RESEARCH_CHECK.png', 'tw': './assets/tw/ui/RESEARCH_CHECK.png'}) RESHMENU_CHECK = Button(area={'cn': (121, 15, 174, 39), 'en': (118, 14, 279, 35), 'jp': (116, 13, 174, 42), 'tw': (121, 14, 175, 40)}, color={'cn': (156, 171, 209), 'en': (100, 113, 152), 'jp': (136, 149, 186), 'tw': (147, 162, 201)}, button={'cn': (121, 15, 174, 39), 'en': (118, 14, 279, 35), 'jp': (116, 13, 174, 42), 'tw': (121, 14, 175, 40)}, file={'cn': './assets/cn/ui/RESHMENU_CHECK.png', 'en': './assets/en/ui/RESHMENU_CHECK.png', 'jp': './assets/jp/ui/RESHMENU_CHECK.png', 'tw': './assets/tw/ui/RESHMENU_CHECK.png'}) RESHMENU_GOTO_META = Button(area={'cn': (1076, 254, 1155, 334), 'en': (1102, 251, 1193, 332), 'jp': (1076, 254, 1155, 334), 'tw': (1076, 254, 1155, 334)}, color={'cn': (144, 156, 183), 'en': (141, 152, 181), 'jp': (144, 156, 183), 'tw': (144, 156, 183)}, button={'cn': (1076, 254, 1155, 334), 'en': (1102, 251, 1193, 332), 'jp': (1076, 254, 1155, 334), 'tw': (1076, 254, 1155, 334)}, file={'cn': './assets/cn/ui/RESHMENU_GOTO_META.png', 'en': './assets/en/ui/RESHMENU_GOTO_META.png', 'jp': './assets/jp/ui/RESHMENU_GOTO_META.png', 'tw': './assets/cn/ui/RESHMENU_GOTO_META.png'}) From 4983b427942860a36e6d1c1086bd9e625491c044 Mon Sep 17 00:00:00 2001 From: mulaikurisu <124201633+mulaikurisu@users.noreply.github.com> Date: Wed, 31 Jan 2024 18:35:19 +0800 Subject: [PATCH 13/14] Fix: RAIDS and COALITIONS lock to the latest --- module/config/config_updater.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/module/config/config_updater.py b/module/config/config_updater.py index 830046167..ff9574146 100644 --- a/module/config/config_updater.py +++ b/module/config/config_updater.py @@ -638,16 +638,17 @@ class ConfigUpdater: deep_default(new, 'Alas.DropRecord.AzurStatsID', random_id()) # Update to latest event server = to_server(deep_get(new, 'Alas.Emulator.PackageName', 'cn')) - # if not is_template: - # for task in EVENTS + RAIDS + COALITIONS: - # deep_set(new, - # keys=f'{task}.Campaign.Event', - # value=deep_get(self.args, f'{task}.Campaign.Event.{server}')) - # for task in ['GemsFarming']: - # if 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.{server}')) + if not is_template: + # for task in EVENTS + RAIDS + COALITIONS: + for task in RAIDS + COALITIONS: + deep_set(new, + keys=f'{task}.Campaign.Event', + value=deep_get(self.args, f'{task}.Campaign.Event.{server}')) + for task in ['GemsFarming']: + if 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.{server}')) # 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': From fc673c311ae6289b1151fc5575563e810821dab5 Mon Sep 17 00:00:00 2001 From: mulaikurisu <124201633+mulaikurisu@users.noreply.github.com> Date: Wed, 31 Jan 2024 18:38:02 +0800 Subject: [PATCH 14/14] Upd: args.json --- module/config/argument/args.json | 74 +++++++++++++++++--------------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 4a0019518..13f0f5e38 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1722,13 +1722,13 @@ ], "display": "hide", "option_bold": [ - "event_20230803_cn", + "event_20210527_cn", "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -2054,13 +2054,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20230803_cn", + "event_20210527_cn", "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -2501,13 +2501,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20230803_cn", + "event_20210527_cn", "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -2948,13 +2948,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20230803_cn", + "event_20210527_cn", "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -3354,15 +3354,16 @@ "raid_20220630", "raid_20221027", "raid_20230118", - "raid_20230629" + "raid_20230629", + "raid_20240130" ], "option_bold": [ - "raid_20230629", - "raid_20221027" + "raid_20221027", + "raid_20240130" ], - "cn": "raid_20230629", - "en": "raid_20230629", - "jp": "raid_20230629", + "cn": "raid_20240130", + "en": "raid_20240130", + "jp": "raid_20240130", "tw": "raid_20221027" }, "Mode": { @@ -3864,9 +3865,11 @@ "war_archives_20200806_cn", "war_archives_20200820_cn", "war_archives_20200903_cn", + "war_archives_20200917_cn", "war_archives_20201029_cn", "war_archives_20201229_cn", "war_archives_20210325_cn", + "war_archives_20210527_cn", "war_archives_20210624_cn", "war_archives_20210819_cn", "war_archives_20211014_cn", @@ -3875,12 +3878,12 @@ "war_archives_20220414_cn" ], "option_bold": [ - "war_archives_20220414_cn", - "war_archives_20201229_cn" + "war_archives_20210527_cn", + "war_archives_20220414_cn" ], - "cn": "war_archives_20201229_cn", - "en": "war_archives_20201229_cn", - "jp": "war_archives_20201229_cn", + "cn": "war_archives_20210527_cn", + "en": "war_archives_20210527_cn", + "jp": "war_archives_20210527_cn", "tw": "war_archives_20220414_cn" }, "Mode": { @@ -4333,13 +4336,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20230803_cn", + "event_20210527_cn", "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -4797,13 +4800,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20230803_cn", + "event_20210527_cn", "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -5261,13 +5264,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20230803_cn", + "event_20210527_cn", "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -5725,13 +5728,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20230803_cn", + "event_20210527_cn", "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -6179,13 +6182,13 @@ "event_20231221_cn" ], "option_bold": [ - "event_20230803_cn", + "event_20210527_cn", "event_20211229_cn" ], "cn": "event_20211229_cn", "en": "event_20211229_cn", "jp": "event_20211229_cn", - "tw": "event_20230803_cn" + "tw": "event_20210527_cn" }, "Mode": { "type": "select", @@ -6582,15 +6585,16 @@ "raid_20220630", "raid_20221027", "raid_20230118", - "raid_20230629" + "raid_20230629", + "raid_20240130" ], "option_bold": [ - "raid_20230629", - "raid_20221027" + "raid_20221027", + "raid_20240130" ], - "cn": "raid_20230629", - "en": "raid_20230629", - "jp": "raid_20230629", + "cn": "raid_20240130", + "en": "raid_20240130", + "jp": "raid_20240130", "tw": "raid_20221027" }, "Mode": {