diff --git a/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif b/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif new file mode 100644 index 000000000..80cbceb5c Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif b/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif new file mode 100644 index 000000000..80cbceb5c Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif b/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif new file mode 100644 index 000000000..80cbceb5c Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif b/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif new file mode 100644 index 000000000..80cbceb5c Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif differ diff --git a/campaign/event_20260625_cn/t1.py b/campaign/event_20260625_cn/t1.py new file mode 100644 index 000000000..07f9cd3a6 --- /dev/null +++ b/campaign/event_20260625_cn/t1.py @@ -0,0 +1,78 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('T1') +MAP.shape = 'I7' +MAP.camera_data = ['F2', 'F5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + -- -- ME -- ME -- -- ++ MB + -- -- ++ ME -- ME ++ ME -- + SP -- -- MS -- -- Me -- -- + -- -- __ -- ++ -- -- -- ME + SP -- -- MS ++ Me -- ++ ++ + -- -- -- -- -- -- -- ++ ++ + ++ ++ ++ Me -- ME -- ME -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['MeowfficerBust_Hobbies'] + 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_CHAPTER_SWITCH_20241219_SP = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + MAP_SWIPE_MULTIPLY = (1.144, 1.165) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.106, 1.126) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.074, 1.093) + + +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_20260625_cn/t2.py b/campaign/event_20260625_cn/t2.py new file mode 100644 index 000000000..76d9a348d --- /dev/null +++ b/campaign/event_20260625_cn/t2.py @@ -0,0 +1,76 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T2') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ME -- ME ++ ME -- -- ++ ++ + -- -- -- -- -- -- SP -- ++ + -- Me ++ ++ ++ -- -- SP -- + -- -- -- Me -- MS -- -- -- + ME -- ME ++ -- MS MS ++ Me + -- MB -- ++ __ -- -- ++ -- + ME -- ME -- -- ME -- Me -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 1}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['MeowfficerBust_Hobbies'] + 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.224, 1.247) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.184, 1.206) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.149, 1.170) + + +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_20260625_cn/t3.py b/campaign/event_20260625_cn/t3.py new file mode 100644 index 000000000..57738dd2a --- /dev/null +++ b/campaign/event_20260625_cn/t3.py @@ -0,0 +1,80 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .t1 import Config as ConfigBase + +MAP = CampaignMap('T3') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['F5'] +MAP.map_data = """ + ++ ++ ++ ++ MB ++ ++ ++ ++ + ++ -- Me Me -- Me Me -- ++ + -- ME -- -- __ -- -- ME -- + ME -- -- SP ++ SP -- -- ME + -- ME -- -- -- -- -- ME -- + ++ ++ ME -- MS -- ME ++ ++ + ++ ++ -- MS -- MS -- ++ ++ + -- -- ++ ++ ++ ++ ++ -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3, 'siren': 2}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['MeowfficerBust_Hobbies'] + 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.115, 1.136) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.078, 1.098) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.047, 1.065) + + +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/module/campaign/run.py b/module/campaign/run.py index f244c36ce..15d121687 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -220,6 +220,7 @@ class CampaignRun(CampaignEvent): 'event_20250814_cn', 'event_20251023_cn', 'event_20260326_cn', + 'event_20260625_cn', 'war_archives_20230525_cn', 'war_archives_20231026_cn', 'war_archives_20240725_cn', @@ -258,6 +259,7 @@ class CampaignRun(CampaignEvent): 'event_20250814_cn', 'event_20251023_cn', 'event_20260326_cn', + 'event_20260625_cn', 'war_archives_20230525_cn', 'war_archives_20231026_cn', 'war_archives_20240725_cn', diff --git a/module/template/assets.py b/module/template/assets.py index cefe72137..c24692c7e 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -176,6 +176,7 @@ TEMPLATE_SIREN_Mainz = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN 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_MeowfficerBust_Hobbies = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Hobbies.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'}) TEMPLATE_SIREN_Miyuki = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Miyuki.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Miyuki.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Miyuki.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Miyuki.gif'})