From 4f779f66b220f80c616f4e7ad8130fe59c1e07ae Mon Sep 17 00:00:00 2001 From: somegituser Date: Fri, 23 Feb 2024 21:58:52 +0800 Subject: [PATCH] add: war archive Khorovod of Dawn's Rime (#3505) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增作战档案:破晓冰华 --- .../TEMPLATE_KHOROVOD_OF_DAWNS_RIME.png | Bin 0 -> 35285 bytes campaign/Readme.md | 1 + campaign/war_archives_20210225_cn/a1.py | 85 +++++++++++++++ campaign/war_archives_20210225_cn/a2.py | 69 ++++++++++++ campaign/war_archives_20210225_cn/a3.py | 78 ++++++++++++++ campaign/war_archives_20210225_cn/b1.py | 92 ++++++++++++++++ campaign/war_archives_20210225_cn/b2.py | 70 ++++++++++++ campaign/war_archives_20210225_cn/b3.py | 79 ++++++++++++++ campaign/war_archives_20210225_cn/c1.py | 88 +++++++++++++++ campaign/war_archives_20210225_cn/c2.py | 76 +++++++++++++ campaign/war_archives_20210225_cn/c3.py | 79 ++++++++++++++ campaign/war_archives_20210225_cn/d1.py | 100 ++++++++++++++++++ campaign/war_archives_20210225_cn/d2.py | 90 ++++++++++++++++ campaign/war_archives_20210225_cn/d3.py | 99 +++++++++++++++++ module/config/argument/args.json | 9 +- module/config/i18n/en-US.json | 1 + module/config/i18n/ja-JP.json | 1 + module/config/i18n/zh-CN.json | 1 + module/config/i18n/zh-TW.json | 1 + module/war_archives/assets.py | 1 + module/war_archives/dictionary.py | 1 + 21 files changed, 1017 insertions(+), 4 deletions(-) create mode 100644 assets/cn/war_archives/TEMPLATE_KHOROVOD_OF_DAWNS_RIME.png create mode 100644 campaign/war_archives_20210225_cn/a1.py create mode 100644 campaign/war_archives_20210225_cn/a2.py create mode 100644 campaign/war_archives_20210225_cn/a3.py create mode 100644 campaign/war_archives_20210225_cn/b1.py create mode 100644 campaign/war_archives_20210225_cn/b2.py create mode 100644 campaign/war_archives_20210225_cn/b3.py create mode 100644 campaign/war_archives_20210225_cn/c1.py create mode 100644 campaign/war_archives_20210225_cn/c2.py create mode 100644 campaign/war_archives_20210225_cn/c3.py create mode 100644 campaign/war_archives_20210225_cn/d1.py create mode 100644 campaign/war_archives_20210225_cn/d2.py create mode 100644 campaign/war_archives_20210225_cn/d3.py diff --git a/assets/cn/war_archives/TEMPLATE_KHOROVOD_OF_DAWNS_RIME.png b/assets/cn/war_archives/TEMPLATE_KHOROVOD_OF_DAWNS_RIME.png new file mode 100644 index 0000000000000000000000000000000000000000..bc55d47f3be23c74cd4a3875ceb05c29d008ff33 GIT binary patch literal 35285 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 literal 0 HcmV?d00001 diff --git a/campaign/Readme.md b/campaign/Readme.md index 23b816024..7918b0346 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -39,6 +39,7 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20230831 | war archives 20201229 cn | Inverted Orthant | 负象限作战 | Inverted Orthant | 虚畳なりし限象 | - | | 20240118 | war archives 20200917 cn | Dreamwaker's Butterfly | 蝶海梦花 | Dreamwaker's Butterfly | 刹那觀る胡蝶の夢 | - | | 20240118 | war archives 20210527 cn | Mirror Involution | 镜位螺旋 | Mirror Involution | 照らす螺旋の鏡海 | - | +| 20240222 | war archives 20210225 cn | Khorovod of Dawn's Rime | 破晓冰华 | Khorovod of Dawn's Rime | 暁射す氷華の嵐 | - | | 20200227 | event 20200227 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | - | | 20200312 | event 20200312 cn | The Solomon Ranger | 复刻斯图尔特的硝烟 | The Solomon Ranger Rerun | 南洋に靡く硝煙(復刻) | - | | 20200326 | event 20200326 cn | Microlayer Medley | 微层混合 | Microlayer Medley | 闇靄払う銀翼 | - | diff --git a/campaign/war_archives_20210225_cn/a1.py b/campaign/war_archives_20210225_cn/a1.py new file mode 100644 index 000000000..6ce6a4954 --- /dev/null +++ b/campaign/war_archives_20210225_cn/a1.py @@ -0,0 +1,85 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('A1') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + ++ ME -- -- -- -- -- -- -- + ME -- ME ++ ME -- Me ++ ++ + -- -- -- Me -- -- ME ++ ++ + -- MS -- ++ ++ -- -- ME -- + Me -- -- ME ++ MS __ -- MB + ++ -- -- -- -- -- -- ME -- + ++ SP -- SP ++ ++ ++ -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1, 'boss': 1}, + {'battle': 4, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['DD'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 24), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 24, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + } + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210225_cn/a2.py b/campaign/war_archives_20210225_cn/a2.py new file mode 100644 index 000000000..d3357c815 --- /dev/null +++ b/campaign/war_archives_20210225_cn/a2.py @@ -0,0 +1,69 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A2') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + -- Me ++ ++ ++ MB ++ ++ ++ + ME -- ME ++ ME -- ME ++ -- + -- -- -- -- -- -- -- ME -- + MS ++ -- ++ Me __ -- -- Me + -- -- -- ++ -- -- -- ME -- + SP -- -- MS ME -- ME ++ ++ + -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210225_cn/a3.py b/campaign/war_archives_20210225_cn/a3.py new file mode 100644 index 000000000..13d64c985 --- /dev/null +++ b/campaign/war_archives_20210225_cn/a3.py @@ -0,0 +1,78 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A3') +MAP.shape = 'I10' +MAP.camera_data = ['E3', 'E6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- ++ ++ ++ ++ ++ ++ ++ -- + ++ -- -- -- Me -- -- -- ++ + ++ -- ++ ME -- ME ++ -- ++ + -- -- ME -- MS -- ME -- -- + -- Me -- MS MB 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 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210225_cn/b1.py b/campaign/war_archives_20210225_cn/b1.py new file mode 100644 index 000000000..780175ab8 --- /dev/null +++ b/campaign/war_archives_20210225_cn/b1.py @@ -0,0 +1,92 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('B1') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D5', 'E2', 'E5'] +MAP.camera_data_spawn_point = ['D2', 'E2'] +MAP.map_data = """ + -- ++ ++ ++ MB ++ ++ ++ -- + -- ME ++ SP -- SP ++ -- -- + Me -- -- -- -- -- -- ME ++ + ++ ME ++ -- __ -- MS Me ++ + -- ME ++ MS -- 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 +""" +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, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'CAred'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 24), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 24, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'CL': 1.111, + 'CAred': 1.111, + 'BBred': 1.111, + } + MAP_SWIPE_MULTIPLY = (1.159, 1.181) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.121, 1.141) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.088, 1.108) + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210225_cn/b2.py b/campaign/war_archives_20210225_cn/b2.py new file mode 100644 index 000000000..edd9f54eb --- /dev/null +++ b/campaign/war_archives_20210225_cn/b2.py @@ -0,0 +1,70 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B2') +MAP.shape = 'K7' +MAP.camera_data = ['D2', 'D4', 'H2', 'H4'] +MAP.camera_data_spawn_point = ['H4'] +MAP.map_data = """ + -- -- -- -- -- -- -- ME ME -- ++ + ++ -- ME -- ++ ++ ME -- -- ME ++ + -- ME -- ME ++ ++ ++ -- MS ++ ++ + ++ ++ -- -- Me __ MS -- -- -- SP + -- ++ Me -- -- -- -- -- -- -- SP + MB -- -- -- Me -- ++ ME MS Me ++ + -- ++ ++ ++ ++ -- ++ -- ++ -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ + = 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 + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210225_cn/b3.py b/campaign/war_archives_20210225_cn/b3.py new file mode 100644 index 000000000..3c65aca14 --- /dev/null +++ b/campaign/war_archives_20210225_cn/b3.py @@ -0,0 +1,79 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B3') +MAP.shape = 'I10' +MAP.camera_data = ['D4', 'D8', 'F4', 'F8'] +MAP.camera_data_spawn_point = ['D4', 'F4'] +MAP.map_data = """ + -- ++ ++ ++ ++ ++ ++ ++ -- + ++ -- -- -- -- -- -- -- ++ + ++ ME ++ SP -- SP ++ ME ++ + ME -- -- -- -- -- -- -- ME + -- Me MS -- __ -- MS Me -- + ME -- -- -- -- -- -- -- ME + ++ ME ++ -- MS -- ++ ME ++ + ++ -- Me -- -- -- Me -- ++ + -- ++ ++ ++ -- ++ ++ ++ -- + -- -- ++ -- MB -- ++ -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', '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 + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210225_cn/c1.py b/campaign/war_archives_20210225_cn/c1.py new file mode 100644 index 000000000..258de071f --- /dev/null +++ b/campaign/war_archives_20210225_cn/c1.py @@ -0,0 +1,88 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('C1') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + ++ ME -- -- -- -- -- -- -- + ME -- ME ++ ME -- Me ++ ++ + -- -- -- Me -- -- ME ++ ++ + -- MS -- ++ ++ -- -- ME -- + Me -- -- ME ++ MS __ -- MB + ++ -- -- -- -- -- -- ME -- + ++ SP -- SP ++ ++ ++ -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['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 + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 24), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 24, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210225_cn/c2.py b/campaign/war_archives_20210225_cn/c2.py new file mode 100644 index 000000000..bee2b6c94 --- /dev/null +++ b/campaign/war_archives_20210225_cn/c2.py @@ -0,0 +1,76 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C2') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + -- Me ++ ++ ++ MB ++ ++ ++ + ME -- ME ++ ME -- ME ++ -- + -- -- -- -- -- -- -- ME -- + MS ++ -- ++ Me __ -- -- Me + -- -- -- ++ -- -- -- ME -- + SP -- -- MS ME -- ME ++ ++ + -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config(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 + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20210225_cn/c3.py b/campaign/war_archives_20210225_cn/c3.py new file mode 100644 index 000000000..e2aa640f1 --- /dev/null +++ b/campaign/war_archives_20210225_cn/c3.py @@ -0,0 +1,79 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C3') +MAP.shape = 'I10' +MAP.camera_data = ['E3', 'E6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- ++ ++ ++ ++ ++ ++ ++ -- + ++ -- -- -- Me -- -- -- ++ + ++ -- ++ ME -- ME ++ -- ++ + -- -- ME -- MS -- ME -- -- + -- Me -- MS MB 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 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'CA', 'BB'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210225_cn/d1.py b/campaign/war_archives_20210225_cn/d1.py new file mode 100644 index 000000000..48cf30b98 --- /dev/null +++ b/campaign/war_archives_20210225_cn/d1.py @@ -0,0 +1,100 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +MAP = CampaignMap('D1') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D5', 'E2', 'E5'] +MAP.camera_data_spawn_point = ['D2', 'E2'] +MAP.map_data = """ + -- ++ ++ ++ MB ++ ++ ++ -- + -- ME ++ SP -- SP ++ -- -- + Me -- -- -- -- -- -- ME ++ + ++ ME ++ -- __ -- MS Me ++ + -- ME ++ MS -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config: + # ===== 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 + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 24), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 24, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'CL': 1.111, + 'CAred': 1.111, + 'BBred': 1.111, + 'CV': 1.111, + } + MAP_SWIPE_MULTIPLY = (1.193, 1.215) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.154, 1.175) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.120, 1.140) + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210225_cn/d2.py b/campaign/war_archives_20210225_cn/d2.py new file mode 100644 index 000000000..d18d04763 --- /dev/null +++ b/campaign/war_archives_20210225_cn/d2.py @@ -0,0 +1,90 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D2') +MAP.shape = 'K7' +MAP.camera_data = ['D2', 'D4', 'H2', 'H4'] +MAP.camera_data_spawn_point = ['H4'] +MAP.map_data = """ + -- -- -- -- -- -- -- ME ME -- ++ + ++ -- ME -- ++ ++ ME -- -- ME ++ + -- ME -- ME ++ ++ ++ -- MS ++ ++ + ++ ++ -- -- Me __ MS -- -- -- SP + -- ++ Me -- -- -- -- -- -- -- SP + MB -- -- -- Me -- ++ ME MS Me ++ + -- ++ ++ ++ ++ -- ++ -- ++ -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CAred', 'CV'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.084, 1.105) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.049, 1.068) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.018, 1.036) + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20210225_cn/d3.py b/campaign/war_archives_20210225_cn/d3.py new file mode 100644 index 000000000..5f7a3b8e9 --- /dev/null +++ b/campaign/war_archives_20210225_cn/d3.py @@ -0,0 +1,99 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.logger import logger +from module.map.map_base import CampaignMap +from module.map.map_grids import RoadGrids, SelectedGrids + +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D3') +MAP.shape = 'I10' +MAP.camera_data = ['D4', 'D8', 'F4', 'F8'] +MAP.camera_data_spawn_point = ['D4', 'F4'] +MAP.map_data = """ + -- ++ ++ ++ ++ ++ ++ ++ -- + ++ -- -- -- -- -- -- -- ++ + ++ ME ++ SP -- SP ++ ME ++ + ME -- -- -- -- -- -- -- ME + -- Me MS -- __ -- MS Me -- + ME -- -- -- -- -- -- -- ME + ++ ME ++ -- MS -- ++ ME ++ + ++ -- Me -- -- -- Me -- ++ + -- ++ ++ ++ -- ++ ++ ++ -- + -- -- ++ -- MB -- ++ -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CAred', 'BBred', 'CV'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.163, 1.185) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.125, 1.146) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.092, 1.112) + + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_siren(): + return True + + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_enemy(scale=(1,)): + return True + if self.clear_enemy(scale=(2,)): + return True + if self.clear_enemy(scale=(3,)): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 8e2faded3..8a29e2d2c 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3386,15 +3386,16 @@ "war_archives_20211014_cn", "war_archives_20211028_cn", "war_archives_20220210_cn", - "war_archives_20220414_cn" + "war_archives_20220414_cn", + "war_archives_20210225_cn" ], "option_bold": [ "war_archives_20210527_cn", "war_archives_20220414_cn" ], - "cn": "war_archives_20210527_cn", - "en": "war_archives_20210527_cn", - "jp": "war_archives_20210527_cn", + "cn": "war_archives_20210225_cn", + "en": "war_archives_20210225_cn", + "jp": "war_archives_20210225_cn", "tw": "war_archives_20220414_cn" }, "Mode": { diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 2351df429..ff1521e16 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -736,6 +736,7 @@ "war_archives_20200917_cn": "archives Dreamwakers Butterfly", "war_archives_20201029_cn": "archives Universe in Unison", "war_archives_20201229_cn": "archives Inverted Orthant", + "war_archives_20210225_cn": "archives Khorovod of Dawn's Rime", "war_archives_20210325_cn": "archives Ashen Simulacrum", "war_archives_20210527_cn": "archives Mirror Involution", "war_archives_20210624_cn": "archives Swirling Cherry Blossoms", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index f06f9abc6..cbbdbabe4 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -736,6 +736,7 @@ "war_archives_20200917_cn": "檔案 刹那觀る胡蝶の夢", "war_archives_20201029_cn": "檔案 激唱のユニバース", "war_archives_20201229_cn": "檔案 虚畳なりし限象", + "war_archives_20210225_cn": "檔案 暁射す氷華の嵐", "war_archives_20210325_cn": "檔案 開かれし紺碧の砂箱", "war_archives_20210527_cn": "檔案 照らす螺旋の鏡海", "war_archives_20210624_cn": "檔案 翳りし満ちる影の華", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 2f8190dad..dc057fbc9 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -736,6 +736,7 @@ "war_archives_20200917_cn": "档案 蝶海梦花", "war_archives_20201029_cn": "档案 激唱的UNIVERSE", "war_archives_20201229_cn": "档案 负象限作战", + "war_archives_20210225_cn": "档案 破晓冰华", "war_archives_20210325_cn": "档案 箱庭疗法", "war_archives_20210527_cn": "档案 镜位螺旋", "war_archives_20210624_cn": "档案 浮樱影华", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 41ec45be2..f2ae651fd 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -736,6 +736,7 @@ "war_archives_20200917_cn": "archives Dreamwakers Butterfly", "war_archives_20201029_cn": "archives Universe in Unison", "war_archives_20201229_cn": "archives Inverted Orthant", + "war_archives_20210225_cn": "archives Khorovod of Dawn's Rime", "war_archives_20210325_cn": "archives Ashen Simulacrum", "war_archives_20210527_cn": "archives Mirror Involution", "war_archives_20210624_cn": "檔案 浮櫻影華", diff --git a/module/war_archives/assets.py b/module/war_archives/assets.py index c83f49d94..52b5e16c7 100644 --- a/module/war_archives/assets.py +++ b/module/war_archives/assets.py @@ -18,6 +18,7 @@ TEMPLATE_GLORIOUS_BATTLE = Template(file={'cn': './assets/cn/war_archives/TEMPLA 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_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'}) TEMPLATE_MICROLAYER_MEDLEY = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png', 'en': './assets/en/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png', 'jp': './assets/cn/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png', 'tw': './assets/tw/war_archives/TEMPLATE_MICROLAYER_MEDLEY.png'}) TEMPLATE_MIRROR_INVOLUTION = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'en': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'jp': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'tw': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png'}) TEMPLATE_NORTHERN_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'en': './assets/en/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'jp': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'tw': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png'}) diff --git a/module/war_archives/dictionary.py b/module/war_archives/dictionary.py index 54c6ef876..0ecee5f89 100644 --- a/module/war_archives/dictionary.py +++ b/module/war_archives/dictionary.py @@ -26,4 +26,5 @@ dic_archives_template = { 'war_archives_20201229_cn': TEMPLATE_INVERTED_ORTHANT, 'war_archives_20200917_cn': TEMPLATE_DREAMWAKERS_BUTTERFLY, 'war_archives_20210527_cn': TEMPLATE_MIRROR_INVOLUTION, + 'war_archives_20210225_cn': TEMPLATE_KHOROVOD_OF_DAWNS_RIME, }