diff --git a/assets/cn/combat_ui/PAUSE_Star.png b/assets/cn/combat_ui/PAUSE_Star.png new file mode 100644 index 000000000..07c231dd4 Binary files /dev/null and b/assets/cn/combat_ui/PAUSE_Star.png differ diff --git a/assets/cn/research/TEMPLATE_S8.png b/assets/cn/research/TEMPLATE_S8.png new file mode 100644 index 000000000..25f6675c4 Binary files /dev/null and b/assets/cn/research/TEMPLATE_S8.png differ diff --git a/assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png b/assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png new file mode 100644 index 000000000..3d92cb507 Binary files /dev/null and b/assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png differ diff --git a/assets/research_blueprint/dmitri.png b/assets/research_blueprint/dmitri.png new file mode 100644 index 000000000..3f2ffc002 Binary files /dev/null and b/assets/research_blueprint/dmitri.png differ diff --git a/assets/research_blueprint/goudenleeuw.png b/assets/research_blueprint/goudenleeuw.png new file mode 100644 index 000000000..752a031e4 Binary files /dev/null and b/assets/research_blueprint/goudenleeuw.png differ diff --git a/assets/research_blueprint/kansas.png b/assets/research_blueprint/kansas.png new file mode 100644 index 000000000..7f6757e92 Binary files /dev/null and b/assets/research_blueprint/kansas.png differ diff --git a/assets/research_blueprint/mecklenburg.png b/assets/research_blueprint/mecklenburg.png new file mode 100644 index 000000000..257bbe46f Binary files /dev/null and b/assets/research_blueprint/mecklenburg.png differ diff --git a/assets/research_blueprint/vittorio.png b/assets/research_blueprint/vittorio.png new file mode 100644 index 000000000..6e4868ed8 Binary files /dev/null and b/assets/research_blueprint/vittorio.png differ diff --git a/assets/tw/reward/MISSION_EMPTY.png b/assets/tw/reward/MISSION_EMPTY.png new file mode 100644 index 000000000..57d4a4b43 Binary files /dev/null and b/assets/tw/reward/MISSION_EMPTY.png differ diff --git a/campaign/Readme.md b/campaign/Readme.md index a7de3903f..afa64fdae 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -52,6 +52,7 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20250109 | war archives 20220224 cn | Abyssal Refrain | 深度回音 | Abyssal Refrain | 鳴動せし星霜の淵 | 深度回音 | | 20250320 | war archives 20220324 cn | Virtual Tower | 虚像构筑之塔 | Virtual Tower | 幻像の塔 | 虛像構築之塔 | | 20250417 | war archives 20220526 cn | Pledge of the Radiant Court | 泠誓光庭 | Pledge of the Radiant Court | 诚閃の剣 搖光の城 | 泠誓光庭 | +| 20250619 | war archives 20220728 cn | Aquilifer's Ballade | 雄鹰的叙事歌 | Aquilifer's Ballade | 鋼鷲の冒険譚 | 雄鷹的敘事歌 | | 20200227 | event 20200227 cn | Northern Overture | 北境序曲 | Northern Overture | 凍絶の北海 | - | | 20200312 | event 20200312 cn | The Solomon Ranger | 复刻斯图尔特的硝烟 | The Solomon Ranger Rerun | 南洋に靡く硝煙(復刻) | - | | 20200326 | event 20200326 cn | Microlayer Medley | 微层混合 | Microlayer Medley | 闇靄払う銀翼 | - | @@ -246,3 +247,4 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20250612 | event 20250520 cn | A Rose on the High Tower | - | - | - | 高塔上的薔薇 | | 20250619 | event 20230525 cn | Confluence of Nothingness | 复刻空相交汇点 | Confluence of Nothingness Rerun | 覆天せし万象の塵(復刻) | - | | 20250626 | coalition 20250626 | The Neon City Investigator | 迷彩都市的寻踪者 | The Neon City Investigator | ネオンシティの探索者 | - | +| 20250703 | event 20250424 cn | Toward Tulipa’s Seas | - | - | - | 揚起鬱金之旗 | diff --git a/campaign/war_archives_20220728_cn/a1.py b/campaign/war_archives_20220728_cn/a1.py new file mode 100644 index 000000000..66793f16a --- /dev/null +++ b/campaign/war_archives_20220728_cn/a1.py @@ -0,0 +1,107 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('A1') +MAP.shape = 'H8' +MAP.camera_data = ['D3', 'D6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ -- -- -- -- ME -- -- + ++ -- ++ ++ Me -- ME -- + -- ME ++ ++ -- -- -- ++ + ME -- -- MB -- Me -- ME + -- -- MS -- -- MS -- -- + ME ++ ++ __ __ ++ ++ -- + -- -- Me -- -- Me -- -- + -- ME -- SP SP -- ME -- +""" +MAP.map_data_loop = """ + ++ -- -- -- -- ME -- -- + ++ -- ++ ++ Me -- ME -- + -- ME ++ ++ -- -- -- ++ + ME -- -- MB -- Me -- ME + -- -- MS -- -- MS -- -- + ME ++ -- __ __ ++ ++ ++ + -- -- Me -- -- Me -- -- + -- ME -- SP SP -- ME -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1, 'boss': 1}, + {'battle': 4, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['DD', 'Juno_ghost'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (120, 255 - 17), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + MAP_ENEMY_TEMPLATE = ['Light', 'Main', 'Carrier', 'Treasure', 'Vestal_ghost'] + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/war_archives_20220728_cn/a2.py b/campaign/war_archives_20220728_cn/a2.py new file mode 100644 index 000000000..58e121e30 --- /dev/null +++ b/campaign/war_archives_20220728_cn/a2.py @@ -0,0 +1,85 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A2') +MAP.shape = 'L7' +MAP.camera_data = ['D3', 'F5', 'H5'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- SP -- ++ ++ ++ Me -- -- -- -- -- + SP -- -- -- -- MS -- ++ ++ -- ++ ++ + -- -- Me MS -- -- -- ++ ++ ME ++ ++ + Me -- -- -- ++ ++ -- -- ME -- -- MB + -- ++ ++ Me ++ ++ Me -- __ -- ME -- + -- ++ ++ -- -- ME -- -- -- -- ME ++ + -- -- ME -- -- -- -- ME ++ ME -- -- +""" +MAP.map_data_loop = """ + -- SP -- ++ ++ ++ Me -- -- -- -- -- + SP -- -- -- -- MS -- -- ++ -- ++ ++ + -- -- Me MS -- -- -- -- ++ ME -- ++ + Me -- -- -- ++ ++ ++ -- ME -- -- MB + -- ++ ++ Me -- -- Me -- __ -- ME -- + -- ++ ++ -- -- ME -- -- -- -- ME ++ + -- -- ME -- -- -- -- ME ++ ME -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, L4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, L5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, L6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, L7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'Juno_ghost'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.226, 1.249) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.186, 1.208) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.151, 1.172) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20220728_cn/a3.py b/campaign/war_archives_20220728_cn/a3.py new file mode 100644 index 000000000..096c7f286 --- /dev/null +++ b/campaign/war_archives_20220728_cn/a3.py @@ -0,0 +1,89 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A3') +MAP.shape = 'I8' +MAP.camera_data = ['D3', 'E6'] +MAP.camera_data_spawn_point = ['E2'] +MAP.map_data = """ + -- -- -- -- SP SP -- -- -- + -- ME ++ ++ -- -- ++ ++ -- + ME -- -- MS -- ME ++ ++ -- + -- ++ ++ Me -- MS ME Me -- + -- ++ ++ -- __ -- -- -- ME + -- -- Me -- ME Me ME ME -- + -- ++ ++ -- -- -- ME -- -- + -- -- ++ -- MB -- ++ ++ ++ +""" +MAP.map_data_loop = """ + -- -- -- -- SP SP -- -- -- + -- ME ++ -- -- -- ++ ++ -- + ME -- -- MS -- ME ++ ++ -- + -- -- ++ Me -- MS ME Me -- + -- -- ++ -- __ -- -- -- ME + -- -- Me -- ME Me ME ME -- + -- ++ ++ -- -- -- ME -- -- + -- -- ++ -- MB -- ++ ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CA', 'Neptune_ghost'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.226, 1.249) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.186, 1.208) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.151, 1.172) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20220728_cn/b1.py b/campaign/war_archives_20220728_cn/b1.py new file mode 100644 index 000000000..55ccb0371 --- /dev/null +++ b/campaign/war_archives_20220728_cn/b1.py @@ -0,0 +1,101 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('B1') +MAP.shape = 'J8' +MAP.camera_data = ['E2', 'E6', 'G4'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- -- ME -- -- Me -- -- ++ ++ + -- -- ++ MS -- -- Me -- MB ++ + SP -- -- -- MS ++ ++ -- -- ME + SP -- -- -- MS ++ ++ ME -- -- + -- -- ++ MS __ ME Me -- -- ME + -- Me ++ Me -- -- -- -- ME -- + -- -- -- -- -- ME -- ME -- -- + -- ME -- ME -- -- ++ ++ ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2, 'boss': 1}, + {'battle': 5, 'enemy': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Neptune_ghost', 'LeMars_ghost'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (120, 255 - 17), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + MAP_ENEMY_TEMPLATE = ['Light', 'Main', 'Carrier', 'Treasure', 'Vestal_ghost'] + MAP_SWIPE_MULTIPLY = (1.141, 1.163) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.104, 1.124) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.071, 1.091) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20220728_cn/b2.py b/campaign/war_archives_20220728_cn/b2.py new file mode 100644 index 000000000..a4e19d9fc --- /dev/null +++ b/campaign/war_archives_20220728_cn/b2.py @@ -0,0 +1,80 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B2') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D3', 'E3', 'E6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- ME -- -- -- ME -- ME -- + ++ -- -- ME -- -- ++ -- ME + ++ ME Me ++ Me -- -- -- Me + -- -- -- ME -- -- -- MS -- + MB -- __ -- -- MS -- -- ++ + -- -- -- Me -- ++ Me -- -- + ++ ++ ME -- MS -- -- -- SP + ++ ++ -- ME -- ME -- SP -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Neptune_ghost', 'LeMars_ghost'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.038, 1.058) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.004, 1.023) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.975, 0.993) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20220728_cn/b3.py b/campaign/war_archives_20220728_cn/b3.py new file mode 100644 index 000000000..c3898eb36 --- /dev/null +++ b/campaign/war_archives_20220728_cn/b3.py @@ -0,0 +1,83 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B3') +MAP.shape = 'I9' +MAP.camera_data = ['D3', 'D5', 'F3', 'F5'] +MAP.camera_data_spawn_point = ['E7'] +MAP.map_data = """ + -- ++ ++ ++ -- ++ ++ ++ -- + -- ME -- -- ME -- -- ME -- + ME -- -- ME -- ME -- -- ME + ++ -- Me ++ -- ++ Me -- ++ + ME -- -- -- MB -- -- -- ME + -- -- Me ++ MS ++ Me -- -- + ME -- MS -- __ -- MS -- ME + ++ ++ -- -- -- -- -- ++ ++ + ++ ++ -- SP -- SP -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['LeMars_ghost', 'Hermes_ghost'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (0.994, 1.013) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.961, 0.979) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.933, 0.950) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20220728_cn/c1.py b/campaign/war_archives_20220728_cn/c1.py new file mode 100644 index 000000000..989033416 --- /dev/null +++ b/campaign/war_archives_20220728_cn/c1.py @@ -0,0 +1,107 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('C1') +MAP.shape = 'H8' +MAP.camera_data = ['D3', 'D6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + ++ -- -- -- -- ME -- -- + ++ -- ++ ++ Me -- ME -- + -- ME ++ ++ -- -- -- ++ + ME -- -- MB -- Me -- ME + -- -- MS -- -- MS -- -- + ME ++ ++ __ __ ++ ++ -- + -- -- Me -- -- Me -- -- + -- ME -- SP SP -- ME -- +""" +MAP.map_data_loop = """ + ++ -- -- -- -- ME -- -- + ++ -- ++ ++ Me -- ME -- + -- ME ++ ++ -- -- -- ++ + ME -- -- MB -- Me -- ME + -- -- MS -- -- MS -- -- + ME ++ -- __ __ ++ ++ ++ + -- -- Me -- -- Me -- -- + -- ME -- SP SP -- ME -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ +A7, B7, C7, D7, E7, F7, G7, H7, \ +A8, B8, C8, D8, E8, F8, G8, H8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CL', 'CA', 'Juno_ghost', 'Neptune_ghost'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (120, 255 - 17), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + MAP_ENEMY_TEMPLATE = ['Light', 'Main', 'Carrier', 'Treasure', 'Vestal_ghost'] + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20220728_cn/c2.py b/campaign/war_archives_20220728_cn/c2.py new file mode 100644 index 000000000..d4d96232c --- /dev/null +++ b/campaign/war_archives_20220728_cn/c2.py @@ -0,0 +1,86 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C2') +MAP.shape = 'L7' +MAP.camera_data = ['D3', 'F5', 'H5'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- SP -- ++ ++ ++ Me -- -- -- -- -- + SP -- -- -- -- MS -- ++ ++ -- ++ ++ + -- -- Me MS -- -- -- ++ ++ ME ++ ++ + Me -- -- -- ++ ++ -- -- ME -- -- MB + -- ++ ++ Me ++ ++ Me -- __ -- ME -- + -- ++ ++ -- -- ME -- -- -- -- ME ++ + -- -- ME -- -- -- -- ME ++ ME -- -- +""" +MAP.map_data_loop = """ + -- SP -- ++ ++ ++ Me -- -- -- -- -- + SP -- -- -- -- MS -- -- ++ -- ++ ++ + -- -- Me MS -- -- -- -- ++ ME -- ++ + Me -- -- -- ++ ++ ++ -- ME -- -- MB + -- ++ ++ Me -- -- Me -- __ -- ME -- + -- ++ ++ -- -- ME -- -- -- -- ME ++ + -- -- ME -- -- -- -- ME ++ ME -- -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, L1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, L4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, L5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, L6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, L7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CA', 'BB', 'Juno_ghost', 'Neptune_ghost'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.226, 1.249) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.186, 1.208) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.151, 1.172) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20220728_cn/c3.py b/campaign/war_archives_20220728_cn/c3.py new file mode 100644 index 000000000..3e1ea62e6 --- /dev/null +++ b/campaign/war_archives_20220728_cn/c3.py @@ -0,0 +1,91 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C3') +MAP.shape = 'I8' +MAP.camera_data = ['D3', 'E6'] +MAP.camera_data_spawn_point = ['E2'] +MAP.map_data = """ + -- -- -- -- SP SP -- -- -- + -- ME ++ ++ -- -- ++ ++ -- + ME -- -- MS -- ME ++ ++ -- + -- ++ ++ Me -- MS ME Me -- + -- ++ ++ -- __ -- -- -- ME + -- -- Me -- ME Me ME ME -- + -- ++ ++ -- -- -- ME -- -- + -- -- ++ -- MB -- ++ ++ ++ +""" +MAP.map_data_loop = """ + -- -- -- -- SP SP -- -- -- + -- ME ++ -- -- -- ++ ++ -- + ME -- -- MS -- ME ++ ++ -- + -- -- ++ Me -- MS ME Me -- + -- -- ++ -- __ -- -- -- ME + -- -- Me -- ME Me ME ME -- + -- ++ ++ -- -- -- ME -- -- + -- -- ++ -- MB -- ++ ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['CA', 'BB', 'Juno_ghost', 'Neptune_ghost'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.226, 1.249) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.186, 1.208) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.151, 1.172) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20220728_cn/d1.py b/campaign/war_archives_20220728_cn/d1.py new file mode 100644 index 000000000..83ae36421 --- /dev/null +++ b/campaign/war_archives_20220728_cn/d1.py @@ -0,0 +1,101 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('D1') +MAP.shape = 'J8' +MAP.camera_data = ['E2', 'E6', 'G4'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- -- ME -- -- Me -- -- ++ ++ + -- -- ++ MS -- -- Me -- MB ++ + SP -- -- -- MS ++ ++ -- -- ME + SP -- -- -- MS ++ ++ ME -- -- + -- -- ++ MS __ ME Me -- -- ME + -- Me ++ Me -- -- -- -- ME -- + -- -- -- -- -- ME -- ME -- -- + -- ME -- ME -- -- ++ ++ ++ -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Neptune_ghost', 'LeMars_ghost'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (120, 255 - 17), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_ENEMY_GENRE_DETECTION_SCALING = { + 'DD': 1.111, + 'CL': 1.111, + 'CA': 1.111, + 'CV': 1.111, + 'BB': 1.111, + } + MAP_ENEMY_TEMPLATE = ['Light', 'Main', 'Carrier', 'Treasure', 'Vestal_ghost'] + MAP_SWIPE_MULTIPLY = (1.141, 1.163) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.104, 1.124) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.071, 1.091) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20220728_cn/d2.py b/campaign/war_archives_20220728_cn/d2.py new file mode 100644 index 000000000..b8064bfa0 --- /dev/null +++ b/campaign/war_archives_20220728_cn/d2.py @@ -0,0 +1,89 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D2') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D3', 'E3', 'E6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- ME -- -- -- ME -- ME -- + ++ -- -- ME -- -- ++ -- ME + ++ ME Me ++ Me -- -- -- Me + -- -- -- ME -- -- -- MS -- + MB -- __ -- -- MS -- -- ++ + -- -- -- Me -- ++ Me -- -- + ++ ++ ME -- MS -- -- -- SP + ++ ++ -- ME -- ME -- SP -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['LeMars_ghost', 'Hermes_ghost'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (1.038, 1.058) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.004, 1.023) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.975, 0.993) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/war_archives_20220728_cn/d3.py b/campaign/war_archives_20220728_cn/d3.py new file mode 100644 index 000000000..f326a67c7 --- /dev/null +++ b/campaign/war_archives_20220728_cn/d3.py @@ -0,0 +1,92 @@ +from ..campaign_war_archives.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D3') +MAP.shape = 'I9' +MAP.camera_data = ['D3', 'D5', 'F3', 'F5'] +MAP.camera_data_spawn_point = ['E7'] +MAP.map_data = """ + -- ++ ++ ++ -- ++ ++ ++ -- + -- ME -- -- ME -- -- ME -- + ME -- -- ME -- ME -- -- ME + ++ -- Me ++ -- ++ Me -- ++ + ME -- -- -- MB -- -- -- ME + -- -- Me ++ MS ++ Me -- -- + ME -- MS -- __ -- MS -- ME + ++ ++ -- -- -- -- -- ++ ++ + ++ ++ -- SP -- SP -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2, 'siren': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 2}, + {'battle': 5, 'enemy': 1}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['LeMars_ghost', 'Hermes_ghost'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_SWIPE_MULTIPLY = (0.994, 1.013) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.961, 0.979) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.933, 0.950) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/config/template.json b/config/template.json index 94f705abd..f6e84b9f4 100644 --- a/config/template.json +++ b/config/template.json @@ -670,7 +670,7 @@ }, "Campaign": { "Name": "D3", - "Event": "war_archives_20220526_cn", + "Event": "war_archives_20220728_cn", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, @@ -1274,8 +1274,8 @@ "UseCoin": "always_use", "UsePart": "always_use", "AllowDelay": true, - "PresetFilter": "series_7_blueprint_la9", - "CustomFilter": "S7-DR0.5 > S7-PRY0.5 > S7-Q0.5 > S7-H0.5 > Q0.5 > S7-DR2.5\n> S7-G1.5 > S7-Q1 > S7-DR5 > 0.5 > S7-G4 > S7-Q2 > S7-PRY2.5 > reset\n> S7-DR8 > Q1 > 1 > S7-E-315 > S7-G2.5 > G1.5 > 1.5 > S7-E-031\n> S7-Q4 > Q2 > E2 > 2 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S7-PRY5\n> S7-PRY8 > Q4 > G4 > 4 > S7-C6 > DR5 > PRY5 > 5 > C6 > 6 > S7-C8\n> S7-C12 > DR8 > PRY8 > C8 > 8 > C12 > 12" + "PresetFilter": "series_8_blueprint_305", + "CustomFilter": "S8-DR0.5 > S8-PRY0.5 > S8-Q0.5 > S8-H0.5 > Q0.5 > S8-DR2.5\n> S8-G1.5 > S8-Q1 > S8-DR5 > 0.5 > S8-G4 > S8-Q2 > S8-PRY2.5 > reset\n> S8-DR8 > Q1 > 1 > S8-E-315 > S8-G2.5 > G1.5 > 1.5 > S8-E-031\n> S8-Q4 > Q2 > E2 > 2 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S8-PRY5\n> S8-PRY8 > Q4 > G4 > 4 > S8-C6 > DR5 > PRY5 > 5 > C6 > 6 > S8-C8\n> S8-C12 > DR8 > PRY8 > C8 > 8 > C12 > 12" }, "Storage": { "Storage": {} diff --git a/module/combat/combat.py b/module/combat/combat.py index aeac85d4d..d138c3911 100644 --- a/module/combat/combat.py +++ b/module/combat/combat.py @@ -106,6 +106,9 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan # PAUSE_Pharaoh has random animation, assets should avoid the area in the middle and use match_luma if PAUSE_Pharaoh.match_luma(self.device.image, offset=(10, 10)): return PAUSE_Pharaoh + # PAUSE_Star may get detected as PAUSE_Nurse, should before it + if PAUSE_Star.match_luma(self.device.image, offset=(10, 10)): + return PAUSE_Star if PAUSE_Nurse.match_luma(self.device.image, offset=(10, 10)): return PAUSE_Nurse # PAUSE_Devil is in red diff --git a/module/combat_ui/assets.py b/module/combat_ui/assets.py index 622cf84c2..748e5dd31 100644 --- a/module/combat_ui/assets.py +++ b/module/combat_ui/assets.py @@ -16,6 +16,7 @@ PAUSE_New = Button(area={'cn': (1231, 29, 1253, 56), 'en': (1231, 29, 1253, 56), PAUSE_Nurse = Button(area={'cn': (1236, 33, 1251, 50), 'en': (1236, 33, 1251, 50), 'jp': (1236, 33, 1251, 50), 'tw': (1236, 33, 1251, 50)}, color={'cn': (200, 206, 209), 'en': (200, 206, 209), 'jp': (200, 206, 209), 'tw': (200, 206, 209)}, button={'cn': (1236, 33, 1251, 50), 'en': (1236, 33, 1251, 50), 'jp': (1236, 33, 1251, 50), 'tw': (1236, 33, 1251, 50)}, file={'cn': './assets/cn/combat_ui/PAUSE_Nurse.png', 'en': './assets/cn/combat_ui/PAUSE_Nurse.png', 'jp': './assets/cn/combat_ui/PAUSE_Nurse.png', 'tw': './assets/cn/combat_ui/PAUSE_Nurse.png'}) PAUSE_Pharaoh = Button(area={'cn': (1229, 55, 1259, 62), 'en': (1229, 55, 1259, 62), 'jp': (1229, 55, 1259, 62), 'tw': (1229, 55, 1259, 62)}, color={'cn': (164, 119, 78), 'en': (164, 119, 78), 'jp': (164, 119, 78), 'tw': (164, 119, 78)}, button={'cn': (1229, 55, 1259, 62), 'en': (1229, 55, 1259, 62), 'jp': (1229, 55, 1259, 62), 'tw': (1229, 55, 1259, 62)}, file={'cn': './assets/cn/combat_ui/PAUSE_Pharaoh.png', 'en': './assets/cn/combat_ui/PAUSE_Pharaoh.png', 'jp': './assets/cn/combat_ui/PAUSE_Pharaoh.png', 'tw': './assets/cn/combat_ui/PAUSE_Pharaoh.png'}) PAUSE_Seaside = Button(area={'cn': (1214, 31, 1239, 59), 'en': (1214, 31, 1239, 59), 'jp': (1214, 31, 1239, 59), 'tw': (1214, 31, 1239, 59)}, color={'cn': (172, 196, 212), 'en': (172, 196, 212), 'jp': (172, 196, 212), 'tw': (172, 196, 212)}, button={'cn': (1214, 31, 1239, 59), 'en': (1214, 31, 1239, 59), 'jp': (1214, 31, 1239, 59), 'tw': (1214, 31, 1239, 59)}, file={'cn': './assets/cn/combat_ui/PAUSE_Seaside.png', 'en': './assets/cn/combat_ui/PAUSE_Seaside.png', 'jp': './assets/cn/combat_ui/PAUSE_Seaside.png', 'tw': './assets/cn/combat_ui/PAUSE_Seaside.png'}) +PAUSE_Star = Button(area={'cn': (1234, 36, 1250, 57), 'en': (1234, 36, 1250, 57), 'jp': (1234, 36, 1250, 57), 'tw': (1234, 36, 1250, 57)}, color={'cn': (169, 179, 179), 'en': (169, 179, 179), 'jp': (169, 179, 179), 'tw': (169, 179, 179)}, button={'cn': (1234, 36, 1250, 57), 'en': (1234, 36, 1250, 57), 'jp': (1234, 36, 1250, 57), 'tw': (1234, 36, 1250, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_Star.png', 'en': './assets/cn/combat_ui/PAUSE_Star.png', 'jp': './assets/cn/combat_ui/PAUSE_Star.png', 'tw': './assets/cn/combat_ui/PAUSE_Star.png'}) QUIT = Button(area={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp': (433, 490, 606, 547), 'tw': (433, 490, 606, 547)}, color={'cn': (199, 122, 114), 'en': (216, 168, 164), 'jp': (196, 120, 113), 'tw': (200, 126, 118)}, button={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp': (433, 490, 606, 547), 'tw': (433, 490, 606, 547)}, file={'cn': './assets/cn/combat_ui/QUIT.png', 'en': './assets/en/combat_ui/QUIT.png', 'jp': './assets/jp/combat_ui/QUIT.png', 'tw': './assets/tw/combat_ui/QUIT.png'}) QUIT_Christmas = Button(area={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, color={'cn': (195, 139, 166), 'en': (207, 166, 185), 'jp': (195, 139, 166), 'tw': (195, 139, 166)}, button={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, file={'cn': './assets/cn/combat_ui/QUIT_Christmas.png', 'en': './assets/en/combat_ui/QUIT_Christmas.png', 'jp': './assets/cn/combat_ui/QUIT_Christmas.png', 'tw': './assets/cn/combat_ui/QUIT_Christmas.png'}) QUIT_Cyber = Button(area={'cn': (393, 506, 470, 524), 'en': (393, 506, 470, 524), 'jp': (393, 506, 470, 524), 'tw': (393, 506, 470, 524)}, color={'cn': (255, 198, 190), 'en': (255, 198, 190), 'jp': (255, 198, 190), 'tw': (255, 198, 190)}, button={'cn': (393, 506, 470, 524), 'en': (393, 506, 470, 524), 'jp': (393, 506, 470, 524), 'tw': (393, 506, 470, 524)}, file={'cn': './assets/cn/combat_ui/QUIT_Cyber.png', 'en': './assets/cn/combat_ui/QUIT_Cyber.png', 'jp': './assets/cn/combat_ui/QUIT_Cyber.png', 'tw': './assets/tw/combat_ui/QUIT_Cyber.png'}) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 705532fb0..8708ad907 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1721,12 +1721,12 @@ "display": "hide", "option_bold": [ "event_20230525_cn", - "event_20250520_cn" + "event_20250424_cn" ], "cn": "event_20230525_cn", "en": "event_20230525_cn", "jp": "event_20230525_cn", - "tw": "event_20250520_cn" + "tw": "event_20250424_cn" }, "Mode": { "type": "select", @@ -2307,12 +2307,12 @@ ], "option_bold": [ "event_20230525_cn", - "event_20250520_cn" + "event_20250424_cn" ], "cn": "event_20230525_cn", "en": "event_20230525_cn", "jp": "event_20230525_cn", - "tw": "event_20250520_cn" + "tw": "event_20250424_cn" }, "Mode": { "type": "select", @@ -2767,12 +2767,12 @@ ], "option_bold": [ "event_20230525_cn", - "event_20250520_cn" + "event_20250424_cn" ], "cn": "event_20230525_cn", "en": "event_20230525_cn", "jp": "event_20230525_cn", - "tw": "event_20250520_cn" + "tw": "event_20250424_cn" }, "Mode": { "type": "select", @@ -3653,15 +3653,16 @@ "war_archives_20220224_cn", "war_archives_20220324_cn", "war_archives_20220414_cn", - "war_archives_20220526_cn" + "war_archives_20220526_cn", + "war_archives_20220728_cn" ], "option_bold": [ - "war_archives_20220526_cn" + "war_archives_20220728_cn" ], - "cn": "war_archives_20220526_cn", - "en": "war_archives_20220526_cn", - "jp": "war_archives_20220526_cn", - "tw": "war_archives_20220526_cn" + "cn": "war_archives_20220728_cn", + "en": "war_archives_20220728_cn", + "jp": "war_archives_20220728_cn", + "tw": "war_archives_20220728_cn" }, "Mode": { "type": "select", @@ -4370,12 +4371,12 @@ ], "option_bold": [ "event_20230525_cn", - "event_20250520_cn" + "event_20250424_cn" ], "cn": "event_20230525_cn", "en": "event_20230525_cn", "jp": "event_20230525_cn", - "tw": "event_20250520_cn" + "tw": "event_20250424_cn" }, "Mode": { "type": "select", @@ -4847,12 +4848,12 @@ ], "option_bold": [ "event_20230525_cn", - "event_20250520_cn" + "event_20250424_cn" ], "cn": "event_20230525_cn", "en": "event_20230525_cn", "jp": "event_20230525_cn", - "tw": "event_20250520_cn" + "tw": "event_20250424_cn" }, "Mode": { "type": "select", @@ -5324,12 +5325,12 @@ ], "option_bold": [ "event_20230525_cn", - "event_20250520_cn" + "event_20250424_cn" ], "cn": "event_20230525_cn", "en": "event_20230525_cn", "jp": "event_20230525_cn", - "tw": "event_20250520_cn" + "tw": "event_20250424_cn" }, "Mode": { "type": "select", @@ -5801,12 +5802,12 @@ ], "option_bold": [ "event_20230525_cn", - "event_20250520_cn" + "event_20250424_cn" ], "cn": "event_20230525_cn", "en": "event_20230525_cn", "jp": "event_20230525_cn", - "tw": "event_20250520_cn" + "tw": "event_20250424_cn" }, "Mode": { "type": "select", @@ -6268,12 +6269,12 @@ ], "option_bold": [ "event_20230525_cn", - "event_20250520_cn" + "event_20250424_cn" ], "cn": "event_20230525_cn", "en": "event_20230525_cn", "jp": "event_20230525_cn", - "tw": "event_20250520_cn" + "tw": "event_20250424_cn" }, "Mode": { "type": "select", @@ -7084,9 +7085,12 @@ }, "PresetFilter": { "type": "select", - "value": "series_7_blueprint_la9", + "value": "series_8_blueprint_305", "option": [ "custom", + "series_8_blueprint_305", + "series_8_blueprint_only", + "series_8_305_only", "series_7_blueprint_la9", "series_7_blueprint_only", "series_7_la9_only", @@ -7110,7 +7114,7 @@ }, "CustomFilter": { "type": "textarea", - "value": "S7-DR0.5 > S7-PRY0.5 > S7-Q0.5 > S7-H0.5 > Q0.5 > S7-DR2.5\n> S7-G1.5 > S7-Q1 > S7-DR5 > 0.5 > S7-G4 > S7-Q2 > S7-PRY2.5 > reset\n> S7-DR8 > Q1 > 1 > S7-E-315 > S7-G2.5 > G1.5 > 1.5 > S7-E-031\n> S7-Q4 > Q2 > E2 > 2 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S7-PRY5\n> S7-PRY8 > Q4 > G4 > 4 > S7-C6 > DR5 > PRY5 > 5 > C6 > 6 > S7-C8\n> S7-C12 > DR8 > PRY8 > C8 > 8 > C12 > 12" + "value": "S8-DR0.5 > S8-PRY0.5 > S8-Q0.5 > S8-H0.5 > Q0.5 > S8-DR2.5\n> S8-G1.5 > S8-Q1 > S8-DR5 > 0.5 > S8-G4 > S8-Q2 > S8-PRY2.5 > reset\n> S8-DR8 > Q1 > 1 > S8-E-315 > S8-G2.5 > G1.5 > 1.5 > S8-E-031\n> S8-Q4 > Q2 > E2 > 2 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S8-PRY5\n> S8-PRY8 > Q4 > G4 > 4 > S8-C6 > DR5 > PRY5 > 5 > C6 > 6 > S8-C8\n> S8-C12 > DR8 > PRY8 > C8 > 8 > C12 > 12" } }, "Storage": { diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 88c213ebf..d11485c8b 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -377,9 +377,12 @@ Research: option: [ always_use, only_05_hour, only_no_project, do_not_use ] AllowDelay: true PresetFilter: - value: series_7_blueprint_la9 + value: series_8_blueprint_305 option: - custom + - series_8_blueprint_305 + - series_8_blueprint_only + - series_8_305_only - series_7_blueprint_la9 - series_7_blueprint_only - series_7_la9_only @@ -400,12 +403,12 @@ Research: - series_2_blueprint_only - series_2_457_only CustomFilter: |- - S7-DR0.5 > S7-PRY0.5 > S7-Q0.5 > S7-H0.5 > Q0.5 > S7-DR2.5 - > S7-G1.5 > S7-Q1 > S7-DR5 > 0.5 > S7-G4 > S7-Q2 > S7-PRY2.5 > reset - > S7-DR8 > Q1 > 1 > S7-E-315 > S7-G2.5 > G1.5 > 1.5 > S7-E-031 - > S7-Q4 > Q2 > E2 > 2 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S7-PRY5 - > S7-PRY8 > Q4 > G4 > 4 > S7-C6 > DR5 > PRY5 > 5 > C6 > 6 > S7-C8 - > S7-C12 > DR8 > PRY8 > C8 > 8 > C12 > 12 + S8-DR0.5 > S8-PRY0.5 > S8-Q0.5 > S8-H0.5 > Q0.5 > S8-DR2.5 + > S8-G1.5 > S8-Q1 > S8-DR5 > 0.5 > S8-G4 > S8-Q2 > S8-PRY2.5 > reset + > S8-DR8 > Q1 > 1 > S8-E-315 > S8-G2.5 > G1.5 > 1.5 > S8-E-031 + > S8-Q4 > Q2 > E2 > 2 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S8-PRY5 + > S8-PRY8 > Q4 > G4 > 4 > S8-C6 > DR5 > PRY5 > 5 > C6 > 6 > S8-C8 + > S8-C12 > DR8 > PRY8 > C8 > 8 > C12 > 12 Dorm: Collect: true Feed: true diff --git a/module/config/config_generated.py b/module/config/config_generated.py index eb7d9816e..df6cee184 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -209,8 +209,8 @@ class GeneratedConfig: Research_UseCoin = 'always_use' # always_use, only_05_hour, only_no_project, do_not_use Research_UsePart = 'always_use' # always_use, only_05_hour, only_no_project, do_not_use Research_AllowDelay = True - Research_PresetFilter = 'series_7_blueprint_la9' # custom, series_7_blueprint_la9, series_7_blueprint_only, series_7_la9_only, series_6_blueprint_203, series_6_blueprint_only, series_6_203_only, series_5_blueprint_152, series_5_blueprint_only, series_5_152_only, series_4_blueprint_tenrai, series_4_blueprint_only, series_4_tenrai_only, series_3_blueprint_234, series_3_blueprint_only, series_3_234_only, series_2_than_3_457_234, series_2_blueprint_457, series_2_blueprint_only, series_2_457_only - Research_CustomFilter = 'S7-DR0.5 > S7-PRY0.5 > S7-Q0.5 > S7-H0.5 > Q0.5 > S7-DR2.5\n> S7-G1.5 > S7-Q1 > S7-DR5 > 0.5 > S7-G4 > S7-Q2 > S7-PRY2.5 > reset\n> S7-DR8 > Q1 > 1 > S7-E-315 > S7-G2.5 > G1.5 > 1.5 > S7-E-031\n> S7-Q4 > Q2 > E2 > 2 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S7-PRY5\n> S7-PRY8 > Q4 > G4 > 4 > S7-C6 > DR5 > PRY5 > 5 > C6 > 6 > S7-C8\n> S7-C12 > DR8 > PRY8 > C8 > 8 > C12 > 12' + Research_PresetFilter = 'series_8_blueprint_305' # custom, series_8_blueprint_305, series_8_blueprint_only, series_8_305_only, series_7_blueprint_la9, series_7_blueprint_only, series_7_la9_only, series_6_blueprint_203, series_6_blueprint_only, series_6_203_only, series_5_blueprint_152, series_5_blueprint_only, series_5_152_only, series_4_blueprint_tenrai, series_4_blueprint_only, series_4_tenrai_only, series_3_blueprint_234, series_3_blueprint_only, series_3_234_only, series_2_than_3_457_234, series_2_blueprint_457, series_2_blueprint_only, series_2_457_only + Research_CustomFilter = 'S8-DR0.5 > S8-PRY0.5 > S8-Q0.5 > S8-H0.5 > Q0.5 > S8-DR2.5\n> S8-G1.5 > S8-Q1 > S8-DR5 > 0.5 > S8-G4 > S8-Q2 > S8-PRY2.5 > reset\n> S8-DR8 > Q1 > 1 > S8-E-315 > S8-G2.5 > G1.5 > 1.5 > S8-E-031\n> S8-Q4 > Q2 > E2 > 2 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S8-PRY5\n> S8-PRY8 > Q4 > G4 > 4 > S8-C6 > DR5 > PRY5 > 5 > C6 > 6 > S8-C8\n> S8-C12 > DR8 > PRY8 > C8 > 8 > C12 > 12' # Group `Dorm` Dorm_Collect = True diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 02bb20913..c34569bfb 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -804,7 +804,8 @@ "war_archives_20220224_cn": "archives Abyssal Refrain", "war_archives_20220324_cn": "archives Virtual Tower", "war_archives_20220414_cn": "archives Aurora Noctis", - "war_archives_20220526_cn": "archives Pledge of the Radiant Court" + "war_archives_20220526_cn": "archives Pledge of the Radiant Court", + "war_archives_20220728_cn": "archives Aquilifers Ballade" }, "Mode": { "name": "Level Mode", @@ -1444,6 +1445,9 @@ "name": "Preset Filter Select", "help": "See research drops rates and spawn rates in https://azur-stats.lyoko.io/. People without a basic knowledge of these are recommended to use pre-optimized presets instead of writing custom filters", "custom": "custom", + "series_8_blueprint_305": "Series 8 Blueprints+305", + "series_8_blueprint_only": "Series 8 Blueprints Only", + "series_8_305_only": "Series 8 305 Only", "series_7_blueprint_la9": "Series 7 Blueprints+La9", "series_7_blueprint_only": "Series 7 Blueprints Only", "series_7_la9_only": "Series 7 La9 Only", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 6dfba41cf..900609d31 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -804,7 +804,8 @@ "war_archives_20220224_cn": "檔案 鳴動せし星霜の淵", "war_archives_20220324_cn": "檔案 幻像の塔", "war_archives_20220414_cn": "檔案 極夜照らす幻光", - "war_archives_20220526_cn": "檔案 诚閃の剣 搖光の城" + "war_archives_20220526_cn": "檔案 诚閃の剣 搖光の城", + "war_archives_20220728_cn": "檔案 鋼鷲の冒険譚" }, "Mode": { "name": "Campaign.Mode.name", @@ -1444,15 +1445,18 @@ "name": "Research.PresetFilter.name", "help": "Research.PresetFilter.help", "custom": "custom", - "series_7_blueprint_la9": "series_7_blueprint_la9", - "series_7_blueprint_only": "series_7_blueprint_only", - "series_7_la9_only": "series_7_la9_only", - "series_6_blueprint_203": "series_6_blueprint_203", - "series_6_blueprint_only": "series_6_blueprint_only", - "series_6_203_only": "series_6_203_only", - "series_5_blueprint_152": "series_5_blueprint_152", - "series_5_blueprint_only": "series_5_blueprint_only", - "series_5_152_only": "series_5_152_only", + "series_8_blueprint_305": "Series 8 Blueprints+305", + "series_8_blueprint_only": "Series 8 Blueprints Only", + "series_8_305_only": "Series 8 305 Only", + "series_7_blueprint_la9": "Series 7 Blueprints+La9", + "series_7_blueprint_only": "Series 7 Blueprints Only", + "series_7_la9_only": "Series 7 La9 Only", + "series_6_blueprint_203": "Series 6 Blueprints+203", + "series_6_blueprint_only": "Series 6 Blueprints Only", + "series_6_203_only": "Series 6 203 Only", + "series_5_blueprint_152": "Series 5 Blueprints+152", + "series_5_blueprint_only": "Series 5 Blueprints Only", + "series_5_152_only": "Series 5 152 Only", "series_4_blueprint_tenrai": "Series 4 Blueprints+Tenrai", "series_4_blueprint_only": "Series 4 Blueprints Only", "series_4_tenrai_only": "Series 4 Tenrai Only", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index c4a90087e..968aed94f 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -804,7 +804,8 @@ "war_archives_20220224_cn": "档案 深度回音", "war_archives_20220324_cn": "档案 虚像构筑之塔", "war_archives_20220414_cn": "档案 永夜幻光", - "war_archives_20220526_cn": "档案 泠誓光庭" + "war_archives_20220526_cn": "档案 泠誓光庭", + "war_archives_20220728_cn": "档案 雄鹰的叙事歌" }, "Mode": { "name": "关卡模式", @@ -1444,6 +1445,9 @@ "name": "科研过滤器", "help": "科研掉落和项目刷新见 https://azur-stats.lyoko.io/,对这些没有基本了解的人不建议编写自定义过滤器,建议使用预优化科研过滤器", "custom": "自定义", + "series_8_blueprint_305": "八期 蓝图+305", + "series_8_blueprint_only": "八期 仅蓝图", + "series_8_305_only": "八期 仅305", "series_7_blueprint_la9": "七期 蓝图+La9", "series_7_blueprint_only": "七期 仅蓝图", "series_7_la9_only": "七期 仅La9", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 5534d68f7..577aebf76 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -755,7 +755,7 @@ "event_20241121_cn": "危險發明逼近中", "event_20241219_cn": "Substellar Crepuscule", "event_20250227_cn": "Paradiso of Shackled Light", - "event_20250424_cn": "Toward Tulipa’s Seas", + "event_20250424_cn": "揚起鬱金之旗", "event_20250520_cn": "高塔上的薔薇", "raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20210708": "復刻穿越彼方的水線", @@ -804,7 +804,8 @@ "war_archives_20220224_cn": "檔案 深度回音", "war_archives_20220324_cn": "檔案 虛像構築之塔", "war_archives_20220414_cn": "檔案 永夜幻光", - "war_archives_20220526_cn": "檔案 泠誓光庭" + "war_archives_20220526_cn": "檔案 泠誓光庭", + "war_archives_20220728_cn": "檔案 雄鷹的敘事歌" }, "Mode": { "name": "地圖模式", @@ -1444,6 +1445,9 @@ "name": "科研過濾器", "help": "科研掉落和項目刷新見 https://azur-stats.lyoko.io/,對這些沒有基本了解的人不建議編寫自定義過濾器,建議使用預優化科研過濾器", "custom": "自定義", + "series_8_blueprint_305": "八期 藍圖+305", + "series_8_blueprint_only": "八期 僅藍圖", + "series_8_305_only": "八期 僅305", "series_7_blueprint_la9": "七期 藍圖+La9", "series_7_blueprint_only": "七期 僅藍圖", "series_7_la9_only": "七期 僅La9", diff --git a/module/device/method/ascreencap.py b/module/device/method/ascreencap.py index 82e4e8a53..325b96764 100644 --- a/module/device/method/ascreencap.py +++ b/module/device/method/ascreencap.py @@ -2,7 +2,6 @@ import os import time from functools import wraps -import lz4.block from adbutils.errors import AdbError from module.base.utils import * @@ -157,7 +156,8 @@ class AScreenCap(Connection): _, uncompressed_size, _, width, height = compressed_data_header channel = 3 - data = lz4.block.decompress(raw_compressed_data[20:], uncompressed_size=uncompressed_size) + from lz4.block import decompress + data = decompress(raw_compressed_data[20:], uncompressed_size=uncompressed_size) image = np.frombuffer(data, dtype=np.uint8) if image is None: @@ -183,20 +183,21 @@ class AScreenCap(Connection): return image def __process_screenshot(self, screenshot): + from lz4.block import LZ4BlockError for method in self.__screenshot_method_fixed: try: result = self.__load_screenshot(screenshot, method=method) result = self.__uncompress(result) self.__screenshot_method_fixed = [method] + self.__screenshot_method return result - except lz4.block.LZ4BlockError: + except LZ4BlockError: self.__bytepointer = 0 continue self.__screenshot_method_fixed = self.__screenshot_method if len(screenshot) < 500: logger.warning(f'Unexpected screenshot: {screenshot}') - raise OSError(f'cannot load screenshot') + raise ImageTruncated(f'cannot load screenshot') @retry def screenshot_ascreencap(self): diff --git a/module/device/method/nemu_ipc.py b/module/device/method/nemu_ipc.py index c9d9dc961..e6c4a69fb 100644 --- a/module/device/method/nemu_ipc.py +++ b/module/device/method/nemu_ipc.py @@ -226,7 +226,7 @@ class NemuIpcImpl: # MuMuPlayer12 5.0 os.path.abspath(os.path.join(nemu_folder, './nx_device/12.0/shell/sdk/external_renderer_ipc.dll')), ] - ipc_dll = '' + self.lib = None for ipc_dll in list_dll: if not os.path.exists(ipc_dll): continue @@ -237,7 +237,7 @@ class NemuIpcImpl: logger.error(e) logger.error(f'ipc_dll={ipc_dll} exists, but cannot be loaded') continue - if not ipc_dll: + if self.lib is None: # not found raise NemuIpcIncompatible( f'NemuIpc requires MuMu12 version >= 3.8.13, please check your version. ' @@ -486,7 +486,7 @@ class NemuIpc(Platform): instance_id=index, display_id=0 ).__enter__() - except (NemuIpcIncompatible, NemuIpcError) as e: + except (NemuIpcIncompatible, NemuIpcError, JobTimeout) as e: logger.error(e) logger.error('Emulator info incorrect') @@ -505,7 +505,7 @@ class NemuIpc(Platform): instance_id=self.emulator_instance.MuMuPlayer12_id, display_id=0 ).__enter__() - except (NemuIpcIncompatible, NemuIpcError) as e: + except (NemuIpcIncompatible, NemuIpcError, JobTimeout) as e: logger.error(e) logger.error('Unable to initialize NemuIpc') raise RequestHumanTakeover diff --git a/module/exercise/hp_daemon.py b/module/exercise/hp_daemon.py index f047ad6f2..ecf7e5b25 100644 --- a/module/exercise/hp_daemon.py +++ b/module/exercise/hp_daemon.py @@ -72,6 +72,7 @@ class HpDaemon(ModuleBase): PAUSE_Nurse, PAUSE_Devil, PAUSE_Seaside, + PAUSE_Star, ]: self.attacker_hp = self._calculate_hp(image, area=ATTACKER_HP_AREA_New.area, reverse=True) self.defender_hp = self._calculate_hp(image, area=DEFENDER_HP_AREA_New.area, reverse=True) diff --git a/module/research/assets.py b/module/research/assets.py index bb5862dd7..c828bae42 100644 --- a/module/research/assets.py +++ b/module/research/assets.py @@ -69,4 +69,5 @@ TEMPLATE_S4_2 = Template(file={'cn': './assets/cn/research/TEMPLATE_S4_2.png', ' TEMPLATE_S5 = Template(file={'cn': './assets/cn/research/TEMPLATE_S5.png', 'en': './assets/en/research/TEMPLATE_S5.png', 'jp': './assets/jp/research/TEMPLATE_S5.png', 'tw': './assets/tw/research/TEMPLATE_S5.png'}) TEMPLATE_S6 = Template(file={'cn': './assets/cn/research/TEMPLATE_S6.png', 'en': './assets/en/research/TEMPLATE_S6.png', 'jp': './assets/jp/research/TEMPLATE_S6.png', 'tw': './assets/tw/research/TEMPLATE_S6.png'}) TEMPLATE_S7 = Template(file={'cn': './assets/cn/research/TEMPLATE_S7.png', 'en': './assets/en/research/TEMPLATE_S7.png', 'jp': './assets/jp/research/TEMPLATE_S7.png', 'tw': './assets/tw/research/TEMPLATE_S7.png'}) +TEMPLATE_S8 = Template(file={'cn': './assets/cn/research/TEMPLATE_S8.png', 'en': './assets/cn/research/TEMPLATE_S8.png', 'jp': './assets/cn/research/TEMPLATE_S8.png', 'tw': './assets/cn/research/TEMPLATE_S8.png'}) TEMPLATE_WAITING = Template(file={'cn': './assets/cn/research/TEMPLATE_WAITING.png', 'en': './assets/en/research/TEMPLATE_WAITING.png', 'jp': './assets/jp/research/TEMPLATE_WAITING.png', 'tw': './assets/tw/research/TEMPLATE_WAITING.png'}) diff --git a/module/research/preset.py b/module/research/preset.py index 15865fd28..9d607e1fa 100644 --- a/module/research/preset.py +++ b/module/research/preset.py @@ -1,6 +1,72 @@ FILTER_STRING_SHORTEST = '0.5 > 1 > 1.5 > 2 > 2.5 > 3 > 4 > 5 > 6 > 8 > 10 > 12' FILTER_STRING_CHEAPEST = 'Q1 > Q2 > T3 > T4 > Q4 > C6 > T6 > C8 > C12 > G1.5 > D2.5 > G2.5 > D5 > Q0.5 > G4 > D8 > H1 > H2 > H0.5 > D0.5 > H4' DICT_FILTER_PRESET = { + # Goal: DR_blurprint=0, PRY_blueprint=0, tanrai_blueprint=150 + # Average time cost: 153.41706666666678 + # Average rewards: [238.69016631 238.37881965 529.71190834 528.92520834 528.39586667 150.07973333] + 'series_8_305_only_cube': """ + S8-Q0.5 > S8-DR0.5 > S8-PRY0.5 > Q0.5 > S8-Q4 > S8-Q2 > S8-Q1 > 0.5 + > S8-E-315 > S8-G1.5 > S8-G4 > Q1 > reset > S8-H1 > H1 > 1 > S8-E-031 + > S8-DR2.5 > S8-PRY2.5 > S8-G2.5 > G1.5 > 1.5 > Q2 > E2 > S8-H2 > H2 + > 2 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S8-DR5 > S8-PRY5 > Q4 > G4 + > S8-H4 > H4 > 4 > S8-C6 > DR5 > PRY5 > 5 > S8-DR8 > S8-PRY8 > S8-C8 + > C6 > 6 > S8-C12 > DR8 > PRY8 > C8 > 8 > C12 > 12 + """, + # Goal: DR_blurprint=0, PRY_blueprint=0, tanrai_blueprint=150 + # Average time cost: 161.37177965277806 + # Average rewards: [241.92774575 241.13046242 421.82134358 421.04494941 420.46893024 150.07799978] + 'series_8_305_only': """ + S8-Q0.5 > S8-PRY0.5 > S8-DR0.5 > Q0.5 > S8-Q4 > S8-Q2 > S8-Q1 > 0.5 + > S8-E-315 > S8-G4 > S8-G1.5 > Q1 > 1 > S8-E-031 > S8-DR2.5 > reset + > S8-G2.5 > S8-PRY2.5 > G1.5 > 1.5 > Q2 > E2 > 2 > DR2.5 > PRY2.5 + > G2.5 > 2.5 > S8-DR5 > S8-PRY5 > Q4 > G4 > 4 > S8-C6 > DR5 > PRY5 + > 5 > S8-DR8 > S8-PRY8 > S8-C8 > C6 > 6 > DR8 > PRY8 > C8 > 8 + > S8-C12 > C12 > 12 + """, + # Goal: DR_blurprint=513, PRY_blueprint=343, tanrai_blueprint=100 + # Average time cost: 124.67622465277958 + # Average rewards: [531.93022864 529.81919864 510.27473326 510.18530159 510.11215826 100.8088164] + 'series_8_blueprint_305_cube': """ + S8-DR0.5 > S8-Q0.5 > S8-PRY0.5 > 0.5 > S8-DR2.5 > S8-Q1 > S8-Q2 + > S8-H1 > S8-E-315 > S8-G1.5 > reset > S8-Q4 > S8-G4 > S8-H2 > Q1 + > H1 > 1 > S8-G2.5 > S8-DR5 > S8-PRY2.5 > G1.5 > 1.5 > S8-E-031 + > S8-DR8 > Q2 > E2 > H2 > 2 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S8-H4 + > S8-PRY5 > Q4 > G4 > H4 > 4 > S8-C6 > S8-PRY8 > DR5 > PRY5 > 5 > C6 + > 6 > S8-C8 > DR8 > PRY8 > C8 > 8 > S8-C12 > C12 > 12 + """, + # Goal: DR_blurprint=513, PRY_blueprint=343, tanrai_blueprint=100 + # Average time cost: 143.56399131945145 + # Average rewards: [520.06195858 519.19883191 392.86544828 392.64870495 392.49383995 102.2368499] + 'series_8_blueprint_305': """ + S8-DR0.5 > S8-PRY0.5 > S8-Q0.5 > S8-H0.5 > Q0.5 > S8-DR2.5 + > S8-G1.5 > S8-Q1 > S8-DR5 > 0.5 > S8-G4 > S8-Q2 > S8-PRY2.5 > reset + > S8-DR8 > Q1 > 1 > S8-E-315 > S8-G2.5 > G1.5 > 1.5 > S8-E-031 + > S8-Q4 > Q2 > E2 > 2 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S8-PRY5 + > S8-PRY8 > Q4 > G4 > 4 > S8-C6 > DR5 > PRY5 > 5 > C6 > 6 > S8-C8 + > S8-C12 > DR8 > PRY8 > C8 > 8 > C12 > 12 + """, + # Goal: DR_blurprint=513, PRY_blueprint=343, tanrai_blueprint=0 + # Average time cost: 82.0121088194467 + # Average rewards: [519.0311752 514.64003687 653.77171198 653.72126532 653.66129615 26.97694791] + 'series_8_blueprint_only_cube': """ + S8-DR0.5 > S8-PRY0.5 > S8-H0.5 > S8-H1 > S8-H2 > S8-DR2.5 > S8-DR5 + > 0.5 > S8-DR8 > reset > S8-H4 > S8-Q1 > Q1 > H1 > 1 > S8-G1.5 > G1.5 + > 1.5 > S8-G2.5 > S8-Q2 > S8-E-315 > S8-E-031 > Q2 > E2 > H2 > 2 + > S8-PRY2.5 > S8-G4 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S8-Q4 > Q4 > G4 + > H4 > 4 > S8-PRY5 > S8-PRY8 > S8-C6 > DR5 > PRY5 > 5 > C6 > 6 + > S8-C8 > S8-C12 > DR8 > PRY8 > C8 > 8 > C12 > 12 + """, + # Goal: DR_blurprint=513, PRY_blueprint=343, tanrai_blueprint=0 + # Average time cost: 124.71616166666873 + # Average rewards: [514.96354877 514.70099977 355.58865468 354.96831385 354.66888635 56.48432238] + 'series_8_blueprint_only': """ + S8-DR0.5 > S8-H0.5 > S8-PRY0.5 > S8-DR8 > S8-DR5 > S8-DR2.5 + > S8-G1.5 > S8-PRY2.5 > 0.5 > S8-G2.5 > S8-G4 > reset > S8-Q1 > Q1 + > 1 > S8-PRY5 > G1.5 > 1.5 > S8-Q2 > S8-E-031 > S8-E-315 > Q2 > E2 + > 2 > S8-PRY8 > DR2.5 > PRY2.5 > G2.5 > 2.5 > S8-Q4 > Q4 > G4 > 4 + > S8-C6 > DR5 > PRY5 > 5 > C6 > 6 > S8-C8 > DR8 > PRY8 > C8 > 8 + > S8-C12 > C12 > 12 + """, # Goal: DR_blurprint=0, PRY_blueprint=0, tanrai_blueprint=150 # Average time cost: 153.41706666666678 # Average rewards: [238.69016631 238.37881965 529.71190834 528.92520834 528.39586667 150.07973333] diff --git a/module/research/preset_generator.py b/module/research/preset_generator.py index 94d238dc4..a7d61edcf 100644 --- a/module/research/preset_generator.py +++ b/module/research/preset_generator.py @@ -80,6 +80,8 @@ def translate(string: str, target='series_4_tenrai_only_cube', for_simulate=Fals def convert_name(name, series): name = re.sub(r'series_\d', f'series_{series}', name) + if 'series_8' in name: + name = name.replace('tenrai', '305') if 'series_7' in name: name = name.replace('tenrai', 'la9') if 'series_6' in name: @@ -102,7 +104,7 @@ if __name__ == '__main__': Value( FILTER_STRING_CHEAPEST='Q1 > Q2 > T3 > T4 > Q4 > C6 > T6 > C8 > C12 > G1.5 > D2.5 > G2.5 > D5 > Q0.5 > G4 > D8 > H1 > H2 > H0.5 > D0.5 > H4') with Dict('DICT_FILTER_PRESET'): - for series in [7, 6, 5, 4, 3, 2]: + for series in [8, 7, 6, 5, 4, 3, 2]: def new_filter(**kwargs): for k, v in kwargs.items(): k = convert_name(k, series) diff --git a/module/research/project.py b/module/research/project.py index d6144d9d8..4a92ae1f5 100644 --- a/module/research/project.py +++ b/module/research/project.py @@ -399,13 +399,16 @@ def research_detect(image): class ResearchProject: REGEX_SHIP = re.compile( - '(neptune|monarch|ibuki|izumo|roon|saintlouis' + '(' + 'neptune|monarch|ibuki|izumo|roon|saintlouis' '|seattle|georgia|kitakaze|azuma|friedrich' '|gascogne|champagne|cheshire|drake|mainz|odin' '|anchorage|hakuryu|agir|august|marcopolo' '|plymouth|rupprecht|harbin|chkalov|brest' '|kearsarge|hindenburg|shimanto|schultz|flandre' - '|napoli|nakhimov|halford|bayard|daisen)') + '|napoli|nakhimov|halford|bayard|daisen' + '|goudenleeuw|mecklenburg|dmitri|kansas|vittorio' + ')') REGEX_INPUT = re.compile('(coin|cube|part)') REGEX_DR_SHIP = re.compile( 'azuma|friedrich' @@ -414,6 +417,7 @@ class ResearchProject: '|plymouth|brest' '|kearsarge|hindenburg' '|napoli|nakhimov' + '|goudenleeuw|mecklenburg' ) # Generate with: """ @@ -431,12 +435,13 @@ class ResearchProject: '779', '794', '305', '312', '346', '357', '379', '394', '721', '722', '772', '777', '795', '321', '322', '372', '377', '395', '708', '763', '775', '782', '768', '308', '363', '375', '382', '368', '719', '778', '786', '788', '793', '319', '378', '386', '388', '393', '783', '713', '739', '771', '796', '383', '313', '339', '371', '396', - '703', '758', '766', '790', '797', '303', '358', '366', '390', '397', '418', '431', '444', '459', '474', '492', - '018', '031', '044', '059', '074', '092', '405', '412', '446', '457', '479', '494', '005', '012', '046', '057', - '079', '094', '421', '422', '472', '477', '495', '021', '022', '072', '077', '095', '408', '463', '475', '482', - '468', '008', '063', '075', '082', '068', '419', '478', '486', '488', '493', '019', '078', '086', '088', '093', - '483', '413', '439', '471', '496', '083', '013', '039', '071', '096', '403', '458', '466', '490', '497', '003', - '058', '066', '090', '097'] + '703', '758', '766', '790', '797', '303', '358', '366', '390', '397', '780', '736', '787', '711', '764', '380', + '336', '387', '311', '364', '418', '431', '444', '459', '474', '492', '018', '031', '044', '059', '074', '092', + '405', '412', '446', '457', '479', '494', '005', '012', '046', '057', '079', '094', '421', '422', '472', '477', + '495', '021', '022', '072', '077', '095', '408', '463', '475', '482', '468', '008', '063', '075', '082', '068', + '419', '478', '486', '488', '493', '019', '078', '086', '088', '093', '483', '413', '439', '471', '496', '083', + '013', '039', '071', '096', '403', '458', '466', '490', '497', '003', '058', '066', '090', '097', '480', '436', + '487', '411', '464', '080', '036', '087', '011', '064'] def __init__(self, name, series): """ @@ -627,7 +632,8 @@ class ResearchProjectJp: SHIP_S5 = ['plymouth', 'rupprecht', 'harbin', 'chkalov', 'brest'] SHIP_S6 = ['kearsarge', 'hindenburg', 'shimanto', 'schultz', 'flandre'] SHIP_S7 = ['napoli', 'nakhimov', 'halford', 'bayard', 'daisen'] - SHIP_ALL = SHIP_S1 + SHIP_S2 + SHIP_S3 + SHIP_S4 + SHIP_S5 + SHIP_S6 + SHIP_S7 + SHIP_S8 = ['goudenleeuw', 'mecklenburg', 'dmitri', 'kansas', 'vittorio'] + SHIP_ALL = SHIP_S1 + SHIP_S2 + SHIP_S3 + SHIP_S4 + SHIP_S5 + SHIP_S6 + SHIP_S7 + SHIP_S8 DR_SHIP = [ 'azuma', 'friedrich', 'drake', @@ -635,6 +641,7 @@ class ResearchProjectJp: 'plymouth', 'brest', 'kearsarge', 'hindenburg', 'napoli', 'nakhimov', + 'goudenleeuw', 'mecklenburg', ] def __init__(self): diff --git a/module/research/project_data.py b/module/research/project_data.py index 6cf347614..9d7579029 100644 --- a/module/research/project_data.py +++ b/module/research/project_data.py @@ -19,7 +19,7 @@ LIST_RESEARCH_PROJECT = [ {'name': 'E-315-MI', 'series': 1, 'time': 7200, 'task': 'Scrap 15 pieces of gear.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, {'name': 'E-131-MI', 'series': 1, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Royal Tech Pack', 'amount': 15}], 'output': [{'name': 'T0 Prototype Triple 381mm AA Gun Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-159-MI', 'series': 1, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Sakura Tech Pack', 'amount': 15}], 'output': [{'name': 'T0 Prototype Triple 410mm Mounted Gun Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, - {'name': 'E-174-MI', 'series': 1, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Ironblood Tech Pack', 'amount': 15}], 'output': [{'name': 'T0 Prototype Triple 203mm Main Gun (SK C) Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-174-MI', 'series': 1, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'T0 Prototype Triple 203mm Main Gun (SK C) Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-192-MI', 'series': 1, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Eagle Tech Pack', 'amount': 15}], 'output': [{'name': 'T0 Prototype Triple 203mm AA Gun Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-118-MI', 'series': 1, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Royal Tech Pack', 'amount': 15}], 'output': [{'name': 'T0 Prototype Triple 152mm AA Gun Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-144-MI', 'series': 1, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Sakura Tech Pack', 'amount': 15}], 'output': [{'name': 'T0 100mm Mounted AA Gun Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, @@ -70,7 +70,7 @@ LIST_RESEARCH_PROJECT = [ {'name': 'T-249-MI', 'series': 2, 'time': 21600, 'task': 'Complete 6 commissions.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-031-MI', 'series': 2, 'time': 7200, 'task': 'Scrap 8 pieces of gear.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, {'name': 'E-315-MI', 'series': 2, 'time': 7200, 'task': 'Scrap 15 pieces of gear.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, - {'name': 'E-179-MI', 'series': 2, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Ironblood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Twin 406mm Main Gun (SK C/34) T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-179-MI', 'series': 2, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Twin 406mm Main Gun (SK C/34) T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-105-MI', 'series': 2, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Eagle Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 152mm Main Gun (DP MK17) T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-146-MI', 'series': 2, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Sakura Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype 40mm AA Gun (Type 5) T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-157-MI', 'series': 2, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Sakura Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 310mm Main Gun (Type 0) T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, @@ -125,7 +125,7 @@ LIST_RESEARCH_PROJECT = [ {'name': 'E-121-MI', 'series': 3, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Royal Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Twin 234mm Main Gun (9.2" MK XII) T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-123-MI', 'series': 3, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Royal Tech Pack', 'amount': 15}], 'output': [{'name': 'Twin 114mm DP (4.5" MK IV) T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-124-MI', 'series': 3, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Royal Tech Pack', 'amount': 15}], 'output': [{'name': 'Sextuple Bofors 40mm AA Gun T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, - {'name': 'E-177-MI', 'series': 3, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Ironblood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 305mm Main Gun (SK C/39) T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-177-MI', 'series': 3, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 305mm Main Gun (SK C/39) T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-195-MI', 'series': 3, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Eagle Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 406mm/50 Main Gun T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'G-412-MI', 'series': 3, 'time': 5400, 'task': '', 'input': [{'name': 'Coins', 'amount': 1500}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, {'name': 'G-236-MI', 'series': 3, 'time': 9000, 'task': '', 'input': [{'name': 'Coins', 'amount': 3000}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, @@ -172,10 +172,10 @@ LIST_RESEARCH_PROJECT = [ {'name': 'T-249-MI', 'series': 4, 'time': 21600, 'task': 'Complete 6 commissions.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-031-MI', 'series': 4, 'time': 7200, 'task': 'Scrap 8 pieces of gear.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, {'name': 'E-315-MI', 'series': 4, 'time': 7200, 'task': 'Scrap 15 pieces of gear.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, - {'name': 'E-175-MI', 'series': 4, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Ironblood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 305mm SK C/39 Main Gun T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, - {'name': 'E-182-MI', 'series': 4, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Ironblood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype BF-109G T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, - {'name': 'E-168-MI', 'series': 4, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Ironblood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Twin 90mm Model 1939 High Angle Gun T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, - {'name': 'E-108-MI', 'series': 4, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Ironblood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 406mm Model 1940 Main Gun T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-175-MI', 'series': 4, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 305mm SK C/39 Main Gun T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-182-MI', 'series': 4, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype BF-109G T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-168-MI', 'series': 4, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Twin 90mm Model 1939 High Angle Gun T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-108-MI', 'series': 4, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 406mm Model 1940 Main Gun T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-163-MI', 'series': 4, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Sakura Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Saiun Kai T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'G-412-MI', 'series': 4, 'time': 5400, 'task': '', 'input': [{'name': 'Coins', 'amount': 1500}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, {'name': 'G-236-MI', 'series': 4, 'time': 9000, 'task': '', 'input': [{'name': 'Coins', 'amount': 3000}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, @@ -223,8 +223,8 @@ LIST_RESEARCH_PROJECT = [ {'name': 'E-031-MI', 'series': 5, 'time': 7200, 'task': 'Scrap 8 pieces of gear.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, {'name': 'E-315-MI', 'series': 5, 'time': 7200, 'task': 'Scrap 15 pieces of gear.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, {'name': 'E-193-MI', 'series': 5, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Eagle Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Quadruple 330mm Mle 1931 (CB Only) Main Gun Mount Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, - {'name': 'E-178-MI', 'series': 5, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Ironblood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Quadruple 30mm AA Gun Mount Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, - {'name': 'E-186-MI', 'series': 5, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Ironblood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Twin 130mm Model 1936 Main Gun Mount Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-178-MI', 'series': 5, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Quadruple 30mm AA Gun Mount Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-186-MI', 'series': 5, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Twin 130mm Model 1936 Main Gun Mount Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-188-MI', 'series': 5, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Eagle Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Su-2 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-189-MI', 'series': 5, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Eagle Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype VIT-2 (VK-107) Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'G-412-MI', 'series': 5, 'time': 5400, 'task': '', 'input': [{'name': 'Coins', 'amount': 1500}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, @@ -274,9 +274,9 @@ LIST_RESEARCH_PROJECT = [ {'name': 'E-315-MI', 'series': 6, 'time': 7200, 'task': 'Scrap 15 pieces of gear.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, {'name': 'E-113-MI', 'series': 6, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Eagle Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 406mm Mk6 Main Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-139-MI', 'series': 6, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Sakura Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 150mm Type 5 High-Angle Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, - {'name': 'E-171-MI', 'series': 6, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Ironblood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Twin 150mm TbtsK C42T Main Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, - {'name': 'E-196-MI', 'series': 6, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Ironblood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 380mm Mle 1935 Main Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, - {'name': 'E-184-MI', 'series': 6, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Ironblood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype 55mm Gerät 58 AA Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-171-MI', 'series': 6, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Twin 150mm TbtsK C42T Main Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-196-MI', 'series': 6, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 380mm Mle 1935 Main Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-184-MI', 'series': 6, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype 55mm Gerät 58 AA Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'G-412-MI', 'series': 6, 'time': 5400, 'task': '', 'input': [{'name': 'Coins', 'amount': 1500}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, {'name': 'G-236-MI', 'series': 6, 'time': 9000, 'task': '', 'input': [{'name': 'Coins', 'amount': 3000}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, {'name': 'G-531-MI', 'series': 6, 'time': 14400, 'task': '', 'input': [{'name': 'Coins', 'amount': 6000}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, @@ -322,6 +322,11 @@ LIST_RESEARCH_PROJECT = [ {'name': 'T-249-MI', 'series': 7, 'time': 21600, 'task': 'Complete 6 commissions.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'E-031-MI', 'series': 7, 'time': 7200, 'task': 'Scrap 8 pieces of gear.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, {'name': 'E-315-MI', 'series': 7, 'time': 7200, 'task': 'Scrap 15 pieces of gear.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'E-191-MI', 'series': 7, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Eagle Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype VIT-2 (Mode Change) T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-166-MI', 'series': 7, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 254mm Model 1939 Main Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-167-MI', 'series': 7, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Iron Blood Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Triple 152mm Model 1936 Main Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-13-MI', 'series': 7, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Eagle Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype F8F Bearcat (Float) T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-158-MI', 'series': 7, 'time': 21600, 'task': '', 'input': [{'name': 'T3 Sakura Tech Pack', 'amount': 15}], 'output': [{'name': 'Prototype Twin 410mm mod.A Main Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'G-412-MI', 'series': 7, 'time': 5400, 'task': '', 'input': [{'name': 'Coins', 'amount': 1500}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, {'name': 'G-236-MI', 'series': 7, 'time': 9000, 'task': '', 'input': [{'name': 'Coins', 'amount': 3000}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, {'name': 'G-531-MI', 'series': 7, 'time': 14400, 'task': '', 'input': [{'name': 'Coins', 'amount': 6000}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, @@ -352,6 +357,51 @@ LIST_RESEARCH_PROJECT = [ {'name': 'Q-089-MI', 'series': 7, 'time': 14400, 'task': '', 'input': [{'name': 'T3 Aircraft Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'H-387-MI', 'series': 7, 'time': 3600, 'task': '', 'input': [{'name': 'Wisdom Cube', 'amount': 3}], 'output': [{'name': 'Random Blueprint'}, {'name': 'T1 Mystery Retrofit Blueprint'}, {'name': 'Cognitive Chips'}]}, {'name': 'H-339-MI', 'series': 7, 'time': 7200, 'task': '', 'input': [{'name': 'Wisdom Cube', 'amount': 6}], 'output': [{'name': 'Random Blueprint'}, {'name': 'T2 Mystery Retrofit Blueprint'}, {'name': 'Cognitive Chips'}]}, + {'name': 'C-153-MI', 'series': 8, 'time': 21600, 'task': '', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'C-185-MI', 'series': 8, 'time': 28800, 'task': '', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'B-622-MI', 'series': 8, 'time': 14400, 'task': 'Clear Chapter 3 or onward stages for 6 times on Normal Mode ', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, + {'name': 'B-636-MI', 'series': 8, 'time': 14400, 'task': 'Clear Chapter 4 or onward stages for 6 times on Normal Mode ', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, + {'name': 'B-654-MI', 'series': 8, 'time': 14400, 'task': 'Clear Chapter 5 or onward stages for 6 times on Normal Mode ', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, + {'name': 'B-682-MI', 'series': 8, 'time': 14400, 'task': 'Clear Chapter 6 or onward stages for 6 times on Normal Mode ', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, + {'name': 'B-235-MI', 'series': 8, 'time': 14400, 'task': 'Clear Chapter 7 or onward stages for 5 times on Normal Mode ', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'B-268-MI', 'series': 8, 'time': 14400, 'task': 'Clear Chapter 8 or onward stages for 5 times on Normal Mode ', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'B-128-MI', 'series': 8, 'time': 14400, 'task': 'Clear Chapter 9 or onward stages for 4 times on Normal Mode ', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'B-164-MI', 'series': 8, 'time': 14400, 'task': 'Clear Chapter 10 or onward stages for 4 times on Normal Mode ', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'T-018-MI', 'series': 8, 'time': 10800, 'task': 'Complete 2 commissions.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'T-384-MI', 'series': 8, 'time': 14400, 'task': 'Complete 4 commissions.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'T-249-MI', 'series': 8, 'time': 21600, 'task': 'Complete 6 commissions.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-031-MI', 'series': 8, 'time': 7200, 'task': 'Scrap 8 pieces of gear.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'E-315-MI', 'series': 8, 'time': 7200, 'task': 'Scrap 15 pieces of gear.', 'input': [], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'G-412-MI', 'series': 8, 'time': 5400, 'task': '', 'input': [{'name': 'Coins', 'amount': 1500}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, + {'name': 'G-236-MI', 'series': 8, 'time': 9000, 'task': '', 'input': [{'name': 'Coins', 'amount': 3000}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, + {'name': 'G-531-MI', 'series': 8, 'time': 14400, 'task': '', 'input': [{'name': 'Coins', 'amount': 6000}], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-780-MI', 'series': 8, 'time': 9000, 'task': '', 'input': [{'name': 'Coins', 'amount': 3000}], 'output': [{'name': 'Blueprint - Mecklenburg'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, + {'name': 'D-736-MI', 'series': 8, 'time': 9000, 'task': '', 'input': [{'name': 'Coins', 'amount': 3000}], 'output': [{'name': 'Blueprint - Gouden Leeuw'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, + {'name': 'D-787-MI', 'series': 8, 'time': 9000, 'task': '', 'input': [{'name': 'Coins', 'amount': 3000}], 'output': [{'name': 'Blueprint - Dmitri Donskoi'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, + {'name': 'D-711-MI', 'series': 8, 'time': 9000, 'task': '', 'input': [{'name': 'Coins', 'amount': 3000}], 'output': [{'name': 'Blueprint - Kansas'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, + {'name': 'D-764-MI', 'series': 8, 'time': 9000, 'task': '', 'input': [{'name': 'Coins', 'amount': 3000}], 'output': [{'name': 'Blueprint - Vittorio Cuniberti'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}]}, + {'name': 'D-380-MI', 'series': 8, 'time': 18000, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}], 'output': [{'name': 'Blueprint - Mecklenburg'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-336-MI', 'series': 8, 'time': 18000, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}], 'output': [{'name': 'Blueprint - Gouden Leeuw'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-387-MI', 'series': 8, 'time': 18000, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}], 'output': [{'name': 'Blueprint - Dmitri Donskoi'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-311-MI', 'series': 8, 'time': 18000, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}], 'output': [{'name': 'Blueprint - Kansas'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-364-MI', 'series': 8, 'time': 18000, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}], 'output': [{'name': 'Blueprint - Vittorio Cuniberti'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'Q-302-MI', 'series': 8, 'time': 3600, 'task': '', 'input': [{'name': 'T1 General Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'Q-310-MI', 'series': 8, 'time': 3600, 'task': '', 'input': [{'name': 'T1 Main Gun Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'Q-351-MI', 'series': 8, 'time': 3600, 'task': '', 'input': [{'name': 'T1 Torpedo Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'Q-368-MI', 'series': 8, 'time': 3600, 'task': '', 'input': [{'name': 'T1 Anti-Air Gun Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'Q-389-MI', 'series': 8, 'time': 3600, 'task': '', 'input': [{'name': 'T1 Aircraft Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'Q-202-MI', 'series': 8, 'time': 7200, 'task': '', 'input': [{'name': 'T2 General Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'Q-210-MI', 'series': 8, 'time': 7200, 'task': '', 'input': [{'name': 'T2 Main Gun Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'Q-251-MI', 'series': 8, 'time': 7200, 'task': '', 'input': [{'name': 'T2 Torpedo Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'Q-268-MI', 'series': 8, 'time': 7200, 'task': '', 'input': [{'name': 'T2 Anti-Air Gun Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'Q-289-MI', 'series': 8, 'time': 7200, 'task': '', 'input': [{'name': 'T2 Aircraft Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T2'}, {'name': 'Coins'}]}, + {'name': 'Q-002-MI', 'series': 8, 'time': 14400, 'task': '', 'input': [{'name': 'T3 General Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'Q-010-MI', 'series': 8, 'time': 14400, 'task': '', 'input': [{'name': 'T3 Main Gun Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'Q-051-MI', 'series': 8, 'time': 14400, 'task': '', 'input': [{'name': 'T3 Torpedo Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'Q-068-MI', 'series': 8, 'time': 14400, 'task': '', 'input': [{'name': 'T3 Anti-Air Gun Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'Q-089-MI', 'series': 8, 'time': 14400, 'task': '', 'input': [{'name': 'T3 Aircraft Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'H-387-MI', 'series': 8, 'time': 3600, 'task': '', 'input': [{'name': 'Wisdom Cube', 'amount': 3}], 'output': [{'name': 'Random Blueprint'}, {'name': 'T1 Mystery Retrofit Blueprint'}, {'name': 'Cognitive Chips'}]}, + {'name': 'H-339-MI', 'series': 8, 'time': 7200, 'task': '', 'input': [{'name': 'Wisdom Cube', 'amount': 6}], 'output': [{'name': 'Random Blueprint'}, {'name': 'T2 Mystery Retrofit Blueprint'}, {'name': 'Cognitive Chips'}]}, {'name': 'C-038-RF', 'series': 1, 'time': 43200, 'task': '', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, {'name': 'B-351-RF', 'series': 1, 'time': 14400, 'task': 'Clear Chapter 11 or onward stages for 3 times on Normal Mode ', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, {'name': 'B-397-RF', 'series': 1, 'time': 14400, 'task': 'Clear Chapter 12 or onward stages for 3 times on Normal Mode ', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, @@ -525,4 +575,28 @@ LIST_RESEARCH_PROJECT = [ {'name': 'Q-068-UL', 'series': 7, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}, {'name': 'T3 Anti-Air Gun Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, {'name': 'Q-089-UL', 'series': 7, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}, {'name': 'T3 Aircraft Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, {'name': 'H-063-UL', 'series': 7, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 8000}, {'name': 'Wisdom Cube', 'amount': 3}], 'output': [{'name': 'Random Blueprint'}, {'name': 'T3 Mystery Retrofit Blueprint'}, {'name': 'Cognitive Chips'}]}, + {'name': 'E-866-MI', 'series': 7, 'time': 7200, 'task': '', 'input': [{'name': 'Twin 203mm Main Gun (M1927) T2 Design', 'amount': 45}], 'output': [{'name': 'Prototype Triple 254mm Model 1939 Main Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-867-MI', 'series': 7, 'time': 7200, 'task': '', 'input': [{'name': 'Twin 120mm Main Gun (M1936) T3 Design', 'amount': 45}], 'output': [{'name': 'Prototype Triple 152mm Model 1936 Main Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-83-MI', 'series': 7, 'time': 7200, 'task': '', 'input': [{'name': 'T2 F6F Hellcat Design', 'amount': 45}], 'output': [{'name': 'Prototype F8F Bearcat (Float) T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'E-858-MI', 'series': 7, 'time': 7200, 'task': '', 'input': [{'name': 'T3 410mm Mounted Gun Design', 'amount': 45}], 'output': [{'name': 'Prototype Twin 410mm mod.A Main Gun Mount T0 Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'C-038-RF', 'series': 8, 'time': 43200, 'task': '', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}, {'name': 'Coins'}]}, + {'name': 'B-351-RF', 'series': 8, 'time': 14400, 'task': 'Clear Chapter 11 or onward stages for 3 times on Normal Mode ', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'B-397-RF', 'series': 8, 'time': 14400, 'task': 'Clear Chapter 12 or onward stages for 3 times on Normal Mode ', 'input': [], 'output': [{'name': 'Random Blueprint'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-480-RF', 'series': 8, 'time': 28800, 'task': '', 'input': [{'name': 'Coins', 'amount': 8000}], 'output': [{'name': 'Blueprint - Mecklenburg'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-436-RF', 'series': 8, 'time': 28800, 'task': '', 'input': [{'name': 'Coins', 'amount': 8000}], 'output': [{'name': 'Blueprint - Gouden Leeuw'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-487-RF', 'series': 8, 'time': 28800, 'task': '', 'input': [{'name': 'Coins', 'amount': 8000}], 'output': [{'name': 'Blueprint - Dmitri Donskoi'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-411-RF', 'series': 8, 'time': 28800, 'task': '', 'input': [{'name': 'Coins', 'amount': 8000}], 'output': [{'name': 'Blueprint - Kansas'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-464-RF', 'series': 8, 'time': 28800, 'task': '', 'input': [{'name': 'Coins', 'amount': 8000}], 'output': [{'name': 'Blueprint - Vittorio Cuniberti'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'H-207-RF', 'series': 8, 'time': 14400, 'task': '', 'input': [{'name': 'Wisdom Cube', 'amount': 10}], 'output': [{'name': 'Random Blueprint'}, {'name': 'T3 Mystery Retrofit Blueprint'}, {'name': 'Cognitive Chips'}]}, + {'name': 'D-080-UL', 'series': 8, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}, {'name': 'Wisdom Cube', 'amount': 5}], 'output': [{'name': 'Blueprint - Mecklenburg'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-036-UL', 'series': 8, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}, {'name': 'Wisdom Cube', 'amount': 5}], 'output': [{'name': 'Blueprint - Gouden Leeuw'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-087-UL', 'series': 8, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}, {'name': 'Wisdom Cube', 'amount': 5}], 'output': [{'name': 'Blueprint - Dmitri Donskoi'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-011-UL', 'series': 8, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}, {'name': 'Wisdom Cube', 'amount': 5}], 'output': [{'name': 'Blueprint - Kansas'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'D-064-UL', 'series': 8, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}, {'name': 'Wisdom Cube', 'amount': 5}], 'output': [{'name': 'Blueprint - Vittorio Cuniberti'}, {'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'Q-002-UL', 'series': 8, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}, {'name': 'T3 General Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'Q-010-UL', 'series': 8, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}, {'name': 'T3 Main Gun Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'Q-051-UL', 'series': 8, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}, {'name': 'T3 Torpedo Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'Q-068-UL', 'series': 8, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}, {'name': 'T3 Anti-Air Gun Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'Q-089-UL', 'series': 8, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 5000}, {'name': 'T3 Aircraft Part', 'amount': 20}], 'output': [{'name': 'Random Gear Design'}, {'name': 'Random Gear Design T3'}]}, + {'name': 'H-063-UL', 'series': 8, 'time': 1800, 'task': '', 'input': [{'name': 'Coins', 'amount': 8000}, {'name': 'Wisdom Cube', 'amount': 3}], 'output': [{'name': 'Random Blueprint'}, {'name': 'T3 Mystery Retrofit Blueprint'}, {'name': 'Cognitive Chips'}]}, ] diff --git a/module/research/selector.py b/module/research/selector.py index 110f12369..7f5c7f085 100644 --- a/module/research/selector.py +++ b/module/research/selector.py @@ -20,7 +20,8 @@ FILTER_REGEX = re.compile('(s[1234567])?' '|anchorage|hakuryu|agir|august|marcopolo' '|plymouth|rupprecht|harbin|chkalov|brest' '|kearsarge|hindenburg|shimanto|schultz|flandre' - '|napoli|nakhimov|halford|bayard|daisen)?' + '|napoli|nakhimov|halford|bayard|daisen' + '|goudenleeuw|mecklenburg|dmitri|kansas|vittorio)?' '(dr|pry)?' '([bcdeghqt])?' '-?' diff --git a/module/research/series.py b/module/research/series.py index c48a39eb1..479996d3d 100644 --- a/module/research/series.py +++ b/module/research/series.py @@ -14,6 +14,8 @@ RESEARCH_SCALING = [ def match_series(image, scaling): image = rgb2gray(image) + if TEMPLATE_S8.match(image, scaling=scaling): + return 8 if TEMPLATE_S7.match(image, scaling=scaling): return 7 if TEMPLATE_S6.match(image, scaling=scaling): diff --git a/module/reward/assets.py b/module/reward/assets.py index 75843e0ce..b55e14c33 100644 --- a/module/reward/assets.py +++ b/module/reward/assets.py @@ -6,7 +6,7 @@ from module.base.template import Template COIN = Button(area={'cn': (279, 48, 308, 73), 'en': (272, 53, 317, 73), 'jp': (279, 48, 308, 73), 'tw': (279, 48, 308, 73)}, color={'cn': (228, 175, 73), 'en': (221, 170, 75), 'jp': (228, 175, 73), 'tw': (228, 175, 73)}, button={'cn': (279, 48, 308, 73), 'en': (272, 53, 317, 73), 'jp': (279, 48, 308, 73), 'tw': (279, 48, 308, 73)}, file={'cn': './assets/cn/reward/COIN.png', 'en': './assets/en/reward/COIN.png', 'jp': './assets/jp/reward/COIN.png', 'tw': './assets/tw/reward/COIN.png'}) EXP = Button(area={'cn': (449, 31, 477, 49), 'en': (455, 51, 490, 71), 'jp': (449, 31, 477, 49), 'tw': (449, 31, 477, 49)}, color={'cn': (145, 158, 176), 'en': (133, 133, 145), 'jp': (145, 158, 176), 'tw': (145, 158, 176)}, button={'cn': (449, 31, 477, 49), 'en': (455, 51, 490, 71), 'jp': (449, 31, 477, 49), 'tw': (449, 31, 477, 49)}, file={'cn': './assets/cn/reward/EXP.png', 'en': './assets/en/reward/EXP.png', 'jp': './assets/jp/reward/EXP.png', 'tw': './assets/tw/reward/EXP.png'}) -MISSION_EMPTY = Button(area={'cn': (158, 347, 220, 378), 'en': (158, 348, 252, 373), 'jp': (158, 348, 221, 378), 'tw': (158, 347, 220, 378)}, color={'cn': (156, 160, 172), 'en': (167, 171, 182), 'jp': (155, 158, 170), 'tw': (156, 160, 172)}, button={'cn': (158, 347, 220, 378), 'en': (158, 348, 252, 373), 'jp': (158, 348, 221, 378), 'tw': (158, 347, 220, 378)}, file={'cn': './assets/cn/reward/MISSION_EMPTY.png', 'en': './assets/en/reward/MISSION_EMPTY.png', 'jp': './assets/jp/reward/MISSION_EMPTY.png', 'tw': './assets/cn/reward/MISSION_EMPTY.png'}) +MISSION_EMPTY = Button(area={'cn': (158, 347, 220, 378), 'en': (158, 348, 252, 373), 'jp': (158, 348, 221, 378), 'tw': (158, 347, 221, 378)}, color={'cn': (156, 160, 172), 'en': (167, 171, 182), 'jp': (155, 158, 170), 'tw': (154, 157, 169)}, button={'cn': (158, 347, 220, 378), 'en': (158, 348, 252, 373), 'jp': (158, 348, 221, 378), 'tw': (158, 347, 221, 378)}, file={'cn': './assets/cn/reward/MISSION_EMPTY.png', 'en': './assets/en/reward/MISSION_EMPTY.png', 'jp': './assets/jp/reward/MISSION_EMPTY.png', 'tw': './assets/tw/reward/MISSION_EMPTY.png'}) MISSION_MULTI = Button(area={'cn': (1041, 8, 1101, 39), 'en': (1041, 8, 1101, 39), 'jp': (1041, 7, 1102, 36), 'tw': (1040, 6, 1102, 39)}, color={'cn': (226, 192, 142), 'en': (221, 179, 96), 'jp': (219, 178, 110), 'tw': (223, 184, 121)}, button={'cn': (1041, 8, 1101, 39), 'en': (1041, 8, 1101, 39), 'jp': (1041, 7, 1102, 36), 'tw': (1040, 6, 1102, 39)}, file={'cn': './assets/cn/reward/MISSION_MULTI.png', 'en': './assets/en/reward/MISSION_MULTI.png', 'jp': './assets/jp/reward/MISSION_MULTI.png', 'tw': './assets/tw/reward/MISSION_MULTI.png'}) MISSION_NOTICE = Button(area={'cn': (940, 670, 945, 681), 'en': (940, 670, 945, 681), 'jp': (940, 670, 945, 681), 'tw': (940, 670, 945, 681)}, color={'cn': (183, 83, 66), 'en': (183, 83, 66), 'jp': (183, 83, 66), 'tw': (183, 83, 66)}, button={'cn': (940, 670, 945, 681), 'en': (940, 670, 945, 681), 'jp': (940, 670, 945, 681), 'tw': (940, 670, 945, 681)}, file={'cn': './assets/cn/reward/MISSION_NOTICE.png', 'en': './assets/en/reward/MISSION_NOTICE.png', 'jp': './assets/jp/reward/MISSION_NOTICE.png', 'tw': './assets/tw/reward/MISSION_NOTICE.png'}) MISSION_SINGLE = Button(area={'cn': (1096, 133, 1128, 163), 'en': (1130, 128, 1184, 150), 'jp': (1102, 120, 1166, 149), 'tw': (1090, 115, 1181, 166)}, color={'cn': (167, 200, 237), 'en': (170, 204, 239), 'jp': (136, 176, 226), 'tw': (108, 149, 216)}, button={'cn': (1096, 133, 1128, 163), 'en': (1130, 128, 1184, 150), 'jp': (1102, 120, 1166, 149), 'tw': (1090, 115, 1181, 166)}, file={'cn': './assets/cn/reward/MISSION_SINGLE.png', 'en': './assets/en/reward/MISSION_SINGLE.png', 'jp': './assets/jp/reward/MISSION_SINGLE.png', 'tw': './assets/tw/reward/MISSION_SINGLE.png'}) diff --git a/module/reward/reward.py b/module/reward/reward.py index 484f1c3eb..4b6b299d1 100644 --- a/module/reward/reward.py +++ b/module/reward/reward.py @@ -166,10 +166,6 @@ class Reward(UI): in: page_mission out: page_mission, MISSION_MULTI or MISSION_SINGLE or MISSION_UNFINISH """ - # MISSION_UNFINISH is available on CN only yet - if self.config.SERVER not in ['cn', 'en', 'jp']: - return - timeout = Timer(1, count=2).start() for _ in self.loop(): if timeout.reached(): diff --git a/module/shop/base.py b/module/shop/base.py index 10f20628b..00267dbf8 100644 --- a/module/shop/base.py +++ b/module/shop/base.py @@ -17,7 +17,7 @@ FILTER_REGEX = re.compile( '|chip|coin|cube|drill|food' '|plate|retrofit|pr|dr|specializedcore' '|logger|tuning' - '|hecombatplan|fragment' + '|hecombatplan|fragment|hiddenzonedatalogger' '|albacore|bataan|bearn|bluegill|carabiniere|casablanca|contedicavour|dukeofyork' '|echo|eldridge|gangut|glorious|grenville|hibiki|hunter|icarus' '|kawakaze|kinggeorgev|kinu|kuroshio|lagalissonniere|lemalinmuse|letemeraire|littorio' diff --git a/module/war_archives/assets.py b/module/war_archives/assets.py index 79bd184cc..7d31f3f11 100644 --- a/module/war_archives/assets.py +++ b/module/war_archives/assets.py @@ -6,6 +6,7 @@ from module.base.template import Template OCR_DATA_KEY_CAMPAIGN = Button(area={'cn': (1188, 107, 1272, 131), 'en': (1188, 107, 1272, 131), 'jp': (1188, 107, 1272, 131), 'tw': (1188, 107, 1272, 131)}, color={'cn': (104, 101, 107), 'en': (104, 101, 107), 'jp': (104, 101, 107), 'tw': (104, 101, 107)}, button={'cn': (1188, 107, 1272, 131), 'en': (1188, 107, 1272, 131), 'jp': (1188, 107, 1272, 131), 'tw': (1188, 107, 1272, 131)}, file={'cn': './assets/cn/war_archives/OCR_DATA_KEY_CAMPAIGN.png', 'en': './assets/en/war_archives/OCR_DATA_KEY_CAMPAIGN.png', 'jp': './assets/jp/war_archives/OCR_DATA_KEY_CAMPAIGN.png', 'tw': './assets/tw/war_archives/OCR_DATA_KEY_CAMPAIGN.png'}) TEMPLATE_ABYSSAL_REFRAIN = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png', 'en': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png', 'jp': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png', 'tw': './assets/cn/war_archives/TEMPLATE_ABYSSAL_REFRAIN.png'}) +TEMPLATE_AQUILIFERS_BALLADE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png', 'en': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png', 'jp': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png', 'tw': './assets/cn/war_archives/TEMPLATE_AQUILIFERS_BALLADE.png'}) TEMPLATE_ASHEN_SIMULACRUM = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png', 'en': './assets/en/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png', 'jp': './assets/cn/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png', 'tw': './assets/cn/war_archives/TEMPLATE_ASHEN_SIMULACRUM.png'}) TEMPLATE_AURORA_NOCTIS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_AURORA_NOCTIS.png', 'en': './assets/en/war_archives/TEMPLATE_AURORA_NOCTIS.png', 'jp': './assets/cn/war_archives/TEMPLATE_AURORA_NOCTIS.png', 'tw': './assets/cn/war_archives/TEMPLATE_AURORA_NOCTIS.png'}) TEMPLATE_COUNTERATTACK_WITHIN_THE_FJORD = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_COUNTERATTACK_WITHIN_THE_FJORD.png', 'en': './assets/cn/war_archives/TEMPLATE_COUNTERATTACK_WITHIN_THE_FJORD.png', 'jp': './assets/cn/war_archives/TEMPLATE_COUNTERATTACK_WITHIN_THE_FJORD.png', 'tw': './assets/cn/war_archives/TEMPLATE_COUNTERATTACK_WITHIN_THE_FJORD.png'}) diff --git a/module/war_archives/dictionary.py b/module/war_archives/dictionary.py index 13fbc3704..d9481a689 100644 --- a/module/war_archives/dictionary.py +++ b/module/war_archives/dictionary.py @@ -39,4 +39,5 @@ dic_archives_template = { 'war_archives_20220224_cn': TEMPLATE_ABYSSAL_REFRAIN, 'war_archives_20220324_cn': TEMPLATE_VIRTUAL_TOWER, 'war_archives_20220526_cn': TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT, + 'war_archives_20220728_cn': TEMPLATE_AQUILIFERS_BALLADE, } diff --git a/module/webui/app.py b/module/webui/app.py index 56e1766be..fb3464643 100644 --- a/module/webui/app.py +++ b/module/webui/app.py @@ -59,7 +59,7 @@ from module.webui.base import Frame from module.webui.discord_presence import close_discord_rpc, init_discord_rpc from module.webui.fastapi import asgi_app from module.webui.lang import _t, t -from module.webui.patch import patch_executor +from module.webui.patch import patch_executor, patch_mimetype from module.webui.pin import put_input, put_select from module.webui.process_manager import ProcessManager from module.webui.remote_access import RemoteAccess @@ -91,6 +91,7 @@ from module.webui.widgets import ( ) patch_executor() +patch_mimetype() task_handler = TaskHandler() diff --git a/module/webui/patch.py b/module/webui/patch.py index 09c0b0a71..d9d7609d2 100644 --- a/module/webui/patch.py +++ b/module/webui/patch.py @@ -39,3 +39,28 @@ def patch_executor(): loop = asyncio.get_event_loop() loop.set_default_executor(CachedThreadPoolExecutor.executor) + + +def patch_mimetype(): + """ + Patch mimetype db to use the builtin table instead of reading from environment. + + By default, mimetype reads user configured mimetype table from environment. It's good for server but bad on our + side, because we deploy on user's machine which may have polluted environment. To have a consistent behaviour on + all deployment, we use the builtin mimetype table only. + """ + import mimetypes + if mimetypes.inited: + # ohno mimetypes already inited + db = mimetypes.MimeTypes() + mimetypes._db = db + # override global variable + mimetypes.encodings_map = db.encodings_map + mimetypes.suffix_map = db.suffix_map + mimetypes.types_map = db.types_map[True] + mimetypes.common_types = db.types_map[False] + else: + # init db with the default table + db = mimetypes.MimeTypes() + mimetypes._db = db + mimetypes.inited = True