diff --git a/assets/cn/handler/AVATAR_EXPIRED.png b/assets/cn/handler/AVATAR_EXPIRED.png new file mode 100644 index 000000000..549f0955c Binary files /dev/null and b/assets/cn/handler/AVATAR_EXPIRED.png differ 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/cn/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif b/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif new file mode 100644 index 000000000..a73bf4c5e Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif b/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif new file mode 100644 index 000000000..12e50c71b Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Studying.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/en/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif b/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif new file mode 100644 index 000000000..a73bf4c5e Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif b/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif new file mode 100644 index 000000000..12e50c71b Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Studying.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/jp/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif b/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif new file mode 100644 index 000000000..a73bf4c5e Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif b/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif new file mode 100644 index 000000000..12e50c71b Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Studying.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/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif b/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif new file mode 100644 index 000000000..a73bf4c5e Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif b/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif new file mode 100644 index 000000000..12e50c71b Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif differ diff --git a/campaign/Readme.md b/campaign/Readme.md index 422ea16de..ce757ea59 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -303,3 +303,4 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20260605 | event 20260520 cn | Alliance Before the Hagiobull | - | - | - | 聖印前的同盟 | | 20260618 | event 20240521 cn | Light of the Martyrium Rerun | 复刻绽放于辉光之城 | Light of the Martyrium Rerun | 赫輝のマルティリウム(復刻) | - | | 20260625 | event 20230223 cn | Revelations of Dust | - | - | - | 復刻湮燼塵墟 | +| 20260625 | event 20260625 cn | Miracle by Midnight | 美梦巡演奇妙夜 | Miracle by Midnight | 幻夢のカヴァルカード | - | diff --git a/campaign/event_20260625_cn/ht1.py b/campaign/event_20260625_cn/ht1.py new file mode 100644 index 000000000..e74fa4caa --- /dev/null +++ b/campaign/event_20260625_cn/ht1.py @@ -0,0 +1,79 @@ +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('HT1') +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': 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, \ +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_Studying', 'MeowfficerBust_Playtime'] + 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_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20260625_cn/ht2.py b/campaign/event_20260625_cn/ht2.py new file mode 100644 index 000000000..f3133d748 --- /dev/null +++ b/campaign/event_20260625_cn/ht2.py @@ -0,0 +1,86 @@ +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 .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT2') +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': 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, \ +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_Studying', 'MeowfficerBust_Playtime'] + 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=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_20260625_cn/ht3.py b/campaign/event_20260625_cn/ht3.py new file mode 100644 index 000000000..eec5d0294 --- /dev/null +++ b/campaign/event_20260625_cn/ht3.py @@ -0,0 +1,89 @@ +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 .ht1 import Config as ConfigBase + +MAP = CampaignMap('HT3') +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, '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, \ +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_Studying', 'MeowfficerBust_Playtime'] + 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=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_20260625_cn/sp.py b/campaign/event_20260625_cn/sp.py new file mode 100644 index 000000000..9be26753d --- /dev/null +++ b/campaign/event_20260625_cn/sp.py @@ -0,0 +1,104 @@ +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('SP') +MAP.shape = 'G10' +MAP.camera_data = ['D3', 'D7', 'D8'] +MAP.camera_data_spawn_point = ['D8'] +MAP.map_data = """ + -- -- ++ -- ++ ++ -- + ++ ++ ++ MB ++ ++ ++ + ++ ME -- -- -- ME -- + -- -- -- ME -- -- ME + ME -- ME ++ ++ -- -- + ++ -- -- -- ++ -- ME + ++ -- MS __ MS -- ++ + ME -- -- MS -- -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 10, 'siren': 3}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6}, + {'battle': 7, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, \ +A2, B2, C2, D2, E2, F2, G2, \ +A3, B3, C3, D3, E3, F3, G3, \ +A4, B4, C4, D4, E4, F4, G4, \ +A5, B5, C5, D5, E5, F5, G5, \ +A6, B6, C6, D6, E6, F6, G6, \ +A7, B7, C7, D7, E7, F7, G7, \ +A8, B8, C8, D8, E8, F8, G8, \ +A9, B9, C9, D9, E9, F9, G9, \ +A10, B10, C10, D10, E10, F10, G10, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['MeowfficerBust_Studying', 'MeowfficerBust_Playtime'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = False + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + MAP_IS_ONE_TIME_STAGE = True + MAP_CHAPTER_SWITCH_20241219_SP = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = False + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY = (1.005, 1.024) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.972, 0.990) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.944, 0.961) + + +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=2): + 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_7(self): + return self.fleet_boss.clear_boss() 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 5cb61b501..be9ebc2cd 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -227,6 +227,7 @@ class CampaignRun(CampaignEvent, ShopStatus): 'event_20250814_cn', 'event_20251023_cn', 'event_20260326_cn', + 'event_20260625_cn', 'war_archives_20230525_cn', 'war_archives_20231026_cn', 'war_archives_20240725_cn', @@ -265,6 +266,7 @@ class CampaignRun(CampaignEvent, ShopStatus): '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/config/argument/args.json b/module/config/argument/args.json index 94ddf4f63..805fc8cef 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1977,23 +1977,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -2397,23 +2397,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -2811,23 +2811,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -4638,23 +4638,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -5070,23 +5070,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -5502,23 +5502,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -5934,23 +5934,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { @@ -6356,23 +6356,23 @@ "value": "campaign_main", "option": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ], "option_cn": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_en": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_jp": [ - "event_20240521_cn" + "event_20260625_cn" ], "option_tw": [ "event_20230223_cn" ], "option_bold": [ "event_20230223_cn", - "event_20240521_cn" + "event_20260625_cn" ] }, "Mode": { diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index fc3b04b3c..b82330041 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -808,6 +808,7 @@ "event_20260326_cn": "The Vagabond’s Recruitment Plan", "event_20260417_cn": "Vacation Lane – Beachside Brilliance", "event_20260520_cn": "Alliance Before the Hagiobull", + "event_20260625_cn": "Miracle by Midnight", "raid_20200624": "Air Raid Drills with Essex Rerun", "raid_20210708": "Cross Wave rerun", "raid_20220127": "Mystery Investigation", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 28a51d000..08ae260c6 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -808,6 +808,7 @@ "event_20260326_cn": "ワンダラー募集計画", "event_20260417_cn": "バケーションレーン・きらめく砂浜", "event_20260520_cn": "聖印前の同盟", + "event_20260625_cn": "幻夢のカヴァルカード", "raid_20200624": "特別演習超空強襲波(復刻)", "raid_20210708": "交錯する新たな波 (復刻)", "raid_20220127": "秘密事件調査", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 00457b354..91d56f304 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -808,6 +808,7 @@ "event_20260326_cn": "漫游者招募计划", "event_20260417_cn": "假日航线闪耀海滨", "event_20260520_cn": "圣印前的同盟", + "event_20260625_cn": "美梦巡演奇妙夜", "raid_20200624": "复刻特别演习埃塞克斯级", "raid_20210708": "复刻穿越彼方的水线", "raid_20220127": "演习神秘事件调查", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 62a10e1a6..a365ad527 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -808,6 +808,7 @@ "event_20260326_cn": "漫遊者招募計劃", "event_20260417_cn": "假日航線閃耀海濱", "event_20260520_cn": "聖印前的同盟", + "event_20260625_cn": "Miracle by Midnight", "raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20210708": "復刻穿越彼方的水線", "raid_20220127": "演習神秘事件調查", diff --git a/module/handler/assets.py b/module/handler/assets.py index b660353a7..8e716092c 100644 --- a/module/handler/assets.py +++ b/module/handler/assets.py @@ -26,6 +26,7 @@ AUTO_SEARCH_SET_MOB = Button(area={'cn': (496, 207, 515, 226), 'en': (477, 208, AUTO_SEARCH_SET_STANDBY = Button(area={'cn': (932, 207, 950, 226), 'en': (813, 322, 832, 340), 'jp': (932, 207, 950, 226), 'tw': (932, 207, 950, 226)}, color={'cn': (30, 30, 37), 'en': (41, 41, 42), 'jp': (37, 36, 37), 'tw': (37, 38, 39)}, button={'cn': (932, 207, 950, 226), 'en': (813, 322, 832, 340), 'jp': (932, 207, 950, 226), 'tw': (932, 207, 950, 226)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_STANDBY.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_STANDBY.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_STANDBY.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_STANDBY.png'}) AUTO_SEARCH_SET_SUB_AUTO = Button(area={'cn': (578, 457, 597, 476), 'en': (577, 460, 595, 478), 'jp': (578, 457, 597, 476), 'tw': (578, 457, 597, 476)}, color={'cn': (69, 96, 52), 'en': (41, 39, 41), 'jp': (39, 37, 39), 'tw': (73, 100, 53)}, button={'cn': (578, 457, 597, 476), 'en': (577, 460, 595, 478), 'jp': (578, 457, 597, 476), 'tw': (578, 457, 597, 476)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_SUB_AUTO.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_SUB_AUTO.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_SUB_AUTO.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_SUB_AUTO.png'}) AUTO_SEARCH_SET_SUB_STANDBY = Button(area={'cn': (894, 457, 913, 476), 'en': (855, 460, 874, 478), 'jp': (894, 457, 913, 476), 'tw': (894, 457, 913, 476)}, color={'cn': (32, 31, 34), 'en': (75, 104, 54), 'jp': (73, 100, 52), 'tw': (35, 36, 38)}, button={'cn': (894, 457, 913, 476), 'en': (855, 460, 874, 478), 'jp': (894, 457, 913, 476), 'tw': (894, 457, 913, 476)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_SET_SUB_STANDBY.png', 'en': './assets/en/handler/AUTO_SEARCH_SET_SUB_STANDBY.png', 'jp': './assets/jp/handler/AUTO_SEARCH_SET_SUB_STANDBY.png', 'tw': './assets/tw/handler/AUTO_SEARCH_SET_SUB_STANDBY.png'}) +AVATAR_EXPIRED = Button(area={'cn': (641, 567, 713, 598), 'en': (641, 567, 713, 598), 'jp': (641, 567, 713, 598), 'tw': (641, 567, 713, 598)}, color={'cn': (154, 184, 222), 'en': (154, 184, 222), 'jp': (154, 184, 222), 'tw': (154, 184, 222)}, button={'cn': (641, 567, 713, 598), 'en': (641, 567, 713, 598), 'jp': (641, 567, 713, 598), 'tw': (641, 567, 713, 598)}, file={'cn': './assets/cn/handler/AVATAR_EXPIRED.png', 'en': './assets/cn/handler/AVATAR_EXPIRED.png', 'jp': './assets/cn/handler/AVATAR_EXPIRED.png', 'tw': './assets/cn/handler/AVATAR_EXPIRED.png'}) BATTLE_PASS_NEW_SEASON = Button(area={'cn': (942, 529, 962, 550), 'en': (942, 529, 962, 550), 'jp': (942, 529, 962, 550), 'tw': (942, 529, 962, 550)}, color={'cn': (134, 137, 140), 'en': (134, 137, 140), 'jp': (134, 137, 140), 'tw': (134, 137, 140)}, button={'cn': (942, 529, 962, 550), 'en': (942, 529, 962, 550), 'jp': (942, 529, 962, 550), 'tw': (942, 529, 962, 550)}, file={'cn': './assets/cn/handler/BATTLE_PASS_NEW_SEASON.png', 'en': './assets/cn/handler/BATTLE_PASS_NEW_SEASON.png', 'jp': './assets/cn/handler/BATTLE_PASS_NEW_SEASON.png', 'tw': './assets/cn/handler/BATTLE_PASS_NEW_SEASON.png'}) BATTLE_PASS_NOTICE = Button(area={'cn': (554, 483, 726, 540), 'en': (716, 488, 869, 533), 'jp': (554, 483, 726, 540), 'tw': (554, 483, 726, 540)}, color={'cn': (107, 152, 207), 'en': (89, 138, 201), 'jp': (107, 152, 207), 'tw': (107, 152, 207)}, button={'cn': (863, 173, 929, 217), 'en': (863, 173, 929, 217), 'jp': (863, 173, 929, 217), 'tw': (863, 173, 929, 217)}, file={'cn': './assets/cn/handler/BATTLE_PASS_NOTICE.png', 'en': './assets/en/handler/BATTLE_PASS_NOTICE.png', 'jp': './assets/cn/handler/BATTLE_PASS_NOTICE.png', 'tw': './assets/cn/handler/BATTLE_PASS_NOTICE.png'}) BOOK_BOX_AUTO = Button(area={'cn': (737, 614, 756, 631), 'en': (806, 612, 828, 633), 'jp': (808, 614, 825, 631), 'tw': (807, 613, 826, 632)}, color={'cn': (67, 74, 82), 'en': (85, 97, 101), 'jp': (59, 62, 68), 'tw': (62, 66, 71)}, button={'cn': (737, 614, 756, 631), 'en': (806, 612, 828, 633), 'jp': (808, 614, 825, 631), 'tw': (807, 613, 826, 632)}, file={'cn': './assets/cn/handler/BOOK_BOX_AUTO.png', 'en': './assets/en/handler/BOOK_BOX_AUTO.png', 'jp': './assets/jp/handler/BOOK_BOX_AUTO.png', 'tw': './assets/tw/handler/BOOK_BOX_AUTO.png'}) diff --git a/module/handler/login.py b/module/handler/login.py index 92eff4ef5..78121944a 100644 --- a/module/handler/login.py +++ b/module/handler/login.py @@ -89,6 +89,8 @@ class LoginHandler(UI): continue if self.appear_then_click(LOGIN_RETURN_INFO, offset=(30, 30), interval=5): continue + if self.appear_then_click(AVATAR_EXPIRED, offset=(30, 30), interval=5): + continue # Popups if self.handle_popup_confirm('LOGIN'): continue diff --git a/module/template/assets.py b/module/template/assets.py index cefe72137..2082ebe53 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -176,6 +176,9 @@ 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_MeowfficerBust_Playtime = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Playtime.gif'}) +TEMPLATE_SIREN_MeowfficerBust_Studying = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif', 'en': './assets/en/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_MeowfficerBust_Studying.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_MeowfficerBust_Studying.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'})