diff --git a/assets/cn/combat_ui/PAUSE_MaidCafe.png b/assets/cn/combat_ui/PAUSE_MaidCafe.png new file mode 100644 index 000000000..f51bdf9fb Binary files /dev/null and b/assets/cn/combat_ui/PAUSE_MaidCafe.png differ diff --git a/assets/cn/combat_ui/QUIT_MaidCafe.png b/assets/cn/combat_ui/QUIT_MaidCafe.png new file mode 100644 index 000000000..483934f28 Binary files /dev/null and b/assets/cn/combat_ui/QUIT_MaidCafe.png differ diff --git a/assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png b/assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png new file mode 100644 index 000000000..77406c2fb Binary files /dev/null and b/assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png differ diff --git a/assets/en/handler/USE_DATA_KEY_NOTIFIED.png b/assets/en/handler/USE_DATA_KEY_NOTIFIED.png index 1e3371820..203efb082 100644 Binary files a/assets/en/handler/USE_DATA_KEY_NOTIFIED.png and b/assets/en/handler/USE_DATA_KEY_NOTIFIED.png differ diff --git a/campaign/Readme.md b/campaign/Readme.md index 925ecafc7..a1176770a 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -56,6 +56,7 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 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 | 赫の涙月 菫の暁風 | 紫絳槿嵐 | +| 20251218 | war archives 20221222 cn | Parallel Superimposition | 定向折叠 | Parallel Superimposition | 積重なる事象の幻界 | 定向折疊 | | 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 | 闇靄払う銀翼 | - | @@ -272,3 +273,4 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20251127 | coalition 20251120 | DATE A LANE | - | - | - | DATE A LANE | | 20251211 | event 20251023 cn | Tempesta and Islas de Libertád | - | - | - | 颶風與自由群島 | | 20251218 | event 20251218 cn | A Note Through the Firmament | 响彻于天穹之音 | A Note Through the Firmament | 天穹に響く音謡 | - | +| 20251231 | event 20251218 cn | A Note Through the Firmament | - | - | - | 響徹於天穹之音 | diff --git a/campaign/event_20251218_cn/a1.py b/campaign/event_20251218_cn/a1.py index 7e692435f..a017abcd1 100644 --- a/campaign/event_20251218_cn/a1.py +++ b/campaign/event_20251218_cn/a1.py @@ -73,6 +73,7 @@ class Config: 'distance': 50, 'wlen': 1000 } + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) HOMO_EDGE_COLOR_RANGE = (0, 17) MAP_WALK_USE_CURRENT_FLEET = True MAP_SWIPE_MULTIPLY = (1.232, 1.255) diff --git a/campaign/event_20251218_cn/b1.py b/campaign/event_20251218_cn/b1.py index 8216822be..b87ff6fa4 100644 --- a/campaign/event_20251218_cn/b1.py +++ b/campaign/event_20251218_cn/b1.py @@ -73,6 +73,7 @@ class Config: 'distance': 50, 'wlen': 1000 } + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) HOMO_EDGE_COLOR_RANGE = (0, 17) MAP_WALK_USE_CURRENT_FLEET = True MAP_SWIPE_MULTIPLY = (1.217, 1.240) diff --git a/campaign/event_20251218_cn/c1.py b/campaign/event_20251218_cn/c1.py index fd594847a..ae69348f5 100644 --- a/campaign/event_20251218_cn/c1.py +++ b/campaign/event_20251218_cn/c1.py @@ -73,6 +73,7 @@ class Config: 'distance': 50, 'wlen': 1000 } + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) HOMO_EDGE_COLOR_RANGE = (0, 17) MAP_WALK_USE_CURRENT_FLEET = True MAP_SWIPE_MULTIPLY = (1.232, 1.255) diff --git a/campaign/event_20251218_cn/d1.py b/campaign/event_20251218_cn/d1.py index cf99034b0..4fdd5db3d 100644 --- a/campaign/event_20251218_cn/d1.py +++ b/campaign/event_20251218_cn/d1.py @@ -74,6 +74,7 @@ class Config: 'distance': 50, 'wlen': 1000 } + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) HOMO_EDGE_COLOR_RANGE = (0, 17) MAP_WALK_USE_CURRENT_FLEET = True MAP_SWIPE_MULTIPLY = (1.217, 1.240) diff --git a/campaign/event_20251218_cn/sp.py b/campaign/event_20251218_cn/sp.py index f74e5236f..8cec53c7b 100644 --- a/campaign/event_20251218_cn/sp.py +++ b/campaign/event_20251218_cn/sp.py @@ -78,6 +78,7 @@ class Config: 'distance': 50, 'wlen': 1000 } + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) HOMO_EDGE_COLOR_RANGE = (0, 17) MAP_WALK_USE_CURRENT_FLEET = True MAP_SWIPE_MULTIPLY = (1.180, 1.202) diff --git a/campaign/war_archives_20221222_cn/a1.py b/campaign/war_archives_20221222_cn/a1.py new file mode 100644 index 000000000..ddf47cf4d --- /dev/null +++ b/campaign/war_archives_20221222_cn/a1.py @@ -0,0 +1,95 @@ +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 = ['D2', 'E3', 'E6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + -- -- ME -- -- -- ++ ++ + -- ME -- ME -- Me ++ ++ + -- -- ++ -- ++ -- MB -- + ME -- ++ MS -- Me -- -- + -- ME -- -- __ -- -- ME + -- -- -- -- -- MS ++ -- + SP -- -- Me ME -- -- 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 = [] + 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_SIREN_HAS_BOSS_ICON_SMALL = True + MAP_ENEMY_TEMPLATE = ['Light20221222', 'Main20221222', 'Carrier20221222'] + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY = (1.040, 1.060) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.006, 1.025) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.977, 0.994) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 2L > 2M > 3L > 3M > 1E > 2E > 3E > 1C > 2C > 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_20221222_cn/a2.py b/campaign/war_archives_20221222_cn/a2.py new file mode 100644 index 000000000..d5b6495c5 --- /dev/null +++ b/campaign/war_archives_20221222_cn/a2.py @@ -0,0 +1,76 @@ +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 = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + ME -- -- ME ++ Me -- ++ ++ + -- -- Me -- MS -- -- -- Me + -- ++ -- -- -- __ MS -- -- + SP -- -- ++ ME ++ ++ MB -- + SP -- ME -- MS ++ ++ MB 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 +""" +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, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + 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.074, 1.095) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.039, 1.058) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.009, 1.027) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 2L > 2M > 3L > 3M > 1E > 2E > 3E > 1C > 2C > 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_20221222_cn/a3.py b/campaign/war_archives_20221222_cn/a3.py new file mode 100644 index 000000000..75120648c --- /dev/null +++ b/campaign/war_archives_20221222_cn/a3.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 .a1 import Config as ConfigBase + +MAP = CampaignMap('A3') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ++ ++ ++ -- -- ME -- SP -- + -- Me -- MS ME -- -- -- SP + -- ME -- ++ -- -- -- -- -- + ME -- ME -- -- ME ME Me -- + Me -- MS -- ++ -- ++ ++ ME + ++ -- __ -- -- MS ++ ++ -- + -- -- -- ++ Me -- -- ME -- + MB MB -- ++ -- ME ++ ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 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 = [] + 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.095, 1.116) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.059, 1.079) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.028, 1.047) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 2L > 2M > 3L > 3M > 1E > 2E > 3E > 1C > 2C > 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_20221222_cn/b1.py b/campaign/war_archives_20221222_cn/b1.py new file mode 100644 index 000000000..a6d36988b --- /dev/null +++ b/campaign/war_archives_20221222_cn/b1.py @@ -0,0 +1,96 @@ +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 = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + -- ME ++ -- Me -- Me ++ ++ + ME -- -- -- -- ME -- MB ++ + -- -- MS -- -- -- __ -- Me + Me -- ME ++ MS Me -- -- Me + -- -- -- ++ ++ ++ -- ME -- + -- -- -- ME -- ME MS -- -- + SP -- -- -- MS -- ME -- ME + ++ SP -- ME ++ ++ ++ ME -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 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, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + 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_SIREN_HAS_BOSS_ICON_SMALL = True + MAP_ENEMY_TEMPLATE = ['Light20221222', 'Main20221222', 'Carrier20221222'] + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 33), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 33, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 33) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY = (1.028, 1.047) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.994, 1.013) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.965, 0.983) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 2L > 2M > 3L > 3M > 1E > 2E > 3E > 1C > 2C > 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_20221222_cn/b2.py b/campaign/war_archives_20221222_cn/b2.py new file mode 100644 index 000000000..aa52c26b4 --- /dev/null +++ b/campaign/war_archives_20221222_cn/b2.py @@ -0,0 +1,84 @@ +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 = 'I9' +MAP.camera_data = ['D2', 'D5', 'D7', 'F2', 'F5', 'F7'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ME -- -- ME -- ++ ++ -- -- + -- Me ME -- -- SP SP -- -- + -- -- ++ ++ ME -- -- -- ME + ME -- ++ ++ ME -- -- MS ++ + ME -- -- MS -- -- ME ME -- + -- Me -- __ -- MS ++ -- ME + ++ -- -- -- ME -- -- MS ++ + -- MB 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 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, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + 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_ENSURE_EDGE_INSIGHT_CORNER = '' + MAP_SWIPE_MULTIPLY = (1.056, 1.076) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.021, 1.040) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.992, 1.009) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 2L > 2M > 3L > 3M > 1E > 2E > 3E > 1C > 2C > 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_20221222_cn/b3.py b/campaign/war_archives_20221222_cn/b3.py new file mode 100644 index 000000000..1924ced31 --- /dev/null +++ b/campaign/war_archives_20221222_cn/b3.py @@ -0,0 +1,87 @@ +from .campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B3') +MAP.shape = 'I9' +MAP.camera_data = ['D3', 'F3', 'F5', 'F7'] +MAP.camera_data_spawn_point = ['D7'] +MAP.map_data = """ + -- ++ ++ ME -- ME -- ++ ++ + ++ ME -- -- -- -- -- MB ++ + -- -- -- Me -- ME __ -- -- + ME -- Me -- MS ++ ME -- ME + -- -- ++ MS -- MS -- -- -- + ++ -- -- -- MS -- Me -- ME + ++ SP -- -- ++ Me -- -- -- + ++ -- SP -- -- -- -- 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 +""" +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() +MAP.ignore_prediction(C5, is_siren=True) +MAP.ignore_prediction(E7, is_siren=True) +MAP.ignore_prediction(G4, is_siren=True) + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['SirenBoss15', 'SirenBoss16'] + 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_SIREN_HAS_BOSS_ICON_SMALL = False + MAP_SWIPE_MULTIPLY = (0.997, 1.015) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.964, 0.982) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.936, 0.953) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 2L > 2M > 3L > 3M > 1E > 2E > 3E > 1C > 2C > 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_20221222_cn/c1.py b/campaign/war_archives_20221222_cn/c1.py new file mode 100644 index 000000000..8e5f44908 --- /dev/null +++ b/campaign/war_archives_20221222_cn/c1.py @@ -0,0 +1,94 @@ +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 = ['D2', 'E3', 'E6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + -- -- ME -- -- -- ++ ++ + -- ME -- ME -- Me ++ ++ + -- -- ++ -- ++ -- MB -- + ME -- ++ MS -- Me -- -- + -- ME -- -- __ -- -- ME + -- -- -- -- -- MS ++ -- + SP -- -- Me ME -- -- 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 = [] + 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_SIREN_HAS_BOSS_ICON_SMALL = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 24), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 24, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 24) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY = (1.040, 1.060) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.006, 1.025) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.977, 0.994) + + +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_20221222_cn/c2.py b/campaign/war_archives_20221222_cn/c2.py new file mode 100644 index 000000000..4e93194e1 --- /dev/null +++ b/campaign/war_archives_20221222_cn/c2.py @@ -0,0 +1,76 @@ +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 = 'I7' +MAP.camera_data = ['D2', 'D5', 'F2', 'F5'] +MAP.camera_data_spawn_point = ['D5'] +MAP.map_data = """ + ME -- -- ME ++ Me -- ++ ++ + -- -- Me -- MS -- -- -- Me + -- ++ -- -- -- __ MS -- -- + SP -- -- ++ ME ++ ++ MB -- + SP -- ME -- MS ++ ++ MB 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 +""" +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, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + 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.074, 1.095) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.039, 1.058) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.009, 1.027) + + +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_20221222_cn/c3.py b/campaign/war_archives_20221222_cn/c3.py new file mode 100644 index 000000000..7320f1bd6 --- /dev/null +++ b/campaign/war_archives_20221222_cn/c3.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 .c1 import Config as ConfigBase + +MAP = CampaignMap('C3') +MAP.shape = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ++ ++ ++ -- -- ME -- SP -- + -- Me -- MS ME -- -- -- SP + -- ME -- ++ -- -- -- -- -- + ME -- ME -- -- ME ME Me -- + Me -- MS -- ++ -- ++ ++ ME + ++ -- __ -- -- MS ++ ++ -- + -- -- -- ++ Me -- -- ME -- + MB MB -- ++ -- ME ++ ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 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 = [] + 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.095, 1.116) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.059, 1.079) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.028, 1.047) + + +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_20221222_cn/campaign_base.py b/campaign/war_archives_20221222_cn/campaign_base.py new file mode 100644 index 000000000..42e0ca3f9 --- /dev/null +++ b/campaign/war_archives_20221222_cn/campaign_base.py @@ -0,0 +1,14 @@ +from ..campaign_war_archives.campaign_base import CampaignBase as CampaignBase_ +from module.ui.page import page_event + + +class CampaignBase(CampaignBase_): + def handle_exp_info(self): + # Random background of hits EXP_INFO_B + if self.ui_page_appear(page_event): + return False + return super().handle_exp_info() + + def map_data_init(self, map_): + super().map_data_init(map_) + self.config.override(EnemyPriority_EnemyScaleBalanceWeight='default_mode') diff --git a/campaign/war_archives_20221222_cn/d1.py b/campaign/war_archives_20221222_cn/d1.py new file mode 100644 index 000000000..e00871961 --- /dev/null +++ b/campaign/war_archives_20221222_cn/d1.py @@ -0,0 +1,95 @@ +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 = 'I8' +MAP.camera_data = ['D2', 'D6', 'F2', 'F6'] +MAP.camera_data_spawn_point = ['D6'] +MAP.map_data = """ + -- ME ++ -- Me -- Me ++ ++ + ME -- -- -- -- ME -- MB ++ + -- -- MS -- -- -- __ -- Me + Me -- ME ++ MS Me -- -- Me + -- -- -- ++ ++ ++ -- ME -- + -- -- -- ME -- ME MS -- -- + SP -- -- -- MS -- ME -- ME + ++ SP -- ME ++ ++ ++ ME -- +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 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, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = [] + 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_SIREN_HAS_BOSS_ICON_SMALL = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 24), + 'width': (1.5, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 24, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 24) + HOMO_EDGE_HOUGHLINES_THRESHOLD = 300 + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_SWIPE_MULTIPLY = (1.028, 1.047) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.994, 1.013) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.965, 0.983) + + +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_20221222_cn/d2.py b/campaign/war_archives_20221222_cn/d2.py new file mode 100644 index 000000000..16253e969 --- /dev/null +++ b/campaign/war_archives_20221222_cn/d2.py @@ -0,0 +1,93 @@ +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 = 'I9' +MAP.camera_data = ['D2', 'D5', 'D7', 'F2', 'F5', 'F7'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ME -- -- ME -- ++ ++ -- -- + -- Me ME -- -- SP SP -- -- + -- -- ++ ++ ME -- -- -- ME + ME -- ++ ++ ME -- -- MS ++ + ME -- -- MS -- -- ME ME -- + -- Me -- __ -- MS ++ -- ME + ++ -- -- -- ME -- -- MS ++ + -- MB 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 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 = [] + 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_ENSURE_EDGE_INSIGHT_CORNER = '' + MAP_SWIPE_MULTIPLY = (1.056, 1.076) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.021, 1.040) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.992, 1.009) + + +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_20221222_cn/d3.py b/campaign/war_archives_20221222_cn/d3.py new file mode 100644 index 000000000..79c8cdbd8 --- /dev/null +++ b/campaign/war_archives_20221222_cn/d3.py @@ -0,0 +1,96 @@ +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', 'F3', 'F5', 'F7'] +MAP.camera_data_spawn_point = ['D7'] +MAP.map_data = """ + -- ++ ++ ME -- ME -- ++ ++ + ++ ME -- -- -- -- -- MB ++ + -- -- -- Me -- ME __ -- -- + ME -- Me -- MS ++ ME -- ME + -- -- ++ MS -- MS -- -- -- + ++ -- -- -- MS -- Me -- ME + ++ SP -- -- ++ Me -- -- -- + ++ -- SP -- -- -- -- 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 +""" +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() +MAP.ignore_prediction(C5, is_siren=True) +MAP.ignore_prediction(E7, is_siren=True) +MAP.ignore_prediction(G4, is_siren=True) + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['SirenBoss15', 'SirenBoss16'] + 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_SIREN_HAS_BOSS_ICON_SMALL = False + MAP_SWIPE_MULTIPLY = (0.997, 1.015) + MAP_SWIPE_MULTIPLY_MINITOUCH = (0.964, 0.982) + MAP_SWIPE_MULTIPLY_MAATOUCH = (0.936, 0.953) + + +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 801cd2333..a9b8a5bac 100644 --- a/config/template.json +++ b/config/template.json @@ -669,7 +669,7 @@ }, "Campaign": { "Name": "D3", - "Event": "war_archives_20220915_cn", + "Event": "war_archives_20221222_cn", "Mode": "normal", "UseClearMode": true, "UseFleetLock": true, diff --git a/module/combat/combat.py b/module/combat/combat.py index ffeb42ca8..9ff52afbd 100644 --- a/module/combat/combat.py +++ b/module/combat/combat.py @@ -121,6 +121,8 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan return PAUSE_Ninja if PAUSE_ShadowPuppetry.match_luma(self.device.image, offset=(10, 10)): return PAUSE_ShadowPuppetry + if PAUSE_MaidCafe.match_template_color(self.device.image, offset=(10, 10)): + return PAUSE_MaidCafe return False def handle_combat_quit(self, offset=(20, 20), interval=3): @@ -168,6 +170,10 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan self.device.click(QUIT_Ninja) timer.reset() return True + if QUIT_MaidCafe.match_luma(self.device.image, offset=offset): + self.device.click(QUIT_MaidCafe) + timer.reset() + return True return False def ensure_combat_oil_loaded(self): diff --git a/module/combat_ui/assets.py b/module/combat_ui/assets.py index 109bc4519..f66c58ff1 100644 --- a/module/combat_ui/assets.py +++ b/module/combat_ui/assets.py @@ -11,6 +11,7 @@ PAUSE_DOUBLE_CHECK = Button(area={'cn': (1226, 35, 1231, 60), 'en': (1226, 35, 1 PAUSE_Devil = Button(area={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, color={'cn': (193, 98, 108), 'en': (193, 98, 108), 'jp': (193, 98, 108), 'tw': (193, 98, 108)}, button={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_Devil.png', 'en': './assets/cn/combat_ui/PAUSE_Devil.png', 'jp': './assets/cn/combat_ui/PAUSE_Devil.png', 'tw': './assets/cn/combat_ui/PAUSE_Devil.png'}) PAUSE_HolyLight = Button(area={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, color={'cn': (54, 40, 27), 'en': (54, 40, 27), 'jp': (54, 40, 27), 'tw': (54, 40, 27)}, button={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_HolyLight.png', 'en': './assets/cn/combat_ui/PAUSE_HolyLight.png', 'jp': './assets/cn/combat_ui/PAUSE_HolyLight.png', 'tw': './assets/cn/combat_ui/PAUSE_HolyLight.png'}) PAUSE_Iridescent_Fantasy = Button(area={'cn': (1232, 33, 1252, 57), 'en': (1232, 33, 1252, 57), 'jp': (1232, 33, 1252, 57), 'tw': (1232, 33, 1252, 57)}, color={'cn': (124, 139, 190), 'en': (124, 139, 190), 'jp': (124, 139, 190), 'tw': (124, 139, 190)}, button={'cn': (1232, 33, 1252, 57), 'en': (1232, 33, 1252, 57), 'jp': (1232, 33, 1252, 57), 'tw': (1232, 33, 1252, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_Iridescent_Fantasy.png', 'en': './assets/en/combat_ui/PAUSE_Iridescent_Fantasy.png', 'jp': './assets/jp/combat_ui/PAUSE_Iridescent_Fantasy.png', 'tw': './assets/tw/combat_ui/PAUSE_Iridescent_Fantasy.png'}) +PAUSE_MaidCafe = Button(area={'cn': (1230, 35, 1248, 54), 'en': (1230, 35, 1248, 54), 'jp': (1230, 35, 1248, 54), 'tw': (1230, 35, 1248, 54)}, color={'cn': (159, 145, 139), 'en': (159, 145, 139), 'jp': (159, 145, 139), 'tw': (159, 145, 139)}, button={'cn': (1230, 35, 1248, 54), 'en': (1230, 35, 1248, 54), 'jp': (1230, 35, 1248, 54), 'tw': (1230, 35, 1248, 54)}, file={'cn': './assets/cn/combat_ui/PAUSE_MaidCafe.png', 'en': './assets/cn/combat_ui/PAUSE_MaidCafe.png', 'jp': './assets/cn/combat_ui/PAUSE_MaidCafe.png', 'tw': './assets/cn/combat_ui/PAUSE_MaidCafe.png'}) PAUSE_Neon = Button(area={'cn': (1228, 32, 1250, 59), 'en': (1228, 32, 1250, 59), 'jp': (1228, 32, 1250, 59), 'tw': (1228, 32, 1250, 59)}, color={'cn': (106, 137, 80), 'en': (106, 137, 80), 'jp': (106, 137, 80), 'tw': (106, 137, 80)}, button={'cn': (1228, 32, 1250, 59), 'en': (1228, 32, 1250, 59), 'jp': (1228, 32, 1250, 59), 'tw': (1228, 32, 1250, 59)}, file={'cn': './assets/cn/combat_ui/PAUSE_Neon.png', 'en': './assets/cn/combat_ui/PAUSE_Neon.png', 'jp': './assets/cn/combat_ui/PAUSE_Neon.png', 'tw': './assets/cn/combat_ui/PAUSE_Neon.png'}) PAUSE_New = Button(area={'cn': (1231, 29, 1253, 56), 'en': (1231, 29, 1253, 56), 'jp': (1231, 29, 1253, 56), 'tw': (1231, 29, 1253, 56)}, color={'cn': (156, 158, 166), 'en': (156, 158, 166), 'jp': (156, 158, 166), 'tw': (156, 158, 166)}, button={'cn': (1231, 29, 1253, 56), 'en': (1231, 29, 1253, 56), 'jp': (1231, 29, 1253, 56), 'tw': (1231, 29, 1253, 56)}, file={'cn': './assets/cn/combat_ui/PAUSE_New.png', 'en': './assets/en/combat_ui/PAUSE_New.png', 'jp': './assets/jp/combat_ui/PAUSE_New.png', 'tw': './assets/tw/combat_ui/PAUSE_New.png'}) PAUSE_Ninja = Button(area={'cn': (1230, 37, 1246, 53), 'en': (1230, 37, 1246, 53), 'jp': (1230, 37, 1246, 53), 'tw': (1230, 37, 1246, 53)}, color={'cn': (135, 109, 92), 'en': (135, 109, 92), 'jp': (135, 109, 92), 'tw': (135, 109, 92)}, button={'cn': (1230, 37, 1246, 53), 'en': (1230, 37, 1246, 53), 'jp': (1230, 37, 1246, 53), 'tw': (1230, 37, 1246, 53)}, file={'cn': './assets/cn/combat_ui/PAUSE_Ninja.png', 'en': './assets/cn/combat_ui/PAUSE_Ninja.png', 'jp': './assets/cn/combat_ui/PAUSE_Ninja.png', 'tw': './assets/cn/combat_ui/PAUSE_Ninja.png'}) @@ -23,6 +24,7 @@ QUIT = Button(area={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp' 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'}) QUIT_Iridescent_Fantasy = Button(area={'cn': (391, 522, 464, 540), 'en': (402, 507, 460, 523), 'jp': (391, 522, 464, 540), 'tw': (391, 522, 464, 540)}, color={'cn': (121, 73, 79), 'en': (255, 174, 164), 'jp': (108, 60, 70), 'tw': (121, 73, 79)}, button={'cn': (391, 522, 464, 540), 'en': (402, 507, 460, 523), 'jp': (391, 522, 464, 540), 'tw': (391, 522, 464, 540)}, file={'cn': './assets/cn/combat_ui/QUIT_Iridescent_Fantasy.png', 'en': './assets/en/combat_ui/QUIT_Iridescent_Fantasy.png', 'jp': './assets/jp/combat_ui/QUIT_Iridescent_Fantasy.png', 'tw': './assets/cn/combat_ui/QUIT_Iridescent_Fantasy.png'}) +QUIT_MaidCafe = Button(area={'cn': (423, 549, 501, 568), 'en': (423, 549, 501, 568), 'jp': (423, 549, 501, 568), 'tw': (423, 549, 501, 568)}, color={'cn': (168, 142, 133), 'en': (168, 142, 133), 'jp': (168, 142, 133), 'tw': (168, 142, 133)}, button={'cn': (423, 549, 501, 568), 'en': (423, 549, 501, 568), 'jp': (423, 549, 501, 568), 'tw': (423, 549, 501, 568)}, file={'cn': './assets/cn/combat_ui/QUIT_MaidCafe.png', 'en': './assets/cn/combat_ui/QUIT_MaidCafe.png', 'jp': './assets/cn/combat_ui/QUIT_MaidCafe.png', 'tw': './assets/cn/combat_ui/QUIT_MaidCafe.png'}) QUIT_New = Button(area={'cn': (394, 506, 467, 524), 'en': (404, 506, 463, 523), 'jp': (394, 506, 467, 524), 'tw': (393, 505, 471, 524)}, color={'cn': (255, 180, 171), 'en': (255, 195, 187), 'jp': (255, 180, 171), 'tw': (255, 200, 193)}, button={'cn': (394, 506, 467, 524), 'en': (404, 506, 463, 523), 'jp': (394, 506, 467, 524), 'tw': (393, 505, 471, 524)}, file={'cn': './assets/cn/combat_ui/QUIT_New.png', 'en': './assets/en/combat_ui/QUIT_New.png', 'jp': './assets/cn/combat_ui/QUIT_New.png', 'tw': './assets/tw/combat_ui/QUIT_New.png'}) QUIT_Ninja = Button(area={'cn': (398, 509, 477, 528), 'en': (398, 509, 477, 528), 'jp': (398, 509, 477, 528), 'tw': (398, 509, 477, 528)}, color={'cn': (148, 138, 134), 'en': (148, 138, 134), 'jp': (148, 138, 134), 'tw': (148, 138, 134)}, button={'cn': (398, 509, 477, 528), 'en': (398, 509, 477, 528), 'jp': (398, 509, 477, 528), 'tw': (398, 509, 477, 528)}, file={'cn': './assets/cn/combat_ui/QUIT_Ninja.png', 'en': './assets/cn/combat_ui/QUIT_Ninja.png', 'jp': './assets/cn/combat_ui/QUIT_Ninja.png', 'tw': './assets/cn/combat_ui/QUIT_Ninja.png'}) QUIT_Nurse = Button(area={'cn': (400, 507, 477, 525), 'en': (400, 507, 477, 525), 'jp': (400, 507, 477, 525), 'tw': (400, 507, 477, 525)}, color={'cn': (254, 193, 170), 'en': (254, 193, 170), 'jp': (254, 193, 170), 'tw': (254, 193, 170)}, button={'cn': (400, 507, 477, 525), 'en': (400, 507, 477, 525), 'jp': (400, 507, 477, 525), 'tw': (400, 507, 477, 525)}, file={'cn': './assets/cn/combat_ui/QUIT_Nurse.png', 'en': './assets/cn/combat_ui/QUIT_Nurse.png', 'jp': './assets/cn/combat_ui/QUIT_Nurse.png', 'tw': './assets/cn/combat_ui/QUIT_Nurse.png'}) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index dc37419cc..c20adc339 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1634,7 +1634,6 @@ "type": "select", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "display": "hide", @@ -1648,10 +1647,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -1915,7 +1913,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -1928,10 +1925,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -2310,7 +2306,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -2323,10 +2318,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -3466,9 +3460,11 @@ "war_archives_20220526_cn", "war_archives_20220728_cn", "war_archives_20220915_cn", + "war_archives_20221222_cn", "war_archives_20231026_cn" ], "option_cn": [ + "war_archives_20221222_cn", "war_archives_20220915_cn", "war_archives_20231026_cn", "war_archives_20220428_cn", @@ -3513,6 +3509,7 @@ "war_archives_20181020_en" ], "option_en": [ + "war_archives_20221222_cn", "war_archives_20220915_cn", "war_archives_20231026_cn", "war_archives_20220428_cn", @@ -3557,6 +3554,7 @@ "war_archives_20181020_en" ], "option_jp": [ + "war_archives_20221222_cn", "war_archives_20220915_cn", "war_archives_20231026_cn", "war_archives_20220428_cn", @@ -3601,6 +3599,7 @@ "war_archives_20181020_en" ], "option_tw": [ + "war_archives_20221222_cn", "war_archives_20220915_cn", "war_archives_20231026_cn", "war_archives_20220428_cn", @@ -4031,7 +4030,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -4044,10 +4042,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -4443,7 +4440,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -4456,10 +4452,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -4855,7 +4850,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -4868,10 +4862,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -5267,7 +5260,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -5280,10 +5272,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -5669,7 +5660,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -5682,10 +5672,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index a44582f70..4ea89bd9c 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -815,6 +815,7 @@ "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_20221222_cn": "archives Parallel Superimposition", "war_archives_20231026_cn": "archives Tempesta and the Fountain of Youth" }, "Mode": { diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 18183507e..fc05ef5d3 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -815,6 +815,7 @@ "war_archives_20220526_cn": "檔案 诚閃の剣 搖光の城", "war_archives_20220728_cn": "檔案 鋼鷲の冒険譚", "war_archives_20220915_cn": "檔案 赫の涙月 菫の暁風", + "war_archives_20221222_cn": "檔案 積重なる事象の幻界", "war_archives_20231026_cn": "檔案 テンペスタと若返りの泉" }, "Mode": { diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 8237150a2..fda77163d 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -815,6 +815,7 @@ "war_archives_20220526_cn": "档案 泠誓光庭", "war_archives_20220728_cn": "档案 雄鹰的叙事歌", "war_archives_20220915_cn": "档案 紫绛槿岚", + "war_archives_20221222_cn": "档案 定向折叠", "war_archives_20231026_cn": "档案 飓风与青春之泉" }, "Mode": { diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 15e3c7e8f..18cb5da49 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -763,7 +763,7 @@ "event_20250814_cn": "奇淵下的秘密", "event_20250912_cn": "起舞於天原之上", "event_20251023_cn": "颶風與自由群島", - "event_20251218_cn": "A Note Through the Firmament", + "event_20251218_cn": "響徹於天穹之音", "raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20210708": "復刻穿越彼方的水線", "raid_20220127": "演習神秘事件調查", @@ -815,6 +815,7 @@ "war_archives_20220526_cn": "檔案 泠誓光庭", "war_archives_20220728_cn": "檔案 雄鷹的敘事歌", "war_archives_20220915_cn": "檔案 紫絳槿嵐", + "war_archives_20221222_cn": "檔案 定向折疊", "war_archives_20231026_cn": "檔案 飓風與青春之泉" }, "Mode": { diff --git a/module/exercise/hp_daemon.py b/module/exercise/hp_daemon.py index 7dbe30bd9..e79bce505 100644 --- a/module/exercise/hp_daemon.py +++ b/module/exercise/hp_daemon.py @@ -74,7 +74,8 @@ class HpDaemon(ModuleBase): PAUSE_Seaside, PAUSE_Star, PAUSE_Ninja, - PAUSE_ShadowPuppetry + PAUSE_ShadowPuppetry, + PAUSE_MaidCafe, ]: 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/handler/assets.py b/module/handler/assets.py index 84de27a0e..63b8de7d1 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': (690, 185, 713, 207), 'en': (820, 440, 837, 456), 'jp': (604, 183, 631, 209), 'tw': (782, 440, 799, 456)}, color={'cn': (34, 49, 75), 'en': (33, 40, 41), 'jp': (28, 43, 65), 'tw': (34, 40, 48)}, button={'cn': (690, 185, 713, 207), 'en': (820, 440, 837, 456), 'jp': (604, 183, 631, 209), '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': (740, 191, 757, 207), 'jp': (604, 183, 631, 209), 'tw': (782, 440, 799, 456)}, color={'cn': (34, 49, 75), 'en': (33, 48, 74), 'jp': (28, 43, 65), 'tw': (34, 40, 48)}, button={'cn': (690, 185, 713, 207), 'en': (740, 191, 757, 207), 'jp': (604, 183, 631, 209), '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 7a9fa8fd4..fb1a22441 100644 --- a/module/os/map_operation.py +++ b/module/os/map_operation.py @@ -47,6 +47,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle name = ocr.ocr(self.device.image) name = "".join(name.split()) name = name.lower() + name = name.strip('\\/-') if '-' in name: name = name.split('-')[0] if 'é' in name: # Méditerranée name maps @@ -79,6 +80,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle # For JP only ocr = Ocr(MAP_NAME, lang='jp', letter=(157, 173, 192), threshold=127, name='OCR_OS_MAP_NAME') name = ocr.ocr(self.device.image) + name = name.strip('\\/-') self.is_zone_name_hidden = '安全' in name # Remove punctuations for char in '・': @@ -107,6 +109,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle # For TW only ocr = Ocr(MAP_NAME, lang='tw', letter=(198, 215, 239), threshold=127, name='OCR_OS_MAP_NAME') name = ocr.ocr(self.device.image) + name = name.strip('\\/-') self.is_zone_name_hidden = '安全' in name # Remove '塞壬要塞海域' if '塞' in name: @@ -120,6 +123,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle # For CN only ocr = Ocr(MAP_NAME, lang='cnocr', letter=(214, 231, 255), threshold=127, name='OCR_OS_MAP_NAME') name = ocr.ocr(self.device.image) + name = name.strip('\\/-') self.is_zone_name_hidden = '安全' in name if '-' in name: name = name.split('-')[0] diff --git a/module/war_archives/assets.py b/module/war_archives/assets.py index 91139e443..561299fcc 100644 --- a/module/war_archives/assets.py +++ b/module/war_archives/assets.py @@ -27,6 +27,7 @@ TEMPLATE_MICROLAYER_MEDLEY = Template(file={'cn': './assets/cn/war_archives/TEMP TEMPLATE_MIRROR_INVOLUTION = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'en': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'jp': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png', 'tw': './assets/cn/war_archives/TEMPLATE_MIRROR_INVOLUTION.png'}) TEMPLATE_MOONLIT_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_MOONLIT_OVERTURE.png', 'en': './assets/cn/war_archives/TEMPLATE_MOONLIT_OVERTURE.png', 'jp': './assets/cn/war_archives/TEMPLATE_MOONLIT_OVERTURE.png', 'tw': './assets/cn/war_archives/TEMPLATE_MOONLIT_OVERTURE.png'}) TEMPLATE_NORTHERN_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'en': './assets/en/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'jp': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png', 'tw': './assets/cn/war_archives/TEMPLATE_NORTHERN_OVERTURE.png'}) +TEMPLATE_PARALLEL_SUPERIMPOSITION = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png', 'en': './assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png', 'jp': './assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png', 'tw': './assets/cn/war_archives/TEMPLATE_PARALLEL_SUPERIMPOSITION.png'}) TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png', 'en': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png', 'jp': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png', 'tw': './assets/cn/war_archives/TEMPLATE_PLEDGE_OF_THE_RADIANT_COURT.png'}) TEMPLATE_PRELUDE_UNDER_THE_MOON = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png', 'en': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png', 'jp': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png', 'tw': './assets/cn/war_archives/TEMPLATE_PRELUDE_UNDER_THE_MOON.png'}) TEMPLATE_RONDO_AT_RAINBOWS_END = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png', 'en': './assets/en/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png', 'jp': './assets/cn/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png', 'tw': './assets/cn/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png'}) diff --git a/module/war_archives/dictionary.py b/module/war_archives/dictionary.py index ce0a75edf..92bcdf53c 100644 --- a/module/war_archives/dictionary.py +++ b/module/war_archives/dictionary.py @@ -43,4 +43,5 @@ dic_archives_template = { '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, + 'war_archives_20221222_cn': TEMPLATE_PARALLEL_SUPERIMPOSITION, }