diff --git a/assets/cn/template/TEMPLATE_SIREN_Amity.gif b/assets/cn/template/TEMPLATE_SIREN_Amity.gif new file mode 100644 index 000000000..eb78dfa86 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_Amity.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_MaryCeleste.gif b/assets/cn/template/TEMPLATE_SIREN_MaryCeleste.gif new file mode 100644 index 000000000..00da638e3 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_MaryCeleste.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_Portsmouth.gif b/assets/cn/template/TEMPLATE_SIREN_Portsmouth.gif new file mode 100644 index 000000000..ade1cfe37 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_Portsmouth.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_fengfanhaigu03.gif b/assets/cn/template/TEMPLATE_SIREN_fengfanhaigu03.gif new file mode 100644 index 000000000..617c9493b Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_fengfanhaigu03.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_Amity.gif b/assets/en/template/TEMPLATE_SIREN_Amity.gif new file mode 100644 index 000000000..eb78dfa86 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_Amity.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_MaryCeleste.gif b/assets/en/template/TEMPLATE_SIREN_MaryCeleste.gif new file mode 100644 index 000000000..00da638e3 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_MaryCeleste.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_Portsmouth.gif b/assets/en/template/TEMPLATE_SIREN_Portsmouth.gif new file mode 100644 index 000000000..ade1cfe37 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_Portsmouth.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_fengfanhaigu03.gif b/assets/en/template/TEMPLATE_SIREN_fengfanhaigu03.gif new file mode 100644 index 000000000..617c9493b Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_fengfanhaigu03.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_Amity.gif b/assets/jp/template/TEMPLATE_SIREN_Amity.gif new file mode 100644 index 000000000..eb78dfa86 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_Amity.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_MaryCeleste.gif b/assets/jp/template/TEMPLATE_SIREN_MaryCeleste.gif new file mode 100644 index 000000000..00da638e3 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_MaryCeleste.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_Portsmouth.gif b/assets/jp/template/TEMPLATE_SIREN_Portsmouth.gif new file mode 100644 index 000000000..ade1cfe37 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_Portsmouth.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_fengfanhaigu03.gif b/assets/jp/template/TEMPLATE_SIREN_fengfanhaigu03.gif new file mode 100644 index 000000000..617c9493b Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_fengfanhaigu03.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_Amity.gif b/assets/tw/template/TEMPLATE_SIREN_Amity.gif new file mode 100644 index 000000000..eb78dfa86 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_Amity.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_MaryCeleste.gif b/assets/tw/template/TEMPLATE_SIREN_MaryCeleste.gif new file mode 100644 index 000000000..00da638e3 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_MaryCeleste.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_Portsmouth.gif b/assets/tw/template/TEMPLATE_SIREN_Portsmouth.gif new file mode 100644 index 000000000..ade1cfe37 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_Portsmouth.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_fengfanhaigu03.gif b/assets/tw/template/TEMPLATE_SIREN_fengfanhaigu03.gif new file mode 100644 index 000000000..617c9493b Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_fengfanhaigu03.gif differ diff --git a/campaign/event_20241024_cn/campaign_base.py b/campaign/event_20241024_cn/campaign_base.py new file mode 100644 index 000000000..16375c9f1 --- /dev/null +++ b/campaign/event_20241024_cn/campaign_base.py @@ -0,0 +1,51 @@ +from module.base.utils import color_similarity_2d +from module.campaign.assets import SWITCH_20240725_COMBAT, SWITCH_20240725_STORY +from module.campaign.campaign_base import CampaignBase as CampaignBase_ +from module.campaign.campaign_ui import ModeSwitch +from module.map_detection.grid import Grid +from module.template.assets import TEMPLATE_ENEMY_BOSS + +MODE_SWITCH_20240912 = ModeSwitch('Mode_switch_20240912', is_selector=True, offset=(30, 30)) +MODE_SWITCH_20240912.add_status('combat', SWITCH_20240725_COMBAT, offset=(444, 4)) +MODE_SWITCH_20240912.add_status('story', SWITCH_20240725_STORY, offset=(444, 4)) + + +class EventGrid(Grid): + def predict_enemy_genre(self): + if self.enemy_scale: + return '' + + image = self.relative_crop((-0, -0.2, 0.8, 0.2), shape=(40, 20)) + image = color_similarity_2d(image, color=(255, 150, 24)) + if image[image > 221].shape[0] > 30: + if TEMPLATE_ENEMY_BOSS.match(image, similarity=0.6, scaling=0.5): + return 'Siren_Siren' + + return super().predict_enemy_genre() + + def predict_boss(self): + if self.enemy_genre == 'Siren_Siren': + return False + return super().predict_boss() + + +class CampaignBase(CampaignBase_): + STAGE_INCREASE = [ + """ + T1 > T2 > T3 > T4 > T5 > T6 + """ + ] + def campaign_ensure_mode(self, mode='normal'): + """ + Args: + mode (str): 'normal', 'hard', 'ex', 'story' + + Returns: + bool: If mode changed. + """ + if mode == "story": + MODE_SWITCH_20240912.set('story', main=self) + elif mode in ['normal', 'hard', 'ex']: + # First switch to combat mode and then select Hard or Normal. + MODE_SWITCH_20240912.set('combat', main=self) + # super().campaign_ensure_mode(mode) diff --git a/campaign/event_20241024_cn/t1.py b/campaign/event_20241024_cn/t1.py new file mode 100644 index 000000000..10a834cc1 --- /dev/null +++ b/campaign/event_20241024_cn/t1.py @@ -0,0 +1,92 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('T1') +MAP.shape = 'I8' +MAP.camera_data = ['D3', 'D6'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + ++ SP SP ++ ME -- ME -- -- + -- -- -- -- -- -- -- ME ++ + Me -- -- -- Me -- ME -- -- + -- MS MS -- -- __ ++ ++ -- + -- ++ ++ ++ Me -- ME -- -- + -- -- ++ -- -- -- -- ME -- + -- -- MB -- -- 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': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Amity', 'Portsmouth'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['half', '20240725'] + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_SWIPE_MULTIPLY = (1.235, 1.258) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.194, 1.216) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.159, 1.180) + + +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/event_20241024_cn/t2.py b/campaign/event_20241024_cn/t2.py new file mode 100644 index 000000000..cfa37e47a --- /dev/null +++ b/campaign/event_20241024_cn/t2.py @@ -0,0 +1,79 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T2') +MAP.shape = 'I8' +MAP.camera_data = ['D3', 'D6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + -- ++ ++ ++ ++ ++ SP -- SP + -- ME -- ++ ++ ++ -- -- -- + -- -- ME ++ ++ ++ -- MS -- + ME -- -- -- MB -- MS ++ MS + ++ ++ ++ -- -- -- -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['MaryCeleste', 'Amity', 'Portsmouth'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.246, 1.269) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.205, 1.227) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.170, 1.191) + + +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/event_20241024_cn/t3.py b/campaign/event_20241024_cn/t3.py new file mode 100644 index 000000000..755bff28c --- /dev/null +++ b/campaign/event_20241024_cn/t3.py @@ -0,0 +1,82 @@ +from .campaign_base import CampaignBase, EventGrid +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T3') +MAP.shape = 'J8' +MAP.camera_data = ['D2', 'D5', 'G2', 'G5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + -- -- Me -- -- -- -- ++ ++ ++ + ++ Me -- Me ++ ++ -- ME -- ME + ++ -- __ -- ME ++ ME -- ++ -- + MS -- MS -- -- -- -- -- ME -- + -- -- MS -- ME -- ME -- -- -- + -- -- ++ ++ ++ ME ++ -- ++ ME + SP SP ++ ++ ++ -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, 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 = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.105, 1.126) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.069, 1.089) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.038, 1.057) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + grid_class = EventGrid + + 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/event_20241024_cn/t4.py b/campaign/event_20241024_cn/t4.py new file mode 100644 index 000000000..8f4010746 --- /dev/null +++ b/campaign/event_20241024_cn/t4.py @@ -0,0 +1,96 @@ +from .campaign_base import CampaignBase, EventGrid +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T4') +MAP.shape = 'J8' +MAP.camera_data = ['D4', 'G4', 'E6'] +MAP.camera_data_spawn_point = ['E2'] +MAP.map_data = """ + -- ++ ++ ++ SP SP ++ ++ ++ -- + -- -- -- -- -- -- -- -- -- -- + ME -- ++ MS -- -- MS ++ -- ME + -- -- ++ -- ME ME -- ++ -- -- + ME -- ME -- __ __ -- ME -- ME + ++ -- -- ME -- -- ME -- -- ++ + ++ ++ -- -- MB MB -- -- ++ -- + ++ ++ -- ME -- -- ME -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, 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 = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + STAGE_ENTRANCE = ['half', '20240725'] + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_SWIPE_MULTIPLY = (1.264, 1.287) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.222, 1.245) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.186, 1.208) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + grid_class = EventGrid + + 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/event_20241024_cn/t5.py b/campaign/event_20241024_cn/t5.py new file mode 100644 index 000000000..5680c930b --- /dev/null +++ b/campaign/event_20241024_cn/t5.py @@ -0,0 +1,91 @@ +from .campaign_base import CampaignBase, EventGrid +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t4 import Config as ConfigBase + +MAP = CampaignMap('T5') +MAP.shape = 'L8' +MAP.camera_data = ['E3', 'E6', 'H6'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- ++ ++ ++ -- ME -- -- -- -- -- -- + -- -- MS -- ME -- ME ++ ++ ++ ++ -- + SP -- -- MS -- __ -- ++ ++ ++ ++ -- + SP -- -- MS ++ -- ME ++ ++ ++ ++ -- + ++ -- MS -- ME -- -- -- MB -- -- -- + ++ ++ ++ -- -- -- ME -- -- ME ++ -- + -- -- ME -- -- ME ++ ++ -- -- ME -- + -- ++ -- ME -- -- -- ++ ME -- -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2, 'siren': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, 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, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, L8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.150, 1.171) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.112, 1.133) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.080, 1.099) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + grid_class = EventGrid + + 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/event_20241024_cn/t6.py b/campaign/event_20241024_cn/t6.py new file mode 100644 index 000000000..6e8992c9c --- /dev/null +++ b/campaign/event_20241024_cn/t6.py @@ -0,0 +1,97 @@ +from .campaign_base import CampaignBase, EventGrid +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t4 import Config as ConfigBase + +MAP = CampaignMap('T6') +MAP.shape = 'K10' +MAP.camera_data = ['E3', 'G3'] +MAP.camera_data_spawn_point = ['F4'] +MAP.map_data = """ + ++ ++ -- -- ++ ++ ++ -- -- ++ ++ + ++ -- -- ME -- MB -- ME -- -- ++ + -- -- ME -- MS -- MS -- ME -- -- + -- ME -- 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 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 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': 10, 'siren': 3}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, K10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['fengfanhaigu03'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.124, 1.145) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.087, 1.107) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.055, 1.074) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + grid_class = EventGrid + + 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/module/campaign/run.py b/module/campaign/run.py index 0c3dca131..3eacf9c88 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -213,6 +213,7 @@ class CampaignRun(CampaignEvent): if folder in [ 'event_20211125_cn', 'event_20231026_cn', + 'event_20241024_cn', ]: name = convert.get(name, name) # Convert between A/B/C/D and T/HT @@ -241,6 +242,7 @@ class CampaignRun(CampaignEvent): 'event_20231123_cn', 'event_20240725_cn', 'event_20240829_cn', + 'event_20241024_cn', ]: name = convert.get(name, name) else: diff --git a/module/template/assets.py b/module/template/assets.py index 1393ea5ac..a6a2b169a 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -46,6 +46,7 @@ TEMPLATE_SIREN_AlfredoOriani = Template(file={'cn': './assets/cn/template/TEMPLA TEMPLATE_SIREN_Algerie = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Algerie.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Algerie.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Algerie.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Algerie.gif'}) TEMPLATE_SIREN_AmagiMasked = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_AmagiMasked.gif', 'en': './assets/en/template/TEMPLATE_SIREN_AmagiMasked.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_AmagiMasked.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_AmagiMasked.gif'}) TEMPLATE_SIREN_Amazon = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Amazon.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Amazon.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Amazon.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Amazon.gif'}) +TEMPLATE_SIREN_Amity = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Amity.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Amity.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Amity.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Amity.gif'}) TEMPLATE_SIREN_Arethusa = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Arethusa.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Arethusa.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Arethusa.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Arethusa.gif'}) TEMPLATE_SIREN_Arizona = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Arizona.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Arizona.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Arizona.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Arizona.gif'}) TEMPLATE_SIREN_ArkRoyal = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_ArkRoyal.gif', 'en': './assets/en/template/TEMPLATE_SIREN_ArkRoyal.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_ArkRoyal.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_ArkRoyal.gif'}) @@ -151,6 +152,7 @@ TEMPLATE_SIREN_Lover = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN TEMPLATE_SIREN_Magdeburg = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Magdeburg.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Magdeburg.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Magdeburg.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Magdeburg.gif'}) TEMPLATE_SIREN_Mainz = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Mainz.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Mainz.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Mainz.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Mainz.gif'}) TEMPLATE_SIREN_MarieRoseDOA = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MarieRoseDOA.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MarieRoseDOA.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MarieRoseDOA.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MarieRoseDOA.gif'}) +TEMPLATE_SIREN_MaryCeleste = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MaryCeleste.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MaryCeleste.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MaryCeleste.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MaryCeleste.gif'}) TEMPLATE_SIREN_Maya = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Maya.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Maya.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Maya.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Maya.gif'}) TEMPLATE_SIREN_Mikasa = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Mikasa.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Mikasa.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Mikasa.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Mikasa.gif'}) TEMPLATE_SIREN_MisakiDOA = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MisakiDOA.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MisakiDOA.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MisakiDOA.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MisakiDOA.gif'}) @@ -165,6 +167,7 @@ TEMPLATE_SIREN_NyotenguDOA = Template(file={'cn': './assets/cn/template/TEMPLATE TEMPLATE_SIREN_Odin = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Odin.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Odin.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Odin.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Odin.gif'}) TEMPLATE_SIREN_PeterStrasser = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_PeterStrasser.gif', 'en': './assets/en/template/TEMPLATE_SIREN_PeterStrasser.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_PeterStrasser.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_PeterStrasser.gif'}) TEMPLATE_SIREN_PompeoMagno = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_PompeoMagno.gif', 'en': './assets/en/template/TEMPLATE_SIREN_PompeoMagno.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_PompeoMagno.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_PompeoMagno.gif'}) +TEMPLATE_SIREN_Portsmouth = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Portsmouth.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Portsmouth.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Portsmouth.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Portsmouth.gif'}) TEMPLATE_SIREN_PrinceOfWales = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_PrinceOfWales.gif', 'en': './assets/en/template/TEMPLATE_SIREN_PrinceOfWales.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_PrinceOfWales.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_PrinceOfWales.gif'}) TEMPLATE_SIREN_PrinzAdalbert = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_PrinzAdalbert.gif', 'en': './assets/en/template/TEMPLATE_SIREN_PrinzAdalbert.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_PrinzAdalbert.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_PrinzAdalbert.gif'}) TEMPLATE_SIREN_PrinzEugen = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_PrinzEugen.gif', 'en': './assets/en/template/TEMPLATE_SIREN_PrinzEugen.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_PrinzEugen.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_PrinzEugen.gif'}) @@ -228,6 +231,7 @@ TEMPLATE_SIREN_Z24 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Z TEMPLATE_SIREN_Z46 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Z46.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Z46.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Z46.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Z46.gif'}) TEMPLATE_SIREN_Zuiho = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Zuiho.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Zuiho.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Zuiho.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Zuiho.gif'}) TEMPLATE_SIREN_Zuikaku = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Zuikaku.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Zuikaku.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Zuikaku.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Zuikaku.gif'}) +TEMPLATE_SIREN_fengfanhaigu03 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_fengfanhaigu03.gif', 'en': './assets/en/template/TEMPLATE_SIREN_fengfanhaigu03.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_fengfanhaigu03.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_fengfanhaigu03.gif'}) TEMPLATE_SIREN_huiguangzhihe = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_huiguangzhihe.gif', 'en': './assets/en/template/TEMPLATE_SIREN_huiguangzhihe.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_huiguangzhihe.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_huiguangzhihe.gif'}) TEMPLATE_SIREN_shuguangjixie_huixing = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_shuguangjixie_huixing.gif', 'en': './assets/en/template/TEMPLATE_SIREN_shuguangjixie_huixing.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_shuguangjixie_huixing.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_shuguangjixie_huixing.gif'}) TEMPLATE_SIREN_shuguangjixie_shanliu = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_shuguangjixie_shanliu.gif', 'en': './assets/en/template/TEMPLATE_SIREN_shuguangjixie_shanliu.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_shuguangjixie_shanliu.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_shuguangjixie_shanliu.gif'})