From 7549650b5a60a8ae104ac3f02f676587adb76cee Mon Sep 17 00:00:00 2001 From: guoh064 <50830808+guoh064@users.noreply.github.com> Date: Thu, 18 Jun 2026 17:52:21 +0800 Subject: [PATCH 1/8] Add: event entrance for event_20240521_cn rerun (#5735) --- campaign/Readme.md | 1 + module/config/argument/args.json | 64 ++++++++++++++++++++------------ module/config/i18n/en-US.json | 2 +- module/config/i18n/ja-JP.json | 2 +- module/config/i18n/zh-CN.json | 2 +- 5 files changed, 44 insertions(+), 27 deletions(-) diff --git a/campaign/Readme.md b/campaign/Readme.md index 45ae4f316..e31de2728 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -298,3 +298,4 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20260520 | event 20260520 cn | Alliance Before the Hagiobull | 圣印前的同盟 | Alliance Before the Hagiobull | 聖印前の同盟 | - | | 20260528 | event 20220818 cn | Operation Convergence | - | - | - | 復刻遠匯點作戰 | | 20260605 | event 20260520 cn | Alliance Before the Hagiobull | - | - | - | 聖印前的同盟 | +| 20260618 | event 20240521 cn | Light of the Martyrium Rerun | 复刻绽放于辉光之城 | Light of the Martyrium Rerun | 赫輝のマルティリウム(復刻) | - | diff --git a/module/config/argument/args.json b/module/config/argument/args.json index a269bafb6..6131720db 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1643,21 +1643,23 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20240521_cn", "event_20260520_cn" ], "option_cn": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_en": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_jp": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_tw": [ "event_20260520_cn" ], "option_bold": [ + "event_20240521_cn", "event_20260520_cn" ] }, @@ -1923,21 +1925,23 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20240521_cn", "event_20260520_cn" ], "option_cn": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_en": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_jp": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_tw": [ "event_20260520_cn" ], "option_bold": [ + "event_20240521_cn", "event_20260520_cn" ] }, @@ -2318,21 +2322,23 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20240521_cn", "event_20260520_cn" ], "option_cn": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_en": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_jp": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_tw": [ "event_20260520_cn" ], "option_bold": [ + "event_20240521_cn", "event_20260520_cn" ] }, @@ -4053,21 +4059,23 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20240521_cn", "event_20260520_cn" ], "option_cn": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_en": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_jp": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_tw": [ "event_20260520_cn" ], "option_bold": [ + "event_20240521_cn", "event_20260520_cn" ] }, @@ -4465,21 +4473,23 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20240521_cn", "event_20260520_cn" ], "option_cn": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_en": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_jp": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_tw": [ "event_20260520_cn" ], "option_bold": [ + "event_20240521_cn", "event_20260520_cn" ] }, @@ -4877,21 +4887,23 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20240521_cn", "event_20260520_cn" ], "option_cn": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_en": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_jp": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_tw": [ "event_20260520_cn" ], "option_bold": [ + "event_20240521_cn", "event_20260520_cn" ] }, @@ -5289,21 +5301,23 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20240521_cn", "event_20260520_cn" ], "option_cn": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_en": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_jp": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_tw": [ "event_20260520_cn" ], "option_bold": [ + "event_20240521_cn", "event_20260520_cn" ] }, @@ -5691,21 +5705,23 @@ "type": "select", "value": "campaign_main", "option": [ + "event_20240521_cn", "event_20260520_cn" ], "option_cn": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_en": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_jp": [ - "event_20260520_cn" + "event_20240521_cn" ], "option_tw": [ "event_20260520_cn" ], "option_bold": [ + "event_20240521_cn", "event_20260520_cn" ] }, diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index afb3ebd5f..9f1c1b39f 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -752,7 +752,7 @@ "event_20231221_cn": "Light-Chasing Sea of Stars Rerun", "event_20240229_cn": "Snowrealm Peregrination Rerun", "event_20240425_cn": "Heart-Linking Harmony", - "event_20240521_cn": "Light of the Martyrium", + "event_20240521_cn": "Light of the Martyrium Rerun", "event_20240725_cn": "Interlude of Illusions", "event_20240815_cn": "Windborne Steel Wings", "event_20240829_cn": "Whence Flowers Bear No Fruit", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 624e502fd..09d22af9b 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -752,7 +752,7 @@ "event_20231221_cn": "光追う星の海(復刻)", "event_20240229_cn": "銀界遊廻(復刻)", "event_20240425_cn": "共鳴のパッション", - "event_20240521_cn": "赫輝のマルティリウム", + "event_20240521_cn": "赫輝のマルティリウム(復刻)", "event_20240725_cn": "夢幻の間奏曲", "event_20240815_cn": "錬翼空翔", "event_20240829_cn": "徒花咲かす彼岸", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 6566771ae..0d5778679 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -752,7 +752,7 @@ "event_20231221_cn": "复刻星海逐光", "event_20240229_cn": "复刻雪境迷踪", "event_20240425_cn": "共鸣的PASSION", - "event_20240521_cn": "绽放于辉光之城", + "event_20240521_cn": "复刻绽放于辉光之城", "event_20240725_cn": "幻梦间奏曲", "event_20240815_cn": "铁翼擎风", "event_20240829_cn": "埋葬于彼岸之花", From b9def283c219dc6c5dafd619974169804fd7077a Mon Sep 17 00:00:00 2001 From: ArecaSapling <115386623+sui-feng-cb@users.noreply.github.com> Date: Thu, 18 Jun 2026 17:53:07 +0800 Subject: [PATCH 2/8] Add: war_archives_20230525_cn and war_archives_20240725_cn (#5736) --- .../TEMPLATE_CONFLUENCE_OF_NOTHINGNESS.png | Bin 0 -> 7769 bytes .../TEMPLATE_INTERLUDE_OF_ILLUSIONS.png | Bin 0 -> 6826 bytes campaign/Readme.md | 2 + .../war_archives_20230525_cn/campaign_base.py | 116 ++++++++++++++++++ .../war_archives_20230525_cn/config_base.py | 34 +++++ campaign/war_archives_20230525_cn/ht1.py | 81 ++++++++++++ campaign/war_archives_20230525_cn/ht2.py | 81 ++++++++++++ campaign/war_archives_20230525_cn/ht3.py | 89 ++++++++++++++ campaign/war_archives_20230525_cn/ht4.py | 82 +++++++++++++ campaign/war_archives_20230525_cn/ht5.py | 99 +++++++++++++++ campaign/war_archives_20230525_cn/ht6.py | 102 +++++++++++++++ campaign/war_archives_20230525_cn/hts1.py | 80 ++++++++++++ campaign/war_archives_20230525_cn/hts2.py | 88 +++++++++++++ campaign/war_archives_20230525_cn/t1.py | 79 ++++++++++++ campaign/war_archives_20230525_cn/t2.py | 79 ++++++++++++ campaign/war_archives_20230525_cn/t3.py | 86 +++++++++++++ campaign/war_archives_20230525_cn/t4.py | 80 ++++++++++++ campaign/war_archives_20230525_cn/t5.py | 84 +++++++++++++ campaign/war_archives_20230525_cn/t6.py | 87 +++++++++++++ campaign/war_archives_20230525_cn/ts1.py | 78 ++++++++++++ campaign/war_archives_20230525_cn/ts2.py | 85 +++++++++++++ .../war_archives_20240725_cn/campaign_base.py | 21 ++++ campaign/war_archives_20240725_cn/ht1.py | 78 ++++++++++++ campaign/war_archives_20240725_cn/ht2.py | 88 +++++++++++++ campaign/war_archives_20240725_cn/ht3.py | 91 ++++++++++++++ campaign/war_archives_20240725_cn/t1.py | 77 ++++++++++++ campaign/war_archives_20240725_cn/t2.py | 78 ++++++++++++ campaign/war_archives_20240725_cn/t3.py | 82 +++++++++++++ config/template.json | 2 +- module/campaign/run.py | 4 + module/config/argument/args.json | 12 +- 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 + 37 files changed, 2059 insertions(+), 6 deletions(-) create mode 100644 assets/cn/war_archives/TEMPLATE_CONFLUENCE_OF_NOTHINGNESS.png create mode 100644 assets/cn/war_archives/TEMPLATE_INTERLUDE_OF_ILLUSIONS.png create mode 100644 campaign/war_archives_20230525_cn/campaign_base.py create mode 100644 campaign/war_archives_20230525_cn/config_base.py create mode 100644 campaign/war_archives_20230525_cn/ht1.py create mode 100644 campaign/war_archives_20230525_cn/ht2.py create mode 100644 campaign/war_archives_20230525_cn/ht3.py create mode 100644 campaign/war_archives_20230525_cn/ht4.py create mode 100644 campaign/war_archives_20230525_cn/ht5.py create mode 100644 campaign/war_archives_20230525_cn/ht6.py create mode 100644 campaign/war_archives_20230525_cn/hts1.py create mode 100644 campaign/war_archives_20230525_cn/hts2.py create mode 100644 campaign/war_archives_20230525_cn/t1.py create mode 100644 campaign/war_archives_20230525_cn/t2.py create mode 100644 campaign/war_archives_20230525_cn/t3.py create mode 100644 campaign/war_archives_20230525_cn/t4.py create mode 100644 campaign/war_archives_20230525_cn/t5.py create mode 100644 campaign/war_archives_20230525_cn/t6.py create mode 100644 campaign/war_archives_20230525_cn/ts1.py create mode 100644 campaign/war_archives_20230525_cn/ts2.py create mode 100644 campaign/war_archives_20240725_cn/campaign_base.py create mode 100644 campaign/war_archives_20240725_cn/ht1.py create mode 100644 campaign/war_archives_20240725_cn/ht2.py create mode 100644 campaign/war_archives_20240725_cn/ht3.py create mode 100644 campaign/war_archives_20240725_cn/t1.py create mode 100644 campaign/war_archives_20240725_cn/t2.py create mode 100644 campaign/war_archives_20240725_cn/t3.py diff --git a/assets/cn/war_archives/TEMPLATE_CONFLUENCE_OF_NOTHINGNESS.png b/assets/cn/war_archives/TEMPLATE_CONFLUENCE_OF_NOTHINGNESS.png new file mode 100644 index 0000000000000000000000000000000000000000..15f60d39c4b367e632873b9bd5d59bdf7862c780 GIT binary patch literal 7769 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 literal 0 HcmV?d00001 diff --git a/assets/cn/war_archives/TEMPLATE_INTERLUDE_OF_ILLUSIONS.png b/assets/cn/war_archives/TEMPLATE_INTERLUDE_OF_ILLUSIONS.png new file mode 100644 index 0000000000000000000000000000000000000000..48f977ce7c142be15aef67b420115877124a5804 GIT binary patch literal 6826 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 T2 > TS1 > T3', + 'T4 > T5 > TS2 > T6', + 'HT1 > HT2 > HTS1 > HT3', + 'HT4 > HT5 > HTS2 > 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(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(chapter) + + elif chapter == 'sp': + self.ui_goto_sp() + self.campaign_ensure_chapter(chapter) + + elif chapter in ['t', 'ts', 'ht', 'hts']: + self.ui_goto_event() + # 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') + if chapter in ['t', 'ht']: + # Campaign ball + if stage in ['1', '2', '3']: + self._campaign_ball_set('blue') + else: + self._campaign_ball_set('red') + elif chapter in ['ts', 'hts']: + if stage in ['1']: + self._campaign_ball_set('blue') + else: + self._campaign_ball_set('red') + # Get stage + self.campaign_ensure_chapter(1) + else: + logger.warning(f'Unknown campaign chapter: {name}') + + 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 + + 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_20230525_cn/config_base.py b/campaign/war_archives_20230525_cn/config_base.py new file mode 100644 index 000000000..179ed2367 --- /dev/null +++ b/campaign/war_archives_20230525_cn/config_base.py @@ -0,0 +1,34 @@ +class ConfigBase: + STAGE_ENTRANCE = ['green'] + + MAP_HAS_MOVABLE_NORMAL_ENEMY = True + MOVABLE_NORMAL_ENEMY_TURN = (2,) + MAP_SIREN_MOVE_WAIT = 1.0 + MAP_WALK_USE_CURRENT_FLEET = True + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 24), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 24, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_HOUGHLINES_THRESHOLD = 120 + HOMO_EDGE_COLOR_RANGE = (0, 12) + INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40 + EDGE_LINES_HOUGHLINES_THRESHOLD = 40 + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + 'CAred': 1.111, + 'BBred': 1.111, + } diff --git a/campaign/war_archives_20230525_cn/ht1.py b/campaign/war_archives_20230525_cn/ht1.py new file mode 100644 index 000000000..16fc47fa3 --- /dev/null +++ b/campaign/war_archives_20230525_cn/ht1.py @@ -0,0 +1,81 @@ +from .campaign_base import CampaignBase +from .config_base import ConfigBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('HT1') +MAP.shape = 'J8' +MAP.camera_data = ['E2', 'E6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['E6', 'F6'] +MAP.map_data = """ + ++ -- -- ME -- -- -- -- -- ++ + -- -- ME -- -- -- -- ME -- -- + ++ ++ ++ -- ++ ++ Me -- ME -- + -- -- Me -- ++ ++ -- -- ++ ++ + ++ Me -- -- SP SP -- Me ++ ++ + -- -- __ -- -- -- -- __ -- -- + -- ME -- MS MB MB MS -- 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 +""" +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, \ +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', '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 + MAP_HAS_MYSTERY = False + # ===== 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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_siren(): + return True + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20230525_cn/ht2.py b/campaign/war_archives_20230525_cn/ht2.py new file mode 100644 index 000000000..7163488c6 --- /dev/null +++ b/campaign/war_archives_20230525_cn/ht2.py @@ -0,0 +1,81 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT2') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ ++ ++ -- -- -- -- -- ++ ++ + -- ME -- ME -- -- ME -- -- ++ + ME -- -- -- ++ ++ -- -- ME -- + -- MS ++ Me ++ ++ Me -- -- ME + ME -- ++ -- MB MB -- __ -- ME + -- -- SP -- -- -- -- -- Me -- + Me -- -- SP -- ++ ++ Me ++ -- + ++ MS -- -- -- 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': 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', '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 + MAP_HAS_MYSTERY = False + # ===== 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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_siren(): + return True + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20230525_cn/ht3.py b/campaign/war_archives_20230525_cn/ht3.py new file mode 100644 index 000000000..f05d0dde9 --- /dev/null +++ b/campaign/war_archives_20230525_cn/ht3.py @@ -0,0 +1,89 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6', 'D6'] +MAP.map_data = """ + -- ME -- ME -- -- ME -- ++ -- + ME -- ++ -- -- -- -- -- ME ME + -- -- ++ Me ++ ++ Me -- -- -- + ME -- -- -- ++ ++ -- ++ Me -- + -- MS -- -- SP SP -- -- -- -- + ++ ++ -- __ -- -- -- -- ME ++ + MB ++ MS -- ++ ++ ++ ME -- ++ + -- 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 +""" +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 = ['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_MYSTERY = False + # ===== 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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_siren(): + return True + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() + + def combat_status(self, *args, **kwargs): + if not self.map_is_clear_mode and self.battle_count >= 5: + # Ignore story battles + self.device.disable_stuck_detection() + + super().combat_status(*args, **kwargs) diff --git a/campaign/war_archives_20230525_cn/ht4.py b/campaign/war_archives_20230525_cn/ht4.py new file mode 100644 index 000000000..abcf18278 --- /dev/null +++ b/campaign/war_archives_20230525_cn/ht4.py @@ -0,0 +1,82 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT4') +MAP.shape = 'J8' +MAP.camera_data = ['E2', 'E6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + ++ -- ME Me -- -- ME ME -- ++ + -- ME -- -- -- -- -- -- ME -- + -- -- ++ -- ++ ++ Me -- -- ME + -- -- Me -- ++ ++ -- ++ -- -- + ++ Me -- -- SP SP -- ++ Me -- + -- -- MS __ -- -- __ MS -- -- + -- ME -- MS -- -- MS -- ME -- + ++ -- ME -- MB MB -- 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 +""" +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(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', '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 + MAP_HAS_MYSTERY = False + # ===== 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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_siren(): + return True + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20230525_cn/ht5.py b/campaign/war_archives_20230525_cn/ht5.py new file mode 100644 index 000000000..486d01d09 --- /dev/null +++ b/campaign/war_archives_20230525_cn/ht5.py @@ -0,0 +1,99 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT5') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- SP SP -- -- -- -- ME -- -- + -- -- -- -- -- ++ ++ ++ MB -- + MS ++ -- MS ++ ++ -- ME -- MB + -- ++ MS -- ++ ++ 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 +""" +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 = ['CAred', 'BBred'] + 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_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.256, 1.280) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.215, 1.237) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.180, 1.201) + + +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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + else: + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_5(self): + if self.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_siren(): + return True + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20230525_cn/ht6.py b/campaign/war_archives_20230525_cn/ht6.py new file mode 100644 index 000000000..1c53349f2 --- /dev/null +++ b/campaign/war_archives_20230525_cn/ht6.py @@ -0,0 +1,102 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT6') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['G6', 'D6'] +MAP.map_data = """ + ++ ++ ++ -- -- -- -- ++ ++ ++ + ++ ME -- ME -- -- ME -- ME ++ + ME -- -- -- ++ ++ -- -- -- ME + -- Me -- Me ++ ++ Me -- Me -- + -- Me -- -- MB MB -- -- Me -- + ME ++ -- MS __ __ MS -- ++ ME + -- ++ MS -- -- -- -- MS ++ -- + -- 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 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 = ['AbyssalBoss5', 'AbyssalBoss4'] + 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_MYSTERY = False + # ===== 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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + else: + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_5(self): + if self.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_siren(): + return True + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() + + def combat_status(self, *args, **kwargs): + if not self.map_is_clear_mode and self.battle_count >= 6: + # Ignore story battles + self.device.disable_stuck_detection() + + super().combat_status(*args, **kwargs) diff --git a/campaign/war_archives_20230525_cn/hts1.py b/campaign/war_archives_20230525_cn/hts1.py new file mode 100644 index 000000000..f485441ce --- /dev/null +++ b/campaign/war_archives_20230525_cn/hts1.py @@ -0,0 +1,80 @@ +from .campaign_base import CampaignBase +from .config_base import ConfigBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('HTS1') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6', 'D6'] +MAP.map_data = """ + MB -- -- ++ ME ME -- -- ++ ++ + -- -- Me -- -- -- Me -- -- -- + ++ -- -- MS ++ ++ -- -- ME -- + -- MS __ -- ++ ++ -- ME -- ME + ME -- __ -- SP SP -- -- ME -- + -- Me MS -- -- -- -- ++ ++ 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 +""" +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, \ +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 = ['AbyssalBoss4'] + 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_MYSTERY = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + MAP_IS_ONE_TIME_STAGE = True + + +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_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20230525_cn/hts2.py b/campaign/war_archives_20230525_cn/hts2.py new file mode 100644 index 000000000..4d6ac66cd --- /dev/null +++ b/campaign/war_archives_20230525_cn/hts2.py @@ -0,0 +1,88 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .hts1 import Config as ConfigBase + +MAP = CampaignMap('HTS2') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6', 'D6'] +MAP.map_data = """ + -- ME -- ME Me ME -- ME -- -- + ++ ++ -- -- -- -- -- ++ ++ -- + ++ ++ ME Me ++ ++ -- ME ++ -- + -- Me -- -- ++ ++ -- -- Me -- + ME -- -- -- SP SP -- -- -- Me + -- -- -- __ -- -- -- ++ -- ++ + ME ++ MS -- -- -- -- MS MB -- + -- ME -- MS -- 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, '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 = ['CAred', 'BBred'] + 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_MYSTERY = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + MAP_IS_ONE_TIME_STAGE = True + + +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_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20230525_cn/t1.py b/campaign/war_archives_20230525_cn/t1.py new file mode 100644 index 000000000..97053bfd7 --- /dev/null +++ b/campaign/war_archives_20230525_cn/t1.py @@ -0,0 +1,79 @@ +from .campaign_base import CampaignBase +from .config_base import ConfigBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('T1') +MAP.shape = 'J8' +MAP.camera_data = ['E2', 'E6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['E6', 'F6'] +MAP.map_data = """ + ++ -- -- ME -- -- -- -- -- ++ + -- -- ME -- -- -- -- ME -- -- + ++ ++ ++ -- ++ ++ Me -- ME -- + -- -- Me -- ++ ++ -- -- ++ ++ + ++ Me -- -- SP SP -- Me ++ ++ + -- -- __ -- -- -- -- __ -- -- + -- ME -- MS MB MB MS -- 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 +""" +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, \ +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 = ['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 + MAP_HAS_MYSTERY = False + # ===== 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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20230525_cn/t2.py b/campaign/war_archives_20230525_cn/t2.py new file mode 100644 index 000000000..e9d9a888e --- /dev/null +++ b/campaign/war_archives_20230525_cn/t2.py @@ -0,0 +1,79 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T2') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ ++ ++ -- -- -- -- -- ++ ++ + -- ME -- ME -- -- ME -- -- ++ + ME -- -- -- ++ ++ -- -- ME -- + -- MS ++ Me ++ ++ Me -- -- ME + ME -- ++ -- MB MB -- __ -- ME + -- -- SP -- -- -- -- -- Me -- + Me -- -- SP -- ++ ++ Me ++ -- + ++ MS -- -- -- 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': 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 + MAP_HAS_MYSTERY = False + # ===== 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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20230525_cn/t3.py b/campaign/war_archives_20230525_cn/t3.py new file mode 100644 index 000000000..f225af66c --- /dev/null +++ b/campaign/war_archives_20230525_cn/t3.py @@ -0,0 +1,86 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6', 'D6'] +MAP.map_data = """ + -- ME -- ME -- -- ME -- ++ -- + ME -- ++ -- -- -- -- -- ME ME + -- -- ++ Me ++ ++ Me -- -- -- + ME -- -- -- ++ ++ -- ++ Me -- + -- MS -- -- SP SP -- -- -- -- + ++ ++ -- __ -- -- -- -- ME ++ + MB ++ MS -- ++ ++ ++ ME -- ++ + -- 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 +""" +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', '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_MYSTERY = False + # ===== 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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() + + def combat_status(self, *args, **kwargs): + if not self.map_is_clear_mode and self.battle_count >= 4: + # Ignore story battles + self.device.disable_stuck_detection() + + super().combat_status(*args, **kwargs) diff --git a/campaign/war_archives_20230525_cn/t4.py b/campaign/war_archives_20230525_cn/t4.py new file mode 100644 index 000000000..244873736 --- /dev/null +++ b/campaign/war_archives_20230525_cn/t4.py @@ -0,0 +1,80 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T4') +MAP.shape = 'J8' +MAP.camera_data = ['E2', 'E6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + ++ -- ME Me -- -- ME ME -- ++ + -- ME -- -- -- -- -- -- ME -- + -- -- ++ -- ++ ++ Me -- -- ME + -- -- Me -- ++ ++ -- ++ -- -- + ++ Me -- -- SP SP -- ++ Me -- + -- -- MS __ -- -- __ MS -- -- + -- ME -- MS -- -- MS -- ME -- + ++ -- ME -- MB MB -- 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 +""" +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(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', '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 + MAP_HAS_MYSTERY = False + # ===== 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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20230525_cn/t5.py b/campaign/war_archives_20230525_cn/t5.py new file mode 100644 index 000000000..496391e10 --- /dev/null +++ b/campaign/war_archives_20230525_cn/t5.py @@ -0,0 +1,84 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T5') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- SP SP -- -- -- -- ME -- -- + -- -- -- -- -- ++ ++ ++ MB -- + MS ++ -- MS ++ ++ -- ME -- MB + -- ++ MS -- ++ ++ 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 +""" +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 = ['CAred', 'BBred'] + 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_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.256, 1.280) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.215, 1.237) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.180, 1.201) + + +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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20230525_cn/t6.py b/campaign/war_archives_20230525_cn/t6.py new file mode 100644 index 000000000..08c30471b --- /dev/null +++ b/campaign/war_archives_20230525_cn/t6.py @@ -0,0 +1,87 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T6') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['G6', 'D6'] +MAP.map_data = """ + ++ ++ ++ -- -- -- -- ++ ++ ++ + ++ ME -- ME -- -- ME -- ME ++ + ME -- -- -- ++ ++ -- -- -- ME + -- Me -- Me ++ ++ Me -- Me -- + -- Me -- -- MB MB -- -- Me -- + ME ++ -- MS __ __ MS -- ++ ME + -- ++ MS -- -- -- -- MS ++ -- + -- 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 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(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['AbyssalBoss5', 'AbyssalBoss4'] + 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_MYSTERY = False + # ===== 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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() + + def combat_status(self, *args, **kwargs): + if not self.map_is_clear_mode and self.battle_count >= 5: + # Ignore story battles + self.device.disable_stuck_detection() + + super().combat_status(*args, **kwargs) diff --git a/campaign/war_archives_20230525_cn/ts1.py b/campaign/war_archives_20230525_cn/ts1.py new file mode 100644 index 000000000..ecd48cae4 --- /dev/null +++ b/campaign/war_archives_20230525_cn/ts1.py @@ -0,0 +1,78 @@ +from .campaign_base import CampaignBase +from .config_base import ConfigBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('TS1') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6', 'D6'] +MAP.map_data = """ + MB -- -- ++ ME ME -- -- ++ ++ + -- -- Me -- -- -- Me -- -- -- + ++ -- -- MS ++ ++ -- -- ME -- + -- MS __ -- ++ ++ -- ME -- ME + ME -- __ -- SP SP -- -- ME -- + -- Me MS -- -- -- -- ++ ++ 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 +""" +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 = ['AbyssalBoss4'] + 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_MYSTERY = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + MAP_IS_ONE_TIME_STAGE = True + + +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_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20230525_cn/ts2.py b/campaign/war_archives_20230525_cn/ts2.py new file mode 100644 index 000000000..9a6f9f055 --- /dev/null +++ b/campaign/war_archives_20230525_cn/ts2.py @@ -0,0 +1,85 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .ts1 import Config as ConfigBase + +MAP = CampaignMap('TS2') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['G6', 'D6'] +MAP.map_data = """ + -- ME -- ME Me ME -- ME -- -- + ++ ++ -- -- -- -- -- ++ ++ -- + ++ ++ ME Me ++ ++ -- ME ++ -- + -- Me -- -- ++ ++ -- -- Me -- + ME -- -- -- SP SP -- -- -- Me + -- -- -- __ -- -- -- ++ -- ++ + ME ++ MS -- -- -- -- MS MB -- + -- ME -- MS -- 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}, + {'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 = ['CAred', 'BBred'] + 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_MYSTERY = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + MAP_IS_ONE_TIME_STAGE = True + + +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.map_is_clear_mode: + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + else: + if self.clear_any_enemy(sort=('cost_2',)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20240725_cn/campaign_base.py b/campaign/war_archives_20240725_cn/campaign_base.py new file mode 100644 index 000000000..280630ee4 --- /dev/null +++ b/campaign/war_archives_20240725_cn/campaign_base.py @@ -0,0 +1,21 @@ +from ..campaign_war_archives.campaign_base import CampaignBase as CampaignBase_ + + +class CampaignBase(CampaignBase_): + def campaign_set_chapter_event(self, chapter, mode='normal'): + self.ui_goto_sp() + self.campaign_ensure_chapter(chapter) + return True + + def campaign_ensure_mode(self, mode='normal'): + """ + Args: + mode (str): 'normal', 'hard', 'ex', 'story' + + Returns: + bool: If mode changed. + """ + if mode == 'hard': + self.config.override(Campaign_Mode='hard') + + self.campaign_ensure_mode_20241219(mode) diff --git a/campaign/war_archives_20240725_cn/ht1.py b/campaign/war_archives_20240725_cn/ht1.py new file mode 100644 index 000000000..2ebc9440a --- /dev/null +++ b/campaign/war_archives_20240725_cn/ht1.py @@ -0,0 +1,78 @@ +from .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('HT1') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F2', 'D2'] +MAP.map_data = """ + ++ ++ -- -- SP -- SP -- -- + MB ++ ME -- -- -- -- -- ++ + -- ME -- -- -- MS -- -- ME + -- -- __ -- Me ++ Me -- -- + -- ME -- -- -- ++ -- -- ME + ++ ++ -- Me -- 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 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'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, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Sirius', 'Dido'] + 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_MYSTERY = False + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + MAP_SWIPE_MULTIPLY = (1.236, 1.259) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.195, 1.217) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.160, 1.181) + + +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=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20240725_cn/ht2.py b/campaign/war_archives_20240725_cn/ht2.py new file mode 100644 index 000000000..0af5737c0 --- /dev/null +++ b/campaign/war_archives_20240725_cn/ht2.py @@ -0,0 +1,88 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT2') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + -- ++ -- Me -- MS ++ ++ ++ + ME ++ Me -- -- -- -- SP -- + -- -- -- -- -- MS -- -- SP + ME -- ME -- Me ++ ++ -- -- + -- ++ -- __ -- ++ ++ MS Me + ++ ME -- ME -- ME ME -- ++ + MB -- -- ++ 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': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2, 'siren': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Z23_g', 'Leipzig_g'] + 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_MYSTERY = False + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + MAP_SWIPE_MULTIPLY = (1.189, 1.211) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.150, 1.171) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.116, 1.137) + + +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/war_archives_20240725_cn/ht3.py b/campaign/war_archives_20240725_cn/ht3.py new file mode 100644 index 000000000..a3127dec9 --- /dev/null +++ b/campaign/war_archives_20240725_cn/ht3.py @@ -0,0 +1,91 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT3') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ ++ Me -- MB -- ++ -- -- + ++ ++ -- ME -- ME ++ Me ME + -- ME -- -- __ -- Me -- -- + -- ME -- ++ -- -- -- -- ME + -- ++ MS ++ MS ++ -- -- ME + -- Me -- -- -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2, 'siren': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'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(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['PompeoMagno', 'AlfredoOriani'] + 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_MYSTERY = False + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + MAP_SWIPE_MULTIPLY = (1.089, 1.109) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.053, 1.072) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.022, 1.041) + + +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/war_archives_20240725_cn/t1.py b/campaign/war_archives_20240725_cn/t1.py new file mode 100644 index 000000000..6e37436c7 --- /dev/null +++ b/campaign/war_archives_20240725_cn/t1.py @@ -0,0 +1,77 @@ +from .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('T1') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F2', 'D2'] +MAP.map_data = """ + ++ ++ -- -- SP -- SP -- -- + MB ++ ME -- -- -- -- -- ++ + -- ME -- -- -- MS -- -- ME + -- -- __ -- Me ++ Me -- -- + -- ME -- -- -- ++ -- -- ME + ++ ++ -- Me -- 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 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': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, '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 = ['Sirius', 'Dido'] + 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_MYSTERY = False + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + MAP_SWIPE_MULTIPLY = (1.236, 1.259) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.195, 1.217) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.160, 1.181) + + +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=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20240725_cn/t2.py b/campaign/war_archives_20240725_cn/t2.py new file mode 100644 index 000000000..25b0750ed --- /dev/null +++ b/campaign/war_archives_20240725_cn/t2.py @@ -0,0 +1,78 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T2') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + -- ++ -- Me -- MS ++ ++ ++ + ME ++ Me -- -- -- -- SP -- + -- -- -- -- -- MS -- -- SP + ME -- ME -- Me ++ ++ -- -- + -- ++ -- __ -- ++ ++ MS Me + ++ ME -- ME -- ME ME -- ++ + MB -- -- ++ 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': 3, 'siren': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, '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(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Z23_g', 'Leipzig_g'] + 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_MYSTERY = False + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + MAP_SWIPE_MULTIPLY = (1.189, 1.211) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.150, 1.171) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.116, 1.137) + + +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=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20240725_cn/t3.py b/campaign/war_archives_20240725_cn/t3.py new file mode 100644 index 000000000..aa3c4e801 --- /dev/null +++ b/campaign/war_archives_20240725_cn/t3.py @@ -0,0 +1,82 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T3') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ ++ Me -- MB -- ++ -- -- + ++ ++ -- ME -- ME ++ Me ME + -- ME -- -- __ -- Me -- -- + -- ME -- ++ -- -- -- -- ME + -- ++ MS ++ MS ++ -- -- ME + -- Me -- -- -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4}, + {'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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['PompeoMagno', 'AlfredoOriani'] + 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_MYSTERY = False + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + MAP_SWIPE_MULTIPLY = (1.089, 1.109) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.053, 1.072) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.022, 1.041) + + +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=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/config/template.json b/config/template.json index aef804051..d171f92ef 100644 --- a/config/template.json +++ b/config/template.json @@ -669,7 +669,7 @@ }, "Campaign": { "Name": "D3", - "Event": "war_archives_20230803_cn", + "Event": "war_archives_20240725_cn", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, diff --git a/module/campaign/run.py b/module/campaign/run.py index abaa5b5cb..f244c36ce 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -220,7 +220,9 @@ class CampaignRun(CampaignEvent): 'event_20250814_cn', 'event_20251023_cn', 'event_20260326_cn', + 'war_archives_20230525_cn', 'war_archives_20231026_cn', + 'war_archives_20240725_cn', ]: name = convert.get(name, name) # Convert between A/B/C/D and T/HT @@ -256,7 +258,9 @@ class CampaignRun(CampaignEvent): 'event_20250814_cn', 'event_20251023_cn', 'event_20260326_cn', + 'war_archives_20230525_cn', 'war_archives_20231026_cn', + 'war_archives_20240725_cn', ]: name = convert.get(name, name) else: diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 6131720db..374ee6097 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3475,10 +3475,14 @@ "war_archives_20220915_cn", "war_archives_20221222_cn", "war_archives_20230223_cn", + "war_archives_20230525_cn", "war_archives_20230803_cn", - "war_archives_20231026_cn" + "war_archives_20231026_cn", + "war_archives_20240725_cn" ], "option_cn": [ + "war_archives_20240725_cn", + "war_archives_20230525_cn", "war_archives_20230803_cn", "war_archives_20220818_cn", "war_archives_20230223_cn", @@ -3527,6 +3531,8 @@ "war_archives_20181020_en" ], "option_en": [ + "war_archives_20240725_cn", + "war_archives_20230525_cn", "war_archives_20230803_cn", "war_archives_20220818_cn", "war_archives_20230223_cn", @@ -3575,6 +3581,8 @@ "war_archives_20181020_en" ], "option_jp": [ + "war_archives_20240725_cn", + "war_archives_20230525_cn", "war_archives_20230803_cn", "war_archives_20220818_cn", "war_archives_20230223_cn", @@ -3623,6 +3631,8 @@ "war_archives_20181020_en" ], "option_tw": [ + "war_archives_20240725_cn", + "war_archives_20230525_cn", "war_archives_20230803_cn", "war_archives_20220818_cn", "war_archives_20230223_cn", diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 9f1c1b39f..9cb785da1 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -827,8 +827,10 @@ "war_archives_20220915_cn": "archives Violet Tempest Blooming Lycoris", "war_archives_20221222_cn": "archives Parallel Superimposition", "war_archives_20230223_cn": "archives Revelations of Dust", + "war_archives_20230525_cn": "archives Confluence of Nothingness", "war_archives_20230803_cn": "archives Anthem of Remembrance", - "war_archives_20231026_cn": "archives Tempesta and the Fountain of Youth" + "war_archives_20231026_cn": "archives Tempesta and the Fountain of Youth", + "war_archives_20240725_cn": "archives Interlude of Illusions" }, "Mode": { "name": "Level Mode", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 09d22af9b..9c930cbf9 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -827,8 +827,10 @@ "war_archives_20220915_cn": "檔案 赫の涙月 菫の暁風", "war_archives_20221222_cn": "檔案 積重なる事象の幻界", "war_archives_20230223_cn": "檔案 黙示の遺構", + "war_archives_20230525_cn": "檔案 覆天せし万象の塵", "war_archives_20230803_cn": "檔案 燃ゆる聖都の回想曲", - "war_archives_20231026_cn": "檔案 テンペスタと若返りの泉" + "war_archives_20231026_cn": "檔案 テンペスタと若返りの泉", + "war_archives_20240725_cn": "檔案 夢幻の間奏曲" }, "Mode": { "name": "Campaign.Mode.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 0d5778679..a5fa75a67 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -827,8 +827,10 @@ "war_archives_20220915_cn": "档案 紫绛槿岚", "war_archives_20221222_cn": "档案 定向折叠", "war_archives_20230223_cn": "档案 湮烬尘墟", + "war_archives_20230525_cn": "档案 空相交汇点", "war_archives_20230803_cn": "档案 奏响鸢尾之歌", - "war_archives_20231026_cn": "档案 飓风与青春之泉" + "war_archives_20231026_cn": "档案 飓风与青春之泉", + "war_archives_20240725_cn": "档案 幻梦间奏曲" }, "Mode": { "name": "关卡模式", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index d36f89f7f..64cedf885 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -827,8 +827,10 @@ "war_archives_20220915_cn": "檔案 紫絳槿嵐", "war_archives_20221222_cn": "檔案 定向折疊", "war_archives_20230223_cn": "檔案 湮燼塵墟", + "war_archives_20230525_cn": "檔案 空相交會點", "war_archives_20230803_cn": "檔案 奏響鳶尾之歌", - "war_archives_20231026_cn": "檔案 飓風與青春之泉" + "war_archives_20231026_cn": "檔案 飓風與青春之泉", + "war_archives_20240725_cn": "檔案 幻夢間奏曲" }, "Mode": { "name": "地圖模式", diff --git a/module/war_archives/assets.py b/module/war_archives/assets.py index b1c41af68..873db5b5c 100644 --- a/module/war_archives/assets.py +++ b/module/war_archives/assets.py @@ -10,6 +10,7 @@ TEMPLATE_ANTHEM_OF_REMEMBRANCE = Template(file={'cn': './assets/cn/war_archives/ TEMPLATE_AQUILIFERS_BALLADE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png', 'en': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png', 'jp': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png', 'tw': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png'}) TEMPLATE_ASHEN_SIMULACRUM = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png', 'en': './assets/en/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png', 'jp': './assets/cn/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png', 'tw': './assets/cn/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png'}) TEMPLATE_AURORA_NOCTIS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_AURORA_NOCTIS.png', 'en': './assets/en/war_archives/TEMPLATE_AURORA_NOCTIS.png', 'jp': './assets/cn/war_archives/TEMPLATE_AURORA_NOCTIS.png', 'tw': './assets/cn/war_archives/TEMPLATE_AURORA_NOCTIS.png'}) +TEMPLATE_CONFLUENCE_OF_NOTHINGNESS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_CONFLUENCE_OF_NOTHINGNESS.png', 'en': './assets/cn/war_archives/TEMPLATE_CONFLUENCE_OF_NOTHINGNESS.png', 'jp': './assets/cn/war_archives/TEMPLATE_CONFLUENCE_OF_NOTHINGNESS.png', 'tw': './assets/cn/war_archives/TEMPLATE_CONFLUENCE_OF_NOTHINGNESS.png'}) TEMPLATE_COUNTERATTACK_WITHIN_THE_FJORD = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_COUNTERATTACK_WITHIN_THE_FJORD.png', 'en': './assets/cn/war_archives/TEMPLATE_COUNTERATTACK_WITHIN_THE_FJORD.png', 'jp': './assets/cn/war_archives/TEMPLATE_COUNTERATTACK_WITHIN_THE_FJORD.png', 'tw': './assets/cn/war_archives/TEMPLATE_COUNTERATTACK_WITHIN_THE_FJORD.png'}) 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'}) @@ -21,6 +22,7 @@ TEMPLATE_ENCIRCLING_GRAF_SPEE = Template(file={'cn': './assets/cn/war_archives/T 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'}) TEMPLATE_GLORIOUS_BATTLE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_GLORIOUS_BATTLE.png', 'en': './assets/en/war_archives/TEMPLATE_GLORIOUS_BATTLE.png', 'jp': './assets/jp/war_archives/TEMPLATE_GLORIOUS_BATTLE.png', 'tw': './assets/tw/war_archives/TEMPLATE_GLORIOUS_BATTLE.png'}) TEMPLATE_INK_STAINED_STEEL_SAKURA = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_INK_STAINED_STEEL_SAKURA.png', 'en': './assets/en/war_archives/TEMPLATE_INK_STAINED_STEEL_SAKURA.png', 'jp': './assets/jp/war_archives/TEMPLATE_INK_STAINED_STEEL_SAKURA.png', 'tw': './assets/cn/war_archives/TEMPLATE_INK_STAINED_STEEL_SAKURA.png'}) +TEMPLATE_INTERLUDE_OF_ILLUSIONS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_INTERLUDE_OF_ILLUSIONS.png', 'en': './assets/cn/war_archives/TEMPLATE_INTERLUDE_OF_ILLUSIONS.png', 'jp': './assets/cn/war_archives/TEMPLATE_INTERLUDE_OF_ILLUSIONS.png', 'tw': './assets/cn/war_archives/TEMPLATE_INTERLUDE_OF_ILLUSIONS.png'}) 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_KHOROVOD_OF_DAWNS_RIME = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_KHOROVOD_OF_DAWNS_RIME.png', 'en': './assets/cn/war_archives/TEMPLATE_KHOROVOD_OF_DAWNS_RIME.png', 'jp': './assets/cn/war_archives/TEMPLATE_KHOROVOD_OF_DAWNS_RIME.png', 'tw': './assets/cn/war_archives/TEMPLATE_KHOROVOD_OF_DAWNS_RIME.png'}) diff --git a/module/war_archives/dictionary.py b/module/war_archives/dictionary.py index 6c965187e..812bfafc7 100644 --- a/module/war_archives/dictionary.py +++ b/module/war_archives/dictionary.py @@ -47,4 +47,6 @@ dic_archives_template = { 'war_archives_20230223_cn': TEMPLATE_REVELATIONS_OF_DUST, 'war_archives_20220818_cn': TEMPLATE_OPERATION_CONVERGENCE, 'war_archives_20230803_cn': TEMPLATE_ANTHEM_OF_REMEMBRANCE, + 'war_archives_20230525_cn': TEMPLATE_CONFLUENCE_OF_NOTHINGNESS, + 'war_archives_20240725_cn': TEMPLATE_INTERLUDE_OF_ILLUSIONS, } From 0556da08297c4cc74cb16b31aaf61da98ef501e3 Mon Sep 17 00:00:00 2001 From: Tianming Date: Thu, 18 Jun 2026 18:02:43 +0800 Subject: [PATCH 3/8] Update shop assets to match the latest UI (#5734) --- assets/cn/shop/AMOUNT_MAX.png | Bin 5104 -> 9818 bytes assets/cn/shop/AMOUNT_MINUS.png | Bin 5470 -> 7052 bytes assets/cn/shop/AMOUNT_PLUS.png | Bin 6166 -> 7653 bytes assets/cn/shop/SHOP_AMOUNT.png | Bin 5189 -> 7188 bytes module/shop/assets.py | 8 ++++---- 5 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/cn/shop/AMOUNT_MAX.png b/assets/cn/shop/AMOUNT_MAX.png index 2d140637a7a57c91423a5b5267bdfac1d6182b1f..6f046c030e11c011b3c999a09ec00f728ff4bcf1 100644 GIT binary patch literal 9818 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 literal 5104 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 A#Q*>R diff --git a/assets/cn/shop/AMOUNT_MINUS.png b/assets/cn/shop/AMOUNT_MINUS.png index 9a5fca8ddacfc875fd4c7041b2e2e7c5c2aa620a..51190e350707dae2e26b2142672496990664da9e 100644 GIT binary patch literal 7052 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 literal 5470 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 D{nR^> diff --git a/assets/cn/shop/AMOUNT_PLUS.png b/assets/cn/shop/AMOUNT_PLUS.png index 144298377ba24fdb02f4614202761fc7e0d57627..d45abe8134890fb3bdcc6f92589c0ee5f38ed3cc 100644 GIT binary patch literal 7653 zcmeHM`&U!P8l8kx0*atm)ba>EN^8qQED9w7v_;X2z*WFj(hw|C3ju;6BtQaDTd7t_ z@6|#9fwm$P5aO*sfIxy$3)UiPgg``|OlACZJ|3lZxS?jDl^TS!|J2T(6 zzdd`d{5?9t!Tv3K0D!}h!{NsPc*8t|K7+3@!w{K&!VGpEdaQe z9SJ`WN4zEF_mrfJo$Q|=$g>-}3hFYbTQ8;D+i+pqeott`&eLAowtISsws(N9I&30i@RK2Ju7JpEx6q_5?UWU98eAEY#6}~u@Uv^<-30*unIW| zvGL88fIxT!Lg#83fJ6ku$$}T{C>C%!3SefSBtbnbQ<}*Z*N}uqo^3ay<8!);)Y*DYhHDm*b z{G(kvIOW+G(jbnn<6k+gk%R~~00^8cdgNHb${gKir_qWlH^g<=sYCmbSzA%8{9fYYtg4jA4strIk&ec(1F*9@CX@d;%LOpttgX zSqXan5m4m=ku?$ee-`++(OpwBDe^psF`JI;CRH`d3@lUZ8R}PRtA$ zn<9Gp<)O{|%=Zg5tpTIcrpt>BtSK3p@VW5)XtPKrdRl($B)3-B8G($38Lr z{flULI-OyhnNDj)7!>&RwmT1AU~VIua^@$KT5 zA15IX5I^J~>f9mjbF`dD;g=^A_v!mCqeLCJl7Z;?c#gebp1?*Go|=!+JJHvhyEfRI051ZaEe)4m)DWy=aZrLgdaTQ zcOxPx^_|mP{_njm@cM?*vcMd}f}yK3pTQc+Gr3OR=lM$m&n5Ak??pjN9`}j`l;r)- zV4gssu*j-kTSH7-TB7K3Dq*Z|JOF#GUk4L0>%@D6r3>vR2t?&wp)b0-GW1Q*|4*Tq zoE<~S2)>7*@s@2J=VgBYk-?^G*+`+aM1`{dlNN!9`J&<*DWw^U3uj_TaPJQPg zgFL)+B1(Ew$Se}F6G|J>wm!hqpXPKje(5{aoN_V^GgFZ(-YJs&M3e3s-JXPg3$@;+ zTqd=H1I2fiD1UCf({sD$`kkH-&|c1R0X$|=_Syo5G~e4HGn*8Vjb7g!=ia`zm&1v~ zu!3G@hH+l1m(eAW z;-BLyVK6}aay54nUgK;@O9y&p=YOQ;1`YfGP-`Bzm~@Nu$E@4?AVky~TFKOL4#y8y zl!KvqU`w8ICQq3t(%OkwEzb*5@K!5q%l~(H#6?uc#h^m@nr7ijK3T=DZ<}LZkRl%R z!#jHFs+_tpq^YVW!GALHnJNapXzq#X9J#)jg+W8d3*|Bo#lO-a3WRaFUiIL9q1vnUZ0fe~p96`;~?@P0^#N25|wRDp;V5_gPWdd_|{@JvBDVS*DdX zQ0@KX_$Na(oM3l}5>1V^z0xh| zH1EK{RmLNsV5iacG|TxZ<{vf z1i48b^I{~ElapWK2CexeXz1E}YTp9B;y)L4y{oT>eCl(eq z*_3s;v5RrJ83j&;P@f6yFsQ9kNsv75*P%G)Rsdr;W?D=apnHH+BAO+*g1-Hjw` zpGV}J%{zuA>D0KDBM=a3@d_y3XKc@2JIpDaEtz8Nuy6m4zI26It;kg@$v)vl3O`^{F&e+j33UPIcdka`tnl*@DZc&z)3THoNCOQ?tUOGjtq=Q{?plS|bz zH9_h(QAK8M?b~2p)`4?{@PXw8Ve&QPBUW-Z?xh#0ZQN{%Z`_(BIm_%uS%5oV23p&`v{C0VJD&}E51lY7a|9j z$lAw)P4BFU!H+Nn8FpF7@K>=%oPcQJKb>aA2Y6Hk^Yh!+Y3DEO8|1Wu@%4tFmkD9y z++1Qr0XH+QPuwVIi`goWxe{|_ihARk|IuL`hDxSa;kyFM1EV2K=hvYTO-SJjnz@qH zZ}&#b$O-y90PxV&mi_U5*^r2j+*B(Ua(0N8$ppdF(|E_LY^mU4q)+`ELn$Ao*#hEW zW5GsXelAwg&=v#_Em2xMC98jC^$LO2QnlL0R+rs+qhP%~u?hmKAoxoNg74>8ket1@ VocWu_uUd5Mk%Q6UEgvOa{5S4i@gV>J literal 6166 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 J{`r&7{s$$5oF4!H diff --git a/assets/cn/shop/SHOP_AMOUNT.png b/assets/cn/shop/SHOP_AMOUNT.png index faa615eb2c25a5f337a0cc9159d406789acb96c2..5f8645a663042b0b0363353624617440e72a957b 100644 GIT binary patch literal 7188 zcmeHL`&W`_9)CbmXS|SBt0`Va%bIN_YbOIUWv0B0Tj{ozPAQt>I9*IJZ4s4QR#JJZ zsZGm-+0(AnoK?G=6axV>b&8O7ZKVkj&@niN``pQcW=Jr|n((-l~) z#6W8UkZkE9!yJyF&j&c1(ER`b8QM13YRBzoh%X(+eT{R{34)UePB}mvaDw0j!C4)g zCG!8fPYC8~Jpj13I5vz8sg})`oiTjxUoUMOR9o3 zX#%H4^X>q$xe$%gy(NeT#k!q=1k>~rDVJYvl-tEro_-Dh^Y>6oMB5VM)>)b%Ey}Es zpq2@Kx3tTch(}RB)O8U0ibxzOH`~;N{DrZU?#?wG&9N51fj(&u)L5|}buVaV>Zt`K zfo`&vM6>81-m@yr7*pRdh|c>E<2`6F-~SzBLVkww%{%#7MQpfkOkj#7&$sT`+K2!G z=_UXNS-t50Qns#wudK=frUM7`YI+ z(1IuFJ=zoe5rFvE@$Lmu@k4yTBKjiV60W#0S1;6TH@7MAqi37)6u3{c1Vk2r6YXZM zd(-K6gV)$n!;MA&n#LFE0NYQOU7?hko0%*)`v~$oFPiWkU*s+r7E^*&VeH*KqXRqP zygh}SD-#9Ua5D_--VNmm#Y^KpeM}t~)wUL@d}yk}=NgS&@%#e-)fF@#p`Wy1{Pp#& zL?2kBtH)T{NHBH`*}$BpTW$X;#-QjOyj`9-l*RE&=+tdI%>{fo2Ey{dM>GI3ItTc& zA}qEctx8hJI!F`Z=2}mbao53+nxFX#Jlce1ySq1C`GE2|0GT?eE72<2tQ7R_iun`f zUL?aCYxzZvl-rEV{Zgu-hKiz?II75Nv(MuI4Vw-R1%kgqnA8@rRR^b<-{RoebBwB!S_Jkl1&~RK_&D0c)#KvanW; zau91fOPu}n#k?iQHp^_)EKeO;CvoZWBlc69H4JY+YYbi4*JztaiNEd3W!_bsJggA4 z0M+r)N)TIX;#wr z_;^UmxV)lm?k{B74h22Lh24V=13(hKvPk)_a$oz%eZj;WyYJJdqFy{Hx&uK3S zLwQ?ru_=qVB+vGmEBo(S3B$4W*3!=+i`rMsj#W0$nfB$7>V~)_rQWKe;)!;vDQA4D zYp+M7P`)KWfIoZH><09!SLBhIC!gFb$VVt5Y;Bg5a4_gY&J)CVvMQHFKE=VYmk)t>4Csb<#-jfTQ)1eLjK zKu}H}{x+1Q<`*25hS04i1N6Dxmo=LO!zZ3~yq6T1n;Au{Zi6|;I>n^xD5mqu^T;@V z%ItN1Pm`_E?#G_68lu7!lHebgAck&O3Eg^*!cvswB`EUg!+!`J?pYp*Iwv{VJ3LV` zI)Cc%BmIu7Vup@$fp1B-S^GkGs5r}X4joU{^eC++`)T6Ryjp)ZguEPK{}ceCTW!G$ z7${Cqy+-r1T`g_=9^E~Wp|8K{lg667SE_94PNYhFgfVzAo`JQ?m0f&mhZ4}3TIuK}^j5|BeO^lu^E z(yr?VI8Z)(E zbv!QVT;E-0ps4W$)tR~lQweTn)%8pLUjUFT2nz)OS?EO;o?=V$V>*5GLp~L(11dQ# z7bWMYxUSIAHX{P!)$XRKxzE$6jXy^f;*wm(+(~(eJCvc!?2-#mfYAev)b})hvsA?H zss&us6v3NRYL?#UOp-i0O?bF5R2;Adq6}|`-R&zq26+ac@LY5!oXkbJ4 ze%s`)#^q-MK9r#vmz!E`j0jWqOhppNVoLPrN!~^yt{ySE-)qbpxg*IB(7aYyG4LI_ zW1h1fhVimEdoJ%y#2YxAx8-2Ujk`9sc*ha_a)3%R_M0ga8jeB7#fn6<^ z$3TcD+6u!IzU~ri0gQC(Z5ifOWso;LP*QG_HHW9d0XNx^W}eg?F6`p0gQ?7ACU|I> z+>Y;=lpE?Tu=ef6v6D4--}x^(*jAlmUy^U_#8Pd`FdKAGCpKo;BG&?%#5jGIpOtP2 z3TdnaV~=0=2P}!gnHOHV*VES!wA>L`PVo=CF!-FEGDOz^CxaE%|VNoegGfb)z zM&6Xo{PIz+KC0b@<*D5O(8CiQSwreSPT=ICAwedBq9hw` zx+44?uGW?rrcfWRWC|7&X{`GK)94!LpTUa!oA-{EztqjMIZ^&I{ox?hfG3l`nQ>uv zhbRb>@)|K!vgOC*%>dwka8NvdxW_)QojO6bx6XDQ;){gke6^uuog&jm-_FdpYpX)h z!f{UGoC_cpEN6HEXgo9GEpUfJqdU?X0ADsik)V+aVG4~44w3+{+QCidq!R=u6P$8z v<^+fXP7s_RI7_6nPjEI%|KpBvufz_k1&;Y^ter^k(B2UboBm7pMEnM;~DN=89IxgjpN;F2hEwYmSp{Ng#!Iq!MiAKvpmpLaPY`y|5a z>#z2I1pvU;KHe}S0Bl)1ZvJcQ<~4ED6uxOq=tlT@!2s?0yvL;$u4%U6y+dOGVEec0 zYZGv{Z10*yI*Cs%kOTUWm}-j)5$o*j>CkJ|g%ocMa73ni#Te=3Q;O zW1>hRU?hJ?*>Qt5R-;tZx(;UUQmaDCYMSE5-}Z8E&~X|i#A4m;jj=&sgTMxXe}=&4 zxZ8n1a}q(5Eenwv2A*b8a4bxu@ zg(PC8zFu9-Zl=$j=?kcMG=?Zsa~pzg#fUv&i0b?f5Xx&)J?1W{&+MTMI|y!Mh(eL~ zWfT+h8~6MXm}3knChSY5dxI#A6^}O^1#~l1BZuZZUs}fBL3Z9(CNnCpB=`JcW_Ic~ z@gQ;JsSgT8AuXk*VN%aS%WaP1ST%Bg=e={W7>lQ&usFI>DwT#i|)D*$znkWwHJFJzni$+IX_VeneGf!?T9h2a6Pu zNVs_9J)h4Hx4R;Cl)LQDQws8Ws@)svp8;i;Et`QdTvv1h`KR-zE^_Nnn?)S9N=QlJ zi0PGizQs0vcl*ZU4@S6=^V?gHaFDtDlEdit$|*$~0I0RN};t)cE_D9t*D2|Bf}hyxUx6gzC_<^aOU%XOf%V)WEfH$=oefK zgV}&gpgL3%{7nG-!Jz=NRtx~HO z_?yW6`pE%sSW}Y9BC}A##Fkc7)0L@G6Juis|0CocXRf1J@qB-d8`heAdOo55&edD@ zVsl8e+cDX+U;j2KN5wD1@OrK82&^souyBxd&Y#zIi$eBbR1vw@y3Rh#{QK_i?x6eF z*$XjtCIzb_44!t3&QMNGf&F8LJL{a!B+%KVNQoyV#t1arLAFVxrr6`5SBtxhY!m#d zl~tm>;lRJb0Vg5Aa-zJgr(mp$9W|*iKEF-g%SVpNcZ52as&4D_l8KBCq=r#8onlX4xJ+ z?fO;oOop%GZMmgN^**8fTXGe*aA{~w9^m<%WuSbTvuXMHE_zui)jhVl7 zZK_elXYo{WNtAZB=-L@EXU#zBF-s}{D2sn7_DP%{IIzRM96_gz#nF1NK>Af{1uf&P z%u1C?GZZc|(q(z#sU&K##lXFhxV#Xm=^#fR{s9O-wq-3Pndn)6kn0CK5xYjrBo5}0 zqjHx8if0%L?d%Ed3U^A=${^0Gg}j+OZ%m9+L-b%)2_xaim+tX>5NEKPTYRZa|ur*Rn*a_L$ABNsX5)u)L zfwwt4-!6Lh7aHbUKK2~Q;LBBtNNrItdTE-!tV!dEeG9L*TocxG%TzBdX_krxHKi>%DQ%a=#x{OO5WvFsopj)BbO2N4?p&lVL{Wv-wcHFMeIL zq`1t#3G8v#uC&#M!F{SV3)^iQSJmC@nu8H+IIpy{GyqvRC4G9+4w!C;zOg04_N2gJ zio1x0gXA9^{9#s}D+p?4d73*V2>uF!!(t~VCakKm^E+#1|m*B*E1!~^@?#k z@g%_)qYO2(2`tm8%{IuNQh413KXQBESyX#5~az@6J)Ec9PRXV)3ilS z`jQGPL!hXbSiw+G|Khf0FXAB!aaPE~wz!C{(3GkyGe8GlVNL}yR1<9sEkBgietYZ? z2vM`;tOv~bT7lMjZQ{>y`+JrT^m=r7;7_im`lUXIe zu*6eyY{Op1#dEC*MbGH{P@gU)DejF4)|SFe=Y)!Um9i>;geYa7Lq z^2{7zeLTo4qBd>Hb(50^pB`33uXDUxRZX*`K;@}+<=^{VJ|j*kM^FWmYc=5*9Dn&H zjXgw)zS}W=eHt2g|@HseSe4cB)o~QWLve0O2h#87n{Lva@7UNcw6>R7<@bYJY z*8xcU7!CbW#Kel3-Pn@4Ziz&*Zg;Ke+9f|IIVnQ70 zkcOmy-3UDcIXeH$Pj2JZ4FVekHVAAG_&))1rdB767NR@m&)v7K^6@~xYL18h_kT^B BR#yN3 diff --git a/module/shop/assets.py b/module/shop/assets.py index 60ea50528..d21e2b672 100644 --- a/module/shop/assets.py +++ b/module/shop/assets.py @@ -4,15 +4,15 @@ from module.base.template import Template # This file was automatically generated by dev_tools/button_extract.py. # Don't modify it manually. -AMOUNT_MAX = Button(area={'cn': (772, 316, 822, 332), 'en': (772, 316, 822, 332), 'jp': (772, 316, 822, 332), 'tw': (772, 316, 822, 332)}, color={'cn': (148, 178, 225), 'en': (148, 178, 225), 'jp': (148, 178, 225), 'tw': (148, 178, 225)}, button={'cn': (772, 316, 822, 332), 'en': (772, 316, 822, 332), 'jp': (772, 316, 822, 332), 'tw': (772, 316, 822, 332)}, file={'cn': './assets/cn/shop/AMOUNT_MAX.png', 'en': './assets/en/shop/AMOUNT_MAX.png', 'jp': './assets/jp/shop/AMOUNT_MAX.png', 'tw': './assets/tw/shop/AMOUNT_MAX.png'}) -AMOUNT_MINUS = Button(area={'cn': (546, 304, 586, 344), 'en': (546, 304, 586, 344), 'jp': (546, 304, 586, 344), 'tw': (546, 304, 586, 344)}, color={'cn': (76, 127, 195), 'en': (76, 127, 195), 'jp': (76, 127, 195), 'tw': (76, 127, 195)}, button={'cn': (546, 304, 586, 344), 'en': (546, 304, 586, 344), 'jp': (546, 304, 586, 344), 'tw': (546, 304, 586, 344)}, file={'cn': './assets/cn/shop/AMOUNT_MINUS.png', 'en': './assets/en/shop/AMOUNT_MINUS.png', 'jp': './assets/jp/shop/AMOUNT_MINUS.png', 'tw': './assets/tw/shop/AMOUNT_MINUS.png'}) -AMOUNT_PLUS = Button(area={'cn': (693, 304, 735, 344), 'en': (693, 304, 735, 344), 'jp': (693, 304, 735, 344), 'tw': (693, 304, 735, 344)}, color={'cn': (81, 130, 196), 'en': (81, 130, 196), 'jp': (81, 130, 196), 'tw': (81, 130, 196)}, button={'cn': (693, 304, 735, 344), 'en': (693, 304, 735, 344), 'jp': (693, 304, 735, 344), 'tw': (693, 304, 735, 344)}, file={'cn': './assets/cn/shop/AMOUNT_PLUS.png', 'en': './assets/en/shop/AMOUNT_PLUS.png', 'jp': './assets/jp/shop/AMOUNT_PLUS.png', 'tw': './assets/tw/shop/AMOUNT_PLUS.png'}) +AMOUNT_MAX = Button(area={'cn': (762, 314, 830, 342), 'en': (772, 316, 822, 332), 'jp': (772, 316, 822, 332), 'tw': (772, 316, 822, 332)}, color={'cn': (104, 145, 209), 'en': (148, 178, 225), 'jp': (148, 178, 225), 'tw': (148, 178, 225)}, button={'cn': (762, 314, 830, 342), 'en': (772, 316, 822, 332), 'jp': (772, 316, 822, 332), 'tw': (772, 316, 822, 332)}, file={'cn': './assets/cn/shop/AMOUNT_MAX.png', 'en': './assets/en/shop/AMOUNT_MAX.png', 'jp': './assets/jp/shop/AMOUNT_MAX.png', 'tw': './assets/tw/shop/AMOUNT_MAX.png'}) +AMOUNT_MINUS = Button(area={'cn': (549, 311, 582, 345), 'en': (546, 304, 586, 344), 'jp': (546, 304, 586, 344), 'tw': (546, 304, 586, 344)}, color={'cn': (82, 129, 194), 'en': (76, 127, 195), 'jp': (76, 127, 195), 'tw': (76, 127, 195)}, button={'cn': (549, 311, 582, 345), 'en': (546, 304, 586, 344), 'jp': (546, 304, 586, 344), 'tw': (546, 304, 586, 344)}, file={'cn': './assets/cn/shop/AMOUNT_MINUS.png', 'en': './assets/en/shop/AMOUNT_MINUS.png', 'jp': './assets/jp/shop/AMOUNT_MINUS.png', 'tw': './assets/tw/shop/AMOUNT_MINUS.png'}) +AMOUNT_PLUS = Button(area={'cn': (696, 312, 732, 345), 'en': (693, 304, 735, 344), 'jp': (693, 304, 735, 344), 'tw': (693, 304, 735, 344)}, color={'cn': (88, 133, 199), 'en': (81, 130, 196), 'jp': (81, 130, 196), 'tw': (81, 130, 196)}, button={'cn': (696, 312, 732, 345), 'en': (693, 304, 735, 344), 'jp': (693, 304, 735, 344), 'tw': (693, 304, 735, 344)}, file={'cn': './assets/cn/shop/AMOUNT_PLUS.png', 'en': './assets/en/shop/AMOUNT_PLUS.png', 'jp': './assets/jp/shop/AMOUNT_PLUS.png', 'tw': './assets/tw/shop/AMOUNT_PLUS.png'}) MEDAL_SHOP_SCROLL_AREA_250814 = Button(area={'cn': (1063, 201, 1064, 623), 'en': (1063, 201, 1064, 623), 'jp': (1063, 201, 1064, 623), 'tw': (1063, 201, 1064, 623)}, color={'cn': (128, 143, 153), 'en': (128, 143, 153), 'jp': (128, 143, 153), 'tw': (128, 143, 153)}, button={'cn': (1063, 201, 1064, 623), 'en': (1063, 201, 1064, 623), 'jp': (1063, 201, 1064, 623), 'tw': (1063, 201, 1064, 623)}, file={'cn': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png', 'en': './assets/en/shop/MEDAL_SHOP_SCROLL_AREA_250814.png', 'jp': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png', 'tw': './assets/cn/shop/MEDAL_SHOP_SCROLL_AREA_250814.png'}) NAV_GENERAL = Button(area={'cn': (52, 436, 127, 457), 'en': (47, 438, 127, 458), 'jp': (50, 438, 94, 458), 'tw': (53, 436, 126, 459)}, color={'cn': (126, 178, 207), 'en': (137, 185, 211), 'jp': (149, 194, 218), 'tw': (146, 191, 214)}, button={'cn': (52, 436, 127, 457), 'en': (47, 438, 127, 458), 'jp': (50, 438, 94, 458), 'tw': (53, 436, 126, 459)}, file={'cn': './assets/cn/shop/NAV_GENERAL.png', 'en': './assets/en/shop/NAV_GENERAL.png', 'jp': './assets/jp/shop/NAV_GENERAL.png', 'tw': './assets/tw/shop/NAV_GENERAL.png'}) NAV_MONTHLY = Button(area={'cn': (52, 486, 127, 508), 'en': (51, 487, 131, 507), 'jp': (53, 488, 125, 508), 'tw': (53, 487, 125, 507)}, color={'cn': (127, 178, 207), 'en': (129, 179, 207), 'jp': (161, 201, 219), 'tw': (143, 187, 210)}, button={'cn': (52, 486, 127, 508), 'en': (51, 487, 131, 507), 'jp': (53, 488, 125, 508), 'tw': (53, 487, 125, 507)}, file={'cn': './assets/cn/shop/NAV_MONTHLY.png', 'en': './assets/en/shop/NAV_MONTHLY.png', 'jp': './assets/jp/shop/NAV_MONTHLY.png', 'tw': './assets/tw/shop/NAV_MONTHLY.png'}) SELECT_MINUS = Button(area={'cn': (562, 201, 588, 227), 'en': (562, 201, 588, 227), 'jp': (562, 201, 588, 227), 'tw': (562, 201, 588, 227)}, color={'cn': (86, 70, 70), 'en': (86, 70, 70), 'jp': (86, 70, 70), 'tw': (86, 70, 70)}, button={'cn': (562, 201, 588, 227), 'en': (562, 201, 588, 227), 'jp': (562, 201, 588, 227), 'tw': (562, 201, 588, 227)}, file={'cn': './assets/cn/shop/SELECT_MINUS.png', 'en': './assets/en/shop/SELECT_MINUS.png', 'jp': './assets/jp/shop/SELECT_MINUS.png', 'tw': './assets/tw/shop/SELECT_MINUS.png'}) SELECT_PLUS = Button(area={'cn': (674, 201, 700, 227), 'en': (674, 201, 700, 227), 'jp': (674, 201, 700, 227), 'tw': (674, 201, 700, 227)}, color={'cn': (97, 70, 70), 'en': (97, 70, 70), 'jp': (97, 70, 70), 'tw': (97, 70, 70)}, button={'cn': (674, 201, 700, 227), 'en': (674, 201, 700, 227), 'jp': (674, 201, 700, 227), 'tw': (674, 201, 700, 227)}, file={'cn': './assets/cn/shop/SELECT_PLUS.png', 'en': './assets/en/shop/SELECT_PLUS.png', 'jp': './assets/jp/shop/SELECT_PLUS.png', 'tw': './assets/tw/shop/SELECT_PLUS.png'}) -SHOP_AMOUNT = Button(area={'cn': (600, 310, 680, 340), 'en': (600, 310, 680, 340), 'jp': (600, 310, 680, 340), 'tw': (600, 310, 680, 340)}, color={'cn': (48, 52, 62), 'en': (48, 52, 62), 'jp': (48, 52, 62), 'tw': (48, 52, 62)}, button={'cn': (600, 310, 680, 340), 'en': (600, 310, 680, 340), 'jp': (600, 310, 680, 340), 'tw': (600, 310, 680, 340)}, file={'cn': './assets/cn/shop/SHOP_AMOUNT.png', 'en': './assets/en/shop/SHOP_AMOUNT.png', 'jp': './assets/jp/shop/SHOP_AMOUNT.png', 'tw': './assets/tw/shop/SHOP_AMOUNT.png'}) +SHOP_AMOUNT = Button(area={'cn': (600, 313, 680, 344), 'en': (600, 310, 680, 340), 'jp': (600, 310, 680, 340), 'tw': (600, 310, 680, 340)}, color={'cn': (38, 38, 46), 'en': (48, 52, 62), 'jp': (48, 52, 62), 'tw': (48, 52, 62)}, button={'cn': (600, 313, 680, 344), 'en': (600, 310, 680, 340), 'jp': (600, 310, 680, 340), 'tw': (600, 310, 680, 340)}, file={'cn': './assets/cn/shop/SHOP_AMOUNT.png', 'en': './assets/en/shop/SHOP_AMOUNT.png', 'jp': './assets/jp/shop/SHOP_AMOUNT.png', 'tw': './assets/tw/shop/SHOP_AMOUNT.png'}) SHOP_BUY_CONFIRM = Button(area={'cn': (703, 483, 876, 540), 'en': (708, 487, 872, 534), 'jp': (720, 494, 862, 531), 'tw': (706, 485, 875, 537)}, color={'cn': (94, 142, 203), 'en': (115, 157, 210), 'jp': (100, 147, 205), 'tw': (95, 143, 203)}, button={'cn': (703, 483, 876, 540), 'en': (708, 487, 872, 534), 'jp': (720, 494, 862, 531), 'tw': (706, 485, 875, 537)}, file={'cn': './assets/cn/shop/SHOP_BUY_CONFIRM.png', 'en': './assets/en/shop/SHOP_BUY_CONFIRM.png', 'jp': './assets/jp/shop/SHOP_BUY_CONFIRM.png', 'tw': './assets/tw/shop/SHOP_BUY_CONFIRM.png'}) SHOP_BUY_CONFIRM_AMOUNT = Button(area={'cn': (756, 622, 827, 653), 'en': (724, 623, 856, 650), 'jp': (756, 623, 826, 653), 'tw': (756, 623, 827, 653)}, color={'cn': (137, 168, 209), 'en': (146, 174, 211), 'jp': (123, 158, 204), 'tw': (139, 170, 210)}, button={'cn': (756, 622, 827, 653), 'en': (724, 623, 856, 650), 'jp': (756, 623, 826, 653), 'tw': (756, 623, 827, 653)}, file={'cn': './assets/cn/shop/SHOP_BUY_CONFIRM_AMOUNT.png', 'en': './assets/en/shop/SHOP_BUY_CONFIRM_AMOUNT.png', 'jp': './assets/jp/shop/SHOP_BUY_CONFIRM_AMOUNT.png', 'tw': './assets/tw/shop/SHOP_BUY_CONFIRM_AMOUNT.png'}) SHOP_BUY_CONFIRM_MISTAKE = Button(area={'cn': (590, 300, 612, 318), 'en': (590, 300, 612, 318), 'jp': (590, 300, 612, 318), 'tw': (590, 300, 612, 318)}, color={'cn': (154, 79, 103), 'en': (154, 79, 103), 'jp': (154, 79, 103), 'tw': (154, 79, 103)}, button={'cn': (590, 300, 612, 318), 'en': (590, 300, 612, 318), 'jp': (590, 300, 612, 318), 'tw': (590, 300, 612, 318)}, file={'cn': './assets/cn/shop/SHOP_BUY_CONFIRM_MISTAKE.png', 'en': './assets/en/shop/SHOP_BUY_CONFIRM_MISTAKE.png', 'jp': './assets/jp/shop/SHOP_BUY_CONFIRM_MISTAKE.png', 'tw': './assets/tw/shop/SHOP_BUY_CONFIRM_MISTAKE.png'}) From 46195277891cdebe5ec8474e17187a8508b184b6 Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Thu, 18 Jun 2026 22:26:09 +0800 Subject: [PATCH 4/8] Fix: handle_get_items_ship in gacha --- assets/cn/handler/GET_ITEMS_SHIP_1.png | Bin 0 -> 10166 bytes assets/en/handler/GET_ITEMS_SHIP_1.png | Bin 0 -> 7446 bytes assets/jp/handler/GET_ITEMS_SHIP_1.png | Bin 0 -> 10179 bytes module/gacha/gacha_reward.py | 2 ++ module/handler/assets.py | 1 + module/handler/info_handler.py | 18 ++++++++++++++++++ 6 files changed, 21 insertions(+) create mode 100644 assets/cn/handler/GET_ITEMS_SHIP_1.png create mode 100644 assets/en/handler/GET_ITEMS_SHIP_1.png create mode 100644 assets/jp/handler/GET_ITEMS_SHIP_1.png diff --git a/assets/cn/handler/GET_ITEMS_SHIP_1.png b/assets/cn/handler/GET_ITEMS_SHIP_1.png new file mode 100644 index 0000000000000000000000000000000000000000..b967e090ee49027796a24cea6a2da13a4735701e GIT binary patch literal 10166 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 literal 0 HcmV?d00001 diff --git a/assets/en/handler/GET_ITEMS_SHIP_1.png b/assets/en/handler/GET_ITEMS_SHIP_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f73e91f5ddfedcd6e4e4a2a6c18d4c227bae0dd1 GIT binary patch literal 7446 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 Date: Sun, 21 Jun 2026 20:12:28 +0800 Subject: [PATCH 5/8] Fix: use fleet_show_index for handle_strategy (#5745) --- module/map/fleet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/map/fleet.py b/module/map/fleet.py index 8999e5bcc..249f61e20 100644 --- a/module/map/fleet.py +++ b/module/map/fleet.py @@ -102,7 +102,7 @@ class Fleet(Camera, AmbushHandler): self.show_fleet() self.hp_get() self.lv_get() - self.handle_strategy(index=self.fleet_current_index) + self.handle_strategy(index=self.fleet_show_index) return True else: return False From e762c01929a991596b11f67d17728a41fe0718da Mon Sep 17 00:00:00 2001 From: EmoryLeo Date: Sun, 21 Jun 2026 20:15:37 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E8=BF=9E=E6=8E=A5a=E5=9B=BE=E5=92=8Cb?= =?UTF-8?q?=E5=9B=BE=20(#5743)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将活动图开荒的a1到b3连接起来。因为c图和d图需要选船,不适合连接,所以分开处理 --- module/config/config_manual.py | 2 +- module/handler/fast_forward.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/module/config/config_manual.py b/module/config/config_manual.py index d8045f7fc..b9f10fce2 100644 --- a/module/config/config_manual.py +++ b/module/config/config_manual.py @@ -121,7 +121,7 @@ class ManualConfig: MAP_CHAPTER_SWITCH_20241219_SPEX = False # Since event_20241219_cn chapter B unlocks event startup # which means chapter AB are continuous - STAGE_INCREASE_AB = False + STAGE_INCREASE_AB = True # Insert anything to STAGE_INCREASE STAGE_INCREASE_CUSTOM = '' MAP_HAS_CLEAR_PERCENTAGE = True diff --git a/module/handler/fast_forward.py b/module/handler/fast_forward.py index a7b86ea8d..747d411c5 100644 --- a/module/handler/fast_forward.py +++ b/module/handler/fast_forward.py @@ -372,8 +372,7 @@ class FastForwardHandler(AutoSearchHandler): # Insert custom increase logic if self.config.STAGE_INCREASE_AB: stage_increase = [ - 'A1 > A2 > A3 > B1 > B2 > B3', - 'C1 > C2 > C3 > D1 > D2 > D3', + 'A1 > A2 > A3 > B1 > B2 > B3', ] + stage_increase custom = self.config.STAGE_INCREASE_CUSTOM if custom: From 37dad5cf2159b1bf8164da5f65ccc0c7d00b7faf Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sun, 21 Jun 2026 20:24:41 +0800 Subject: [PATCH 7/8] Fix: goto HT stages in war_archive_20240725_cn --- campaign/war_archives_20240725_cn/campaign_base.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/campaign/war_archives_20240725_cn/campaign_base.py b/campaign/war_archives_20240725_cn/campaign_base.py index 280630ee4..563579a00 100644 --- a/campaign/war_archives_20240725_cn/campaign_base.py +++ b/campaign/war_archives_20240725_cn/campaign_base.py @@ -4,6 +4,12 @@ from ..campaign_war_archives.campaign_base import CampaignBase as CampaignBase_ class CampaignBase(CampaignBase_): def campaign_set_chapter_event(self, chapter, mode='normal'): self.ui_goto_sp() + if chapter in ['a', 'b', 'as', 'bs', 't', 'ts', 'tss']: + self.campaign_ensure_mode('normal') + elif chapter in ['c', 'd', 'cs', 'ds', 'ht', 'hts']: + self.campaign_ensure_mode('hard') + elif chapter == 'ex_sp': + self.campaign_ensure_mode('ex') self.campaign_ensure_chapter(chapter) return True @@ -18,4 +24,6 @@ class CampaignBase(CampaignBase_): if mode == 'hard': self.config.override(Campaign_Mode='hard') - self.campaign_ensure_mode_20241219(mode) + # this event only have chapter T/HT and chapter SP, and war archive does not have SP + # so there is no mode switch buttons + # self.campaign_ensure_mode_20241219(mode) From e3626b750625578b5f320d36ff75a92d4ed49fdc Mon Sep 17 00:00:00 2001 From: LmeSzinc <37934724+LmeSzinc@users.noreply.github.com> Date: Sun, 21 Jun 2026 20:30:31 +0800 Subject: [PATCH 8/8] Fix: handle_in_map_with_enemy_searching() immediately enter submarine combat in W16 (#5740) --- module/handler/enemy_searching.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/module/handler/enemy_searching.py b/module/handler/enemy_searching.py index 96adc3f31..e3fccd3f7 100644 --- a/module/handler/enemy_searching.py +++ b/module/handler/enemy_searching.py @@ -120,6 +120,10 @@ class EnemySearchingHandler(InfoHandler): # although here expects an enemy searching animation. if self.handle_in_stage(): return True + # immediately enter submarine combat in W16 + if hasattr(self, 'is_combat_loading') and self.is_combat_loading(): + logger.warning('Entered map with is_combat_loading appeared') + break if self.handle_auto_search_exit(drop=drop): timeout.limit = 10 timeout.reset()