diff --git a/assets/cn/equipment/FLEET_DETAIL_CHECK.png b/assets/cn/equipment/FLEET_DETAIL_CHECK.png new file mode 100644 index 000000000..0bfc387c4 Binary files /dev/null and b/assets/cn/equipment/FLEET_DETAIL_CHECK.png differ diff --git a/assets/cn/template/TEMPLATE_SIREN_DidoIdol2.gif b/assets/cn/template/TEMPLATE_SIREN_DidoIdol2.gif new file mode 100644 index 000000000..32eac9a5f Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_DidoIdol2.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_Elizabeth3.gif b/assets/cn/template/TEMPLATE_SIREN_Elizabeth3.gif new file mode 100644 index 000000000..657edf629 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_Elizabeth3.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_GascogneIdol.gif b/assets/cn/template/TEMPLATE_SIREN_GascogneIdol.gif new file mode 100644 index 000000000..377fc0be4 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_GascogneIdol.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_Laffey6.gif b/assets/cn/template/TEMPLATE_SIREN_Laffey6.gif new file mode 100644 index 000000000..54094373f Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_Laffey6.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_RoonIdol2.gif b/assets/cn/template/TEMPLATE_SIREN_RoonIdol2.gif new file mode 100644 index 000000000..e24b7e40f Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_RoonIdol2.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_SheffieldIdol.gif b/assets/cn/template/TEMPLATE_SIREN_SheffieldIdol.gif new file mode 100644 index 000000000..c33810aa6 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_SheffieldIdol.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_SheffieldIdol.png b/assets/cn/template/TEMPLATE_SIREN_SheffieldIdol.png deleted file mode 100644 index 25445dd60..000000000 Binary files a/assets/cn/template/TEMPLATE_SIREN_SheffieldIdol.png and /dev/null differ diff --git a/assets/cn/template/TEMPLATE_SIREN_TaihouIdol.gif b/assets/cn/template/TEMPLATE_SIREN_TaihouIdol.gif new file mode 100644 index 000000000..9346ec9de Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_TaihouIdol.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_TashkentIdol.gif b/assets/cn/template/TEMPLATE_SIREN_TashkentIdol.gif new file mode 100644 index 000000000..b54d0575a Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_TashkentIdol.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_Z23_5.gif b/assets/cn/template/TEMPLATE_SIREN_Z23_5.gif new file mode 100644 index 000000000..38d890793 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_Z23_5.gif differ diff --git a/assets/en/equipment/FLEET_DETAIL_CHECK.png b/assets/en/equipment/FLEET_DETAIL_CHECK.png new file mode 100644 index 000000000..472a4db06 Binary files /dev/null and b/assets/en/equipment/FLEET_DETAIL_CHECK.png differ diff --git a/assets/en/template/TEMPLATE_SIREN_DidoIdol2.gif b/assets/en/template/TEMPLATE_SIREN_DidoIdol2.gif new file mode 100644 index 000000000..32eac9a5f Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_DidoIdol2.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_Elizabeth3.gif b/assets/en/template/TEMPLATE_SIREN_Elizabeth3.gif new file mode 100644 index 000000000..657edf629 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_Elizabeth3.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_GascogneIdol.gif b/assets/en/template/TEMPLATE_SIREN_GascogneIdol.gif new file mode 100644 index 000000000..377fc0be4 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_GascogneIdol.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_Laffey6.gif b/assets/en/template/TEMPLATE_SIREN_Laffey6.gif new file mode 100644 index 000000000..54094373f Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_Laffey6.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_RoonIdol2.gif b/assets/en/template/TEMPLATE_SIREN_RoonIdol2.gif new file mode 100644 index 000000000..e24b7e40f Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_RoonIdol2.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_SheffieldIdol.gif b/assets/en/template/TEMPLATE_SIREN_SheffieldIdol.gif new file mode 100644 index 000000000..c33810aa6 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_SheffieldIdol.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_SheffieldIdol.png b/assets/en/template/TEMPLATE_SIREN_SheffieldIdol.png deleted file mode 100644 index 25445dd60..000000000 Binary files a/assets/en/template/TEMPLATE_SIREN_SheffieldIdol.png and /dev/null differ diff --git a/assets/en/template/TEMPLATE_SIREN_TaihouIdol.gif b/assets/en/template/TEMPLATE_SIREN_TaihouIdol.gif new file mode 100644 index 000000000..9346ec9de Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_TaihouIdol.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_TashkentIdol.gif b/assets/en/template/TEMPLATE_SIREN_TashkentIdol.gif new file mode 100644 index 000000000..b54d0575a Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_TashkentIdol.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_Z23_5.gif b/assets/en/template/TEMPLATE_SIREN_Z23_5.gif new file mode 100644 index 000000000..38d890793 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_Z23_5.gif differ diff --git a/assets/jp/equipment/FLEET_DETAIL_CHECK.png b/assets/jp/equipment/FLEET_DETAIL_CHECK.png new file mode 100644 index 000000000..da1eff331 Binary files /dev/null and b/assets/jp/equipment/FLEET_DETAIL_CHECK.png differ diff --git a/assets/jp/template/TEMPLATE_SIREN_DidoIdol2.gif b/assets/jp/template/TEMPLATE_SIREN_DidoIdol2.gif new file mode 100644 index 000000000..32eac9a5f Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_DidoIdol2.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_Elizabeth3.gif b/assets/jp/template/TEMPLATE_SIREN_Elizabeth3.gif new file mode 100644 index 000000000..657edf629 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_Elizabeth3.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_GascogneIdol.gif b/assets/jp/template/TEMPLATE_SIREN_GascogneIdol.gif new file mode 100644 index 000000000..377fc0be4 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_GascogneIdol.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_Laffey6.gif b/assets/jp/template/TEMPLATE_SIREN_Laffey6.gif new file mode 100644 index 000000000..54094373f Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_Laffey6.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_RoonIdol2.gif b/assets/jp/template/TEMPLATE_SIREN_RoonIdol2.gif new file mode 100644 index 000000000..e24b7e40f Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_RoonIdol2.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_SheffieldIdol.gif b/assets/jp/template/TEMPLATE_SIREN_SheffieldIdol.gif new file mode 100644 index 000000000..c33810aa6 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_SheffieldIdol.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_TaihouIdol.gif b/assets/jp/template/TEMPLATE_SIREN_TaihouIdol.gif new file mode 100644 index 000000000..9346ec9de Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_TaihouIdol.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_TashkentIdol.gif b/assets/jp/template/TEMPLATE_SIREN_TashkentIdol.gif new file mode 100644 index 000000000..b54d0575a Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_TashkentIdol.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_Z23_5.gif b/assets/jp/template/TEMPLATE_SIREN_Z23_5.gif new file mode 100644 index 000000000..38d890793 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_Z23_5.gif differ diff --git a/assets/tw/equipment/FLEET_DETAIL_CHECK.png b/assets/tw/equipment/FLEET_DETAIL_CHECK.png new file mode 100644 index 000000000..ff18f0f7f Binary files /dev/null and b/assets/tw/equipment/FLEET_DETAIL_CHECK.png differ diff --git a/assets/tw/template/TEMPLATE_SIREN_DidoIdol2.gif b/assets/tw/template/TEMPLATE_SIREN_DidoIdol2.gif new file mode 100644 index 000000000..32eac9a5f Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_DidoIdol2.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_Elizabeth3.gif b/assets/tw/template/TEMPLATE_SIREN_Elizabeth3.gif new file mode 100644 index 000000000..657edf629 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_Elizabeth3.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_GascogneIdol.gif b/assets/tw/template/TEMPLATE_SIREN_GascogneIdol.gif new file mode 100644 index 000000000..377fc0be4 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_GascogneIdol.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_Laffey6.gif b/assets/tw/template/TEMPLATE_SIREN_Laffey6.gif new file mode 100644 index 000000000..54094373f Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_Laffey6.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_RoonIdol2.gif b/assets/tw/template/TEMPLATE_SIREN_RoonIdol2.gif new file mode 100644 index 000000000..e24b7e40f Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_RoonIdol2.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_SheffieldIdol.gif b/assets/tw/template/TEMPLATE_SIREN_SheffieldIdol.gif new file mode 100644 index 000000000..c33810aa6 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_SheffieldIdol.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_TaihouIdol.gif b/assets/tw/template/TEMPLATE_SIREN_TaihouIdol.gif new file mode 100644 index 000000000..9346ec9de Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_TaihouIdol.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_TashkentIdol.gif b/assets/tw/template/TEMPLATE_SIREN_TashkentIdol.gif new file mode 100644 index 000000000..b54d0575a Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_TashkentIdol.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_Z23_5.gif b/assets/tw/template/TEMPLATE_SIREN_Z23_5.gif new file mode 100644 index 000000000..38d890793 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_Z23_5.gif differ diff --git a/campaign/Readme.md b/campaign/Readme.md index 318c74f10..de950e751 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -190,4 +190,6 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20240321 | raid 20230629 | Reflections of the Oasis | - | - | - | 綠洲往事 | | 20240328 | raid 20240328 | From Zero to Hero | 从零开始的魔王讨伐之旅 | From Zero to Hero | ゼロから頑張る魔王討伐 | - | | 20240403 | event 20211111 cn | The Flame-Touched Dagger | - | - | - | 復刻杰諾瓦的焰火 | -| 20240411 | event 20220224 cn | Abyssal Refrain Rerun | 复刻深度回音 | Abyssal Refrain Rerun | 鳴動せし星霜の淵(復刻) | - | \ No newline at end of file +| 20240411 | event 20220224 cn | Abyssal Refrain Rerun | 复刻深度回音 | Abyssal Refrain Rerun | 鳴動せし星霜の淵(復刻) | - | +| 20240425 | event 20230817 cn | The Fool's Scales | - | - | - | 愚者的天平 | +| 20240425 | event 20240425 cn | Heart-Linking Harmony | 共鸣的PASSION | Heart-Linking Harmony | 共鳴のパッション | - | diff --git a/campaign/campaign_main/campaign_15_1.py b/campaign/campaign_main/campaign_15_1.py index 8e9f7f093..f98c6da49 100644 --- a/campaign/campaign_main/campaign_15_1.py +++ b/campaign/campaign_main/campaign_15_1.py @@ -65,15 +65,27 @@ class Config(ConfigBase): class Campaign(CampaignBase): MAP = MAP + def battle_function(self): + if self.config.MAP_CLEAR_ALL_THIS_TIME \ + and self.battle_count == 0 and not self.map_is_clear_mode: + func = self.FUNCTION_NAME_BASE + str(self.battle_count) + logger.info(f'Using function: {func}') + func = self.__getattribute__(func) + result = func() + return result + + return super().battle_function() + def battle_0(self): - if not self.map_is_clear_mode: + if not self.map_is_clear_mode and self.map_has_mob_move: self.mob_move(B3, C3) - self.clear_chosen_enemy(B1) - return True - else: - if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + if B1.is_accessible: + self.clear_chosen_enemy(B1) return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + return self.battle_default() def battle_1(self): diff --git a/campaign/campaign_main/campaign_15_2.py b/campaign/campaign_main/campaign_15_2.py index cfead5821..038ebf1a3 100644 --- a/campaign/campaign_main/campaign_15_2.py +++ b/campaign/campaign_main/campaign_15_2.py @@ -66,16 +66,28 @@ class Config(ConfigBase): class Campaign(CampaignBase): MAP = MAP + def battle_function(self): + if self.config.MAP_CLEAR_ALL_THIS_TIME \ + and self.battle_count == 0 and not self.map_is_clear_mode: + func = self.FUNCTION_NAME_BASE + str(self.battle_count) + logger.info(f'Using function: {func}') + func = self.__getattribute__(func) + result = func() + return result + + return super().battle_function() + def battle_0(self): - if not self.map_is_clear_mode: + if not self.map_is_clear_mode and self.map_has_mob_move: self.mob_move(I6, I7) self.mob_move(I7, H7) - self.clear_chosen_enemy(G7) - return True - else: - if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + if G7.is_accessible: + self.clear_chosen_enemy(G7) return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + return self.battle_default() def battle_1(self): diff --git a/campaign/campaign_main/campaign_15_3.py b/campaign/campaign_main/campaign_15_3.py index dc9cced52..b5e3e1037 100644 --- a/campaign/campaign_main/campaign_15_3.py +++ b/campaign/campaign_main/campaign_15_3.py @@ -2,10 +2,11 @@ from module.logger import logger from module.map.map_base import CampaignMap from module.map.map_grids import SelectedGrids, RoadGrids -from .campaign_15_base import CampaignBase +from .campaign_15_base import CampaignBase, W15GridInfo from .campaign_15_base import Config as ConfigBase MAP = CampaignMap('15-3') +MAP.grid_class = W15GridInfo MAP.shape = 'J8' MAP.camera_data = ['C2', 'C6', 'G2', 'G6'] MAP.camera_data_spawn_point = ['G6'] @@ -15,7 +16,7 @@ MAP.map_data = """ -- ME ++ Me -- Me ME Me ME -- ME Me ME ME Me -- ++ MB -- ME ++ -- -- ME ME Me ++ ++ __ ME - Me ME -- ++ Me -- ME MB -- Me + Me ME -- ++ Me -- ME MS -- Me ME ME -- -- ME ME ME -- -- ME Me -- __ -- -- ME -- -- ++ ++ ++ ++ ++ Me -- -- SP SP ++ ++ @@ -81,14 +82,15 @@ class Campaign(CampaignBase): return super().battle_function() def battle_0(self): - if not self.map_is_clear_mode: + if not self.map_is_clear_mode and self.map_has_mob_move: self.mob_move(B3, B4) - self.clear_chosen_enemy(A1) - return True - else: - if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + if A1.is_accessible: + self.clear_chosen_enemy(A1) return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + return self.battle_default() def battle_1(self): diff --git a/campaign/campaign_main/campaign_15_4.py b/campaign/campaign_main/campaign_15_4.py index 5899c328c..ecdcf249f 100644 --- a/campaign/campaign_main/campaign_15_4.py +++ b/campaign/campaign_main/campaign_15_4.py @@ -2,10 +2,11 @@ from module.logger import logger from module.map.map_base import CampaignMap from module.map.map_grids import SelectedGrids, RoadGrids -from .campaign_15_base import CampaignBase +from .campaign_15_base import CampaignBase, W15GridInfo from .campaign_15_base import Config as ConfigBase MAP = CampaignMap('15-4') +MAP.grid_class = W15GridInfo MAP.shape = 'K9' MAP.camera_data = ['C2', 'C5', 'C7', 'F2', 'F5', 'F7', 'H2', 'H5', 'H7'] MAP.camera_data_spawn_point = ['H2'] @@ -13,9 +14,9 @@ MAP.camera_sight = (-2, -1, 3, 2) MAP.map_data = """ Me -- ME ME Me -- ME ++ ++ ME ME ME -- -- -- -- ME -- ++ ++ -- ME - ++ -- -- MB -- -- ME SP SP ME Me + ++ -- -- MS -- -- ME SP SP ME Me ++ ME -- ++ ++ -- -- -- -- ME -- - -- Me ME MA ++ ME -- MB -- -- ME + -- Me ME MA ++ ME -- MS -- -- ME ME ME ME -- -- -- -- ++ ME -- Me ME -- __ -- ME ME -- ME ME -- ++ -- -- ++ -- Me -- ME ME ME Me ME @@ -90,28 +91,29 @@ class Campaign(CampaignBase): return super().battle_function() def battle_0(self): - if not self.map_is_clear_mode: - self.clear_chosen_enemy(A1) - return True - else: - if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + if not self.map_is_clear_mode and self.map_has_mob_move: + self.mob_move(J8, K8) + if K9.is_accessible: + self.clear_chosen_enemy(K9) return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + return self.battle_default() def battle_1(self): if not self.map_is_clear_mode: - self.mob_move(J8, J7) - self.clear_chosen_enemy(K9) - return True - else: - if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + if A1.is_accessible: + self.clear_chosen_enemy(A1) return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + return self.battle_default() def battle_2(self): - self.pick_up_ammo() if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): return True @@ -123,6 +125,7 @@ class Campaign(CampaignBase): self.fleet_1.switch_to() return True else: + self.pick_up_ammo() self.clear_chosen_enemy(H5, expected='siren') return True diff --git a/campaign/campaign_main/campaign_15_base.py b/campaign/campaign_main/campaign_15_base.py index 3e3d3897d..ce400f6da 100644 --- a/campaign/campaign_main/campaign_15_base.py +++ b/campaign/campaign_main/campaign_15_base.py @@ -2,19 +2,19 @@ from module.base.mask import Mask from module.base.timer import Timer from module.campaign.campaign_base import CampaignBase as CampaignBase_ from module.handler.assets import STRATEGY_OPENED -from module.map_detection.utils_assets import ASSETS from module.logger import logger from module.map.map_grids import SelectedGrids from module.map.utils import location_ensure +from module.map_detection.grid import GridInfo +from module.map_detection.utils_assets import ASSETS MASK_MAP_UI_W15 = Mask(file='./assets/mask/MASK_MAP_UI_W15.png') class Config: - # Disabled because having errors - MAP_SWIPE_PREDICT_WITH_SEA_GRIDS = False # Ambushes can be avoid by having more DDs. MAP_WALK_OPTIMIZE = False + MAP_HAS_MYSTERY = False MAP_ENEMY_TEMPLATE = ['Light', 'Main', 'Carrier', 'CarrierSpecial'] INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { 'height': (80, 255 - 33), @@ -27,6 +27,19 @@ class Config: MAP_SWIPE_MULTIPLY_MAATOUCH = (0.932, 0.949) +class W15GridInfo(GridInfo): + def merge(self, info, mode='normal'): + # Consider boss as siren + if info.is_boss: + if not self.is_land and self.may_siren: + self.is_siren = True + self.enemy_scale = 0 + self.enemy_genre = '' + return True + + return super().merge(info, mode=mode) + + class CampaignBase(CampaignBase_): ENEMY_FILTER = '1T > 1L > 1E > 1M > 2T > 2L > 2E > 2M > 3T > 3L > 3E > 3M' @@ -36,6 +49,17 @@ class CampaignBase(CampaignBase_): _ = ASSETS.ui_mask ASSETS.ui_mask = MASK_MAP_UI_W15.image + map_has_mob_move = True + + def strategy_set_execute(self, formation_index=None, sub_view=None, sub_hunt=None): + super().strategy_set_execute( + formation_index=formation_index, + sub_view=sub_view, + sub_hunt=sub_hunt, + ) + self.map_has_mob_move = (self.strategy_get_mob_move_remain() > 0) + logger.attr("Map has mob move", self.map_has_mob_move) + def _map_swipe(self, vector, box=(239, 159, 1175, 628)): # Left border to 239, avoid swiping on support fleet return super()._map_swipe(vector, box=box) @@ -190,4 +214,5 @@ class CampaignBase(CampaignBase_): self.strategy_close(skip_first_screenshot=False) self._mob_move_info_change(location, target) + self.find_path_initial() self.map.show() diff --git a/campaign/event_20240425_cn/campaign_base.py b/campaign/event_20240425_cn/campaign_base.py new file mode 100644 index 000000000..03ca49532 --- /dev/null +++ b/campaign/event_20240425_cn/campaign_base.py @@ -0,0 +1,56 @@ +from module.campaign.campaign_base import CampaignBase as CampaignBase_ +from module.logger import logger + + +class CampaignBase(CampaignBase_): + STAGE_INCREASE = [ + """ + SP1 > SP2 > SP3 > SP4 > SP5 + """, + """ + ISP1 > ISP2 > ISP3 > ISP4 > ISP5 > ISP6 + """, + ] + + def campaign_set_chapter_event(self, chapter, mode='normal'): + self.ui_goto_event() + self.campaign_ensure_chapter(index=chapter) + return True + + def _campaign_get_chapter_index(self, name): + """ + Args: + name (str, int): + + Returns: + int + """ + if name == 'sp': + return 1 + if name == 'isp': + return 2 + if name == 'ex_sp': + return 3 + if name == 'ex_ex': + return 4 + + return super(CampaignBase, CampaignBase)._campaign_get_chapter_index(name) + + @staticmethod + def _campaign_ocr_result_process(result): + result = CampaignBase_._campaign_ocr_result_process(result) + if result in ['usp', 'iisp']: + result = 'sp' + return result + + def is_event_animation(self): + # Blue banner + if self.image_color_count((1180, 285, 1280, 335), color=(140, 215, 255), count=1000): + logger.info('Live start!') + return True + # Red-black banner with white bottom border + if self.image_color_count((1193, 428, 1273, 436), color=(255, 255, 255), count=500): + logger.info('Live start!') + return True + + return False diff --git a/campaign/event_20240425_cn/isp1.py b/campaign/event_20240425_cn/isp1.py new file mode 100644 index 000000000..a1155dc66 --- /dev/null +++ b/campaign/event_20240425_cn/isp1.py @@ -0,0 +1,56 @@ +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('ISP1') +MAP.shape = 'E5' +MAP.camera_data = ['C2'] +MAP.camera_data_spawn_point = ['C2'] +MAP.map_data = """ + -- ++ ++ ++ -- + -- ++ MB ++ -- + -- ++ -- ++ -- + ++ -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'boss': 1}, +] +A1, B1, C1, D1, E1, \ +A2, B2, C2, D2, E2, \ +A3, B3, C3, D3, E3, \ +A4, B4, C4, D4, E4, \ +A5, B5, C5, D5, E5, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + 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_HAS_CLEAR_PERCENTAGE = False + FLEET_2 = 0 + MAP_IS_ONE_TIME_STAGE = True + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + return self.clear_boss() diff --git a/campaign/event_20240425_cn/isp2.py b/campaign/event_20240425_cn/isp2.py new file mode 100644 index 000000000..467df2a85 --- /dev/null +++ b/campaign/event_20240425_cn/isp2.py @@ -0,0 +1,53 @@ +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 .isp1 import Config as ConfigBase + +MAP = CampaignMap('ISP2') +MAP.shape = 'E5' +MAP.camera_data = ['C2'] +MAP.camera_data_spawn_point = ['C2'] +MAP.map_data = """ + -- ++ ++ ++ -- + -- ++ MB ++ -- + -- ++ -- ++ -- + ++ -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'boss': 1}, +] +A1, B1, C1, D1, E1, \ +A2, B2, C2, D2, E2, \ +A3, B3, C3, D3, E3, \ +A4, B4, C4, D4, E4, \ +A5, B5, C5, D5, E5, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + 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 ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + return self.clear_boss() diff --git a/campaign/event_20240425_cn/isp3.py b/campaign/event_20240425_cn/isp3.py new file mode 100644 index 000000000..7afccbdee --- /dev/null +++ b/campaign/event_20240425_cn/isp3.py @@ -0,0 +1,53 @@ +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 .isp1 import Config as ConfigBase + +MAP = CampaignMap('ISP3') +MAP.shape = 'E5' +MAP.camera_data = ['C2'] +MAP.camera_data_spawn_point = ['C2'] +MAP.map_data = """ + -- ++ ++ ++ -- + -- ++ MB ++ -- + -- ++ -- ++ -- + ++ -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'boss': 1}, +] +A1, B1, C1, D1, E1, \ +A2, B2, C2, D2, E2, \ +A3, B3, C3, D3, E3, \ +A4, B4, C4, D4, E4, \ +A5, B5, C5, D5, E5, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + 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 ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + return self.clear_boss() diff --git a/campaign/event_20240425_cn/isp4.py b/campaign/event_20240425_cn/isp4.py new file mode 100644 index 000000000..eaa0a32d6 --- /dev/null +++ b/campaign/event_20240425_cn/isp4.py @@ -0,0 +1,53 @@ +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 .isp1 import Config as ConfigBase + +MAP = CampaignMap('ISP4') +MAP.shape = 'E5' +MAP.camera_data = ['C2'] +MAP.camera_data_spawn_point = ['C2'] +MAP.map_data = """ + -- ++ ++ ++ -- + -- ++ MB ++ -- + -- ++ -- ++ -- + ++ -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'boss': 1}, +] +A1, B1, C1, D1, E1, \ +A2, B2, C2, D2, E2, \ +A3, B3, C3, D3, E3, \ +A4, B4, C4, D4, E4, \ +A5, B5, C5, D5, E5, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + 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 ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + return self.clear_boss() diff --git a/campaign/event_20240425_cn/isp5.py b/campaign/event_20240425_cn/isp5.py new file mode 100644 index 000000000..89ed824a0 --- /dev/null +++ b/campaign/event_20240425_cn/isp5.py @@ -0,0 +1,53 @@ +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 .isp1 import Config as ConfigBase + +MAP = CampaignMap('ISP5') +MAP.shape = 'E5' +MAP.camera_data = ['C2'] +MAP.camera_data_spawn_point = ['C2'] +MAP.map_data = """ + -- ++ ++ ++ -- + -- ++ MB ++ -- + -- ++ -- ++ -- + ++ -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'boss': 1}, +] +A1, B1, C1, D1, E1, \ +A2, B2, C2, D2, E2, \ +A3, B3, C3, D3, E3, \ +A4, B4, C4, D4, E4, \ +A5, B5, C5, D5, E5, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + 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 ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + return self.clear_boss() diff --git a/campaign/event_20240425_cn/isp6.py b/campaign/event_20240425_cn/isp6.py new file mode 100644 index 000000000..298ede101 --- /dev/null +++ b/campaign/event_20240425_cn/isp6.py @@ -0,0 +1,53 @@ +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 .isp1 import Config as ConfigBase + +MAP = CampaignMap('ISP6') +MAP.shape = 'E5' +MAP.camera_data = ['C2'] +MAP.camera_data_spawn_point = ['C2'] +MAP.map_data = """ + -- ++ ++ ++ -- + -- ++ MB ++ -- + -- ++ -- ++ -- + ++ -- 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'boss': 1}, +] +A1, B1, C1, D1, E1, \ +A2, B2, C2, D2, E2, \ +A3, B3, C3, D3, E3, \ +A4, B4, C4, D4, E4, \ +A5, B5, C5, D5, E5, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + 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 ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + return self.clear_boss() diff --git a/campaign/event_20240425_cn/sp.py b/campaign/event_20240425_cn/sp.py new file mode 100644 index 000000000..8777c132b --- /dev/null +++ b/campaign/event_20240425_cn/sp.py @@ -0,0 +1,114 @@ +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('SP') +MAP.shape = 'I9' +MAP.camera_data = ['C5', 'F5'] +MAP.camera_data_spawn_point = ['E7'] +MAP.camera_sight = (-2, -1, 3, 2) +MAP.map_data = """ + -- ++ ++ -- -- -- ++ ++ -- + -- ++ ++ -- MB -- ++ ++ -- + ++ ++ ++ ++ -- ++ ++ ++ ++ + -- ME ++ -- -- -- ++ ME -- + 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 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 6, 'siren': 4}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6}, + {'battle': 7, '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: + # ===== Start of generated config ===== + 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_HAS_SIREN = True + MAP_HAS_CLEAR_PERCENTAGE = False + MAP_IS_ONE_TIME_STAGE = True + HOMO_STORAGE = ((9, 6), [(165.083, 80.309), (1168.09, 80.309), (21.023, 612.379), (1325.484, 612.379)]) + + MAP_SWIPE_MULTIPLY = (1.009, 1.028) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.976, 0.994) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.948, 0.965) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_WALK_USE_CURRENT_FLEET = True + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def map_data_init(self, map_): + super().map_data_init(map_) + D4.is_siren = True + D6.is_siren = True + F4.is_siren = True + F6.is_siren = True + + 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() + + def is_event_animation(self): + # Red-black banner with white bottom border + if self.image_color_count((1193, 322, 1273, 329), color=(255, 255, 255), count=500): + logger.info('Live start!') + return True + + return False \ No newline at end of file diff --git a/campaign/event_20240425_cn/sp1.py b/campaign/event_20240425_cn/sp1.py new file mode 100644 index 000000000..582355652 --- /dev/null +++ b/campaign/event_20240425_cn/sp1.py @@ -0,0 +1,87 @@ +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('SP1') +MAP.shape = 'I8' +MAP.camera_data = ['C3', 'C6', 'E3', 'E6'] +MAP.camera_data_spawn_point = ['E3'] +MAP.camera_sight = (-2, -1, 3, 2) +MAP.map_data = """ + -- -- -- -- -- -- -- -- -- + -- -- ME ++ ++ ++ -- ++ -- + ++ ME -- ++ MB ++ ME -- ME + ++ -- -- ++ -- ++ -- -- -- + -- Me -- SP -- SP -- Me -- + ME -- -- -- __ -- -- -- ME + -- ++ ME -- MS -- ME ++ ++ + -- -- -- Me ++ Me -- -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +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 = ['Laffey6'] + 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': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + MAP_SWIPE_MULTIPLY = (1.062, 1.082) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.027, 1.046) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.997, 1.015) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_WALK_USE_CURRENT_FLEET = True + + +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_20240425_cn/sp2.py b/campaign/event_20240425_cn/sp2.py new file mode 100644 index 000000000..33db6a645 --- /dev/null +++ b/campaign/event_20240425_cn/sp2.py @@ -0,0 +1,78 @@ +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 .sp1 import Config as ConfigBase + +MAP = CampaignMap('SP2') +MAP.shape = 'I7' +MAP.camera_data = ['D2', 'D5', 'F5'] +MAP.camera_data_spawn_point = ['F2'] +MAP.camera_sight = (-2, -1, 3, 2) +MAP.map_data = """ + -- -- ME -- -- MS -- -- SP + -- ++ ++ Me __ Me MS -- -- + -- ++ ++ Me -- MS -- -- SP + -- -- 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 +""" +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 = ['TashkentIdol', 'DidoIdol2'] + 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 ===== + + HOMO_STORAGE = ((7, 4), [(179.668, 262.579), (1042.431, 262.579), (89.435, 660.188), (1122.585, 660.188)]) + 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_20240425_cn/sp3.py b/campaign/event_20240425_cn/sp3.py new file mode 100644 index 000000000..46e4a9a39 --- /dev/null +++ b/campaign/event_20240425_cn/sp3.py @@ -0,0 +1,81 @@ +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 .sp1 import Config as ConfigBase + +MAP = CampaignMap('SP3') +MAP.shape = 'I8' +MAP.camera_data = ['C4', 'E4', 'E6'] +MAP.camera_data_spawn_point = ['C6'] +MAP.camera_sight = (-2, -1, 3, 2) +MAP.map_data = """ + ++ ++ ++ ++ -- ++ ++ ++ -- + -- ++ MB ++ ME -- ME -- -- + ME ++ -- ++ -- Me -- ME -- + -- Me -- Me -- ++ -- ME ++ + -- MS __ MS -- Me -- -- ++ + -- -- MS -- -- -- -- 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 +""" +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 = ['SheffieldIdol', 'RoonIdol2'] + 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.069, 1.089) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.034, 1.053) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.004, 1.022) + + +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_20240425_cn/sp4.py b/campaign/event_20240425_cn/sp4.py new file mode 100644 index 000000000..7b522cd11 --- /dev/null +++ b/campaign/event_20240425_cn/sp4.py @@ -0,0 +1,81 @@ +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 .sp1 import Config as ConfigBase + +MAP = CampaignMap('SP4') +MAP.shape = 'I8' +MAP.camera_data = ['C3', 'C6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['D2'] +MAP.camera_sight = (-2, -1, 3, 2) +MAP.map_data = """ + ++ ++ ++ SP -- SP ++ ++ ++ + -- Me -- -- -- -- -- Me -- + ME -- MS -- MS -- MS -- ME + -- ++ -- Me __ Me -- ++ -- + -- Me -- ++ ++ ++ -- Me -- + ME -- -- ++ MB ++ -- -- 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': 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, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Z23_5', 'Elizabeth3'] + 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.251, 1.275) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.210, 1.232) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.175, 1.196) + + +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_20240425_cn/sp5.py b/campaign/event_20240425_cn/sp5.py new file mode 100644 index 000000000..42867b5db --- /dev/null +++ b/campaign/event_20240425_cn/sp5.py @@ -0,0 +1,93 @@ +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 .sp1 import Config as ConfigBase + +MAP = CampaignMap('SP5') +MAP.shape = 'I9' +MAP.camera_data = ['C4', 'C7', 'F4', 'F7'] +MAP.camera_data_spawn_point = ['C7'] +MAP.camera_sight = (-2, -1, 3, 2) +MAP.map_data = """ + ++ ++ -- ++ ++ ++ -- ++ ++ + ++ ++ ME -- Me -- ME -- ++ + -- -- -- ME -- ME -- -- -- + -- ME -- ++ ++ ++ -- ME -- + ME ++ -- ++ MB ++ -- ++ ME + -- ++ -- ++ -- ++ -- ++ -- + -- -- MS -- MS -- MS -- -- + 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 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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['GascogneIdol', 'TaihouIdol'] + 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.012, 1.031) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.979, 0.997) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.950, 0.968) + + +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/deploy/AidLux/0.92/requirements.txt b/deploy/AidLux/0.92/requirements.txt index 78ea35953..6bdd5e1ab 100644 --- a/deploy/AidLux/0.92/requirements.txt +++ b/deploy/AidLux/0.92/requirements.txt @@ -13,6 +13,7 @@ onepush pillow prettytable==2.2.1 psutil==5.9.3 +pycryptodome==3.10.4 pydantic pypresence==4.2.1 pywebio==1.6.2 diff --git a/deploy/AidLux/requirements_generator.py b/deploy/AidLux/requirements_generator.py index a5bbda2f5..dc9eee768 100644 --- a/deploy/AidLux/requirements_generator.py +++ b/deploy/AidLux/requirements_generator.py @@ -45,6 +45,7 @@ def write_file(file, data): def aidlux_requirements_generate(requirements_in='requirements-in.txt'): logger.info('aidlux_requirements_generate') requirements = read_file(requirements_in) + requirements = dict(sorted(requirements.items())) for aidlux in iter_version(): logger.info(f'Generate requirements for AidLux {aidlux}') pre_installed = read_file(os.path.join(BASE_FOLDER, f'./{aidlux}/pre-installed.txt')) diff --git a/deploy/config.py b/deploy/config.py index 94852494e..528a16078 100644 --- a/deploy/config.py +++ b/deploy/config.py @@ -98,6 +98,8 @@ class DeployConfig(ConfigModel): if hasattr(self, key): super().__setattr__(key, value) + self.config_redirect() + def write(self): poor_yaml_write(self.config, self.file) diff --git a/deploy/docker/requirements.txt b/deploy/docker/requirements.txt index eaa999932..27ad15099 100644 --- a/deploy/docker/requirements.txt +++ b/deploy/docker/requirements.txt @@ -1,31 +1,43 @@ -adbutils==0.11.0 -aiofiles -anyio==1.3.1 -av==10.0.0 -cnocr==1.2.2 -imageio==2.27.0 -inflection -jellyfish==0.11.2 -lz4 -mxnet==1.6.0 +# Image processing numpy==1.16.6 -onepush -opencv-python-headless -pillow -prettytable==2.2.1 -psutil==5.9.3 -pydantic -pypresence==4.2.1 -pywebio==1.6.2 -pyyaml -pyzmq==22.3.0 -retrying -rich==11.2.0 scipy==1.4.1 -starlette==0.14.2 -tqdm +pillow +opencv-python-headless +imageio==2.27.0 + +# Device connection +adbutils==0.11.0 uiautomator2==2.16.17 uiautomator2cache==0.3.0.1 -uvicorn[standard]==0.17.6 wrapt==1.13.1 -zerorpc==0.6.3 \ No newline at end of file +retrying +lz4 +av==10.0.0 +psutil==5.9.3 + +# Utils +rich==11.2.0 +tqdm +jellyfish==0.11.2 +pyyaml +inflection +pydantic +aiofiles +prettytable==2.2.1 +anyio==1.3.1 + +# Pushing +onepush==1.3.0 +pycryptodome==3.9.9 +pypresence==4.2.1 + +# Ocr +cnocr==1.2.2 +mxnet==1.6.0 + +# Webui +pywebio==1.6.2 +starlette==0.14.2 +uvicorn[standard]==0.17.6 +zerorpc==0.6.3 +pyzmq==22.3.0 \ No newline at end of file diff --git a/deploy/docker/requirements_generator.py b/deploy/docker/requirements_generator.py index 75290c7f4..9f5b4d17d 100644 --- a/deploy/docker/requirements_generator.py +++ b/deploy/docker/requirements_generator.py @@ -10,6 +10,8 @@ def read_file(file): out = {} with open(file, 'r', encoding='utf-8') as f: for line in f.readlines(): + if not line.strip(): + continue res = [s.strip() for s in line.split('==')] if len(res) > 1: name, version = res @@ -29,7 +31,9 @@ def write_file(file, data): lines.append(str(name)) with open(file, 'w', encoding='utf-8', newline='') as f: - f.write('\n'.join(lines)) + text = '\n'.join(lines) + text = text.replace('#', '\n#').strip() + f.write(text) def docker_requirements_generate(requirements_in='requirements-in.txt'): diff --git a/deploy/git.py b/deploy/git.py new file mode 100644 index 000000000..83572e769 --- /dev/null +++ b/deploy/git.py @@ -0,0 +1,115 @@ +from deploy.config import DeployConfig +from deploy.git_over_cdn.client import GitOverCdnClient +from deploy.logger import logger +from deploy.utils import * + + +class GitManager(DeployConfig): + @cached_property + def git(self): + return self.filepath('GitExecutable') + + @staticmethod + def remove(file): + try: + os.remove(file) + logger.info(f'Removed file: {file}') + except FileNotFoundError: + logger.info(f'File not found: {file}') + + def git_repository_init( + self, repo, source='origin', branch='master', + proxy='', ssl_verify=True, keep_changes=False + ): + logger.hr('Git Init', 1) + if not self.execute(f'"{self.git}" init', allow_failure=True): + self.remove('./.git/config') + self.remove('./.git/index') + self.remove('./.git/HEAD') + self.execute(f'"{self.git}" init') + + logger.hr('Set Git Proxy', 1) + if proxy: + self.execute(f'"{self.git}" config --local http.proxy {proxy}') + self.execute(f'"{self.git}" config --local https.proxy {proxy}') + else: + self.execute(f'"{self.git}" config --local --unset http.proxy', allow_failure=True) + self.execute(f'"{self.git}" config --local --unset https.proxy', allow_failure=True) + + if ssl_verify: + self.execute(f'"{self.git}" config --local http.sslVerify true', allow_failure=True) + else: + self.execute(f'"{self.git}" config --local http.sslVerify false', allow_failure=True) + + logger.hr('Set Git Repository', 1) + if not self.execute(f'"{self.git}" remote set-url {source} {repo}', allow_failure=True): + self.execute(f'"{self.git}" remote add {source} {repo}') + + logger.hr('Fetch Repository Branch', 1) + self.execute(f'"{self.git}" fetch {source} {branch}') + + logger.hr('Pull Repository Branch', 1) + # Remove git lock + for lock_file in [ + './.git/index.lock', + './.git/HEAD.lock', + './.git/refs/heads/master.lock', + ]: + if os.path.exists(lock_file): + logger.info(f'Lock file {lock_file} exists, removing') + os.remove(lock_file) + if keep_changes: + if self.execute(f'"{self.git}" stash', allow_failure=True): + self.execute(f'"{self.git}" pull --ff-only {source} {branch}') + if self.execute(f'"{self.git}" stash pop', allow_failure=True): + pass + else: + # No local changes to existing files, untracked files not included + logger.info('Stash pop failed, there seems to be no local changes, skip instead') + else: + logger.info('Stash failed, this may be the first installation, drop changes instead') + self.execute(f'"{self.git}" reset --hard {source}/{branch}') + self.execute(f'"{self.git}" pull --ff-only {source} {branch}') + else: + self.execute(f'"{self.git}" reset --hard {source}/{branch}') + self.execute(f'"{self.git}" pull --ff-only {source} {branch}') + + logger.hr('Show Version', 1) + self.execute(f'"{self.git}" --no-pager log --no-merges -1') + + @property + def goc_client(self): + client = GitOverCdnClient( + url='https://vip.123pan.cn/1818706573/pack/LmeSzinc_AzurLaneAutoScript_master', + folder=self.root_filepath, + source='origin', + branch='master', + git=self.git, + ) + client.logger = logger + return client + + def git_install(self): + logger.hr('Update Alas', 0) + + if not self.AutoUpdate: + logger.info('AutoUpdate is disabled, skip') + return + + if self.GitOverCdn: + if self.goc_client.update(keep_changes=self.KeepLocalChanges): + return + + self.git_repository_init( + repo=self.Repository, + source='origin', + branch=self.Branch, + proxy=self.GitProxy, + ssl_verify=self.SSLVerify, + keep_changes=self.KeepLocalChanges, + ) + + +if __name__ == '__main__': + self = GitManager() + self.goc_client.get_status() \ No newline at end of file diff --git a/deploy/headless/requirements.txt b/deploy/headless/requirements.txt index c563a82b7..b10cef4d5 100644 --- a/deploy/headless/requirements.txt +++ b/deploy/headless/requirements.txt @@ -1,31 +1,43 @@ -adbutils==0.11.0 -aiofiles==23.1.0 -anyio==1.3.1 -av==10.0.0 -cnocr==1.2.2 -imageio==2.27.0 -inflection==0.5.1 -jellyfish==0.11.2 -lz4==4.3.2 -mxnet==1.6.0 +# Image processing numpy==1.17.4 -onepush==1.2.0 -opencv-python-headless==4.7.0.72 -pillow==9.5.0 -prettytable==2.2.1 -psutil==5.9.3 -pydantic==1.10.9 -pypresence==4.2.1 -pywebio==1.6.2 -pyyaml==6.0 -pyzmq==22.3.0 -retrying==1.3.4 -rich==11.2.0 scipy==1.4.1 -starlette==0.14.2 -tqdm==4.65.0 +pillow==9.5.0 +opencv-python-headless==4.7.0.72 +imageio==2.27.0 + +# Device connection +adbutils==0.11.0 uiautomator2==2.16.17 uiautomator2cache==0.3.0.1 -uvicorn[standard]==0.17.6 wrapt==1.15.0 -zerorpc==0.6.3 \ No newline at end of file +retrying==1.3.4 +lz4==4.3.2 +av==10.0.0 +psutil==5.9.3 + +# Utils +rich==11.2.0 +tqdm==4.65.0 +jellyfish==0.11.2 +pyyaml==6.0 +inflection==0.5.1 +pydantic==1.10.9 +aiofiles==23.1.0 +prettytable==2.2.1 +anyio==1.3.1 + +# Pushing +onepush==1.3.0 +pycryptodome==3.9.9 +pypresence==4.2.1 + +# Ocr +cnocr==1.2.2 +mxnet==1.6.0 + +# Webui +pywebio==1.6.2 +starlette==0.14.2 +uvicorn[standard]==0.17.6 +zerorpc==0.6.3 +pyzmq==22.3.0 \ No newline at end of file diff --git a/deploy/headless/requirements_generator.py b/deploy/headless/requirements_generator.py index bacf1ec7a..9c3c1ddbd 100644 --- a/deploy/headless/requirements_generator.py +++ b/deploy/headless/requirements_generator.py @@ -10,6 +10,8 @@ def read_file(file): out = {} with open(file, 'r', encoding='utf-8') as f: for line in f.readlines(): + if not line.strip(): + continue res = [s.strip() for s in line.split('==')] if len(res) > 1: name, version = res @@ -29,7 +31,9 @@ def write_file(file, data): lines.append(str(name)) with open(file, 'w', encoding='utf-8', newline='') as f: - f.write('\n'.join(lines)) + text = '\n'.join(lines) + text = text.replace('#', '\n#').strip() + f.write(text) def headless_requirements_generate(requirements_in='requirements-in.txt'): @@ -41,7 +45,7 @@ def headless_requirements_generate(requirements_in='requirements-in.txt'): 'inflection': '0.5.1', 'lz4': '4.3.2', 'numpy': '1.17.4', - 'onepush': '1.2.0', + # 'onepush': '1.2.0', 'opencv-python': { 'name': 'opencv-python-headless', 'version': '4.7.0.72' diff --git a/dev_tools/button_extract.py b/dev_tools/button_extract.py index 1c8eb2dff..b966f1a77 100644 --- a/dev_tools/button_extract.py +++ b/dev_tools/button_extract.py @@ -174,6 +174,8 @@ class ModuleExtractor: exp.append(ImageExtractor(module=self.name, file=file).expression) continue + exp.sort() + logger.info('Module: %s(%s)' % (self.name, len(exp))) exp = IMPORT_EXP + exp return exp diff --git a/dev_tools/map_extractor.py b/dev_tools/map_extractor.py index be324c21e..7dcafcf03 100644 --- a/dev_tools/map_extractor.py +++ b/dev_tools/map_extractor.py @@ -248,6 +248,14 @@ DIC_SIREN_NAME_CHI_TO_ENG = { # Light-Chasing Sea of Stars 'sairenboss10': 'Sirenboss10', 'UDFsairen_baolei_2': 'UDFFortress2', + + # Heart-Linking Harmony + 'lafei_6': 'Laffey6', + 'tashigan_idol': 'TashkentIdol', + 'xiefeierde_idol': 'SheffieldIdol', + 'yilishabai_3': 'Elizabeth3', + 'jiasikenie_idol': 'GascogneIdol', + 'dafeng_idol': 'TaihouIdol', } diff --git a/module/campaign/campaign_ocr.py b/module/campaign/campaign_ocr.py index 763dda45f..1929fdf00 100644 --- a/module/campaign/campaign_ocr.py +++ b/module/campaign/campaign_ocr.py @@ -59,7 +59,7 @@ class CampaignOcr(ModuleBase): name = name.strip('-') if name == 'sp': return 'ex_sp', '1' - elif name.startswith('extra'): + elif name.startswith('extra') or name == 'ex': return 'ex_ex', '1' elif '-' in name: return name.split('-') diff --git a/module/campaign/run.py b/module/campaign/run.py index 0cd688db6..a4545ff18 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -196,6 +196,12 @@ class CampaignRun(CampaignEvent, ShopStatus): name = 'sp' if folder == 'event_20221124_cn' and name in ['asp', 'a.sp']: name = 'sp' + if folder == 'event_20240425_cn': + if name in ['μsp', 'usp', 'iisp']: + name = 'sp' + name = name.replace('lsp', 'isp').replace('1sp', 'isp') + if name == 'isp': + name = 'isp1' # Convert to chapter T convert = { 'a1': 't1', diff --git a/module/config/argument/args.json b/module/config/argument/args.json index bcdfb049d..4e3ce4252 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1715,17 +1715,18 @@ "event_20231026_cn", "event_20231123_cn", "event_20231221_cn", - "event_20240229_cn" + "event_20240229_cn", + "event_20240425_cn" ], "display": "hide", "option_bold": [ - "event_20220224_cn", - "event_20211111_cn" + "event_20230817_cn", + "event_20240425_cn" ], - "cn": "event_20220224_cn", - "en": "event_20220224_cn", - "jp": "event_20220224_cn", - "tw": "event_20211111_cn" + "cn": "event_20240425_cn", + "en": "event_20240425_cn", + "jp": "event_20240425_cn", + "tw": "event_20230817_cn" }, "Mode": { "type": "select", @@ -2049,16 +2050,17 @@ "event_20231026_cn", "event_20231123_cn", "event_20231221_cn", - "event_20240229_cn" + "event_20240229_cn", + "event_20240425_cn" ], "option_bold": [ - "event_20220224_cn", - "event_20211111_cn" + "event_20230817_cn", + "event_20240425_cn" ], - "cn": "event_20220224_cn", - "en": "event_20220224_cn", - "jp": "event_20220224_cn", - "tw": "event_20211111_cn" + "cn": "event_20240425_cn", + "en": "event_20240425_cn", + "jp": "event_20240425_cn", + "tw": "event_20230817_cn" }, "Mode": { "type": "select", @@ -2497,16 +2499,17 @@ "event_20231026_cn", "event_20231123_cn", "event_20231221_cn", - "event_20240229_cn" + "event_20240229_cn", + "event_20240425_cn" ], "option_bold": [ - "event_20220224_cn", - "event_20211111_cn" + "event_20230817_cn", + "event_20240425_cn" ], - "cn": "event_20220224_cn", - "en": "event_20220224_cn", - "jp": "event_20220224_cn", - "tw": "event_20211111_cn" + "cn": "event_20240425_cn", + "en": "event_20240425_cn", + "jp": "event_20240425_cn", + "tw": "event_20230817_cn" }, "Mode": { "type": "select", @@ -3359,8 +3362,8 @@ "raid_20240328" ], "option_bold": [ - "raid_20240328", - "raid_20230629" + "raid_20230629", + "raid_20240328" ], "cn": "raid_20240328", "en": "raid_20240328", @@ -4339,16 +4342,17 @@ "event_20231026_cn", "event_20231123_cn", "event_20231221_cn", - "event_20240229_cn" + "event_20240229_cn", + "event_20240425_cn" ], "option_bold": [ - "event_20220224_cn", - "event_20211111_cn" + "event_20230817_cn", + "event_20240425_cn" ], - "cn": "event_20220224_cn", - "en": "event_20220224_cn", - "jp": "event_20220224_cn", - "tw": "event_20211111_cn" + "cn": "event_20240425_cn", + "en": "event_20240425_cn", + "jp": "event_20240425_cn", + "tw": "event_20230817_cn" }, "Mode": { "type": "select", @@ -4804,16 +4808,17 @@ "event_20231026_cn", "event_20231123_cn", "event_20231221_cn", - "event_20240229_cn" + "event_20240229_cn", + "event_20240425_cn" ], "option_bold": [ - "event_20220224_cn", - "event_20211111_cn" + "event_20230817_cn", + "event_20240425_cn" ], - "cn": "event_20220224_cn", - "en": "event_20220224_cn", - "jp": "event_20220224_cn", - "tw": "event_20211111_cn" + "cn": "event_20240425_cn", + "en": "event_20240425_cn", + "jp": "event_20240425_cn", + "tw": "event_20230817_cn" }, "Mode": { "type": "select", @@ -5269,16 +5274,17 @@ "event_20231026_cn", "event_20231123_cn", "event_20231221_cn", - "event_20240229_cn" + "event_20240229_cn", + "event_20240425_cn" ], "option_bold": [ - "event_20220224_cn", - "event_20211111_cn" + "event_20230817_cn", + "event_20240425_cn" ], - "cn": "event_20220224_cn", - "en": "event_20220224_cn", - "jp": "event_20220224_cn", - "tw": "event_20211111_cn" + "cn": "event_20240425_cn", + "en": "event_20240425_cn", + "jp": "event_20240425_cn", + "tw": "event_20230817_cn" }, "Mode": { "type": "select", @@ -5734,16 +5740,17 @@ "event_20231026_cn", "event_20231123_cn", "event_20231221_cn", - "event_20240229_cn" + "event_20240229_cn", + "event_20240425_cn" ], "option_bold": [ - "event_20220224_cn", - "event_20211111_cn" + "event_20230817_cn", + "event_20240425_cn" ], - "cn": "event_20220224_cn", - "en": "event_20220224_cn", - "jp": "event_20220224_cn", - "tw": "event_20211111_cn" + "cn": "event_20240425_cn", + "en": "event_20240425_cn", + "jp": "event_20240425_cn", + "tw": "event_20230817_cn" }, "Mode": { "type": "select", @@ -6189,16 +6196,17 @@ "event_20231026_cn", "event_20231123_cn", "event_20231221_cn", - "event_20240229_cn" + "event_20240229_cn", + "event_20240425_cn" ], "option_bold": [ - "event_20220224_cn", - "event_20211111_cn" + "event_20230817_cn", + "event_20240425_cn" ], - "cn": "event_20220224_cn", - "en": "event_20220224_cn", - "jp": "event_20220224_cn", - "tw": "event_20211111_cn" + "cn": "event_20240425_cn", + "en": "event_20240425_cn", + "jp": "event_20240425_cn", + "tw": "event_20230817_cn" }, "Mode": { "type": "select", @@ -6600,8 +6608,8 @@ "raid_20240328" ], "option_bold": [ - "raid_20240328", - "raid_20230629" + "raid_20230629", + "raid_20240328" ], "cn": "raid_20240328", "en": "raid_20240328", diff --git a/module/config/config_manual.py b/module/config/config_manual.py index 14a4c6731..1d1d8e952 100644 --- a/module/config/config_manual.py +++ b/module/config/config_manual.py @@ -142,7 +142,7 @@ class ManualConfig: MAP_HAS_MYSTERY = True MAP_MYSTERY_MAP_CLICK = True MAP_MYSTERY_HAS_CARRIER = False - MAP_GRID_CENTER_TOLERANCE = 0.1 + MAP_GRID_CENTER_TOLERANCE = 0.2 MOVABLE_ENEMY_FLEET_STEP = 2 MOVABLE_ENEMY_TURN = (2,) diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 37fb9a45f..284007fd3 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -727,6 +727,7 @@ "event_20231123_cn": "The Ninja Scrolls: Azur Flash", "event_20231221_cn": "Light-Chasing Sea of Stars", "event_20240229_cn": "Snowrealm Peregrination", + "event_20240425_cn": "Heart-Linking Harmony", "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 c16b49f43..944cf38ad 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -727,6 +727,7 @@ "event_20231123_cn": "蒼閃忍法帖", "event_20231221_cn": "光追う星の海", "event_20240229_cn": "銀界遊廻", + "event_20240425_cn": "共鳴のパッション", "raid_20200624": "特別演習超空強襲波(復刻)", "raid_20210708": "交錯する新たな波 (復刻)", "raid_20220127": "秘密事件調査", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 45b365b18..43abca0e9 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -727,6 +727,7 @@ "event_20231123_cn": "苍闪忍法帖", "event_20231221_cn": "星海逐光", "event_20240229_cn": "雪境迷踪", + "event_20240425_cn": "共鸣的PASSION", "raid_20200624": "复刻特别演习埃塞克斯级", "raid_20210708": "复刻穿越彼方的水线", "raid_20220127": "演习神秘事件调查", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index d12c4c939..7b14c4b78 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -721,12 +721,13 @@ "event_20230223_cn": "湮燼塵墟", "event_20230525_cn": "Confluence of Nothingness", "event_20230803_cn": "奏響鳶尾之歌", - "event_20230817_cn": "The Fools Scales", + "event_20230817_cn": "愚者的天平", "event_20230914_cn": "Effulgence Before Eclipse", "event_20231026_cn": "Tempesta and the Fountain of Youth", "event_20231123_cn": "蒼閃忍法帖", "event_20231221_cn": "Light-Chasing Sea of Stars", "event_20240229_cn": "Snowrealm Peregrination", + "event_20240425_cn": "Heart-Linking Harmony", "raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20210708": "復刻穿越彼方的水線", "raid_20220127": "演習神秘事件調查", diff --git a/module/device/connection.py b/module/device/connection.py index 0611d523b..71ebbdeef 100644 --- a/module/device/connection.py +++ b/module/device/connection.py @@ -506,30 +506,51 @@ class Connection(ConnectionAttr): def adb_forward_remove(self, local): """ Equivalent to `adb -s forward --remove ` + No error raised when removing a non-existent forward + More about the commands send to ADB server, see: https://cs.android.com/android/platform/superproject/+/master:packages/modules/adb/SERVICES.TXT Args: local (str): Such as 'tcp:2437' """ - with self.adb_client._connect() as c: - list_cmd = f"host-serial:{self.serial}:killforward:{local}" - c.send_command(list_cmd) - c.check_okay() + try: + with self.adb_client._connect() as c: + list_cmd = f"host-serial:{self.serial}:killforward:{local}" + c.send_command(list_cmd) + c.check_okay() + except AdbError as e: + # No error raised when removing a non-existed forward + # adbutils.errors.AdbError: listener 'tcp:8888' not found + msg = str(e) + if re.search(r'listener .*? not found', msg): + logger.warning(f'{type(e).__name__}: {msg}') + else: + raise def adb_reverse_remove(self, local): """ Equivalent to `adb -s reverse --remove ` + No error raised when removing a non-existent reverse Args: local (str): Such as 'tcp:2437' """ - with self.adb_client._connect() as c: - c.send_command(f"host:transport:{self.serial}") - c.check_okay() - list_cmd = f"reverse:killforward:{local}" - c.send_command(list_cmd) - c.check_okay() + try: + with self.adb_client._connect() as c: + c.send_command(f"host:transport:{self.serial}") + c.check_okay() + list_cmd = f"reverse:killforward:{local}" + c.send_command(list_cmd) + c.check_okay() + except AdbError as e: + # No error raised when removing a non-existed forward + # adbutils.errors.AdbError: listener 'tcp:8888' not found + msg = str(e) + if re.search(r'listener .*? not found', msg): + logger.warning(f'{type(e).__name__}: {msg}') + else: + raise def adb_push(self, local, remote): """ diff --git a/module/equipment/assets.py b/module/equipment/assets.py index f5a567a82..30ebfd803 100644 --- a/module/equipment/assets.py +++ b/module/equipment/assets.py @@ -21,6 +21,10 @@ EQUIP_TAKE_ON_1 = Button(area={'cn': (907, 338, 991, 431), 'en': (907, 338, 991, EQUIP_TAKE_ON_2 = Button(area={'cn': (866, 511, 950, 604), 'en': (866, 511, 950, 604), 'jp': (866, 511, 950, 604), 'tw': (866, 511, 950, 604)}, color={'cn': (117, 118, 127), 'en': (117, 118, 127), 'jp': (117, 118, 127), 'tw': (117, 118, 127)}, button={'cn': (866, 511, 950, 604), 'en': (866, 511, 950, 604), 'jp': (866, 511, 950, 604), 'tw': (866, 511, 950, 604)}, file={'cn': './assets/cn/equipment/EQUIP_TAKE_ON_2.png', 'en': './assets/en/equipment/EQUIP_TAKE_ON_2.png', 'jp': './assets/jp/equipment/EQUIP_TAKE_ON_2.png', 'tw': './assets/tw/equipment/EQUIP_TAKE_ON_2.png'}) EQUIP_TAKE_ON_3 = Button(area={'cn': (129, 252, 213, 345), 'en': (129, 252, 213, 345), 'jp': (129, 252, 213, 345), 'tw': (129, 252, 213, 345)}, color={'cn': (105, 108, 115), 'en': (105, 108, 115), 'jp': (105, 108, 115), 'tw': (105, 108, 115)}, button={'cn': (129, 252, 213, 345), 'en': (129, 252, 213, 345), 'jp': (129, 252, 213, 345), 'tw': (129, 252, 213, 345)}, file={'cn': './assets/cn/equipment/EQUIP_TAKE_ON_3.png', 'en': './assets/en/equipment/EQUIP_TAKE_ON_3.png', 'jp': './assets/jp/equipment/EQUIP_TAKE_ON_3.png', 'tw': './assets/tw/equipment/EQUIP_TAKE_ON_3.png'}) EQUIP_TAKE_ON_4 = Button(area={'cn': (128, 432, 212, 525), 'en': (128, 432, 212, 525), 'jp': (128, 432, 212, 525), 'tw': (128, 432, 212, 525)}, color={'cn': (109, 111, 120), 'en': (109, 111, 120), 'jp': (109, 111, 120), 'tw': (109, 111, 120)}, button={'cn': (128, 432, 212, 525), 'en': (128, 432, 212, 525), 'jp': (128, 432, 212, 525), 'tw': (128, 432, 212, 525)}, file={'cn': './assets/cn/equipment/EQUIP_TAKE_ON_4.png', 'en': './assets/en/equipment/EQUIP_TAKE_ON_4.png', 'jp': './assets/jp/equipment/EQUIP_TAKE_ON_4.png', 'tw': './assets/tw/equipment/EQUIP_TAKE_ON_4.png'}) +FLEET_DETAIL = Button(area={'cn': (906, 644, 1008, 699), 'en': (906, 644, 1008, 699), 'jp': (906, 644, 1008, 699), 'tw': (906, 644, 1008, 699)}, color={'cn': (166, 170, 188), 'en': (166, 170, 188), 'jp': (166, 170, 188), 'tw': (166, 170, 188)}, button={'cn': (906, 644, 1008, 699), 'en': (906, 644, 1008, 699), 'jp': (906, 644, 1008, 699), 'tw': (906, 644, 1008, 699)}, file={'cn': './assets/cn/equipment/FLEET_DETAIL.png', 'en': './assets/en/equipment/FLEET_DETAIL.png', 'jp': './assets/jp/equipment/FLEET_DETAIL.png', 'tw': './assets/tw/equipment/FLEET_DETAIL.png'}) +FLEET_DETAIL_CHECK = Button(area={'cn': (915, 647, 980, 679), 'en': (915, 649, 980, 677), 'jp': (915, 647, 979, 679), 'tw': (915, 647, 980, 680)}, color={'cn': (234, 195, 154), 'en': (236, 200, 160), 'jp': (234, 195, 154), 'tw': (237, 196, 154)}, button={'cn': (915, 647, 980, 679), 'en': (915, 649, 980, 677), 'jp': (915, 647, 979, 679), 'tw': (915, 647, 980, 680)}, file={'cn': './assets/cn/equipment/FLEET_DETAIL_CHECK.png', 'en': './assets/en/equipment/FLEET_DETAIL_CHECK.png', 'jp': './assets/jp/equipment/FLEET_DETAIL_CHECK.png', 'tw': './assets/tw/equipment/FLEET_DETAIL_CHECK.png'}) +FLEET_DETAIL_ENTER = Button(area={'cn': (729, 314, 802, 438), 'en': (729, 314, 802, 438), 'jp': (729, 314, 802, 438), 'tw': (729, 314, 802, 438)}, color={'cn': (154, 149, 147), 'en': (154, 149, 147), 'jp': (154, 149, 147), 'tw': (154, 149, 147)}, button={'cn': (729, 314, 802, 438), 'en': (729, 314, 802, 438), 'jp': (729, 314, 802, 438), 'tw': (729, 314, 802, 438)}, file={'cn': './assets/cn/equipment/FLEET_DETAIL_ENTER.png', 'en': './assets/en/equipment/FLEET_DETAIL_ENTER.png', 'jp': './assets/jp/equipment/FLEET_DETAIL_ENTER.png', 'tw': './assets/tw/equipment/FLEET_DETAIL_ENTER.png'}) +FLEET_DETAIL_ENTER_FLAGSHIP = Button(area={'cn': (103, 327, 176, 437), 'en': (103, 327, 176, 437), 'jp': (103, 327, 176, 437), 'tw': (103, 327, 176, 437)}, color={'cn': (141, 135, 138), 'en': (141, 135, 138), 'jp': (141, 135, 138), 'tw': (141, 135, 138)}, button={'cn': (103, 327, 176, 437), 'en': (103, 327, 176, 437), 'jp': (103, 327, 176, 437), 'tw': (103, 327, 176, 437)}, file={'cn': './assets/cn/equipment/FLEET_DETAIL_ENTER_FLAGSHIP.png', 'en': './assets/en/equipment/FLEET_DETAIL_ENTER_FLAGSHIP.png', 'jp': './assets/jp/equipment/FLEET_DETAIL_ENTER_FLAGSHIP.png', 'tw': './assets/tw/equipment/FLEET_DETAIL_ENTER_FLAGSHIP.png'}) FLEET_ENTER = Button(area={'cn': (502, 474, 517, 489), 'en': (502, 474, 517, 489), 'jp': (502, 474, 517, 489), 'tw': (502, 474, 517, 489)}, color={'cn': (58, 62, 77), 'en': (58, 62, 77), 'jp': (58, 62, 77), 'tw': (58, 62, 77)}, button={'cn': (502, 474, 517, 489), 'en': (502, 474, 517, 489), 'jp': (502, 474, 517, 489), 'tw': (502, 474, 517, 489)}, file={'cn': './assets/cn/equipment/FLEET_ENTER.png', 'en': './assets/en/equipment/FLEET_ENTER.png', 'jp': './assets/jp/equipment/FLEET_ENTER.png', 'tw': './assets/tw/equipment/FLEET_ENTER.png'}) FLEET_ENTER_FLAGSHIP = Button(area={'cn': (577, 306, 604, 321), 'en': (577, 306, 604, 321), 'jp': (577, 306, 604, 321), 'tw': (577, 306, 604, 321)}, color={'cn': (95, 83, 74), 'en': (95, 83, 74), 'jp': (95, 83, 74), 'tw': (95, 83, 74)}, button={'cn': (577, 306, 604, 321), 'en': (577, 306, 604, 321), 'jp': (577, 306, 604, 321), 'tw': (577, 306, 604, 321)}, file={'cn': './assets/cn/equipment/FLEET_ENTER_FLAGSHIP.png', 'en': './assets/en/equipment/FLEET_ENTER_FLAGSHIP.png', 'jp': './assets/jp/equipment/FLEET_ENTER_FLAGSHIP.png', 'tw': './assets/tw/equipment/FLEET_ENTER_FLAGSHIP.png'}) FLEET_NEXT = Button(area={'cn': (1234, 327, 1254, 356), 'en': (1234, 327, 1254, 356), 'jp': (1234, 327, 1254, 356), 'tw': (1234, 327, 1254, 356)}, color={'cn': (72, 93, 125), 'en': (72, 93, 125), 'jp': (72, 93, 125), 'tw': (72, 93, 125)}, button={'cn': (1234, 327, 1254, 356), 'en': (1234, 327, 1254, 356), 'jp': (1234, 327, 1254, 356), 'tw': (1234, 327, 1254, 356)}, file={'cn': './assets/cn/equipment/FLEET_NEXT.png', 'en': './assets/en/equipment/FLEET_NEXT.png', 'jp': './assets/jp/equipment/FLEET_NEXT.png', 'tw': './assets/tw/equipment/FLEET_NEXT.png'}) diff --git a/module/handler/strategy.py b/module/handler/strategy.py index cc1d963bf..7462a72eb 100644 --- a/module/handler/strategy.py +++ b/module/handler/strategy.py @@ -20,6 +20,8 @@ submarine_view = Switch('Submarine_view', offset=(100, 200)) submarine_view.add_status('on', check_button=SUBMARINE_VIEW_ON) submarine_view.add_status('off', check_button=SUBMARINE_VIEW_OFF) +MOB_MOVE_OFFSET = (120, 120) + class StrategyHandler(InfoHandler): fleet_1_formation_fixed = False @@ -215,9 +217,9 @@ class StrategyHandler(InfoHandler): in: STRATEGY_OPENED out: STRATEGY_OPENED """ - if self.appear(MOB_MOVE_2, offset=(120, 120)): + if self.appear(MOB_MOVE_2, offset=MOB_MOVE_OFFSET): return 2 - elif self.appear(MOB_MOVE_1, offset=(120, 120)): + elif self.appear(MOB_MOVE_1, offset=MOB_MOVE_OFFSET): return 1 else: return 0 @@ -238,9 +240,9 @@ class StrategyHandler(InfoHandler): if self.appear(MOB_MOVE_CANCEL, offset=(20, 20)): break - if self.appear_then_click(MOB_MOVE_1, offset=(120, 120), interval=5): + if self.appear_then_click(MOB_MOVE_1, offset=MOB_MOVE_OFFSET, interval=5): continue - if self.appear_then_click(MOB_MOVE_2, offset=(120, 120), interval=5): + if self.appear_then_click(MOB_MOVE_2, offset=MOB_MOVE_OFFSET, interval=5): continue def strategy_mob_move_cancel(self, skip_first_screenshot=True): @@ -256,8 +258,8 @@ class StrategyHandler(InfoHandler): else: self.device.screenshot() - if self.appear(MOB_MOVE_1, offset=(120, 120)) \ - or self.appear(MOB_MOVE_2, offset=(120, 120)): + if self.appear(MOB_MOVE_1, offset=MOB_MOVE_OFFSET) \ + or self.appear(MOB_MOVE_2, offset=MOB_MOVE_OFFSET): break if self.appear_then_click(MOB_MOVE_CANCEL, offset=(20, 20), interval=5): diff --git a/module/map/map_base.py b/module/map/map_base.py index 42b81d03b..68dcbb431 100644 --- a/module/map/map_base.py +++ b/module/map/map_base.py @@ -10,6 +10,7 @@ from module.map_detection.grid_info import GridInfo class CampaignMap: def __init__(self, name=None): self.name = name + self.grid_class = GridInfo self.grids = {} self._shape = (0, 0) self._map_data = '' @@ -68,7 +69,7 @@ class CampaignMap: self._shape = node2location(scale.upper()) for y in range(self._shape[1] + 1): for x in range(self._shape[0] + 1): - grid = GridInfo() + grid = self.grid_class() grid.location = (x, y) self.grids[(x, y)] = grid diff --git a/module/os/config.py b/module/os/config.py index 5bc6a0e88..73444fd6b 100644 --- a/module/os/config.py +++ b/module/os/config.py @@ -9,7 +9,7 @@ class OSConfig: MAP_HAS_FLEET_STEP = True IGNORE_LOW_EMOTION_WARN = False - MAP_GRID_CENTER_TOLERANCE = 0.2 + MAP_GRID_CENTER_TOLERANCE = 0.3 MAP_SWIPE_MULTIPLY = (1.174, 1.200) MAP_SWIPE_MULTIPLY_MINITOUCH = (1.135, 1.160) MAP_SWIPE_MULTIPLY_MAATOUCH = (1.102, 1.126) diff --git a/module/template/assets.py b/module/template/assets.py index 6c0c9e8dc..f4047fc1c 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -51,48 +51,51 @@ TEMPLATE_SIREN_Asanagi = Template(file={'cn': './assets/cn/template/TEMPLATE_SIR TEMPLATE_SIREN_Atlanta = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Atlanta.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Atlanta.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Atlanta.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Atlanta.gif'}) TEMPLATE_SIREN_August = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_August.gif', 'en': './assets/en/template/TEMPLATE_SIREN_August.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_August.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_August.gif'}) TEMPLATE_SIREN_AzusaMiura = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_AzusaMiura.gif', 'en': './assets/en/template/TEMPLATE_SIREN_AzusaMiura.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_AzusaMiura.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_AzusaMiura.gif'}) -TEMPLATE_SIREN_BaltimoreIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BaltimoreIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BaltimoreIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BaltimoreIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BaltimoreIdol.gif'}) TEMPLATE_SIREN_BB = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BB.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BB.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BB.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BB.gif'}) TEMPLATE_SIREN_BBalchemist = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BBalchemist.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BBalchemist.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BBalchemist.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BBalchemist.gif'}) TEMPLATE_SIREN_BBlightning = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BBlightning.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BBlightning.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BBlightning.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BBlightning.gif'}) TEMPLATE_SIREN_BBpurple = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BBpurple.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BBpurple.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BBpurple.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BBpurple.gif'}) TEMPLATE_SIREN_BBred = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BBred.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BBred.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BBred.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BBred.gif'}) +TEMPLATE_SIREN_BaltimoreIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_BaltimoreIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_BaltimoreIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_BaltimoreIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_BaltimoreIdol.gif'}) TEMPLATE_SIREN_Bellona = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Bellona.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Bellona.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Bellona.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Bellona.gif'}) TEMPLATE_SIREN_CA = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CA.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CA.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CA.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CA.gif'}) TEMPLATE_SIREN_CAalchemist = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CAalchemist.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CAalchemist.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CAalchemist.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CAalchemist.gif'}) TEMPLATE_SIREN_CAgreen = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CAgreen.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CAgreen.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CAgreen.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CAgreen.gif'}) TEMPLATE_SIREN_CAlightning = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CAlightning.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CAlightning.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CAlightning.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CAlightning.gif'}) TEMPLATE_SIREN_CApurple = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CApurple.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CApurple.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CApurple.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CApurple.gif'}) -TEMPLATE_SIREN_Carabiniere = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Carabiniere.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Carabiniere.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Carabiniere.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Carabiniere.gif'}) TEMPLATE_SIREN_CAred = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CAred.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CAred.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CAred.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CAred.gif'}) +TEMPLATE_SIREN_CL = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CL.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CL.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CL.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CL.gif'}) +TEMPLATE_SIREN_CLalchemist = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CLalchemist.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CLalchemist.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CLalchemist.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CLalchemist.gif'}) +TEMPLATE_SIREN_CLpurple = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CLpurple.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CLpurple.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CLpurple.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CLpurple.gif'}) +TEMPLATE_SIREN_CV = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CV.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CV.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CV.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CV.gif'}) +TEMPLATE_SIREN_CValchemist = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CValchemist.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CValchemist.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CValchemist.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CValchemist.gif'}) +TEMPLATE_SIREN_CVlightning = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CVlightning.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CVlightning.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CVlightning.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CVlightning.gif'}) +TEMPLATE_SIREN_CVpurple = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CVpurple.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CVpurple.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CVpurple.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CVpurple.gif'}) +TEMPLATE_SIREN_Carabiniere = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Carabiniere.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Carabiniere.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Carabiniere.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Carabiniere.gif'}) TEMPLATE_SIREN_Champagne = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Champagne.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Champagne.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Champagne.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Champagne.gif'}) TEMPLATE_SIREN_ChihayaKisaragi = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_ChihayaKisaragi.gif', 'en': './assets/en/template/TEMPLATE_SIREN_ChihayaKisaragi.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_ChihayaKisaragi.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_ChihayaKisaragi.gif'}) TEMPLATE_SIREN_Chitose = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Chitose.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Chitose.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Chitose.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Chitose.gif'}) TEMPLATE_SIREN_Chiyoda = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Chiyoda.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Chiyoda.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Chiyoda.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Chiyoda.gif'}) TEMPLATE_SIREN_Choukai = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Choukai.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Choukai.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Choukai.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Choukai.gif'}) -TEMPLATE_SIREN_CL = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CL.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CL.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CL.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CL.gif'}) -TEMPLATE_SIREN_CLalchemist = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CLalchemist.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CLalchemist.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CLalchemist.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CLalchemist.gif'}) TEMPLATE_SIREN_ClevelandIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_ClevelandIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_ClevelandIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_ClevelandIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_ClevelandIdol.gif'}) -TEMPLATE_SIREN_CLpurple = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CLpurple.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CLpurple.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CLpurple.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CLpurple.gif'}) TEMPLATE_SIREN_Compiler = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Compiler.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Compiler.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Compiler.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Compiler.gif'}) -TEMPLATE_SIREN_CV = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CV.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CV.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CV.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CV.gif'}) -TEMPLATE_SIREN_CValchemist = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CValchemist.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CValchemist.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CValchemist.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CValchemist.gif'}) -TEMPLATE_SIREN_CVlightning = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CVlightning.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CVlightning.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CVlightning.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CVlightning.gif'}) -TEMPLATE_SIREN_CVpurple = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_CVpurple.gif', 'en': './assets/en/template/TEMPLATE_SIREN_CVpurple.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_CVpurple.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_CVpurple.gif'}) -TEMPLATE_SIREN_Dace = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Dace.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Dace.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Dace.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Dace.gif'}) TEMPLATE_SIREN_DD = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_DD.gif', 'en': './assets/en/template/TEMPLATE_SIREN_DD.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_DD.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_DD.gif'}) TEMPLATE_SIREN_DDalchemist = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_DDalchemist.gif', 'en': './assets/en/template/TEMPLATE_SIREN_DDalchemist.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_DDalchemist.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_DDalchemist.gif'}) TEMPLATE_SIREN_DDpurple = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_DDpurple.gif', 'en': './assets/en/template/TEMPLATE_SIREN_DDpurple.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_DDpurple.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_DDpurple.gif'}) +TEMPLATE_SIREN_Dace = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Dace.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Dace.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Dace.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Dace.gif'}) TEMPLATE_SIREN_Deutschland = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Deutschland.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Deutschland.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Deutschland.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Deutschland.gif'}) TEMPLATE_SIREN_Dewey = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Dewey.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Dewey.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Dewey.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Dewey.gif'}) TEMPLATE_SIREN_DidoIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_DidoIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_DidoIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_DidoIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_DidoIdol.gif'}) +TEMPLATE_SIREN_DidoIdol2 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_DidoIdol2.gif', 'en': './assets/en/template/TEMPLATE_SIREN_DidoIdol2.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_DidoIdol2.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_DidoIdol2.gif'}) TEMPLATE_SIREN_Dilloy = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Dilloy.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Dilloy.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Dilloy.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Dilloy.gif'}) TEMPLATE_SIREN_DogPink = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_DogPink.gif', 'en': './assets/en/template/TEMPLATE_SIREN_DogPink.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_DogPink.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_DogPink.gif'}) TEMPLATE_SIREN_Dorsetshire = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Dorsetshire.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Dorsetshire.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Dorsetshire.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Dorsetshire.gif'}) TEMPLATE_SIREN_DukeOfYork = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_DukeOfYork.gif', 'en': './assets/en/template/TEMPLATE_SIREN_DukeOfYork.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_DukeOfYork.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_DukeOfYork.gif'}) TEMPLATE_SIREN_ELpurple = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_ELpurple.gif', 'en': './assets/en/template/TEMPLATE_SIREN_ELpurple.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_ELpurple.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_ELpurple.gif'}) +TEMPLATE_SIREN_Elizabeth3 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Elizabeth3.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Elizabeth3.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Elizabeth3.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Elizabeth3.gif'}) TEMPLATE_SIREN_Formidable = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Formidable.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Formidable.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Formidable.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Formidable.gif'}) TEMPLATE_SIREN_Gascogne = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Gascogne.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Gascogne.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Gascogne.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Gascogne.gif'}) +TEMPLATE_SIREN_GascogneIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_GascogneIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_GascogneIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_GascogneIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_GascogneIdol.gif'}) TEMPLATE_SIREN_Gloucester = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Gloucester.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Gloucester.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Gloucester.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Gloucester.gif'}) TEMPLATE_SIREN_Gneisenau = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Gneisenau.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Gneisenau.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Gneisenau.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Gneisenau.gif'}) TEMPLATE_SIREN_GrafZeppelin = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_GrafZeppelin.gif', 'en': './assets/en/template/TEMPLATE_SIREN_GrafZeppelin.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_GrafZeppelin.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_GrafZeppelin.gif'}) @@ -130,10 +133,11 @@ TEMPLATE_SIREN_Kinu = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_ TEMPLATE_SIREN_Kirishima = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Kirishima.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Kirishima.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Kirishima.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Kirishima.gif'}) TEMPLATE_SIREN_Kongo = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Kongo.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Kongo.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Kongo.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Kongo.gif'}) TEMPLATE_SIREN_LaGalissonniere = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_LaGalissonniere.gif', 'en': './assets/en/template/TEMPLATE_SIREN_LaGalissonniere.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_LaGalissonniere.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_LaGalissonniere.gif'}) -TEMPLATE_SIREN_Leipzig = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Leipzig.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Leipzig.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Leipzig.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Leipzig.gif'}) +TEMPLATE_SIREN_Laffey6 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Laffey6.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Laffey6.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Laffey6.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Laffey6.gif'}) TEMPLATE_SIREN_LeMalinIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_LeMalinIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_LeMalinIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_LeMalinIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_LeMalinIdol.gif'}) TEMPLATE_SIREN_LeMars = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_LeMars.gif', 'en': './assets/en/template/TEMPLATE_SIREN_LeMars.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_LeMars.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_LeMars.gif'}) TEMPLATE_SIREN_LeMars_ghost = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_LeMars_ghost.gif', 'en': './assets/en/template/TEMPLATE_SIREN_LeMars_ghost.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_LeMars_ghost.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_LeMars_ghost.gif'}) +TEMPLATE_SIREN_Leipzig = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Leipzig.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Leipzig.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Leipzig.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Leipzig.gif'}) TEMPLATE_SIREN_Lexington = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Lexington.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Lexington.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Lexington.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Lexington.gif'}) TEMPLATE_SIREN_Littorio = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Littorio.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Littorio.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Littorio.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Littorio.gif'}) TEMPLATE_SIREN_Lover = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Lover.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Lover.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Lover.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Lover.gif'}) @@ -162,31 +166,32 @@ TEMPLATE_SIREN_Revenge = Template(file={'cn': './assets/cn/template/TEMPLATE_SIR TEMPLATE_SIREN_Rodney = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Rodney.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Rodney.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Rodney.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Rodney.gif'}) TEMPLATE_SIREN_Roon = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Roon.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Roon.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Roon.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Roon.gif'}) TEMPLATE_SIREN_RoonIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_RoonIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_RoonIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_RoonIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_RoonIdol.gif'}) +TEMPLATE_SIREN_RoonIdol2 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_RoonIdol2.gif', 'en': './assets/en/template/TEMPLATE_SIREN_RoonIdol2.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_RoonIdol2.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_RoonIdol2.gif'}) TEMPLATE_SIREN_Ryuuhou = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Ryuuhou.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Ryuuhou.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Ryuuhou.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Ryuuhou.gif'}) -TEMPLATE_SIREN_Sakawa = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Sakawa.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Sakawa.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Sakawa.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Sakawa.gif'}) -TEMPLATE_SIREN_SanDiego = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SanDiego.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SanDiego.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SanDiego.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SanDiego.gif'}) -TEMPLATE_SIREN_Scharnhorst = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Scharnhorst.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Scharnhorst.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Scharnhorst.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Scharnhorst.gif'}) -TEMPLATE_SIREN_Sheffield = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Sheffield.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Sheffield.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Sheffield.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Sheffield.gif'}) -TEMPLATE_SIREN_SheffieldIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SheffieldIdol.png', 'en': './assets/en/template/TEMPLATE_SIREN_SheffieldIdol.png', 'jp': './assets/cn/template/TEMPLATE_SIREN_SheffieldIdol.png', 'tw': './assets/cn/template/TEMPLATE_SIREN_SheffieldIdol.png'}) -TEMPLATE_SIREN_Shokaku = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Shokaku.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Shokaku.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Shokaku.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Shokaku.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'}) -TEMPLATE_SIREN_Sirenboss10 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Sirenboss10.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Sirenboss10.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Sirenboss10.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Sirenboss10.gif'}) -TEMPLATE_SIREN_SirenBoss15 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss15.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss15.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss15.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss15.gif'}) -TEMPLATE_SIREN_SirenBoss16 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss16.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss16.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss16.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss16.gif'}) -TEMPLATE_SIREN_SirenBoss18 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss18.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss18.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss18.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss18.gif'}) -TEMPLATE_SIREN_SirenBoss19 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss19.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss19.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss19.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss19.gif'}) TEMPLATE_SIREN_SK_BB = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SK_BB.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SK_BB.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SK_BB.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SK_BB.gif'}) TEMPLATE_SIREN_SK_CA = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SK_CA.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SK_CA.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SK_CA.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SK_CA.gif'}) TEMPLATE_SIREN_SK_CL = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SK_CL.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SK_CL.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SK_CL.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SK_CL.gif'}) TEMPLATE_SIREN_SK_CV = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SK_CV.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SK_CV.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SK_CV.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SK_CV.gif'}) TEMPLATE_SIREN_SK_DD = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SK_DD.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SK_DD.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SK_DD.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SK_DD.gif'}) +TEMPLATE_SIREN_SS = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SS.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SS.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SS.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SS.gif'}) +TEMPLATE_SIREN_Sakawa = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Sakawa.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Sakawa.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Sakawa.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Sakawa.gif'}) +TEMPLATE_SIREN_SanDiego = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SanDiego.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SanDiego.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SanDiego.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SanDiego.gif'}) +TEMPLATE_SIREN_Scharnhorst = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Scharnhorst.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Scharnhorst.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Scharnhorst.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Scharnhorst.gif'}) +TEMPLATE_SIREN_Sheffield = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Sheffield.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Sheffield.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Sheffield.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Sheffield.gif'}) +TEMPLATE_SIREN_SheffieldIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SheffieldIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SheffieldIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SheffieldIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SheffieldIdol.gif'}) +TEMPLATE_SIREN_Shokaku = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Shokaku.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Shokaku.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Shokaku.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Shokaku.gif'}) +TEMPLATE_SIREN_SirenBoss15 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss15.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss15.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss15.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss15.gif'}) +TEMPLATE_SIREN_SirenBoss16 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss16.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss16.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss16.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss16.gif'}) +TEMPLATE_SIREN_SirenBoss18 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss18.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss18.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss18.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss18.gif'}) +TEMPLATE_SIREN_SirenBoss19 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SirenBoss19.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SirenBoss19.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SirenBoss19.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SirenBoss19.gif'}) +TEMPLATE_SIREN_Sirenboss10 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Sirenboss10.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Sirenboss10.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Sirenboss10.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Sirenboss10.gif'}) TEMPLATE_SIREN_Soobrazitelny = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Soobrazitelny.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Soobrazitelny.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Soobrazitelny.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Soobrazitelny.gif'}) TEMPLATE_SIREN_Spee = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Spee.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Spee.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Spee.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Spee.gif'}) TEMPLATE_SIREN_SpeeIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SpeeIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SpeeIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SpeeIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SpeeIdol.gif'}) -TEMPLATE_SIREN_SS = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_SS.gif', 'en': './assets/en/template/TEMPLATE_SIREN_SS.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_SS.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_SS.gif'}) TEMPLATE_SIREN_Suzutsuki = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Suzutsuki.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Suzutsuki.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Suzutsuki.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Suzutsuki.gif'}) TEMPLATE_SIREN_Swordfish = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Swordfish.png', 'en': './assets/en/template/TEMPLATE_SIREN_Swordfish.png', 'jp': './assets/jp/template/TEMPLATE_SIREN_Swordfish.png', 'tw': './assets/tw/template/TEMPLATE_SIREN_Swordfish.png'}) +TEMPLATE_SIREN_TaihouIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_TaihouIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_TaihouIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_TaihouIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_TaihouIdol.gif'}) +TEMPLATE_SIREN_TashkentIdol = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_TashkentIdol.gif', 'en': './assets/en/template/TEMPLATE_SIREN_TashkentIdol.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_TashkentIdol.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_TashkentIdol.gif'}) TEMPLATE_SIREN_Tirpitz = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Tirpitz.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Tirpitz.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Tirpitz.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Tirpitz.gif'}) TEMPLATE_SIREN_Trento = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Trento.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Trento.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Trento.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Trento.gif'}) TEMPLATE_SIREN_U101 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_U101.gif', 'en': './assets/en/template/TEMPLATE_SIREN_U101.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_U101.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_U101.gif'}) @@ -207,10 +212,13 @@ TEMPLATE_SIREN_Yuudachi = Template(file={'cn': './assets/cn/template/TEMPLATE_SI TEMPLATE_SIREN_Z18 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Z18.png', 'en': './assets/en/template/TEMPLATE_SIREN_Z18.png', 'jp': './assets/jp/template/TEMPLATE_SIREN_Z18.png', 'tw': './assets/tw/template/TEMPLATE_SIREN_Z18.png'}) TEMPLATE_SIREN_Z19 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Z19.png', 'en': './assets/en/template/TEMPLATE_SIREN_Z19.png', 'jp': './assets/jp/template/TEMPLATE_SIREN_Z19.png', 'tw': './assets/tw/template/TEMPLATE_SIREN_Z19.png'}) TEMPLATE_SIREN_Z2 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Z2.png', 'en': './assets/en/template/TEMPLATE_SIREN_Z2.png', 'jp': './assets/jp/template/TEMPLATE_SIREN_Z2.png', 'tw': './assets/tw/template/TEMPLATE_SIREN_Z2.png'}) +TEMPLATE_SIREN_Z23_5 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Z23_5.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Z23_5.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Z23_5.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Z23_5.gif'}) TEMPLATE_SIREN_Z24 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Z24.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Z24.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Z24.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Z24.gif'}) 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_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'}) TEMPLATE_STAGE_BLUE_CLEAR = Template(file={'cn': './assets/cn/template/TEMPLATE_STAGE_BLUE_CLEAR.png', 'en': './assets/en/template/TEMPLATE_STAGE_BLUE_CLEAR.png', 'jp': './assets/jp/template/TEMPLATE_STAGE_BLUE_CLEAR.png', 'tw': './assets/tw/template/TEMPLATE_STAGE_BLUE_CLEAR.png'}) TEMPLATE_STAGE_BLUE_PERCENT = Template(file={'cn': './assets/cn/template/TEMPLATE_STAGE_BLUE_PERCENT.png', 'en': './assets/en/template/TEMPLATE_STAGE_BLUE_PERCENT.png', 'jp': './assets/jp/template/TEMPLATE_STAGE_BLUE_PERCENT.png', 'tw': './assets/tw/template/TEMPLATE_STAGE_BLUE_PERCENT.png'}) TEMPLATE_STAGE_CLEAR = Template(file={'cn': './assets/cn/template/TEMPLATE_STAGE_CLEAR.png', 'en': './assets/en/template/TEMPLATE_STAGE_CLEAR.png', 'jp': './assets/jp/template/TEMPLATE_STAGE_CLEAR.png', 'tw': './assets/tw/template/TEMPLATE_STAGE_CLEAR.png'}) diff --git a/requirements-in.txt b/requirements-in.txt index 6146e9795..fd69eec2e 100644 --- a/requirements-in.txt +++ b/requirements-in.txt @@ -1,32 +1,44 @@ -adbutils==0.11.0 -aiofiles -alas-webapp==0.3.7 -anyio==1.3.1 -av==10.0.0 -cnocr==1.2.2 -imageio==2.27.0 -inflection -jellyfish==0.11.2 -lz4 -mxnet==1.6.0 +# Image processing numpy==1.16.6 -onepush -opencv-python -pillow -prettytable==2.2.1 -psutil==5.9.3 -pydantic -pypresence==4.2.1 -pywebio==1.6.2 -pyyaml -pyzmq==22.3.0 -retrying -rich==11.2.0 scipy==1.4.1 -starlette==0.14.2 -tqdm +pillow +opencv-python +imageio==2.27.0 + +# Device connection +adbutils==0.11.0 uiautomator2==2.16.17 uiautomator2cache==0.3.0.1 -uvicorn[standard]==0.17.6 wrapt==1.13.1 -zerorpc==0.6.3 \ No newline at end of file +retrying +lz4 +av==10.0.0 +psutil==5.9.3 + +# Utils +rich==11.2.0 +tqdm +jellyfish==0.11.2 +pyyaml +inflection +pydantic +aiofiles +prettytable==2.2.1 +anyio==1.3.1 + +# Pushing +onepush==1.3.0 +pycryptodome==3.9.9 +pypresence==4.2.1 + +# Ocr +cnocr==1.2.2 +mxnet==1.6.0 + +# Webui +pywebio==1.6.2 +starlette==0.14.2 +uvicorn[standard]==0.17.6 +alas-webapp==0.3.7 +zerorpc==0.6.3 +pyzmq==22.3.0 diff --git a/requirements.txt b/requirements.txt index d26b1145e..87d8e66de 100644 --- a/requirements.txt +++ b/requirements.txt @@ -47,7 +47,7 @@ matplotlib==3.4.3 # via gluoncv msgpack==1.0.3 # via zerorpc mxnet==1.6.0 # via -r requirements-in.txt, cnocr numpy==1.16.6 # via -r requirements-in.txt, cnocr, gluoncv, imageio, matplotlib, mxnet, opencv-python, scipy -onepush==1.2.0 # via -r requirements-in.txt +onepush==1.3.0 # via -r requirements-in.txt opencv-python==4.5.3.56 # via -r requirements-in.txt packaging==20.9 # via deprecation, uiautomator2 pillow==8.3.2 # via -r requirements-in.txt, cnocr, gluoncv, imageio, matplotlib, uiautomator2 @@ -57,6 +57,7 @@ progress==1.6 # via uiautomator2 psutil==5.9.3 # via -r requirements-in.txt py==1.10.0 # via retry pycparser==2.21 # via cffi +pycryptodome==3.9.9 # via onepush pydantic==1.10.2 # via -r requirements-in.txt pyelftools==0.27 # via apkutils2 pygments==2.12.0 # via rich