diff --git a/assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png b/assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png new file mode 100644 index 000000000..3d92cb507 Binary files /dev/null and b/assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png differ diff --git a/campaign/Readme.md b/campaign/Readme.md index cfcc88fda..afa64fdae 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -52,6 +52,7 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20250109 | war archives 20220224 cn | Abyssal Refrain | 深度回音 | Abyssal Refrain | 鳴動せし星霜の淵 | 深度回音 | | 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 | 鋼鷲の冒険譚 | 雄鷹的敘事歌 | | 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_20220728_cn/a1.py b/campaign/war_archives_20220728_cn/a1.py new file mode 100644 index 000000000..66793f16a --- /dev/null +++ b/campaign/war_archives_20220728_cn/a1.py @@ -0,0 +1,107 @@ +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('A1') +MAP.shape = 'H8' +MAP.camera_data = ['D3', 'D6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ -- -- -- -- ME -- -- + ++ -- ++ ++ Me -- ME -- + -- ME ++ ++ -- -- -- ++ + ME -- -- MB -- Me -- ME + -- -- MS -- -- MS -- -- + ME ++ ++ __ __ ++ ++ -- + -- -- Me -- -- Me -- -- + -- ME -- SP SP -- ME -- +""" +MAP.map_data_loop = """ + ++ -- -- -- -- ME -- -- + ++ -- ++ ++ Me -- ME -- + -- ME ++ ++ -- -- -- ++ + ME -- -- MB -- Me -- ME + -- -- MS -- -- MS -- -- + ME ++ -- __ __ ++ ++ ++ + -- -- Me -- -- 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 +""" +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, \ +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 = ['DD', 'Juno_ghost'] + 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) + 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, + } + MAP_ENEMY_TEMPLATE = ['Light', 'Main', 'Carrier', 'Treasure', 'Vestal_ghost'] + + +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_20220728_cn/a2.py b/campaign/war_archives_20220728_cn/a2.py new file mode 100644 index 000000000..58e121e30 --- /dev/null +++ b/campaign/war_archives_20220728_cn/a2.py @@ -0,0 +1,85 @@ +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 .a1 import Config as ConfigBase + +MAP = CampaignMap('A2') +MAP.shape = 'L7' +MAP.camera_data = ['D3', 'F5', 'H5'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- SP -- ++ ++ ++ Me -- -- -- -- -- + SP -- -- -- -- MS -- ++ ++ -- ++ ++ + -- -- Me MS -- -- -- ++ ++ ME ++ ++ + Me -- -- -- ++ ++ -- -- ME -- -- MB + -- ++ ++ Me ++ ++ Me -- __ -- ME -- + -- ++ ++ -- -- ME -- -- -- -- ME ++ + -- -- ME -- -- -- -- ME ++ ME -- -- +""" +MAP.map_data_loop = """ + -- SP -- ++ ++ ++ Me -- -- -- -- -- + SP -- -- -- -- MS -- -- ++ -- ++ ++ + -- -- Me MS -- -- -- -- ++ ME -- ++ + Me -- -- -- ++ ++ ++ -- ME -- -- MB + -- ++ ++ Me -- -- Me -- __ -- ME -- + -- ++ ++ -- -- ME -- -- -- -- ME ++ + -- -- ME -- -- -- -- ME ++ ME -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 +""" +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, K1, L1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, L4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, L5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, L6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, L7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'Juno_ghost'] + 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_SWIPE_MULTIPLY = (1.226, 1.249) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.186, 1.208) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.151, 1.172) + + +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_20220728_cn/a3.py b/campaign/war_archives_20220728_cn/a3.py new file mode 100644 index 000000000..096c7f286 --- /dev/null +++ b/campaign/war_archives_20220728_cn/a3.py @@ -0,0 +1,89 @@ +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 .a1 import Config as ConfigBase + +MAP = CampaignMap('A3') +MAP.shape = 'I8' +MAP.camera_data = ['D3', 'E6'] +MAP.camera_data_spawn_point = ['E2'] +MAP.map_data = """ + -- -- -- -- SP SP -- -- -- + -- ME ++ ++ -- -- ++ ++ -- + ME -- -- MS -- ME ++ ++ -- + -- ++ ++ Me -- MS ME Me -- + -- ++ ++ -- __ -- -- -- ME + -- -- Me -- ME Me ME ME -- + -- ++ ++ -- -- -- ME -- -- + -- -- ++ -- MB -- ++ ++ ++ +""" +MAP.map_data_loop = """ + -- -- -- -- SP SP -- -- -- + -- ME ++ -- -- -- ++ ++ -- + ME -- -- MS -- ME ++ ++ -- + -- -- ++ Me -- MS ME Me -- + -- -- ++ -- __ -- -- -- ME + -- -- Me -- ME Me 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 +""" +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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CA', 'Neptune_ghost'] + 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_SWIPE_MULTIPLY = (1.226, 1.249) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.186, 1.208) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.151, 1.172) + + +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_20220728_cn/b1.py b/campaign/war_archives_20220728_cn/b1.py new file mode 100644 index 000000000..55ccb0371 --- /dev/null +++ b/campaign/war_archives_20220728_cn/b1.py @@ -0,0 +1,101 @@ +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 = 'J8' +MAP.camera_data = ['E2', 'E6', 'G4'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- -- ME -- -- Me -- -- ++ ++ + -- -- ++ MS -- -- Me -- MB ++ + SP -- -- -- MS ++ ++ -- -- ME + SP -- -- -- MS ++ ++ ME -- -- + -- -- ++ MS __ 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, 'boss': 1}, + {'battle': 5, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Neptune_ghost', 'LeMars_ghost'] + 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) + 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, + } + MAP_ENEMY_TEMPLATE = ['Light', 'Main', 'Carrier', 'Treasure', 'Vestal_ghost'] + MAP_SWIPE_MULTIPLY = (1.141, 1.163) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.104, 1.124) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.071, 1.091) + + +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_20220728_cn/b2.py b/campaign/war_archives_20220728_cn/b2.py new file mode 100644 index 000000000..a4e19d9fc --- /dev/null +++ b/campaign/war_archives_20220728_cn/b2.py @@ -0,0 +1,80 @@ +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 = 'I8' +MAP.camera_data = ['D2', 'D3', 'E3', 'E6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- ME -- -- -- ME -- ME -- + ++ -- -- ME -- -- ++ -- ME + ++ ME Me ++ Me -- -- -- Me + -- -- -- ME -- -- -- MS -- + MB -- __ -- -- MS -- -- ++ + -- -- -- Me -- ++ Me -- -- + ++ ++ ME -- MS -- -- -- SP + ++ ++ -- ME -- ME -- SP -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Neptune_ghost', 'LeMars_ghost'] + 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_SWIPE_MULTIPLY = (1.038, 1.058) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.004, 1.023) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.975, 0.993) + + +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_20220728_cn/b3.py b/campaign/war_archives_20220728_cn/b3.py new file mode 100644 index 000000000..c3898eb36 --- /dev/null +++ b/campaign/war_archives_20220728_cn/b3.py @@ -0,0 +1,83 @@ +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 = ['D3', 'D5', 'F3', 'F5'] +MAP.camera_data_spawn_point = ['E7'] +MAP.map_data = """ + -- ++ ++ ++ -- ++ ++ ++ -- + -- ME -- -- ME -- -- ME -- + ME -- -- ME -- ME -- -- ME + ++ -- Me ++ -- ++ Me -- ++ + ME -- -- -- MB -- -- -- ME + -- -- Me ++ MS ++ Me -- -- + ME -- MS -- __ -- MS -- ME + ++ ++ -- -- -- -- -- ++ ++ + ++ ++ -- SP -- SP -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['LeMars_ghost', 'Hermes_ghost'] + 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_SWIPE_MULTIPLY = (0.994, 1.013) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.961, 0.979) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.933, 0.950) + + +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_20220728_cn/c1.py b/campaign/war_archives_20220728_cn/c1.py new file mode 100644 index 000000000..989033416 --- /dev/null +++ b/campaign/war_archives_20220728_cn/c1.py @@ -0,0 +1,107 @@ +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 = 'H8' +MAP.camera_data = ['D3', 'D6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ -- -- -- -- ME -- -- + ++ -- ++ ++ Me -- ME -- + -- ME ++ ++ -- -- -- ++ + ME -- -- MB -- Me -- ME + -- -- MS -- -- MS -- -- + ME ++ ++ __ __ ++ ++ -- + -- -- Me -- -- Me -- -- + -- ME -- SP SP -- ME -- +""" +MAP.map_data_loop = """ + ++ -- -- -- -- ME -- -- + ++ -- ++ ++ Me -- ME -- + -- ME ++ ++ -- -- -- ++ + ME -- -- MB -- Me -- ME + -- -- MS -- -- MS -- -- + ME ++ -- __ __ ++ ++ ++ + -- -- Me -- -- 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 +""" +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: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'CA', 'Juno_ghost', 'Neptune_ghost'] + 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) + 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, + } + MAP_ENEMY_TEMPLATE = ['Light', 'Main', 'Carrier', 'Treasure', 'Vestal_ghost'] + + +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_20220728_cn/c2.py b/campaign/war_archives_20220728_cn/c2.py new file mode 100644 index 000000000..d4d96232c --- /dev/null +++ b/campaign/war_archives_20220728_cn/c2.py @@ -0,0 +1,86 @@ +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 = 'L7' +MAP.camera_data = ['D3', 'F5', 'H5'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- SP -- ++ ++ ++ Me -- -- -- -- -- + SP -- -- -- -- MS -- ++ ++ -- ++ ++ + -- -- Me MS -- -- -- ++ ++ ME ++ ++ + Me -- -- -- ++ ++ -- -- ME -- -- MB + -- ++ ++ Me ++ ++ Me -- __ -- ME -- + -- ++ ++ -- -- ME -- -- -- -- ME ++ + -- -- ME -- -- -- -- ME ++ ME -- -- +""" +MAP.map_data_loop = """ + -- SP -- ++ ++ ++ Me -- -- -- -- -- + SP -- -- -- -- MS -- -- ++ -- ++ ++ + -- -- Me MS -- -- -- -- ++ ME -- ++ + Me -- -- -- ++ ++ ++ -- ME -- -- MB + -- ++ ++ Me -- -- Me -- __ -- ME -- + -- ++ ++ -- -- ME -- -- -- -- ME ++ + -- -- ME -- -- -- -- ME ++ ME -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, L4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, L5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, L6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, L7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CA', 'BB', 'Juno_ghost', 'Neptune_ghost'] + 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_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.226, 1.249) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.186, 1.208) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.151, 1.172) + + +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_20220728_cn/c3.py b/campaign/war_archives_20220728_cn/c3.py new file mode 100644 index 000000000..3e1ea62e6 --- /dev/null +++ b/campaign/war_archives_20220728_cn/c3.py @@ -0,0 +1,91 @@ +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 = 'I8' +MAP.camera_data = ['D3', 'E6'] +MAP.camera_data_spawn_point = ['E2'] +MAP.map_data = """ + -- -- -- -- SP SP -- -- -- + -- ME ++ ++ -- -- ++ ++ -- + ME -- -- MS -- ME ++ ++ -- + -- ++ ++ Me -- MS ME Me -- + -- ++ ++ -- __ -- -- -- ME + -- -- Me -- ME Me ME ME -- + -- ++ ++ -- -- -- ME -- -- + -- -- ++ -- MB -- ++ ++ ++ +""" +MAP.map_data_loop = """ + -- -- -- -- SP SP -- -- -- + -- ME ++ -- -- -- ++ ++ -- + ME -- -- MS -- ME ++ ++ -- + -- -- ++ Me -- MS ME Me -- + -- -- ++ -- __ -- -- -- ME + -- -- Me -- ME Me 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 +""" +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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CA', 'BB', 'Juno_ghost', 'Neptune_ghost'] + 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_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.226, 1.249) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.186, 1.208) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.151, 1.172) + + +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_20220728_cn/d1.py b/campaign/war_archives_20220728_cn/d1.py new file mode 100644 index 000000000..83ae36421 --- /dev/null +++ b/campaign/war_archives_20220728_cn/d1.py @@ -0,0 +1,101 @@ +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 = 'J8' +MAP.camera_data = ['E2', 'E6', 'G4'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- -- ME -- -- Me -- -- ++ ++ + -- -- ++ MS -- -- Me -- MB ++ + SP -- -- -- MS ++ ++ -- -- ME + SP -- -- -- MS ++ ++ ME -- -- + -- -- ++ MS __ 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}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Neptune_ghost', 'LeMars_ghost'] + 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) + 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, + } + MAP_ENEMY_TEMPLATE = ['Light', 'Main', 'Carrier', 'Treasure', 'Vestal_ghost'] + MAP_SWIPE_MULTIPLY = (1.141, 1.163) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.104, 1.124) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.071, 1.091) + + +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_20220728_cn/d2.py b/campaign/war_archives_20220728_cn/d2.py new file mode 100644 index 000000000..b8064bfa0 --- /dev/null +++ b/campaign/war_archives_20220728_cn/d2.py @@ -0,0 +1,89 @@ +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 = 'I8' +MAP.camera_data = ['D2', 'D3', 'E3', 'E6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- ME -- -- -- ME -- ME -- + ++ -- -- ME -- -- ++ -- ME + ++ ME Me ++ Me -- -- -- Me + -- -- -- ME -- -- -- MS -- + MB -- __ -- -- MS -- -- ++ + -- -- -- Me -- ++ Me -- -- + ++ ++ ME -- MS -- -- -- SP + ++ ++ -- ME -- ME -- SP -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['LeMars_ghost', 'Hermes_ghost'] + 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_SWIPE_MULTIPLY = (1.038, 1.058) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.004, 1.023) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.975, 0.993) + + +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_20220728_cn/d3.py b/campaign/war_archives_20220728_cn/d3.py new file mode 100644 index 000000000..f326a67c7 --- /dev/null +++ b/campaign/war_archives_20220728_cn/d3.py @@ -0,0 +1,92 @@ +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 = ['D3', 'D5', 'F3', 'F5'] +MAP.camera_data_spawn_point = ['E7'] +MAP.map_data = """ + -- ++ ++ ++ -- ++ ++ ++ -- + -- ME -- -- ME -- -- ME -- + ME -- -- ME -- ME -- -- ME + ++ -- Me ++ -- ++ Me -- ++ + ME -- -- -- MB -- -- -- ME + -- -- Me ++ MS ++ Me -- -- + ME -- MS -- __ -- MS -- ME + ++ ++ -- -- -- -- -- ++ ++ + ++ ++ -- SP -- SP -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['LeMars_ghost', 'Hermes_ghost'] + 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_SWIPE_MULTIPLY = (0.994, 1.013) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.961, 0.979) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.933, 0.950) + + +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/config/template.json b/config/template.json index 92fd681c9..7d056997e 100644 --- a/config/template.json +++ b/config/template.json @@ -670,7 +670,7 @@ }, "Campaign": { "Name": "D3", - "Event": "war_archives_20220526_cn", + "Event": "war_archives_20220728_cn", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, diff --git a/module/config/argument/args.json b/module/config/argument/args.json index e7c17b993..24d486454 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3653,15 +3653,16 @@ "war_archives_20220224_cn", "war_archives_20220324_cn", "war_archives_20220414_cn", - "war_archives_20220526_cn" + "war_archives_20220526_cn", + "war_archives_20220728_cn" ], "option_bold": [ - "war_archives_20220526_cn" + "war_archives_20220728_cn" ], - "cn": "war_archives_20220526_cn", - "en": "war_archives_20220526_cn", - "jp": "war_archives_20220526_cn", - "tw": "war_archives_20220526_cn" + "cn": "war_archives_20220728_cn", + "en": "war_archives_20220728_cn", + "jp": "war_archives_20220728_cn", + "tw": "war_archives_20220728_cn" }, "Mode": { "type": "select", diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 7716a8ef5..18617fab6 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -800,7 +800,8 @@ "war_archives_20220224_cn": "archives Abyssal Refrain", "war_archives_20220324_cn": "archives Virtual Tower", "war_archives_20220414_cn": "archives Aurora Noctis", - "war_archives_20220526_cn": "archives Pledge of the Radiant Court" + "war_archives_20220526_cn": "archives Pledge of the Radiant Court", + "war_archives_20220728_cn": "archives Aquilifers Ballade" }, "Mode": { "name": "Level Mode", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 1092b8b0d..a088f2d7f 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -800,7 +800,8 @@ "war_archives_20220224_cn": "檔案 鳴動せし星霜の淵", "war_archives_20220324_cn": "檔案 幻像の塔", "war_archives_20220414_cn": "檔案 極夜照らす幻光", - "war_archives_20220526_cn": "檔案 诚閃の剣 搖光の城" + "war_archives_20220526_cn": "檔案 诚閃の剣 搖光の城", + "war_archives_20220728_cn": "檔案 鋼鷲の冒険譚" }, "Mode": { "name": "Campaign.Mode.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 4c84a4b3e..fb6c9b58d 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -800,7 +800,8 @@ "war_archives_20220224_cn": "档案 深度回音", "war_archives_20220324_cn": "档案 虚像构筑之塔", "war_archives_20220414_cn": "档案 永夜幻光", - "war_archives_20220526_cn": "档案 泠誓光庭" + "war_archives_20220526_cn": "档案 泠誓光庭", + "war_archives_20220728_cn": "档案 雄鹰的叙事歌" }, "Mode": { "name": "关卡模式", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index c5b311188..e60a10d12 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -800,7 +800,8 @@ "war_archives_20220224_cn": "檔案 深度回音", "war_archives_20220324_cn": "檔案 虛像構築之塔", "war_archives_20220414_cn": "檔案 永夜幻光", - "war_archives_20220526_cn": "檔案 泠誓光庭" + "war_archives_20220526_cn": "檔案 泠誓光庭", + "war_archives_20220728_cn": "檔案 雄鷹的敘事歌" }, "Mode": { "name": "地圖模式", diff --git a/module/war_archives/assets.py b/module/war_archives/assets.py index 79bd184cc..7d31f3f11 100644 --- a/module/war_archives/assets.py +++ b/module/war_archives/assets.py @@ -6,6 +6,7 @@ from module.base.template import Template OCR_DATA_KEY_CAMPAIGN = Button(area={'cn': (1188, 107, 1272, 131), 'en': (1188, 107, 1272, 131), 'jp': (1188, 107, 1272, 131), 'tw': (1188, 107, 1272, 131)}, color={'cn': (104, 101, 107), 'en': (104, 101, 107), 'jp': (104, 101, 107), 'tw': (104, 101, 107)}, button={'cn': (1188, 107, 1272, 131), 'en': (1188, 107, 1272, 131), 'jp': (1188, 107, 1272, 131), 'tw': (1188, 107, 1272, 131)}, file={'cn': './assets/cn/war_archives/OCR_DATA_KEY_CAMPAIGN.png', 'en': './assets/en/war_archives/OCR_DATA_KEY_CAMPAIGN.png', 'jp': './assets/jp/war_archives/OCR_DATA_KEY_CAMPAIGN.png', 'tw': './assets/tw/war_archives/OCR_DATA_KEY_CAMPAIGN.png'}) TEMPLATE_ABYSSAL_REFRAIN = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png', 'en': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png', 'jp': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png', 'tw': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png'}) +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_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'}) diff --git a/module/war_archives/dictionary.py b/module/war_archives/dictionary.py index 13fbc3704..d9481a689 100644 --- a/module/war_archives/dictionary.py +++ b/module/war_archives/dictionary.py @@ -39,4 +39,5 @@ dic_archives_template = { 'war_archives_20220224_cn': TEMPLATE_ABYSSAL_REFRAIN, 'war_archives_20220324_cn': TEMPLATE_VIRTUAL_TOWER, 'war_archives_20220526_cn': TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT, + 'war_archives_20220728_cn': TEMPLATE_AQUILIFERS_BALLADE, }