diff --git a/assets/cn/handler/USE_DATA_KEY_NOTIFIED.png b/assets/cn/handler/USE_DATA_KEY_NOTIFIED.png index 022cdf93f..b855ef36d 100644 Binary files a/assets/cn/handler/USE_DATA_KEY_NOTIFIED.png and b/assets/cn/handler/USE_DATA_KEY_NOTIFIED.png differ diff --git a/assets/cn/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png b/assets/cn/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png new file mode 100644 index 000000000..f67a19235 Binary files /dev/null and b/assets/cn/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png differ diff --git a/assets/cn/war_archives/TEMPLATE_VIOLET_TEMPEST_BLOOMING_LYCORIS.png b/assets/cn/war_archives/TEMPLATE_VIOLET_TEMPEST_BLOOMING_LYCORIS.png new file mode 100644 index 000000000..52209141d Binary files /dev/null and b/assets/cn/war_archives/TEMPLATE_VIOLET_TEMPEST_BLOOMING_LYCORIS.png differ diff --git a/assets/en/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png b/assets/en/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png new file mode 100644 index 000000000..18963ccae Binary files /dev/null and b/assets/en/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png differ diff --git a/assets/en/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png b/assets/en/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png new file mode 100644 index 000000000..f67a19235 Binary files /dev/null and b/assets/en/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png differ diff --git a/assets/jp/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png b/assets/jp/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png new file mode 100644 index 000000000..f67a19235 Binary files /dev/null and b/assets/jp/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png differ diff --git a/assets/shop/guild/BookT3_4.png b/assets/shop/guild/BookT3_4.png new file mode 100644 index 000000000..3e55c6590 Binary files /dev/null and b/assets/shop/guild/BookT3_4.png differ diff --git a/assets/tw/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png b/assets/tw/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png new file mode 100644 index 000000000..18963ccae Binary files /dev/null and b/assets/tw/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png differ diff --git a/assets/tw/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png b/assets/tw/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png new file mode 100644 index 000000000..f67a19235 Binary files /dev/null and b/assets/tw/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png differ diff --git a/campaign/Readme.md b/campaign/Readme.md index 7a43473b6..c88eea3a1 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -55,6 +55,7 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20250619 | war archives 20220728 cn | Aquilifer's Ballade | 雄鹰的叙事歌 | Aquilifer's Ballade | 鋼鷲の冒険譚 | 雄鷹的敘事歌 | | 20250717 | war archives 20220428 cn | Rondo at Rainbow's End | 虹彩的终幕曲 | Rondo at Rainbow's End | 吟ずる瑠璃の楽章 | 虹彩的終幕曲 | | 20251016 | war archives 20231026 cn | Tempesta and the Fountain of Youth | 飓风与青春之泉 | Tempesta and the Fountain of Youth | テンペスタと若返りの泉 | 飓風與青春之泉 | +| 20251106 | war archives 20220915 cn | Violet Tempest Blooming Lycoris | 紫绛槿岚 | Violet Tempest Blooming Lycoris | 赫の涙月 菫の暁風 | 紫絳槿嵐 | | 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 | 闇靄払う銀翼 | - | @@ -263,3 +264,5 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20251009 | coalition 20250626 | The Neon City Investigator | - | - | - | 迷彩都市的尋蹤者 | | 20251016 | event 20230817 cn | The Fool's Scales | 复刻愚者的天平 | The Fool's Scales Rerun | 愚者の天秤(復刻) | - | | 20251023 | event 20251023 cn | Tempesta and Islas de Libertád | 飓风与自由群岛 | Tempesta and Islas de Libertád | テンペスタと自由群島 | - | +| 20251106 | event 20230803 cn | Anthem of Remembrance | 复刻奏响鸢尾之歌 | Anthem of Remembrance Rerun | 燃ゆる聖都の回想曲(復刻) | - | +| 20251106 | event 20250227 cn | Paradiso of Shackled Light | - | - | - | 樊籠內的神光 | diff --git a/campaign/event_20251023_cn/t1.py b/campaign/event_20251023_cn/t1.py index e11483e1b..a74cca509 100644 --- a/campaign/event_20251023_cn/t1.py +++ b/campaign/event_20251023_cn/t1.py @@ -74,6 +74,7 @@ class Config: HOMO_EDGE_COLOR_RANGE = (0, 17) HOMO_EDGE_HOUGHLINES_THRESHOLD = 210 MAP_SIREN_HAS_BOSS_ICON_SMALL = True + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' MAP_SWIPE_MULTIPLY = (1.089, 1.109) MAP_SWIPE_MULTIPLY_MINITOUCH = (1.053, 1.072) MAP_SWIPE_MULTIPLY_MAATOUCH = (1.022, 1.041) diff --git a/campaign/event_20251023_cn/t2.py b/campaign/event_20251023_cn/t2.py index 0e43eee70..6c2846227 100644 --- a/campaign/event_20251023_cn/t2.py +++ b/campaign/event_20251023_cn/t2.py @@ -58,8 +58,6 @@ class Config(ConfigBase): MAP_HAS_MYSTERY = False # ===== End of generated config ===== - # topleft is spawn points - MAP_ENSURE_EDGE_INSIGHT_CORNER = 'top-right' MAP_SWIPE_MULTIPLY = (1.255, 1.279) MAP_SWIPE_MULTIPLY_MINITOUCH = (1.214, 1.236) MAP_SWIPE_MULTIPLY_MAATOUCH = (1.179, 1.200) diff --git a/campaign/event_20251023_cn/t3.py b/campaign/event_20251023_cn/t3.py index bd45283b9..d9dfb7d6c 100644 --- a/campaign/event_20251023_cn/t3.py +++ b/campaign/event_20251023_cn/t3.py @@ -59,7 +59,6 @@ class Config(ConfigBase): MAP_HAS_MYSTERY = False # ===== End of generated config ===== - MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' # swipe multiply same as T1 diff --git a/campaign/war_archives_20220915_cn/a1.py b/campaign/war_archives_20220915_cn/a1.py new file mode 100644 index 000000000..42916550d --- /dev/null +++ b/campaign/war_archives_20220915_cn/a1.py @@ -0,0 +1,94 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('A1') +MAP.shape = 'H8' +MAP.camera_data = ['D3', 'E4', 'E6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + -- ++ ++ -- -- -- -- -- + -- ME ++ ME Me ++ ++ -- + ME -- -- -- -- ++ ++ -- + MS -- MS -- Me -- MB -- + -- -- ++ ME __ -- -- ME + -- -- ++ MS -- Me ME -- + SP -- -- -- Me ++ ++ -- + -- 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 = ['Wakaba', 'Suzutsuki'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_SWIPE_MULTIPLY = (1.093, 1.113) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.057, 1.076) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.026, 1.045) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 210 + MAP_WALK_USE_CURRENT_FLEET = True + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD = 0.65 + + 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_20220915_cn/a2.py b/campaign/war_archives_20220915_cn/a2.py new file mode 100644 index 000000000..d028c6469 --- /dev/null +++ b/campaign/war_archives_20220915_cn/a2.py @@ -0,0 +1,80 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A2') +MAP.shape = 'H8' +MAP.camera_data = ['D4', 'D6', 'E3'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- SP ++ ++ -- ME -- ME + SP -- -- ++ Me -- -- -- + -- -- ME MS -- Me -- ++ + Me -- -- -- __ -- -- ++ + -- MS Me -- -- -- MB -- + -- ++ ++ ++ -- ++ ++ -- + ME -- -- ME -- ++ ++ -- + -- ME ++ -- ME -- -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 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, \ +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(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Miyuki', 'Jintsuu'] + 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.220, 1.243) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.180, 1.201) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.145, 1.166) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD = 0.65 + + 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_20220915_cn/a3.py b/campaign/war_archives_20220915_cn/a3.py new file mode 100644 index 000000000..0580791da --- /dev/null +++ b/campaign/war_archives_20220915_cn/a3.py @@ -0,0 +1,80 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A3') +MAP.shape = 'H8' +MAP.camera_data = ['D3', 'E4', 'E6'] +MAP.camera_data_spawn_point = ['E2'] +MAP.map_data = """ + ++ ++ ++ ME -- -- SP -- + ME -- Me -- MS -- -- SP + -- -- -- -- -- ++ -- -- + ME -- ME -- Me -- MS -- + -- ++ ++ ++ ME __ -- ME + -- ++ ++ ++ -- -- Me -- + -- ++ ++ MB -- ME ++ ++ + -- -- -- -- Me -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +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, \ +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(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Hatakaze', 'Kinu', 'Haguro'] + 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.220, 1.243) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.180, 1.201) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.145, 1.166) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD = 0.65 + + 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_20220915_cn/b1.py b/campaign/war_archives_20220915_cn/b1.py new file mode 100644 index 000000000..558f64dc5 --- /dev/null +++ b/campaign/war_archives_20220915_cn/b1.py @@ -0,0 +1,94 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('B1') +MAP.shape = 'H8' +MAP.camera_data = ['D3', 'D5'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + ++ -- -- -- ME -- -- -- + -- -- -- ME -- ME ++ -- + -- ++ ++ ME -- Me ++ ME + -- MB -- -- -- -- -- -- + Me -- -- __ Me ME MS -- + ++ ME -- ME -- ++ -- -- + -- -- Me -- MS -- -- 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 +""" +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, \ +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 = ['Harutsuki', 'Kawakaze', 'Hiei'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.023, 1.043) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.990, 1.008) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.961, 0.978) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD = 0.65 + + 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_20220915_cn/b2.py b/campaign/war_archives_20220915_cn/b2.py new file mode 100644 index 000000000..a6e235ee3 --- /dev/null +++ b/campaign/war_archives_20220915_cn/b2.py @@ -0,0 +1,75 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B2') +MAP.shape = 'M6' +MAP.camera_data = ['D4', 'E3', 'G3', 'G4'] +MAP.camera_data_spawn_point = ['H3'] +MAP.map_data = """ + -- -- -- -- ME -- ++ ++ -- Me ++ ++ ++ + ++ ++ ++ ME -- Me ++ ++ MS -- -- -- -- + ++ ++ ++ ME -- __ -- MS -- -- SP ++ ++ + ++ ++ MB -- -- __ -- MS -- -- SP ++ ++ + ME -- -- -- -- Me ++ ++ MS -- -- -- -- + -- ME ME ++ ME -- ++ ++ -- Me ++ ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 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, J1, K1, L1, M1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, M3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, L4, M4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, L5, M5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, L6, M6, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Kongo', 'Yamashiro', 'Akagi', 'Kaga'] + 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.123, 1.144) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.086, 1.106) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.054, 1.073) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD = 0.65 + + 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_20220915_cn/b3.py b/campaign/war_archives_20220915_cn/b3.py new file mode 100644 index 000000000..8dd25bf78 --- /dev/null +++ b/campaign/war_archives_20220915_cn/b3.py @@ -0,0 +1,85 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B3') +MAP.shape = 'I9' +MAP.camera_data = ['D3', 'D5', 'E5'] +MAP.camera_data_spawn_point = ['D7'] +MAP.map_covered = ['E3'] +MAP.map_data = """ + ++ -- -- -- ME -- -- -- ++ + -- ME ME -- -- -- ME ME -- + -- ME ++ Me MS Me ++ ME -- + -- -- Me -- -- -- Me -- -- + ME -- MS -- ++ -- MS -- ME + -- -- Me -- MB -- Me -- -- + -- ME ++ -- 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 = ['Mikasa', 'Nagato', 'Akagi', 'Kaga'] + 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.985, 1.003) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.952, 0.970) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.925, 0.941) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD = 0.65 + + 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_20220915_cn/c1.py b/campaign/war_archives_20220915_cn/c1.py new file mode 100644 index 000000000..8da18f1d2 --- /dev/null +++ b/campaign/war_archives_20220915_cn/c1.py @@ -0,0 +1,79 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('C1') +MAP.shape = 'H8' +MAP.camera_data = ['D3', 'E4', 'E6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + -- ++ ++ -- -- -- -- -- + -- ME ++ ME Me ++ ++ -- + ME -- -- -- -- ++ ++ -- + MS -- MS -- Me -- MB -- + -- -- ++ ME __ -- -- ME + -- -- ++ MS -- Me ME -- + SP -- -- -- Me ++ ++ -- + -- 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 = ['Sakawa', 'Chitose', 'Chiyoda'] + 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.093, 1.113) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.057, 1.076) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.026, 1.045) + MAP_WALK_USE_CURRENT_FLEET = True + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/war_archives_20220915_cn/c2.py b/campaign/war_archives_20220915_cn/c2.py new file mode 100644 index 000000000..5fb1974a9 --- /dev/null +++ b/campaign/war_archives_20220915_cn/c2.py @@ -0,0 +1,79 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C2') +MAP.shape = 'H8' +MAP.camera_data = ['D4', 'D6', 'E3'] +MAP.camera_data_spawn_point = ['D2'] +MAP.map_data = """ + -- SP ++ ++ -- ME -- ME + SP -- -- ++ Me -- -- -- + -- -- ME MS -- Me -- ++ + Me -- -- -- __ -- -- ++ + -- MS Me -- -- -- MB -- + -- ++ ++ ++ -- ++ ++ -- + ME -- -- ME -- ++ ++ -- + -- ME ++ -- ME -- -- ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 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(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Jintsuu', 'Ryuuhou', 'Kaga'] + 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.220, 1.243) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.180, 1.201) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.145, 1.166) + + +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_20220915_cn/c3.py b/campaign/war_archives_20220915_cn/c3.py new file mode 100644 index 000000000..82e35b41d --- /dev/null +++ b/campaign/war_archives_20220915_cn/c3.py @@ -0,0 +1,80 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C3') +MAP.shape = 'H8' +MAP.camera_data = ['D3', 'E4', 'E6'] +MAP.camera_data_spawn_point = ['E2'] +MAP.map_data = """ + ++ ++ ++ ME -- -- SP -- + ME -- Me -- MS -- -- SP + -- -- -- -- -- ++ -- -- + ME -- ME -- Me -- MS -- + -- ++ ++ ++ ME __ -- ME + -- ++ ++ ++ -- -- Me -- + -- ++ ++ MB -- ME ++ ++ + -- -- -- -- Me -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 +""" +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, \ +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(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Haguro', 'Kongo', 'Kirishima'] + 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.220, 1.243) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.180, 1.201) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.145, 1.166) + + +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_20220915_cn/campaign_base.py b/campaign/war_archives_20220915_cn/campaign_base.py new file mode 100644 index 000000000..1ca22192e --- /dev/null +++ b/campaign/war_archives_20220915_cn/campaign_base.py @@ -0,0 +1,14 @@ +from module.base.utils import get_color, red_overlay_transparency +from ..campaign_war_archives.campaign_base import CampaignBase as CampaignBase_ +from module.handler.assets import MAP_ENEMY_SEARCHING +from module.map.assets import SWITCH_OVER + + +class CampaignBase(CampaignBase_): + def enemy_searching_appear(self): + if not self.appear(SWITCH_OVER, offset=(20, 20)): + return False + + return red_overlay_transparency( + MAP_ENEMY_SEARCHING.color, get_color(self.device.image, MAP_ENEMY_SEARCHING.area) + ) > self.MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD diff --git a/campaign/war_archives_20220915_cn/d1.py b/campaign/war_archives_20220915_cn/d1.py new file mode 100644 index 000000000..1d6e32f28 --- /dev/null +++ b/campaign/war_archives_20220915_cn/d1.py @@ -0,0 +1,93 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('D1') +MAP.shape = 'H8' +MAP.camera_data = ['D3', 'D5'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + ++ -- -- -- ME -- -- -- + -- -- -- ME -- ME ++ -- + -- ++ ++ ME -- Me ++ ME + -- MB -- -- -- -- -- -- + Me -- -- __ Me ME MS -- + ++ ME -- ME -- ++ -- -- + -- -- Me -- MS -- -- 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 +""" +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, \ +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 = ['Hiei', 'Haruna', 'Shokaku'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = True + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + # 'width': (0, 7), + 'wlen': 1000 + } + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.023, 1.043) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.990, 1.008) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.961, 0.978) + + +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_20220915_cn/d2.py b/campaign/war_archives_20220915_cn/d2.py new file mode 100644 index 000000000..3fa21f78d --- /dev/null +++ b/campaign/war_archives_20220915_cn/d2.py @@ -0,0 +1,83 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D2') +MAP.shape = 'M6' +MAP.camera_data = ['D4', 'E3', 'G3', 'G4'] +MAP.camera_data_spawn_point = ['H3'] +MAP.map_data = """ + -- -- -- -- ME -- ++ ++ -- Me ++ ++ ++ + ++ ++ ++ ME -- Me ++ ++ MS -- -- -- -- + ++ ++ ++ ME -- __ -- MS -- -- SP ++ ++ + ++ ++ MB -- -- __ -- MS -- -- SP ++ ++ + ME -- -- -- -- Me ++ ++ MS -- -- -- -- + -- ME ME ++ ME -- ++ ++ -- Me ++ ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 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, J1, K1, L1, M1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2, M2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, L3, M3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, L4, M4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, L5, M5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, L6, M6, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Kongo', 'Yamashiro', 'Akagi', 'Kaga'] + 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.123, 1.144) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.086, 1.106) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.054, 1.073) + + +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_20220915_cn/d3.py b/campaign/war_archives_20220915_cn/d3.py new file mode 100644 index 000000000..51acc8f7a --- /dev/null +++ b/campaign/war_archives_20220915_cn/d3.py @@ -0,0 +1,93 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D3') +MAP.shape = 'I9' +MAP.camera_data = ['D3', 'D5', 'E5'] +MAP.camera_data_spawn_point = ['D7'] +MAP.map_covered = ['E3'] +MAP.map_data = """ + ++ -- -- -- ME -- -- -- ++ + -- ME ME -- -- -- ME ME -- + -- ME ++ Me MS Me ++ ME -- + -- -- Me -- -- -- Me -- -- + ME -- MS -- ++ -- MS -- ME + -- -- Me -- MB -- Me -- -- + -- ME ++ -- 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 = ['Mikasa', 'Nagato', 'Akagi', 'Kaga'] + 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.985, 1.003) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.952, 0.970) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.925, 0.941) + + +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 74a05e787..f1fe4e9bb 100644 --- a/config/template.json +++ b/config/template.json @@ -1402,7 +1402,7 @@ }, "Campaign": { "Name": "D3", - "Event": "war_archives_20231026_cn", + "Event": "war_archives_20220915_cn", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, diff --git a/module/commission/project.py b/module/commission/project.py index 60d3f1fa4..afdc8c809 100644 --- a/module/commission/project.py +++ b/module/commission/project.py @@ -107,6 +107,8 @@ class Commission: # DALY RESOURCE EXTRACTION -> DAILY RESOURCE EXTRACTION result = result.replace('DALY', 'DAILY') result = result.replace('NVB', 'NYB') + # PYEIN PROTECTION COMMISSION I + result = result.replace('PYEIN', 'VEIN').replace('YEIN', 'VEIN') self.name = result self.genre = self.commission_name_parse(self.name) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index d2e1a882f..632bb19ac 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3443,6 +3443,7 @@ ], "display": "hide", "option_cn": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -3478,7 +3479,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -3510,6 +3510,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -3545,7 +3546,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -3581,6 +3581,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -3616,7 +3617,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -3648,6 +3648,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20250227_cn", "event_20250912_cn", "event_20250814_cn", "event_20220224_cn", @@ -4226,6 +4227,7 @@ "event_20251023_cn" ], "option_cn": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -4261,7 +4263,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -4293,6 +4294,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -4328,7 +4330,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -4364,6 +4365,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -4399,7 +4401,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -4431,6 +4432,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20250227_cn", "event_20250912_cn", "event_20250814_cn", "event_20220224_cn", @@ -4956,6 +4958,7 @@ "event_20251023_cn" ], "option_cn": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -4991,7 +4994,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -5023,6 +5025,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -5058,7 +5061,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -5094,6 +5096,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -5129,7 +5132,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -5161,6 +5163,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20250227_cn", "event_20250912_cn", "event_20250814_cn", "event_20220224_cn", @@ -5686,6 +5689,7 @@ "event_20251023_cn" ], "option_cn": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -5721,7 +5725,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -5753,6 +5756,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -5788,7 +5792,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -5824,6 +5827,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -5859,7 +5863,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -5891,6 +5894,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20250227_cn", "event_20250912_cn", "event_20250814_cn", "event_20220224_cn", @@ -6416,6 +6420,7 @@ "event_20251023_cn" ], "option_cn": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -6451,7 +6456,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -6483,6 +6487,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -6518,7 +6523,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -6554,6 +6558,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -6589,7 +6594,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -6621,6 +6625,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20250227_cn", "event_20250912_cn", "event_20250814_cn", "event_20220224_cn", @@ -7146,6 +7151,7 @@ "event_20251023_cn" ], "option_cn": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -7181,7 +7187,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -7213,6 +7218,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -7248,7 +7254,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -7284,6 +7289,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -7319,7 +7325,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -7351,6 +7356,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20250227_cn", "event_20250912_cn", "event_20250814_cn", "event_20220224_cn", @@ -7876,6 +7882,7 @@ "event_20251023_cn" ], "option_cn": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -7911,7 +7918,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -7943,6 +7949,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -7978,7 +7985,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -8014,6 +8020,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -8049,7 +8056,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -8081,6 +8087,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20250227_cn", "event_20250912_cn", "event_20250814_cn", "event_20220224_cn", @@ -9398,9 +9405,11 @@ "war_archives_20220428_cn", "war_archives_20220526_cn", "war_archives_20220728_cn", + "war_archives_20220915_cn", "war_archives_20231026_cn" ], "option_cn": [ + "war_archives_20220915_cn", "war_archives_20231026_cn", "war_archives_20220428_cn", "war_archives_20220728_cn", @@ -9444,6 +9453,7 @@ "war_archives_20181020_en" ], "option_en": [ + "war_archives_20220915_cn", "war_archives_20231026_cn", "war_archives_20220428_cn", "war_archives_20220728_cn", @@ -9487,6 +9497,7 @@ "war_archives_20181020_en" ], "option_jp": [ + "war_archives_20220915_cn", "war_archives_20231026_cn", "war_archives_20220428_cn", "war_archives_20220728_cn", @@ -9530,6 +9541,7 @@ "war_archives_20181020_en" ], "option_tw": [ + "war_archives_20220915_cn", "war_archives_20231026_cn", "war_archives_20220428_cn", "war_archives_20220728_cn", @@ -10040,6 +10052,7 @@ "event_20251023_cn" ], "option_cn": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -10075,7 +10088,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -10107,6 +10119,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -10142,7 +10155,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -10178,6 +10190,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -10213,7 +10226,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -10245,6 +10257,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20250227_cn", "event_20250912_cn", "event_20250814_cn", "event_20220224_cn", @@ -10787,6 +10800,7 @@ "event_20251023_cn" ], "option_cn": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -10822,7 +10836,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -10854,6 +10867,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -10889,7 +10903,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -10925,6 +10938,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -10960,7 +10974,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -10992,6 +11005,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20250227_cn", "event_20250912_cn", "event_20250814_cn", "event_20220224_cn", @@ -11534,6 +11548,7 @@ "event_20251023_cn" ], "option_cn": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -11569,7 +11584,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -11601,6 +11615,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -11636,7 +11651,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -11672,6 +11686,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -11707,7 +11722,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -11739,6 +11753,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20250227_cn", "event_20250912_cn", "event_20250814_cn", "event_20220224_cn", @@ -12281,6 +12296,7 @@ "event_20251023_cn" ], "option_cn": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -12316,7 +12332,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -12348,6 +12363,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -12383,7 +12399,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -12419,6 +12434,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -12454,7 +12470,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -12486,6 +12501,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20250227_cn", "event_20250912_cn", "event_20250814_cn", "event_20220224_cn", @@ -13018,6 +13034,7 @@ "event_20251023_cn" ], "option_cn": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -13053,7 +13070,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -13085,6 +13101,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -13120,7 +13137,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -13156,6 +13172,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20230803_cn", "event_20251023_cn", "event_20230817_cn", "event_20250912_cn", @@ -13191,7 +13208,6 @@ "event_20210916_cn", "event_20231026_cn", "event_20230914_cn", - "event_20230803_cn", "event_20211125_cn", "event_20210527_cn", "event_20201126_cn", @@ -13223,6 +13239,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20250227_cn", "event_20250912_cn", "event_20250814_cn", "event_20220224_cn", @@ -15920,7 +15937,8 @@ "anchorage", "noshiro", "sirius", - "new_jersey" + "new_jersey", + "taihou" ] } }, diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 499a9d38e..b7ec5a607 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -600,7 +600,7 @@ PrivateQuarters: TargetInteract: true TargetShip: value: anchorage - option: [ anchorage, noshiro, sirius, new_jersey ] + option: [ anchorage, noshiro, sirius, new_jersey, taihou ] # ==================== Daily ==================== Daily: diff --git a/module/config/config_generated.py b/module/config/config_generated.py index 9111789d9..677c43542 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -348,7 +348,7 @@ class GeneratedConfig: PrivateQuarters_BuyRoses = True PrivateQuarters_BuyCake = False PrivateQuarters_TargetInteract = True - PrivateQuarters_TargetShip = 'anchorage' # anchorage, noshiro, sirius, new_jersey + PrivateQuarters_TargetShip = 'anchorage' # anchorage, noshiro, sirius, new_jersey, taihou # Group `Daily` Daily_UseDailySkip = True diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index de66113bf..fc1ab7cb6 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -791,7 +791,7 @@ "event_20221222_cn": "Parallel Superimposition Rerun", "event_20230223_cn": "Revelations of Dust Rerun", "event_20230525_cn": "Confluence of Nothingness Rerun", - "event_20230803_cn": "Anthem of Remembrance", + "event_20230803_cn": "Anthem of Remembrance Rerun", "event_20230817_cn": "The Fools Scales Rerun", "event_20230914_cn": "Effulgence Before Eclipse", "event_20231026_cn": "Tempesta and the Fountain of Youth", @@ -864,6 +864,7 @@ "war_archives_20220428_cn": "archives Rondo at Rainbows End", "war_archives_20220526_cn": "archives Pledge of the Radiant Court", "war_archives_20220728_cn": "archives Aquilifers Ballade", + "war_archives_20220915_cn": "archives Violet Tempest Blooming Lycoris", "war_archives_20231026_cn": "archives Tempesta and the Fountain of Youth" }, "Mode": { @@ -1232,7 +1233,7 @@ }, "ChangeFlagship": { "name": "Change Flagship", - "help": "Change flagship if flagship level >= 32 or either flagship or vanguard are emotion exhausted (if Change Vanguard is enabled). If you choose not to change, your fleet will ignore the low emotion warning and continue combat.\nSwitch out to new common CV/CVL whose level is in range of 1 to 31, after current has reached level 32+. Meanwhile, abandoned flagships will be retired. Any common CV/CVL whose level is 2+ will be regarded as targets. Do confirm that your own ships which is not a target has been locked\n\nThe flagship's equipment is replaced when being switched out by first recording the current setup\nOnly populated equipment slots will be replaced. If the CV/CVL preference has been configured, all 5 slots will be populated otherwise only the auxiliary slots will be populated.", + "help": "Change flagship if flagship level >= 32 or either flagship or vanguard are emotion exhausted. If you choose not to change, your fleet will ignore the low emotion warning and continue combat.\nSwitch out to new common CV/CVL whose level is in range of 1 to 31, after current has reached level 32+. Meanwhile, abandoned flagships will be retired. Any common CV/CVL whose level is 2+ will be regarded as targets. Do confirm that your own ships which is not a target has been locked\n\nThe flagship's equipment is replaced when being switched out by first recording the current setup\nOnly populated equipment slots will be replaced. If the CV/CVL preference has been configured, all 5 slots will be populated otherwise only the auxiliary slots will be populated.", "ship": "Change Ship", "ship_equip": "Change Ship + Gears" }, @@ -2169,7 +2170,8 @@ "anchorage": "Anchorage", "noshiro": "Noshiro", "sirius": "Sirius", - "new_jersey": "New Jersey" + "new_jersey": "New Jersey", + "taihou": "Taihou" } }, "Daily": { diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 54c178be8..aa9356839 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -791,7 +791,7 @@ "event_20221222_cn": "積重なる事象の幻界(復刻)", "event_20230223_cn": "黙示の遺構(復刻)", "event_20230525_cn": "覆天せし万象の塵(復刻)", - "event_20230803_cn": "燃ゆる聖都の回想曲", + "event_20230803_cn": "燃ゆる聖都の回想曲(復刻)", "event_20230817_cn": "愚者の天秤(復刻)", "event_20230914_cn": "須臾望月抄", "event_20231026_cn": "テンペスタと若返りの泉", @@ -864,6 +864,7 @@ "war_archives_20220428_cn": "檔案 吟ずる瑠璃の楽章", "war_archives_20220526_cn": "檔案 诚閃の剣 搖光の城", "war_archives_20220728_cn": "檔案 鋼鷲の冒険譚", + "war_archives_20220915_cn": "檔案 赫の涙月 菫の暁風", "war_archives_20231026_cn": "檔案 テンペスタと若返りの泉" }, "Mode": { @@ -2169,7 +2170,8 @@ "anchorage": "anchorage", "noshiro": "noshiro", "sirius": "sirius", - "new_jersey": "new_jersey" + "new_jersey": "new_jersey", + "taihou": "taihou" } }, "Daily": { diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 4b147db39..4e3c61284 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -791,7 +791,7 @@ "event_20221222_cn": "复刻定向折叠", "event_20230223_cn": "复刻湮烬尘墟", "event_20230525_cn": "复刻空相交汇点", - "event_20230803_cn": "奏响鸢尾之歌", + "event_20230803_cn": "复刻奏响鸢尾之歌", "event_20230817_cn": "复刻愚者的天平", "event_20230914_cn": "须臾望月抄", "event_20231026_cn": "飓风与青春之泉", @@ -864,6 +864,7 @@ "war_archives_20220428_cn": "档案 虹彩的终幕曲", "war_archives_20220526_cn": "档案 泠誓光庭", "war_archives_20220728_cn": "档案 雄鹰的叙事歌", + "war_archives_20220915_cn": "档案 紫绛槿岚", "war_archives_20231026_cn": "档案 飓风与青春之泉" }, "Mode": { @@ -1232,7 +1233,7 @@ }, "ChangeFlagship": { "name": "更换旗舰", - "help": "当旗舰等级>=32或红脸时更换旗舰,选择不更换则会强制红脸出击\n寻找等级在1-31之间的白皮航母,同时会在退役时选择更换下来的旗舰。所有等级大于1级的白皮航母均会被视为退役目标,请务必锁定不是目标的船。换船时更换旗舰装备,这通过记录之前的装备完成。\n\n换装备只会更换正在装备中的栏位,即使是白装也会更换。如果指定了旗舰,则会更换全部5个装备,未指定旗舰只会更换设备。", + "help": "当旗舰等级>=32或红脸时更换旗舰\n寻找等级在1-31之间的白皮航母,同时会在退役时选择更换下来的旗舰。所有等级大于1级的白皮航母均会被视为退役目标,请务必锁定不是目标的船。换船时更换旗舰装备,这通过记录之前的装备完成。\n\n换装备只会更换正在装备中的栏位,即使是白装也会更换。如果指定了旗舰,则会更换全部5个装备,未指定旗舰只会更换设备。", "ship": "更换舰船", "ship_equip": "更换舰船 + 装备" }, @@ -2169,7 +2170,8 @@ "anchorage": "安克雷奇", "noshiro": "能代", "sirius": "天狼星", - "new_jersey": "新泽西" + "new_jersey": "新泽西", + "taihou": "鹩" } }, "Daily": { diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 23de86567..785cede96 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -807,7 +807,7 @@ "event_20241024_cn": "颶風與沉眠之海", "event_20241121_cn": "危險發明逼近中", "event_20241219_cn": "星光下的餘暉", - "event_20250227_cn": "Paradiso of Shackled Light", + "event_20250227_cn": "樊籠內的神光", "event_20250424_cn": "揚起鬱金之旗", "event_20250520_cn": "高塔上的薔薇", "event_20250724_cn": "鍊金術士與天際交會之塔", @@ -864,6 +864,7 @@ "war_archives_20220428_cn": "檔案 虹彩的終幕曲", "war_archives_20220526_cn": "檔案 泠誓光庭", "war_archives_20220728_cn": "檔案 雄鷹的敘事歌", + "war_archives_20220915_cn": "檔案 紫絳槿嵐", "war_archives_20231026_cn": "檔案 飓風與青春之泉" }, "Mode": { @@ -1232,7 +1233,7 @@ }, "ChangeFlagship": { "name": "更換旗艦", - "help": "當旗艦等級>=32或紅臉時更換旗艦,選擇不更換則會強制紅臉出擊\n尋找等級在1-31之間的白皮航母,同時會在退役時選擇更換下來的旗艦。所有等級大於1級的白船航母均會被視為退役目標,請務必鎖定不是目標的船。換船時更換旗艦裝備,這通過記錄之前的裝備完成。\n\n換裝備只會更換正在裝備中的欄位,即使是白裝也會更換。如果指定了旗艦,則會更換全部5個裝備,未指定旗艦隻會更換設備。", + "help": "當旗艦等級>=32或紅臉時更換旗艦\n尋找等級在1-31之間的白皮航母,同時會在退役時選擇更換下來的旗艦。所有等級大於1級的白船航母均會被視為退役目標,請務必鎖定不是目標的船。換船時更換旗艦裝備,這通過記錄之前的裝備完成。\n\n換裝備只會更換正在裝備中的欄位,即使是白裝也會更換。如果指定了旗艦,則會更換全部5個裝備,未指定旗艦隻會更換設備。", "ship": "更換艦船", "ship_equip": "更換艦船 + 裝備" }, @@ -2169,7 +2170,8 @@ "anchorage": "anchorage", "noshiro": "noshiro", "sirius": "sirius", - "new_jersey": "new_jersey" + "new_jersey": "new_jersey", + "taihou": "taihou" } }, "Daily": { diff --git a/module/handler/assets.py b/module/handler/assets.py index d457df28f..1254ed064 100644 --- a/module/handler/assets.py +++ b/module/handler/assets.py @@ -100,5 +100,5 @@ SUBMARINE_VIEW_ON = Button(area={'cn': (1140, 435, 1170, 468), 'en': (1140, 435, TEMPLATE_MANJUU = Template(file={'cn': './assets/cn/handler/TEMPLATE_MANJUU.png', 'en': './assets/cn/handler/TEMPLATE_MANJUU.png', 'jp': './assets/cn/handler/TEMPLATE_MANJUU.png', 'tw': './assets/cn/handler/TEMPLATE_MANJUU.png'}) USER_AGREEMENT_CONFIRM = Button(area={'cn': (709, 526, 742, 542), 'en': (709, 526, 742, 542), 'jp': (709, 526, 742, 542), 'tw': (709, 526, 742, 542)}, color={'cn': (151, 216, 243), 'en': (151, 216, 243), 'jp': (151, 216, 243), 'tw': (151, 216, 243)}, button={'cn': (709, 526, 742, 542), 'en': (709, 526, 742, 542), 'jp': (709, 526, 742, 542), 'tw': (709, 526, 742, 542)}, file={'cn': './assets/cn/handler/USER_AGREEMENT_CONFIRM.png', 'en': './assets/en/handler/USER_AGREEMENT_CONFIRM.png', 'jp': './assets/jp/handler/USER_AGREEMENT_CONFIRM.png', 'tw': './assets/tw/handler/USER_AGREEMENT_CONFIRM.png'}) USE_DATA_KEY = Button(area={'cn': (688, 316, 781, 338), 'en': (759, 323, 889, 342), 'jp': (627, 300, 743, 321), 'tw': (688, 316, 782, 338)}, color={'cn': (165, 154, 99), 'en': (170, 160, 94), 'jp': (127, 128, 116), 'tw': (159, 150, 97)}, button={'cn': (688, 316, 781, 338), 'en': (759, 323, 889, 342), 'jp': (627, 300, 743, 321), 'tw': (688, 316, 782, 338)}, file={'cn': './assets/cn/handler/USE_DATA_KEY.png', 'en': './assets/en/handler/USE_DATA_KEY.png', 'jp': './assets/jp/handler/USE_DATA_KEY.png', 'tw': './assets/tw/handler/USE_DATA_KEY.png'}) -USE_DATA_KEY_NOTIFIED = Button(area={'cn': (770, 434, 793, 456), 'en': (820, 440, 837, 456), 'jp': (686, 430, 709, 456), 'tw': (782, 440, 799, 456)}, color={'cn': (41, 44, 49), 'en': (33, 40, 41), 'jp': (33, 44, 49), 'tw': (34, 40, 48)}, button={'cn': (770, 434, 793, 456), 'en': (820, 440, 837, 456), 'jp': (686, 430, 709, 456), 'tw': (782, 440, 799, 456)}, file={'cn': './assets/cn/handler/USE_DATA_KEY_NOTIFIED.png', 'en': './assets/en/handler/USE_DATA_KEY_NOTIFIED.png', 'jp': './assets/jp/handler/USE_DATA_KEY_NOTIFIED.png', 'tw': './assets/tw/handler/USE_DATA_KEY_NOTIFIED.png'}) +USE_DATA_KEY_NOTIFIED = Button(area={'cn': (690, 185, 713, 207), 'en': (820, 440, 837, 456), 'jp': (686, 430, 709, 456), 'tw': (782, 440, 799, 456)}, color={'cn': (34, 49, 75), 'en': (33, 40, 41), 'jp': (33, 44, 49), 'tw': (34, 40, 48)}, button={'cn': (690, 185, 713, 207), 'en': (820, 440, 837, 456), 'jp': (686, 430, 709, 456), 'tw': (782, 440, 799, 456)}, file={'cn': './assets/cn/handler/USE_DATA_KEY_NOTIFIED.png', 'en': './assets/en/handler/USE_DATA_KEY_NOTIFIED.png', 'jp': './assets/jp/handler/USE_DATA_KEY_NOTIFIED.png', 'tw': './assets/tw/handler/USE_DATA_KEY_NOTIFIED.png'}) VOTE_CANCEL = Button(area={'cn': (404, 483, 576, 539), 'en': (413, 489, 566, 532), 'jp': (407, 483, 577, 538), 'tw': (404, 483, 576, 539)}, color={'cn': (167, 169, 171), 'en': (169, 170, 172), 'jp': (163, 164, 166), 'tw': (167, 169, 171)}, button={'cn': (404, 483, 576, 539), 'en': (413, 489, 566, 532), 'jp': (407, 483, 577, 538), 'tw': (404, 483, 576, 539)}, file={'cn': './assets/cn/handler/VOTE_CANCEL.png', 'en': './assets/en/handler/VOTE_CANCEL.png', 'jp': './assets/jp/handler/VOTE_CANCEL.png', 'tw': './assets/cn/handler/VOTE_CANCEL.png'}) diff --git a/module/os/map_operation.py b/module/os/map_operation.py index 6a876dd05..7a9fa8fd4 100644 --- a/module/os/map_operation.py +++ b/module/os/map_operation.py @@ -96,6 +96,10 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle name = name.replace('ジブフルタル', 'ジブラルタル') name = name.replace('タント', 'タラント').replace('タフント', 'タラント') name = name.replace('N海域', 'NA海域') + # リバープル -> リバープール + name = name.replace('リバプル', 'リバープール') + name = name.replace('リバープル', 'リバープール') + name = name.replace('リバプール', 'リバープール') return name @Config.when(SERVER='tw') diff --git a/module/private_quarters/assets.py b/module/private_quarters/assets.py index b54d89a00..7e87777ff 100644 --- a/module/private_quarters/assets.py +++ b/module/private_quarters/assets.py @@ -20,9 +20,10 @@ PRIVATE_QUARTERS_ROOM_TARGET_CHECK_2 = Button(area={'cn': (667, 71, 717, 86), 'e PRIVATE_QUARTERS_ROOM_TARGET_CLICK_AREA = Button(area={'cn': (504, 45, 784, 625), 'en': (504, 45, 784, 625), 'jp': (504, 45, 784, 625), 'tw': (504, 45, 784, 625)}, color={'cn': (255, 255, 255), 'en': (255, 255, 255), 'jp': (255, 255, 255), 'tw': (255, 255, 255)}, button={'cn': (504, 45, 784, 625), 'en': (504, 45, 784, 625), 'jp': (504, 45, 784, 625), 'tw': (504, 45, 784, 625)}, file={'cn': './assets/cn/private_quarters/PRIVATE_QUARTERS_ROOM_TARGET_CLICK_AREA.png', 'en': './assets/en/private_quarters/PRIVATE_QUARTERS_ROOM_TARGET_CLICK_AREA.png', 'jp': './assets/jp/private_quarters/PRIVATE_QUARTERS_ROOM_TARGET_CLICK_AREA.png', 'tw': './assets/tw/private_quarters/PRIVATE_QUARTERS_ROOM_TARGET_CLICK_AREA.png'}) PRIVATE_QUARTERS_ROOM_TARGET_INTIMACY_MAX = Button(area={'cn': (1157, 40, 1197, 60), 'en': (1157, 40, 1197, 60), 'jp': (1157, 40, 1197, 60), 'tw': (1157, 40, 1197, 60)}, color={'cn': (173, 161, 155), 'en': (173, 161, 155), 'jp': (173, 161, 155), 'tw': (173, 161, 155)}, button={'cn': (1157, 40, 1197, 60), 'en': (1157, 40, 1197, 60), 'jp': (1157, 40, 1197, 60), 'tw': (1157, 40, 1197, 60)}, file={'cn': './assets/cn/private_quarters/PRIVATE_QUARTERS_ROOM_TARGET_INTIMACY_MAX.png', 'en': './assets/en/private_quarters/PRIVATE_QUARTERS_ROOM_TARGET_INTIMACY_MAX.png', 'jp': './assets/jp/private_quarters/PRIVATE_QUARTERS_ROOM_TARGET_INTIMACY_MAX.png', 'tw': './assets/tw/private_quarters/PRIVATE_QUARTERS_ROOM_TARGET_INTIMACY_MAX.png'}) PRIVATE_QUARTERS_SHIP_ANCHORAGE = Button(area={'cn': (713, 246, 778, 311), 'en': (713, 246, 778, 311), 'jp': (713, 246, 778, 311), 'tw': (713, 246, 778, 311)}, color={'cn': (214, 184, 176), 'en': (214, 184, 176), 'jp': (214, 184, 176), 'tw': (214, 184, 176)}, button={'cn': (713, 246, 778, 311), 'en': (713, 246, 778, 311), 'jp': (713, 246, 778, 311), 'tw': (713, 246, 778, 311)}, file={'cn': './assets/cn/private_quarters/PRIVATE_QUARTERS_SHIP_ANCHORAGE.png', 'en': './assets/en/private_quarters/PRIVATE_QUARTERS_SHIP_ANCHORAGE.png', 'jp': './assets/jp/private_quarters/PRIVATE_QUARTERS_SHIP_ANCHORAGE.png', 'tw': './assets/tw/private_quarters/PRIVATE_QUARTERS_SHIP_ANCHORAGE.png'}) -PRIVATE_QUARTERS_SHIP_NEW_JERSEY = Button(area={'cn': (973, 307, 1023, 347), 'en': (973, 307, 1023, 347), 'jp': (973, 307, 1023, 347), 'tw': (973, 307, 1023, 347)}, color={'cn': (149, 141, 173), 'en': (149, 141, 173), 'jp': (149, 141, 173), 'tw': (149, 141, 173)}, button={'cn': (973, 307, 1023, 347), 'en': (973, 307, 1023, 347), 'jp': (973, 307, 1023, 347), 'tw': (973, 307, 1023, 347)}, file={'cn': './assets/cn/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png', 'en': './assets/cn/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png', 'jp': './assets/jp/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png', 'tw': './assets/cn/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png'}) +PRIVATE_QUARTERS_SHIP_NEW_JERSEY = Button(area={'cn': (973, 307, 1023, 347), 'en': (973, 307, 1023, 347), 'jp': (973, 307, 1023, 347), 'tw': (973, 307, 1023, 347)}, color={'cn': (149, 141, 173), 'en': (149, 141, 173), 'jp': (149, 141, 173), 'tw': (149, 141, 173)}, button={'cn': (973, 307, 1023, 347), 'en': (973, 307, 1023, 347), 'jp': (973, 307, 1023, 347), 'tw': (973, 307, 1023, 347)}, file={'cn': './assets/cn/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png', 'en': './assets/en/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png', 'jp': './assets/jp/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png', 'tw': './assets/tw/private_quarters/PRIVATE_QUARTERS_SHIP_NEW_JERSEY.png'}) PRIVATE_QUARTERS_SHIP_NOSHIRO = Button(area={'cn': (965, 289, 1027, 362), 'en': (962, 295, 1027, 360), 'jp': (962, 295, 1027, 360), 'tw': (962, 295, 1027, 360)}, color={'cn': (143, 120, 127), 'en': (102, 93, 102), 'jp': (102, 93, 102), 'tw': (102, 93, 102)}, button={'cn': (965, 289, 1027, 362), 'en': (962, 295, 1027, 360), 'jp': (962, 295, 1027, 360), 'tw': (962, 295, 1027, 360)}, file={'cn': './assets/cn/private_quarters/PRIVATE_QUARTERS_SHIP_NOSHIRO.png', 'en': './assets/en/private_quarters/PRIVATE_QUARTERS_SHIP_NOSHIRO.png', 'jp': './assets/jp/private_quarters/PRIVATE_QUARTERS_SHIP_NOSHIRO.png', 'tw': './assets/tw/private_quarters/PRIVATE_QUARTERS_SHIP_NOSHIRO.png'}) PRIVATE_QUARTERS_SHIP_SIRIUS = Button(area={'cn': (908, 411, 966, 478), 'en': (905, 414, 970, 479), 'jp': (905, 414, 970, 479), 'tw': (905, 414, 970, 479)}, color={'cn': (219, 207, 214), 'en': (156, 153, 165), 'jp': (156, 153, 165), 'tw': (156, 153, 165)}, button={'cn': (908, 411, 966, 478), 'en': (905, 414, 970, 479), 'jp': (905, 414, 970, 479), 'tw': (905, 414, 970, 479)}, file={'cn': './assets/cn/private_quarters/PRIVATE_QUARTERS_SHIP_SIRIUS.png', 'en': './assets/en/private_quarters/PRIVATE_QUARTERS_SHIP_SIRIUS.png', 'jp': './assets/jp/private_quarters/PRIVATE_QUARTERS_SHIP_SIRIUS.png', 'tw': './assets/tw/private_quarters/PRIVATE_QUARTERS_SHIP_SIRIUS.png'}) +PRIVATE_QUARTERS_SHIP_TAIHOU = Button(area={'cn': (814, 190, 856, 232), 'en': (814, 190, 856, 232), 'jp': (814, 190, 856, 232), 'tw': (814, 190, 856, 232)}, color={'cn': (134, 111, 109), 'en': (134, 111, 109), 'jp': (134, 111, 109), 'tw': (134, 111, 109)}, button={'cn': (814, 190, 856, 232), 'en': (814, 190, 856, 232), 'jp': (814, 190, 856, 232), 'tw': (814, 190, 856, 232)}, file={'cn': './assets/cn/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png', 'en': './assets/en/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png', 'jp': './assets/jp/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png', 'tw': './assets/tw/private_quarters/PRIVATE_QUARTERS_SHIP_TAIHOU.png'}) PRIVATE_QUARTERS_SHOP_AMOUNT_MAX = Button(area={'cn': (848, 504, 888, 524), 'en': (848, 504, 888, 524), 'jp': (848, 504, 888, 524), 'tw': (848, 504, 888, 524)}, color={'cn': (227, 231, 235), 'en': (227, 231, 235), 'jp': (227, 231, 235), 'tw': (227, 231, 235)}, button={'cn': (848, 504, 888, 524), 'en': (848, 504, 888, 524), 'jp': (848, 504, 888, 524), 'tw': (848, 504, 888, 524)}, file={'cn': './assets/cn/private_quarters/PRIVATE_QUARTERS_SHOP_AMOUNT_MAX.png', 'en': './assets/en/private_quarters/PRIVATE_QUARTERS_SHOP_AMOUNT_MAX.png', 'jp': './assets/jp/private_quarters/PRIVATE_QUARTERS_SHOP_AMOUNT_MAX.png', 'tw': './assets/tw/private_quarters/PRIVATE_QUARTERS_SHOP_AMOUNT_MAX.png'}) PRIVATE_QUARTERS_SHOP_BACK = Button(area={'cn': (40, 35, 60, 55), 'en': (40, 35, 60, 55), 'jp': (40, 35, 60, 55), 'tw': (40, 35, 60, 55)}, color={'cn': (202, 202, 202), 'en': (202, 202, 202), 'jp': (202, 202, 202), 'tw': (202, 202, 202)}, button={'cn': (35, 30, 95, 60), 'en': (35, 30, 95, 60), 'jp': (35, 30, 95, 60), 'tw': (35, 30, 95, 60)}, file={'cn': './assets/cn/private_quarters/PRIVATE_QUARTERS_SHOP_BACK.png', 'en': './assets/en/private_quarters/PRIVATE_QUARTERS_SHOP_BACK.png', 'jp': './assets/jp/private_quarters/PRIVATE_QUARTERS_SHOP_BACK.png', 'tw': './assets/tw/private_quarters/PRIVATE_QUARTERS_SHOP_BACK.png'}) PRIVATE_QUARTERS_SHOP_CHECK = Button(area={'cn': (124, 18, 218, 48), 'en': (129, 25, 284, 40), 'jp': (126, 20, 260, 44), 'tw': (129, 25, 284, 40)}, color={'cn': (86, 92, 98), 'en': (142, 147, 155), 'jp': (82, 88, 94), 'tw': (142, 147, 155)}, button={'cn': (124, 18, 218, 48), 'en': (129, 25, 284, 40), 'jp': (126, 20, 260, 44), 'tw': (129, 25, 284, 40)}, file={'cn': './assets/cn/private_quarters/PRIVATE_QUARTERS_SHOP_CHECK.png', 'en': './assets/en/private_quarters/PRIVATE_QUARTERS_SHOP_CHECK.png', 'jp': './assets/jp/private_quarters/PRIVATE_QUARTERS_SHOP_CHECK.png', 'tw': './assets/tw/private_quarters/PRIVATE_QUARTERS_SHOP_CHECK.png'}) diff --git a/module/private_quarters/interact.py b/module/private_quarters/interact.py index e40669b74..0d81f8ed7 100644 --- a/module/private_quarters/interact.py +++ b/module/private_quarters/interact.py @@ -16,14 +16,45 @@ class PQInteract(UI): 'noshiro': (PRIVATE_QUARTERS_SHIP_NOSHIRO, PRIVATE_QUARTERS_PAGE_LOCALE_BEACH), 'sirius': (PRIVATE_QUARTERS_SHIP_SIRIUS, PRIVATE_QUARTERS_PAGE_LOCALE_BEACH), 'new_jersey': (PRIVATE_QUARTERS_SHIP_NEW_JERSEY, PRIVATE_QUARTERS_PAGE_LOCALE_LOFT), + 'taihou': (PRIVATE_QUARTERS_SHIP_TAIHOU, PRIVATE_QUARTERS_PAGE_LOCALE_LOFT), } + def _pq_handle_dialogue(self): + """ + Handles dialogue sequence of target + After the addition of Taihou this sequence + has been discovered lagging on rare cases + Hence this call is used in other states + besides on room enter + """ + + # Helper funcs to hold off spam clicking until loading + # state is not present + def after_loading_state(): + return not self.appear(PRIVATE_QUARTERS_LOADING_CHECK, offset=(20, 20)) + + def additional(): + return True + + self.ui_click( + click_button=PRIVATE_QUARTERS_ROOM_SAFE_CLICK_AREA, + check_button=PRIVATE_QUARTERS_ROOM_CHECK, + appear_button=after_loading_state, + additional=additional, + confirm_wait=3, + offset=(20, 20), + retry_wait=1.5 + ) + def _pq_target_appear(self): """ Callable wrapper to validate target's appearance - offset=(100, 100) detectable for anchorage, noshiro, sirus, and new_jersey + offset=(100, 100) detectable for anchorage, noshiro, sirus, new_jersey, and taihou When more ships added may need to adjust or capture specific bubble position per ship, can use the available_targets to store similarly into tuples instead + + Returns: + bool """ settle_timer = Timer(1.5, count=3).start() skip_first_screenshot = True @@ -43,11 +74,20 @@ class PQInteract(UI): if settle_timer.reached(): return False - # Factor in couple drag up actions to - # counter odd default distance/zoom on target - p1, p2 = random_rectangle_vector( - (0, -30), box=PRIVATE_QUARTERS_ROOM_SAFE_CLICK_AREA.area, random_range=(-10, -10, 10, 10), padding=5) - self.device.drag(p1, p2, segments=2, shake=(0, 25), point_random=(0, 0, 0, 0), shake_random=(0, -5, 0, 5)) + if self.appear(PRIVATE_QUARTERS_ROOM_CHECK, offset=(20, 20)): + # Factor in couple drag up actions to + # counter odd default distance/zoom on target + p1, p2 = random_rectangle_vector( + (0, -30), box=PRIVATE_QUARTERS_ROOM_SAFE_CLICK_AREA.area, + random_range=(-10, -10, 10, 10), padding=5) + self.device.drag(p1, p2, segments=2, + shake=(0, 25), point_random=(0, 0, 0, 0), + shake_random=(0, -5, 0, 5)) + settle_timer.reset() + else: + # Absence of check likely means dialogue is ongoing + self._pq_handle_dialogue() + settle_timer.reset() def _pq_goto_room_seek(self, target_ship): """ @@ -112,8 +152,11 @@ class PQInteract(UI): """ Callable wrapper for whether is loading or blocked by download asset popup """ - return self.appear(PRIVATE_QUARTERS_LOADING_CHECK, offset=(20, 20)) \ - or self.appear(POPUP_CANCEL, offset=(20, 20)) + if self.appear(PRIVATE_QUARTERS_LOADING_CHECK, offset=(20, 20)): + return True + if self.appear(POPUP_CANCEL, offset=(20, 20)): + return True + return False def _pq_goto_room_enter(self, target_ship): """ @@ -155,25 +198,7 @@ class PQInteract(UI): # Fully enter into target's room # through click progression - click_timer = Timer(1.5, count=3).start() - skip_first_screenshot = True - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - - # End - if self.appear(PRIVATE_QUARTERS_ROOM_CHECK, offset=(20, 20)): - break - - # Continue without clicking, mitigate too many click exception - if self.appear(PRIVATE_QUARTERS_LOADING_CHECK, offset=(20, 20)): - continue - - if click_timer.reached(): - self.device.click(PRIVATE_QUARTERS_ROOM_SAFE_CLICK_AREA) - click_timer.reset() + self._pq_handle_dialogue() # If target's intimacy is maxed # Terminate the run @@ -188,6 +213,12 @@ class PQInteract(UI): """ Execute room exit routine """ + # Rare case in the middle of dialogue, so address + # before initiating room exit + if (not self.appear(PRIVATE_QUARTERS_ROOM_CHECK, offset=(20, 20)) and + not self.appear(PRIVATE_QUARTERS_INTERACT, offset=(0, 60))): + self._pq_handle_dialogue() + self.interval_clear(PRIVATE_QUARTERS_ROOM_BACK) self.ui_click( click_button=PRIVATE_QUARTERS_ROOM_BACK, diff --git a/module/shop/ui.py b/module/shop/ui.py index e14c471a2..dc4bf9022 100644 --- a/module/shop/ui.py +++ b/module/shop/ui.py @@ -1,6 +1,5 @@ from module.base.button import ButtonGrid from module.base.decorator import cached_property -from module.base.timer import Timer from module.handler.assets import POPUP_CONFIRM from module.logger import logger from module.shop.assets import * @@ -72,44 +71,46 @@ class ShopUI(UI): switch.add_state(TAB_PROTOTYPE, check_button=TAB_PROTOTYPE) return switch - def shop_refresh(self, skip_first_screenshot=True): + def shop_refresh(self): """ - Args: - skip_first_screenshot: bool - Returns: bool: If refreshed """ + logger.info('Shop refresh') refreshed = False - exit_timer = Timer(3, count=6).start() - while 1: - if skip_first_screenshot: - skip_first_screenshot = False - else: - self.device.screenshot() - if self.appear_then_click(SHOP_REFRESH, interval=3): - exit_timer.reset() - continue - if self.appear(SHOP_BUY_CONFIRM_MISTAKE, interval=3, offset=(200, 200)) \ - and self.appear(POPUP_CONFIRM, offset=(3, 30)): + # SHOP_REFRESH -> POPUP_CONFIRM + for _ in self.loop(): + if self.appear(POPUP_CONFIRM, offset=(30, 30)): + break + if self.appear(SHOP_REFRESH, offset=(30, 30), interval=3): + # SHOP_REFRESH has two kinds of color when active + if self.image_color_count(SHOP_REFRESH.button, color=(49, 142, 207), threshold=221, count=50): + self.device.click(SHOP_REFRESH) + continue + if self.image_color_count(SHOP_REFRESH.button, color=(54, 117, 161), threshold=221, count=50): + self.device.click(SHOP_REFRESH) + continue + if self.image_color_count(SHOP_REFRESH.button, color=(52, 74, 94), threshold=221, count=50): + logger.info('Refresh not available') + break + # no `continue`, act like SHOP_REFRESH not matched + self.interval_clear(SHOP_REFRESH) + + # POPUP_CONFIRM -> SHOP_BACK_ARROW + for _ in self.loop(): + if self.appear(SHOP_BACK_ARROW, offset=(30, 30)): + break + if self.appear(SHOP_BUY_CONFIRM_MISTAKE, interval=3, offset=(200, 200)): + logger.warning('SHOP_BUY_CONFIRM_MISTAKE') self.ui_click(SHOP_CLICK_SAFE_AREA, appear_button=POPUP_CONFIRM, check_button=SHOP_BACK_ARROW, offset=(20, 30), skip_first_screenshot=True) - exit_timer.reset() refreshed = False break if self.handle_popup_confirm('SHOP_REFRESH_CONFIRM'): - exit_timer.reset() refreshed = True continue - # End - if self.appear(SHOP_BACK_ARROW, offset=(30, 30)): - if exit_timer.reached(): - break - else: - exit_timer.reset() - self.handle_info_bar() return refreshed diff --git a/module/ui/ui.py b/module/ui/ui.py index 8393e8b3f..7a38821e8 100644 --- a/module/ui/ui.py +++ b/module/ui/ui.py @@ -611,6 +611,8 @@ class UI(InfoHandler): self.interval_reset(GET_SHIP) if button == DORMMENU_GOTO_DORM: self.interval_reset(GET_SHIP) + if button == DORMMENU_GOTO_MEOWFFICER: + self.interval_reset(GET_SHIP) for switch_button in page_main.links.values(): if button == switch_button: self.interval_reset(GET_SHIP) diff --git a/module/war_archives/assets.py b/module/war_archives/assets.py index cbedb971d..b1ad00ed0 100644 --- a/module/war_archives/assets.py +++ b/module/war_archives/assets.py @@ -44,6 +44,7 @@ TEMPLATE_THE_WAY_HOME_IN_THE_NIGHT = Template(file={'cn': './assets/cn/war_archi TEMPLATE_TOWER_OF_TRANSCENDENCE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_TOWER_OF_TRANSCENDENCE.png', 'en': './assets/cn/war_archives/TEMPLATE_TOWER_OF_TRANSCENDENCE.png', 'jp': './assets/cn/war_archives/TEMPLATE_TOWER_OF_TRANSCENDENCE.png', 'tw': './assets/cn/war_archives/TEMPLATE_TOWER_OF_TRANSCENDENCE.png'}) TEMPLATE_UNIVERSE_IN_UNISON = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_UNIVERSE_IN_UNISON.png', 'en': './assets/en/war_archives/TEMPLATE_UNIVERSE_IN_UNISON.png', 'jp': './assets/jp/war_archives/TEMPLATE_UNIVERSE_IN_UNISON.png', 'tw': './assets/cn/war_archives/TEMPLATE_UNIVERSE_IN_UNISON.png'}) TEMPLATE_UPON_THE_SHIMMERING_BLUE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_UPON_THE_SHIMMERING_BLUE.png', 'en': './assets/cn/war_archives/TEMPLATE_UPON_THE_SHIMMERING_BLUE.png', 'jp': './assets/cn/war_archives/TEMPLATE_UPON_THE_SHIMMERING_BLUE.png', 'tw': './assets/cn/war_archives/TEMPLATE_UPON_THE_SHIMMERING_BLUE.png'}) +TEMPLATE_VIOLET_TEMPEST_BLOOMING_LYCORIS = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_VIOLET_TEMPEST_BLOOMING_LYCORIS.png', 'en': './assets/cn/war_archives/TEMPLATE_VIOLET_TEMPEST_BLOOMING_LYCORIS.png', 'jp': './assets/cn/war_archives/TEMPLATE_VIOLET_TEMPEST_BLOOMING_LYCORIS.png', 'tw': './assets/cn/war_archives/TEMPLATE_VIOLET_TEMPEST_BLOOMING_LYCORIS.png'}) TEMPLATE_VIRTUAL_TOWER = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_VIRTUAL_TOWER.png', 'en': './assets/cn/war_archives/TEMPLATE_VIRTUAL_TOWER.png', 'jp': './assets/cn/war_archives/TEMPLATE_VIRTUAL_TOWER.png', 'tw': './assets/cn/war_archives/TEMPLATE_VIRTUAL_TOWER.png'}) TEMPLATE_VISITORS_DYED_IN_RED = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_VISITORS_DYED_IN_RED.png', 'en': './assets/en/war_archives/TEMPLATE_VISITORS_DYED_IN_RED.png', 'jp': './assets/jp/war_archives/TEMPLATE_VISITORS_DYED_IN_RED.png', 'tw': './assets/tw/war_archives/TEMPLATE_VISITORS_DYED_IN_RED.png'}) TEMPLATE_WINTERS_CROWN = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_WINTERS_CROWN.png', 'en': './assets/en/war_archives/TEMPLATE_WINTERS_CROWN.png', 'jp': './assets/jp/war_archives/TEMPLATE_WINTERS_CROWN.png', 'tw': './assets/tw/war_archives/TEMPLATE_WINTERS_CROWN.png'}) diff --git a/module/war_archives/dictionary.py b/module/war_archives/dictionary.py index 1afa4350a..ce0a75edf 100644 --- a/module/war_archives/dictionary.py +++ b/module/war_archives/dictionary.py @@ -42,4 +42,5 @@ dic_archives_template = { 'war_archives_20220728_cn': TEMPLATE_AQUILIFERS_BALLADE, 'war_archives_20220428_cn': TEMPLATE_RONDO_AT_RAINBOWS_END, 'war_archives_20231026_cn': TEMPLATE_TEMPESTA_AND_THE_FOUNTAIN_OF_YOUTH, + 'war_archives_20220915_cn': TEMPLATE_VIOLET_TEMPEST_BLOOMING_LYCORIS, }