From 6b49b9218526be3de7b1d35c772811dee49ec744 Mon Sep 17 00:00:00 2001 From: sui-feng-cb Date: Thu, 17 Jul 2025 22:42:17 +0800 Subject: [PATCH] Add: war_archives_20220428_cn --- .../TEMPLATE_RONDO_AT_RAINBOWS_END.png | Bin 0 -> 6589 bytes campaign/Readme.md | 1 + campaign/war_archives_20220428_cn/a1.py | 98 +++++++++++++++ campaign/war_archives_20220428_cn/a2.py | 103 +++++++++++++++ campaign/war_archives_20220428_cn/a3.py | 112 +++++++++++++++++ campaign/war_archives_20220428_cn/b1.py | 114 +++++++++++++++++ campaign/war_archives_20220428_cn/b2.py | 94 ++++++++++++++ campaign/war_archives_20220428_cn/b3.py | 103 +++++++++++++++ campaign/war_archives_20220428_cn/c1.py | 99 +++++++++++++++ campaign/war_archives_20220428_cn/c2.py | 103 +++++++++++++++ campaign/war_archives_20220428_cn/c3.py | 113 +++++++++++++++++ .../war_archives_20220428_cn/campaign_base.py | 10 ++ campaign/war_archives_20220428_cn/d1.py | 114 +++++++++++++++++ campaign/war_archives_20220428_cn/d2.py | 117 ++++++++++++++++++ campaign/war_archives_20220428_cn/d3.py | 112 +++++++++++++++++ config/template.json | 2 +- module/config/argument/args.json | 11 +- 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 + 23 files changed, 1306 insertions(+), 6 deletions(-) create mode 100644 assets/cn/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png create mode 100644 campaign/war_archives_20220428_cn/a1.py create mode 100644 campaign/war_archives_20220428_cn/a2.py create mode 100644 campaign/war_archives_20220428_cn/a3.py create mode 100644 campaign/war_archives_20220428_cn/b1.py create mode 100644 campaign/war_archives_20220428_cn/b2.py create mode 100644 campaign/war_archives_20220428_cn/b3.py create mode 100644 campaign/war_archives_20220428_cn/c1.py create mode 100644 campaign/war_archives_20220428_cn/c2.py create mode 100644 campaign/war_archives_20220428_cn/c3.py create mode 100644 campaign/war_archives_20220428_cn/campaign_base.py create mode 100644 campaign/war_archives_20220428_cn/d1.py create mode 100644 campaign/war_archives_20220428_cn/d2.py create mode 100644 campaign/war_archives_20220428_cn/d3.py diff --git a/assets/cn/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png b/assets/cn/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2a4d2d4515bcbe5ebf66398c0ef76130f1deb5 GIT binary patch literal 6589 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 literal 0 HcmV?d00001 diff --git a/campaign/Readme.md b/campaign/Readme.md index afa64fdae..646bd6e11 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -53,6 +53,7 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20250320 | war archives 20220324 cn | Virtual Tower | 虚像构筑之塔 | Virtual Tower | 幻像の塔 | 虛像構築之塔 | | 20250417 | war archives 20220526 cn | Pledge of the Radiant Court | 泠誓光庭 | Pledge of the Radiant Court | 诚閃の剣 搖光の城 | 泠誓光庭 | | 20250619 | war archives 20220728 cn | Aquilifer's Ballade | 雄鹰的叙事歌 | Aquilifer's Ballade | 鋼鷲の冒険譚 | 雄鷹的敘事歌 | +| 20250717 | war archives 20220428 cn | Rondo at Rainbow's End | 虹彩的终幕曲 | Rondo at Rainbow's End | 吟ずる瑠璃の楽章 | 虹彩的終幕曲 | | 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_20220428_cn/a1.py b/campaign/war_archives_20220428_cn/a1.py new file mode 100644 index 000000000..9adef92ab --- /dev/null +++ b/campaign/war_archives_20220428_cn/a1.py @@ -0,0 +1,98 @@ +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('A1') +MAP.shape = 'H7' +MAP.camera_data = ['D2', 'D5', 'E2', 'E5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + -- ++ ++ ++ -- MB MB MB + ME -- -- MS -- Me -- ++ + -- ME ++ -- __ -- ME ++ + -- -- -- -- ME ME -- -- + ++ SP -- ME -- ++ -- -- + ++ SP -- -- Me -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 4, 'siren': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 2, 'boss': 1}, + {'battle': 4, 'enemy': 2}, +] +MAP.spawn_data_loop = [ + {'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, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Z2'] + 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 ===== + + MAP_HAS_DECOY_ENEMY = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (120, 255 - 49), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 49, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_CANNY_THRESHOLD = (50, 75) + HOMO_EDGE_COLOR_RANGE = (0, 49) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_SWIPE_MULTIPLY = (1.131, 1.152) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.094, 1.114) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.062, 1.081) + + +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_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20220428_cn/a2.py b/campaign/war_archives_20220428_cn/a2.py new file mode 100644 index 000000000..81573ea2f --- /dev/null +++ b/campaign/war_archives_20220428_cn/a2.py @@ -0,0 +1,103 @@ +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 .a1 import Config as ConfigBase + +MAP = CampaignMap('A2') +MAP.shape = 'H8' +MAP.camera_data = ['C2', 'C6', 'E2', 'E6'] +MAP.camera_data_spawn_point = ['C2'] +MAP.map_data = """ + ++ ME ME -- -- Me ++ ++ + Me -- -- -- MS -- -- ++ + SP -- ++ -- -- ME ME -- + SP -- ++ ME -- -- -- -- + -- -- -- ME Me ++ __ -- + -- -- Me -- -- MS -- MB + Me ++ MS -- ME -- -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['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 ===== + + MAP_HAS_DECOY_ENEMY = False + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY = (1.222, 1.245) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.182, 1.204) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.148, 1.168) + + +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_20220428_cn/a3.py b/campaign/war_archives_20220428_cn/a3.py new file mode 100644 index 000000000..1e9e237f3 --- /dev/null +++ b/campaign/war_archives_20220428_cn/a3.py @@ -0,0 +1,112 @@ +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 .a1 import Config as ConfigBase + +MAP = CampaignMap('A3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ ++ -- ME -- -- -- ++ ++ ++ + ++ ++ MS ME -- -- -- -- ME ME + ME -- -- __ -- MB MB -- -- -- + -- -- Me -- MS ++ ++ -- -- ME + ++ SP -- ++ ++ ++ ME -- Me -- + ++ SP -- Me -- Me -- -- -- -- + -- ME -- -- ME -- -- MS ++ ++ + ME -- ++ ME -- ME -- -- -- ++ +""" +MAP.map_data_loop = """ + ++ ++ -- ME -- -- -- ++ ++ ++ + ++ ++ MS ME -- Me -- -- ME ME + ME -- -- __ -- MB MB -- -- -- + -- -- Me -- MS ++ ++ -- -- ME + ++ SP -- ++ ++ ++ ME -- Me -- + ++ SP -- -- -- Me -- -- -- -- + -- ME -- -- ME -- -- 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}, + {'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 ===== + + MAP_HAS_DECOY_ENEMY = False + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + MAP_SWIPE_MULTIPLY = (0.984, 1.003) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.952, 0.969) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.924, 0.941) + + +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_20220428_cn/b1.py b/campaign/war_archives_20220428_cn/b1.py new file mode 100644 index 000000000..fb00241ae --- /dev/null +++ b/campaign/war_archives_20220428_cn/b1.py @@ -0,0 +1,114 @@ +from ..campaign_war_archives.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('B1') +MAP.shape = 'H8' +MAP.camera_data = ['D2', 'D6', 'E2', 'E6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + ++ ++ ++ ME ME Me -- ++ + MB MB ++ -- -- ME -- ++ + -- -- -- -- MS -- MS ++ + -- -- Me -- -- -- -- ME + ME __ -- Me -- ++ -- -- + Me MS ME -- MS -- -- ME + ++ ++ -- -- ++ ME -- -- + ++ ++ ME -- ME -- SP SP +""" +MAP.map_data_loop = """ + ++ ++ ++ ME -- Me -- ++ + MB MB ++ -- -- ME -- ++ + -- -- -- -- MS -- MS ++ + ME -- Me -- ME -- -- ME + -- __ -- Me -- ++ -- -- + Me MS ME -- MS -- -- ME + ++ ++ -- -- ++ ME -- -- + ++ ++ ME -- ME -- SP SP +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 4, 'siren': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 4}, + {'battle': 3, 'enemy': 2}, + {'battle': 4, 'enemy': 4, 'boss': 1}, + {'battle': 5, 'enemy': 2}, +] +MAP.spawn_data_loop = [ + {'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, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Z2', 'Leipzig'] + 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 ===== + + MAP_HAS_DECOY_ENEMY = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (120, 255 - 49), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 49, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_CANNY_THRESHOLD = (50, 75) + HOMO_EDGE_COLOR_RANGE = (0, 49) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom-right' + MAP_SWIPE_MULTIPLY = (0.985, 1.004) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.953, 0.971) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.925, 0.942) + + +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_20220428_cn/b2.py b/campaign/war_archives_20220428_cn/b2.py new file mode 100644 index 000000000..35bcfb601 --- /dev/null +++ b/campaign/war_archives_20220428_cn/b2.py @@ -0,0 +1,94 @@ +from ..campaign_war_archives.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 .b1 import Config as ConfigBase + +MAP = CampaignMap('B2') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ME -- ME -- ME ++ -- SP SP + ME -- ME -- -- ++ ME -- -- + ++ ME -- Me -- ++ Me -- ME + ++ ++ ++ MS -- MS -- -- -- + -- -- __ -- -- -- -- ME -- + -- Me -- MS ME MS Me ++ ++ + MB -- -- ++ ME -- -- ++ ++ +""" +MAP.map_data_loop = """ + ME -- ME -- ME ++ -- SP SP + ME -- ME -- -- ++ ME -- -- + ++ ME -- Me -- ++ Me -- ME + ++ ++ ++ MS -- MS -- -- -- + -- -- __ -- -- -- -- ME -- + MB Me -- MS ME MS 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CAlightning', 'SS'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'CAlightning': 1.111, + 'BBlightning': 1.111, + 'SS': 1.111, + } + MAP_HAS_DECOY_ENEMY = False + MAP_WALK_USE_CURRENT_FLEET = True + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom-right' + MAP_SWIPE_MULTIPLY = (1.115, 1.136) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.078, 1.098) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.047, 1.066) + + +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_20220428_cn/b3.py b/campaign/war_archives_20220428_cn/b3.py new file mode 100644 index 000000000..5b2d288b6 --- /dev/null +++ b/campaign/war_archives_20220428_cn/b3.py @@ -0,0 +1,103 @@ +from ..campaign_war_archives.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 .b1 import Config as ConfigBase + +MAP = CampaignMap('B3') +MAP.shape = 'I9' +MAP.camera_data = ['D4', 'D7', 'F4', 'F7'] +MAP.camera_data_spawn_point = ['F7', 'D7'] +MAP.map_data = """ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + ME -- ++ ++ MB ++ ++ -- ME + -- Me MS ++ -- ++ MS Me -- + ME -- __ -- MS -- __ -- ME + -- ++ ++ Me ++ Me ++ ++ -- + -- -- ME -- ++ -- ME -- -- + -- -- -- -- -- -- -- -- -- + ME -- ME SP -- SP ME -- ME +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Compiler'] + 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 ===== + + MAP_HAS_DECOY_ENEMY = False + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (120, 255 - 13), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 13, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + INTERNAL_LINES_HOUGHLINES_THRESHOLD = 35 + EDGE_LINES_HOUGHLINES_THRESHOLD = 35 + HOMO_CANNY_THRESHOLD = (50, 100) + HOMO_EDGE_COLOR_RANGE = (0, 13) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_WALK_USE_CURRENT_FLEET = True + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY = (0.983, 1.001) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.951, 0.968) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.923, 0.939) + + +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_20220428_cn/c1.py b/campaign/war_archives_20220428_cn/c1.py new file mode 100644 index 000000000..4d464dadc --- /dev/null +++ b/campaign/war_archives_20220428_cn/c1.py @@ -0,0 +1,99 @@ +from ..campaign_war_archives.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('C1') +MAP.shape = 'H7' +MAP.camera_data = ['D2', 'D5', 'E2', 'E5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + -- ++ ++ ++ -- MB MB MB + ME -- -- MS -- Me -- ++ + -- ME ++ -- __ -- ME ++ + -- -- -- -- ME ME -- -- + ++ SP -- ME -- ++ -- -- + ++ SP -- -- Me -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 4, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 4}, + {'battle': 3, 'enemy': 2}, + {'battle': 4, 'enemy': 2, 'boss': 1}, +] +MAP.spawn_data_loop = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Z2', 'Leipzig'] + 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 ===== + + MAP_HAS_DECOY_ENEMY = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + HOMO_CANNY_THRESHOLD = (50, 75) + HOMO_EDGE_COLOR_RANGE = (0, 33) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_SWIPE_MULTIPLY = (1.131, 1.152) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.094, 1.114) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.062, 1.081) + + +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_20220428_cn/c2.py b/campaign/war_archives_20220428_cn/c2.py new file mode 100644 index 000000000..33183e659 --- /dev/null +++ b/campaign/war_archives_20220428_cn/c2.py @@ -0,0 +1,103 @@ +from ..campaign_war_archives.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 .c1 import Config as ConfigBase + +MAP = CampaignMap('C2') +MAP.shape = 'H8' +MAP.camera_data = ['C2', 'C6', 'E2', 'E6'] +MAP.camera_data_spawn_point = ['C2'] +MAP.map_data = """ + ++ ME ME -- -- Me ++ ++ + Me -- -- -- MS -- -- ++ + SP -- ++ -- -- ME ME -- + SP -- ++ ME -- -- -- -- + -- -- -- ME Me ++ __ -- + -- -- Me -- -- MS -- MB + Me ++ MS -- ME -- -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['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 ===== + + MAP_HAS_DECOY_ENEMY = False + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 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 + } + HOMO_EDGE_COLOR_RANGE = (0, 24) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY = (1.222, 1.245) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.182, 1.204) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.148, 1.168) + + +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_20220428_cn/c3.py b/campaign/war_archives_20220428_cn/c3.py new file mode 100644 index 000000000..ebc40e4eb --- /dev/null +++ b/campaign/war_archives_20220428_cn/c3.py @@ -0,0 +1,113 @@ +from ..campaign_war_archives.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 .c1 import Config as ConfigBase + +MAP = CampaignMap('C3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D6', 'G2', 'G6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ ++ -- ME -- -- -- ++ ++ ++ + ++ ++ MS ME -- -- -- -- ME ME + ME -- -- __ -- MB MB -- -- -- + -- -- Me -- MS ++ ++ -- -- ME + ++ SP -- ++ ++ ++ ME -- Me -- + ++ SP -- Me -- Me -- -- -- -- + -- ME -- -- ME -- -- MS ++ ++ + ME -- ++ ME -- ME -- -- -- ++ +""" +MAP.map_data_loop = """ + ++ ++ -- ME -- -- -- ++ ++ ++ + ++ ++ MS ME -- Me -- -- ME ME + ME -- -- __ -- MB MB -- -- -- + -- -- Me -- MS ++ ++ -- -- ME + ++ SP -- ++ ++ ++ ME -- Me -- + ++ SP -- -- -- Me -- -- -- -- + -- ME -- -- ME -- -- 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}, + {'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', '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 + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_HAS_DECOY_ENEMY = False + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 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 + } + HOMO_EDGE_COLOR_RANGE = (0, 24) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + MAP_SWIPE_MULTIPLY = (0.984, 1.003) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.952, 0.969) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.924, 0.941) + + +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_20220428_cn/campaign_base.py b/campaign/war_archives_20220428_cn/campaign_base.py new file mode 100644 index 000000000..ac57105c1 --- /dev/null +++ b/campaign/war_archives_20220428_cn/campaign_base.py @@ -0,0 +1,10 @@ +from ..campaign_war_archives.campaign_base import CampaignBase as CampaignBase_ +from module.ui.page import page_event + + +class CampaignBase(CampaignBase_): + def handle_exp_info(self): + # Random background of chapter A hits EXP_INFO_B + if self.ui_page_appear(page_event): + return False + return super().handle_exp_info() diff --git a/campaign/war_archives_20220428_cn/d1.py b/campaign/war_archives_20220428_cn/d1.py new file mode 100644 index 000000000..6f0b11ae8 --- /dev/null +++ b/campaign/war_archives_20220428_cn/d1.py @@ -0,0 +1,114 @@ +from ..campaign_war_archives.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('D1') +MAP.shape = 'H8' +MAP.camera_data = ['D2', 'D6', 'E2', 'E6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + ++ ++ ++ ME ME Me -- ++ + MB MB ++ -- -- ME -- ++ + -- -- -- -- MS -- MS ++ + -- -- Me -- -- -- -- ME + ME __ -- Me -- ++ -- -- + Me MS ME -- MS -- -- ME + ++ ++ -- -- ++ ME -- -- + ++ ++ ME -- ME -- SP SP +""" +MAP.map_data_loop = """ + ++ ++ ++ ME -- Me -- ++ + MB MB ++ -- -- ME -- ++ + -- -- -- -- MS -- MS ++ + ME -- Me -- ME -- -- ME + -- __ -- Me -- ++ -- -- + Me MS ME -- MS -- -- ME + ++ ++ -- -- ++ ME -- -- + ++ ++ ME -- ME -- SP SP +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 4, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 4}, + {'battle': 3, 'enemy': 2}, + {'battle': 4, 'enemy': 4}, + {'battle': 5, 'enemy': 2, 'boss': 1}, +] +MAP.spawn_data_loop = [ + {'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, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Z2', 'Leipzig', 'PrinzEugen'] + 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 ===== + + MAP_HAS_DECOY_ENEMY = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (120, 255 - 33), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_CANNY_THRESHOLD = (50, 75) + HOMO_EDGE_COLOR_RANGE = (0, 33) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom-right' + MAP_SWIPE_MULTIPLY = (0.985, 1.004) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.953, 0.971) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.925, 0.942) + + +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_20220428_cn/d2.py b/campaign/war_archives_20220428_cn/d2.py new file mode 100644 index 000000000..6a6fe768f --- /dev/null +++ b/campaign/war_archives_20220428_cn/d2.py @@ -0,0 +1,117 @@ +from ..campaign_war_archives.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 .d1 import Config as ConfigBase + +MAP = CampaignMap('D2') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ME -- ME -- ME ++ -- SP SP + ME -- ME -- -- ++ ME -- -- + ++ ME -- Me -- ++ Me -- ME + ++ ++ ++ MS -- MS -- -- -- + -- -- __ -- -- -- -- ME -- + -- Me -- MS ME MS Me ++ ++ + MB -- -- ++ ME -- -- ++ ++ +""" +MAP.map_data_loop = """ + ME -- ME -- ME ++ -- SP SP + ME -- ME -- -- ++ ME -- -- + ++ ME -- Me -- ++ Me -- ME + ++ ++ ++ MS -- MS -- -- -- + -- -- __ -- -- -- -- ME -- + MB Me -- MS ME MS 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 +""" +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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['SS', 'CAlightning', 'BBlightning'] + 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 ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (120, 255 - 17), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'CAlightning': 1.111, + 'BBlightning': 1.111, + 'SS': 1.111, + } + MAP_HAS_DECOY_ENEMY = False + MAP_WALK_USE_CURRENT_FLEET = True + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom-right' + MAP_SWIPE_MULTIPLY = (1.115, 1.136) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.078, 1.098) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.047, 1.066) + + +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): + 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_20220428_cn/d3.py b/campaign/war_archives_20220428_cn/d3.py new file mode 100644 index 000000000..9f62ea7fd --- /dev/null +++ b/campaign/war_archives_20220428_cn/d3.py @@ -0,0 +1,112 @@ +from ..campaign_war_archives.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 .d1 import Config as ConfigBase + +MAP = CampaignMap('D3') +MAP.shape = 'I9' +MAP.camera_data = ['D4', 'D7', 'F4', 'F7'] +MAP.camera_data_spawn_point = ['F7', 'D7'] +MAP.map_data = """ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + ++ ++ ++ ++ ++ ++ ++ ++ ++ + ME -- ++ ++ MB ++ ++ -- ME + -- Me MS ++ -- ++ MS Me -- + ME -- __ -- MS -- __ -- ME + -- ++ ++ Me ++ Me ++ ++ -- + -- -- ME -- ++ -- ME -- -- + -- -- -- -- -- -- -- -- -- + ME -- ME SP -- SP ME -- ME +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Compiler'] + 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 ===== + + MAP_HAS_DECOY_ENEMY = False + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (120, 255 - 13), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 13, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + INTERNAL_LINES_HOUGHLINES_THRESHOLD = 35 + EDGE_LINES_HOUGHLINES_THRESHOLD = 35 + HOMO_CANNY_THRESHOLD = (50, 100) + HOMO_EDGE_COLOR_RANGE = (0, 13) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_WALK_USE_CURRENT_FLEET = True + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY = (0.983, 1.001) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.951, 0.968) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.923, 0.939) + + +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): + 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/config/template.json b/config/template.json index 06d876665..2695ea427 100644 --- a/config/template.json +++ b/config/template.json @@ -670,7 +670,7 @@ }, "Campaign": { "Name": "D3", - "Event": "war_archives_20220728_cn", + "Event": "war_archives_20220428_cn", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 13f14fb1f..1257c0282 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3653,16 +3653,17 @@ "war_archives_20220224_cn", "war_archives_20220324_cn", "war_archives_20220414_cn", + "war_archives_20220428_cn", "war_archives_20220526_cn", "war_archives_20220728_cn" ], "option_bold": [ - "war_archives_20220728_cn" + "war_archives_20220428_cn" ], - "cn": "war_archives_20220728_cn", - "en": "war_archives_20220728_cn", - "jp": "war_archives_20220728_cn", - "tw": "war_archives_20220728_cn" + "cn": "war_archives_20220428_cn", + "en": "war_archives_20220428_cn", + "jp": "war_archives_20220428_cn", + "tw": "war_archives_20220428_cn" }, "Mode": { "type": "select", diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 5d1313cd8..ab29ab9b4 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -804,6 +804,7 @@ "war_archives_20220224_cn": "archives Abyssal Refrain", "war_archives_20220324_cn": "archives Virtual Tower", "war_archives_20220414_cn": "archives Aurora Noctis", + "war_archives_20220428_cn": "archives Rondo at Rainbows End", "war_archives_20220526_cn": "archives Pledge of the Radiant Court", "war_archives_20220728_cn": "archives Aquilifers Ballade" }, diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 885a377a7..3642eb8c9 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -804,6 +804,7 @@ "war_archives_20220224_cn": "檔案 鳴動せし星霜の淵", "war_archives_20220324_cn": "檔案 幻像の塔", "war_archives_20220414_cn": "檔案 極夜照らす幻光", + "war_archives_20220428_cn": "檔案 吟ずる瑠璃の楽章", "war_archives_20220526_cn": "檔案 诚閃の剣 搖光の城", "war_archives_20220728_cn": "檔案 鋼鷲の冒険譚" }, diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 126492abd..481379a2a 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -804,6 +804,7 @@ "war_archives_20220224_cn": "档案 深度回音", "war_archives_20220324_cn": "档案 虚像构筑之塔", "war_archives_20220414_cn": "档案 永夜幻光", + "war_archives_20220428_cn": "档案 虹彩的终幕曲", "war_archives_20220526_cn": "档案 泠誓光庭", "war_archives_20220728_cn": "档案 雄鹰的叙事歌" }, diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 743fd1741..30cfa4466 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -804,6 +804,7 @@ "war_archives_20220224_cn": "檔案 深度回音", "war_archives_20220324_cn": "檔案 虛像構築之塔", "war_archives_20220414_cn": "檔案 永夜幻光", + "war_archives_20220428_cn": "檔案 虹彩的終幕曲", "war_archives_20220526_cn": "檔案 泠誓光庭", "war_archives_20220728_cn": "檔案 雄鷹的敘事歌" }, diff --git a/module/war_archives/assets.py b/module/war_archives/assets.py index 7d31f3f11..f27864414 100644 --- a/module/war_archives/assets.py +++ b/module/war_archives/assets.py @@ -29,6 +29,7 @@ TEMPLATE_MOONLIT_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPL TEMPLATE_NORTHERN_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'en': './assets/en/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'jp': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'tw': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png'}) TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png', 'en': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png', 'jp': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png', 'tw': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png'}) TEMPLATE_PRELUDE_UNDER_THE_MOON = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png', 'en': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png', 'jp': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png', 'tw': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png'}) +TEMPLATE_RONDO_AT_RAINBOWS_END = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png', 'en': './assets/cn/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png', 'jp': './assets/cn/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png', 'tw': './assets/cn/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png'}) TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png', 'en': './assets/en/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png', 'jp': './assets/cn/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png', 'tw': './assets/cn/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png'}) TEMPLATE_SKYBOUND_ORATORIO = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png', 'en': './assets/en/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png', 'jp': './assets/cn/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png', 'tw': './assets/cn/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png'}) TEMPLATE_STARS_OF_THE_SHIMMERING_FJORD = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_STARS_OF_THE_SHIMMERING_FJORD.png', 'en': './assets/en/war_archives/TEMPLATE_STARS_OF_THE_SHIMMERING_FJORD.png', 'jp': './assets/cn/war_archives/TEMPLATE_STARS_OF_THE_SHIMMERING_FJORD.png', 'tw': './assets/tw/war_archives/TEMPLATE_STARS_OF_THE_SHIMMERING_FJORD.png'}) diff --git a/module/war_archives/dictionary.py b/module/war_archives/dictionary.py index d9481a689..dd68d59f1 100644 --- a/module/war_archives/dictionary.py +++ b/module/war_archives/dictionary.py @@ -40,4 +40,5 @@ dic_archives_template = { 'war_archives_20220324_cn': TEMPLATE_VIRTUAL_TOWER, 'war_archives_20220526_cn': TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT, 'war_archives_20220728_cn': TEMPLATE_AQUILIFERS_BALLADE, + 'war_archives_20220428_cn': TEMPLATE_RONDO_AT_RAINBOWS_END, }