diff --git a/assets/cn/combat_ui/PAUSE_ShadowPuppetry.png b/assets/cn/combat_ui/PAUSE_ShadowPuppetry.png new file mode 100644 index 000000000..a4e4b9efb Binary files /dev/null and b/assets/cn/combat_ui/PAUSE_ShadowPuppetry.png differ diff --git a/assets/cn/map/FLEET_1_CLEAR.png b/assets/cn/map/FLEET_1_CLEAR.png index 8eb37ee91..212b44e14 100644 Binary files a/assets/cn/map/FLEET_1_CLEAR.png and b/assets/cn/map/FLEET_1_CLEAR.png differ diff --git a/assets/cn/map/FLEET_2_CLEAR.png b/assets/cn/map/FLEET_2_CLEAR.png index 43f507784..29578472e 100644 Binary files a/assets/cn/map/FLEET_2_CLEAR.png and b/assets/cn/map/FLEET_2_CLEAR.png differ diff --git a/assets/cn/map/SUBMARINE_CLEAR.png b/assets/cn/map/SUBMARINE_CLEAR.png index fc32be8f1..5b5e5ef51 100644 Binary files a/assets/cn/map/SUBMARINE_CLEAR.png and b/assets/cn/map/SUBMARINE_CLEAR.png differ diff --git a/assets/cn/template/TEMPLATE_COMBAT_LOADING.png b/assets/cn/template/TEMPLATE_COMBAT_LOADING.png index 594a73094..9086656f0 100644 Binary files a/assets/cn/template/TEMPLATE_COMBAT_LOADING.png and b/assets/cn/template/TEMPLATE_COMBAT_LOADING.png differ diff --git a/assets/cn/template/TEMPLATE_SIREN_Vboss_Chariot.gif b/assets/cn/template/TEMPLATE_SIREN_Vboss_Chariot.gif new file mode 100644 index 000000000..2d693b945 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_Vboss_Chariot.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_Vboss_Hermit.gif b/assets/cn/template/TEMPLATE_SIREN_Vboss_Hermit.gif new file mode 100644 index 000000000..be67af507 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_Vboss_Hermit.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_Vboss_Lovers.gif b/assets/cn/template/TEMPLATE_SIREN_Vboss_Lovers.gif new file mode 100644 index 000000000..c5b407980 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_Vboss_Lovers.gif differ diff --git a/assets/cn/template/TEMPLATE_SIREN_Vboss_Star.gif b/assets/cn/template/TEMPLATE_SIREN_Vboss_Star.gif new file mode 100644 index 000000000..aa503f136 Binary files /dev/null and b/assets/cn/template/TEMPLATE_SIREN_Vboss_Star.gif differ diff --git a/assets/en/map/FLEET_1_CLEAR.png b/assets/en/map/FLEET_1_CLEAR.png index 81e729c70..188e71dd3 100644 Binary files a/assets/en/map/FLEET_1_CLEAR.png and b/assets/en/map/FLEET_1_CLEAR.png differ diff --git a/assets/en/map/FLEET_2_CLEAR.png b/assets/en/map/FLEET_2_CLEAR.png index a6716804b..52b810f02 100644 Binary files a/assets/en/map/FLEET_2_CLEAR.png and b/assets/en/map/FLEET_2_CLEAR.png differ diff --git a/assets/en/map/SUBMARINE_CLEAR.png b/assets/en/map/SUBMARINE_CLEAR.png index 1c1bc2292..2acc99cfc 100644 Binary files a/assets/en/map/SUBMARINE_CLEAR.png and b/assets/en/map/SUBMARINE_CLEAR.png differ diff --git a/assets/en/template/TEMPLATE_COMBAT_LOADING.png b/assets/en/template/TEMPLATE_COMBAT_LOADING.png index 594a73094..9086656f0 100644 Binary files a/assets/en/template/TEMPLATE_COMBAT_LOADING.png and b/assets/en/template/TEMPLATE_COMBAT_LOADING.png differ diff --git a/assets/en/template/TEMPLATE_SIREN_Vboss_Chariot.gif b/assets/en/template/TEMPLATE_SIREN_Vboss_Chariot.gif new file mode 100644 index 000000000..2d693b945 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_Vboss_Chariot.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_Vboss_Hermit.gif b/assets/en/template/TEMPLATE_SIREN_Vboss_Hermit.gif new file mode 100644 index 000000000..be67af507 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_Vboss_Hermit.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_Vboss_Lovers.gif b/assets/en/template/TEMPLATE_SIREN_Vboss_Lovers.gif new file mode 100644 index 000000000..c5b407980 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_Vboss_Lovers.gif differ diff --git a/assets/en/template/TEMPLATE_SIREN_Vboss_Star.gif b/assets/en/template/TEMPLATE_SIREN_Vboss_Star.gif new file mode 100644 index 000000000..aa503f136 Binary files /dev/null and b/assets/en/template/TEMPLATE_SIREN_Vboss_Star.gif differ diff --git a/assets/en/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png b/assets/en/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png new file mode 100644 index 000000000..488540be7 Binary files /dev/null and b/assets/en/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png differ diff --git a/assets/en/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png b/assets/en/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png new file mode 100644 index 000000000..0dd72e37a Binary files /dev/null and b/assets/en/war_archives/TEMPLATE_RONDO_AT_RAINBOWS_END.png differ diff --git a/assets/jp/map/FLEET_1_CLEAR.png b/assets/jp/map/FLEET_1_CLEAR.png index 981497267..ac682f2b6 100644 Binary files a/assets/jp/map/FLEET_1_CLEAR.png and b/assets/jp/map/FLEET_1_CLEAR.png differ diff --git a/assets/jp/map/FLEET_2_CLEAR.png b/assets/jp/map/FLEET_2_CLEAR.png index 18d25c0d3..30eef1e08 100644 Binary files a/assets/jp/map/FLEET_2_CLEAR.png and b/assets/jp/map/FLEET_2_CLEAR.png differ diff --git a/assets/jp/map/SUBMARINE_CLEAR.png b/assets/jp/map/SUBMARINE_CLEAR.png index 2c4bb8e68..a32ad4693 100644 Binary files a/assets/jp/map/SUBMARINE_CLEAR.png and b/assets/jp/map/SUBMARINE_CLEAR.png differ diff --git a/assets/jp/template/TEMPLATE_COMBAT_LOADING.png b/assets/jp/template/TEMPLATE_COMBAT_LOADING.png index 594a73094..2bf0123f5 100644 Binary files a/assets/jp/template/TEMPLATE_COMBAT_LOADING.png and b/assets/jp/template/TEMPLATE_COMBAT_LOADING.png differ diff --git a/assets/jp/template/TEMPLATE_SIREN_Vboss_Chariot.gif b/assets/jp/template/TEMPLATE_SIREN_Vboss_Chariot.gif new file mode 100644 index 000000000..2d693b945 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_Vboss_Chariot.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_Vboss_Hermit.gif b/assets/jp/template/TEMPLATE_SIREN_Vboss_Hermit.gif new file mode 100644 index 000000000..be67af507 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_Vboss_Hermit.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_Vboss_Lovers.gif b/assets/jp/template/TEMPLATE_SIREN_Vboss_Lovers.gif new file mode 100644 index 000000000..c5b407980 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_Vboss_Lovers.gif differ diff --git a/assets/jp/template/TEMPLATE_SIREN_Vboss_Star.gif b/assets/jp/template/TEMPLATE_SIREN_Vboss_Star.gif new file mode 100644 index 000000000..aa503f136 Binary files /dev/null and b/assets/jp/template/TEMPLATE_SIREN_Vboss_Star.gif differ diff --git a/assets/jp/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png b/assets/jp/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png new file mode 100644 index 000000000..2e770d6af Binary files /dev/null and b/assets/jp/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png differ diff --git a/assets/tw/map/FLEET_1_CLEAR.png b/assets/tw/map/FLEET_1_CLEAR.png index 47a9cc43d..260424c44 100644 Binary files a/assets/tw/map/FLEET_1_CLEAR.png and b/assets/tw/map/FLEET_1_CLEAR.png differ diff --git a/assets/tw/map/FLEET_2_CLEAR.png b/assets/tw/map/FLEET_2_CLEAR.png index 34d892bd2..fcafb2fc0 100644 Binary files a/assets/tw/map/FLEET_2_CLEAR.png and b/assets/tw/map/FLEET_2_CLEAR.png differ diff --git a/assets/tw/map/SUBMARINE_CLEAR.png b/assets/tw/map/SUBMARINE_CLEAR.png index c77399ca4..809192065 100644 Binary files a/assets/tw/map/SUBMARINE_CLEAR.png and b/assets/tw/map/SUBMARINE_CLEAR.png differ diff --git a/assets/tw/storage/DISASSEMBLE_POPUP_CONFIRM.BUTTON.png b/assets/tw/storage/DISASSEMBLE_POPUP_CONFIRM.BUTTON.png new file mode 100644 index 000000000..a8e6f9c90 Binary files /dev/null and b/assets/tw/storage/DISASSEMBLE_POPUP_CONFIRM.BUTTON.png differ diff --git a/assets/tw/storage/EQUIPMENT_ENTER.BUTTON.png b/assets/tw/storage/EQUIPMENT_ENTER.BUTTON.png new file mode 100644 index 000000000..222ab6ecd Binary files /dev/null and b/assets/tw/storage/EQUIPMENT_ENTER.BUTTON.png differ diff --git a/assets/tw/storage/EQUIPMENT_ENTER.png b/assets/tw/storage/EQUIPMENT_ENTER.png new file mode 100644 index 000000000..28a6cb89f Binary files /dev/null and b/assets/tw/storage/EQUIPMENT_ENTER.png differ diff --git a/assets/tw/storage/EQUIPMENT_FILTER.BUTTON.png b/assets/tw/storage/EQUIPMENT_FILTER.BUTTON.png new file mode 100644 index 000000000..02a853781 Binary files /dev/null and b/assets/tw/storage/EQUIPMENT_FILTER.BUTTON.png differ diff --git a/assets/tw/storage/EQUIPMENT_FILTER.png b/assets/tw/storage/EQUIPMENT_FILTER.png new file mode 100644 index 000000000..75f0a6bbc Binary files /dev/null and b/assets/tw/storage/EQUIPMENT_FILTER.png differ diff --git a/assets/tw/storage/EQUIPMENT_FILTER_CONFIRM.BUTTON.png b/assets/tw/storage/EQUIPMENT_FILTER_CONFIRM.BUTTON.png new file mode 100644 index 000000000..b63573806 Binary files /dev/null and b/assets/tw/storage/EQUIPMENT_FILTER_CONFIRM.BUTTON.png differ diff --git a/assets/tw/storage/EQUIPMENT_FILTER_CONFIRM.png b/assets/tw/storage/EQUIPMENT_FILTER_CONFIRM.png new file mode 100644 index 000000000..9e5c0bea9 Binary files /dev/null and b/assets/tw/storage/EQUIPMENT_FILTER_CONFIRM.png differ diff --git a/assets/tw/template/TEMPLATE_SIREN_Vboss_Chariot.gif b/assets/tw/template/TEMPLATE_SIREN_Vboss_Chariot.gif new file mode 100644 index 000000000..2d693b945 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_Vboss_Chariot.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_Vboss_Hermit.gif b/assets/tw/template/TEMPLATE_SIREN_Vboss_Hermit.gif new file mode 100644 index 000000000..be67af507 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_Vboss_Hermit.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_Vboss_Lovers.gif b/assets/tw/template/TEMPLATE_SIREN_Vboss_Lovers.gif new file mode 100644 index 000000000..c5b407980 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_Vboss_Lovers.gif differ diff --git a/assets/tw/template/TEMPLATE_SIREN_Vboss_Star.gif b/assets/tw/template/TEMPLATE_SIREN_Vboss_Star.gif new file mode 100644 index 000000000..aa503f136 Binary files /dev/null and b/assets/tw/template/TEMPLATE_SIREN_Vboss_Star.gif differ diff --git a/assets/tw/ui/STORAGE_CHECK.png b/assets/tw/ui/STORAGE_CHECK.png new file mode 100644 index 000000000..3de1b8161 Binary files /dev/null and b/assets/tw/ui/STORAGE_CHECK.png differ diff --git a/campaign/Readme.md b/campaign/Readme.md index 9a245e21d..925ecafc7 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -270,3 +270,5 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20251121 | event 20220428 cn | Rondo at Rainbow's End | - | - | - | 復刻虹彩的終幕曲 | | 20251120 | coalition 20251120 | DATE A LANE | DATE A LANE | DATE A LANE | DATE A LANE | - | | 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 | 天穹に響く音謡 | - | diff --git a/campaign/event_20251218_cn/a1.py b/campaign/event_20251218_cn/a1.py new file mode 100644 index 000000000..7e692435f --- /dev/null +++ b/campaign/event_20251218_cn/a1.py @@ -0,0 +1,96 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('A1') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['G2'] +MAP.map_data = """ + ++ -- -- -- -- -- ++ -- SP -- + ++ ME ++ ++ ++ Me -- -- -- SP + -- -- -- -- Me -- -- MS -- -- + ME -- ME -- -- -- __ -- ++ ++ + ++ -- ++ ++ -- MS -- -- ++ ++ + -- -- -- ++ 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 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, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Star'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.232, 1.255) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.191, 1.213) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.156, 1.177) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_3(self): + return self.clear_boss() diff --git a/campaign/event_20251218_cn/a2.py b/campaign/event_20251218_cn/a2.py new file mode 100644 index 000000000..40e981981 --- /dev/null +++ b/campaign/event_20251218_cn/a2.py @@ -0,0 +1,75 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A2') +MAP.shape = 'J8' +MAP.camera_data = ['E3', 'E6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- -- -- -- -- ++ ME ++ -- -- + -- -- MB -- -- ME -- ME -- -- + ++ ++ -- ++ ++ -- -- -- ME -- + ++ -- __ -- ++ Me -- ++ ++ ++ + -- MS -- MS -- -- -- Me -- -- + -- -- MS -- -- Me -- -- ME -- + ++ -- -- -- -- ++ -- ME ++ ++ + ++ SP -- SP -- ME -- -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Star'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20251218_cn/a3.py b/campaign/event_20251218_cn/a3.py new file mode 100644 index 000000000..368b00817 --- /dev/null +++ b/campaign/event_20251218_cn/a3.py @@ -0,0 +1,81 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .a1 import Config as ConfigBase + +MAP = CampaignMap('A3') +MAP.shape = 'K10' +MAP.camera_data = ['F3', 'F6'] +MAP.camera_data_spawn_point = ['F6'] +MAP.map_data = """ + -- ++ ++ ++ -- -- -- ++ ++ ++ -- + -- ++ -- Me -- MB -- Me -- ++ -- + -- -- ME -- Me -- Me -- ME -- -- + -- -- ++ MS -- __ -- MS ++ -- -- + -- -- ++ -- -- MS -- -- ++ -- -- + ++ ++ ME -- -- -- -- -- ME ++ ++ + ++ ++ -- -- SP -- 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 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 1}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 1}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, K10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Star'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20251218_cn/b1.py b/campaign/event_20251218_cn/b1.py new file mode 100644 index 000000000..8216822be --- /dev/null +++ b/campaign/event_20251218_cn/b1.py @@ -0,0 +1,96 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('B1') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['G2'] +MAP.map_data = """ + ++ -- -- -- -- -- ++ -- SP -- + ++ ME ++ ++ ++ Me -- -- -- SP + -- -- -- -- Me -- -- MS -- -- + ME -- ME -- -- -- __ -- ++ ++ + ++ -- ++ ++ -- MS -- -- ++ ++ + -- -- -- ++ 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 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 9, 'siren': 1}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Hermit', 'Vboss_Lovers'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.217, 1.240) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.177, 1.199) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.143, 1.163) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20251218_cn/b2.py b/campaign/event_20251218_cn/b2.py new file mode 100644 index 000000000..10a60a465 --- /dev/null +++ b/campaign/event_20251218_cn/b2.py @@ -0,0 +1,76 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B2') +MAP.shape = 'J8' +MAP.camera_data = ['E3', 'E6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- -- -- -- -- ++ ME ++ -- -- + -- -- MB -- -- ME -- ME -- -- + ++ ++ -- ++ ++ -- -- -- ME -- + ++ -- __ -- ++ Me -- ++ ++ ++ + -- MS -- MS -- -- -- Me -- -- + -- -- MS -- -- Me -- -- ME -- + ++ -- -- -- -- ++ -- ME ++ ++ + ++ SP -- SP -- ME -- -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 9, 'siren': 1}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Hermit', 'Vboss_Chariot'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20251218_cn/b3.py b/campaign/event_20251218_cn/b3.py new file mode 100644 index 000000000..12af0244b --- /dev/null +++ b/campaign/event_20251218_cn/b3.py @@ -0,0 +1,82 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .b1 import Config as ConfigBase + +MAP = CampaignMap('B3') +MAP.shape = 'K10' +MAP.camera_data = ['F3', 'F6'] +MAP.camera_data_spawn_point = ['F6'] +MAP.map_data = """ + -- ++ ++ ++ -- -- -- ++ ++ ++ -- + -- ++ -- Me -- MB -- Me -- ++ -- + -- -- ME -- Me -- Me -- ME -- -- + -- -- ++ MS -- __ -- MS ++ -- -- + -- -- ++ -- -- MS -- -- ++ -- -- + ++ ++ ME -- -- -- -- -- ME ++ ++ + ++ ++ -- -- SP -- 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 50 50 50 50 50 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': 9, 'siren': 2}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, K10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Lovers', 'Vboss_Chariot'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20251218_cn/c1.py b/campaign/event_20251218_cn/c1.py new file mode 100644 index 000000000..fd594847a --- /dev/null +++ b/campaign/event_20251218_cn/c1.py @@ -0,0 +1,96 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('C1') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['G2'] +MAP.map_data = """ + ++ -- -- -- -- -- ++ -- SP -- + ++ ME ++ ++ ++ Me -- -- -- SP + -- -- -- -- Me -- -- MS -- -- + ME -- ME -- -- -- __ -- ++ ++ + ++ -- ++ ++ -- MS -- -- ++ ++ + -- -- -- ++ 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 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Star'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.232, 1.255) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.191, 1.213) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.156, 1.177) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20251218_cn/c2.py b/campaign/event_20251218_cn/c2.py new file mode 100644 index 000000000..87e2ebf10 --- /dev/null +++ b/campaign/event_20251218_cn/c2.py @@ -0,0 +1,75 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C2') +MAP.shape = 'J8' +MAP.camera_data = ['E3', 'E6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- -- -- -- -- ++ ME ++ -- -- + -- -- MB -- -- ME -- ME -- -- + ++ ++ -- ++ ++ -- -- -- ME -- + ++ -- __ -- ++ Me -- ++ ++ ++ + -- MS -- MS -- -- -- Me -- -- + -- -- MS -- -- Me -- -- ME -- + ++ -- -- -- -- ++ -- ME ++ ++ + ++ SP -- SP -- ME -- -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 2, 'siren': 2}, + {'battle': 1, 'enemy': 1}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Star'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_4(self): + return self.clear_boss() diff --git a/campaign/event_20251218_cn/c3.py b/campaign/event_20251218_cn/c3.py new file mode 100644 index 000000000..99f63596e --- /dev/null +++ b/campaign/event_20251218_cn/c3.py @@ -0,0 +1,82 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .c1 import Config as ConfigBase + +MAP = CampaignMap('C3') +MAP.shape = 'K10' +MAP.camera_data = ['F3', 'F6'] +MAP.camera_data_spawn_point = ['F6'] +MAP.map_data = """ + -- ++ ++ ++ -- -- -- ++ ++ ++ -- + -- ++ -- Me -- MB -- Me -- ++ -- + -- -- ME -- Me -- Me -- ME -- -- + -- -- ++ MS -- __ -- MS ++ -- -- + -- -- ++ -- -- MS -- -- ++ -- -- + ++ ++ ME -- -- -- -- -- ME ++ ++ + ++ ++ -- -- SP -- 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 50 50 50 50 50 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, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, K10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Star'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20251218_cn/d1.py b/campaign/event_20251218_cn/d1.py new file mode 100644 index 000000000..cf99034b0 --- /dev/null +++ b/campaign/event_20251218_cn/d1.py @@ -0,0 +1,97 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('D1') +MAP.shape = 'J8' +MAP.camera_data = ['D3', 'D6', 'G3', 'G6'] +MAP.camera_data_spawn_point = ['G2'] +MAP.map_data = """ + ++ -- -- -- -- -- ++ -- SP -- + ++ ME ++ ++ ++ Me -- -- -- SP + -- -- -- -- Me -- -- MS -- -- + ME -- ME -- -- -- __ -- ++ ++ + ++ -- ++ ++ -- MS -- -- ++ ++ + -- -- -- ++ 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 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 9, 'siren': 2}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config: + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Hermit', 'Vboss_Lovers'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + MAP_HAS_MODE_SWITCH = True + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.217, 1.240) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.177, 1.199) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.143, 1.163) + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_5(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20251218_cn/d2.py b/campaign/event_20251218_cn/d2.py new file mode 100644 index 000000000..ddf96d6e7 --- /dev/null +++ b/campaign/event_20251218_cn/d2.py @@ -0,0 +1,85 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D2') +MAP.shape = 'J8' +MAP.camera_data = ['E3', 'E6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['E6'] +MAP.map_data = """ + -- -- -- -- -- ++ ME ++ -- -- + -- -- MB -- -- ME -- ME -- -- + ++ ++ -- ++ ++ -- -- -- ME -- + ++ -- __ -- ++ Me -- ++ ++ ++ + -- MS -- MS -- -- -- Me -- -- + -- -- MS -- -- Me -- -- ME -- + ++ -- -- -- -- ++ -- ME ++ ++ + ++ SP -- SP -- ME -- -- ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 9, 'siren': 3}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Hermit', 'Vboss_Chariot'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20251218_cn/d3.py b/campaign/event_20251218_cn/d3.py new file mode 100644 index 000000000..107d0066e --- /dev/null +++ b/campaign/event_20251218_cn/d3.py @@ -0,0 +1,91 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger +from .d1 import Config as ConfigBase + +MAP = CampaignMap('D3') +MAP.shape = 'K10' +MAP.camera_data = ['F3', 'F6'] +MAP.camera_data_spawn_point = ['F6'] +MAP.map_data = """ + -- ++ ++ ++ -- -- -- ++ ++ ++ -- + -- ++ -- Me -- MB -- Me -- ++ -- + -- -- ME -- Me -- Me -- ME -- -- + -- -- ++ MS -- __ -- MS ++ -- -- + -- -- ++ -- -- MS -- -- ++ -- -- + ++ ++ ME -- -- -- -- -- ME ++ ++ + ++ ++ -- -- SP -- 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 50 50 50 50 50 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': 9, 'siren': 3}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \ +A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \ +A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \ +A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \ +A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \ +A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \ +A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \ +A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \ +A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \ +A10, B10, C10, D10, E10, F10, G10, H10, I10, J10, K10, \ + = MAP.flatten() + + +class Config(ConfigBase): + # ===== Start of generated config ===== + MAP_SIREN_TEMPLATE = ['Vboss_Lovers', 'Vboss_Chariot'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + # ===== End of generated config ===== + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_6(self): + return self.fleet_boss.clear_boss() diff --git a/campaign/event_20251218_cn/sp.py b/campaign/event_20251218_cn/sp.py new file mode 100644 index 000000000..f74e5236f --- /dev/null +++ b/campaign/event_20251218_cn/sp.py @@ -0,0 +1,111 @@ +from module.campaign.campaign_base import CampaignBase +from module.map.map_base import CampaignMap +from module.map.map_grids import SelectedGrids, RoadGrids +from module.logger import logger + +MAP = CampaignMap('SP') +MAP.shape = 'I8' +MAP.camera_data = ['D3', 'D6', 'F3', 'F6'] +MAP.camera_data_spawn_point = ['F2'] +MAP.map_data = """ + ++ ++ ++ -- -- -- -- SP -- + -- ME -- -- -- MS -- -- SP + -- -- ME ++ -- -- MS -- -- + ME -- -- -- ME __ -- MS -- + -- ME -- ME ++ -- ++ ++ ME + ++ -- -- -- -- -- ++ ++ -- + -- MB -- ++ ME -- ME -- -- + -- -- -- ++ -- ME ++ ++ ++ +""" +MAP.weight_data = """ + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 + 50 50 50 50 50 50 50 50 50 +""" +MAP.spawn_data = [ + {'battle': 0, 'enemy': 10, 'siren': 3}, + {'battle': 1}, + {'battle': 2}, + {'battle': 3}, + {'battle': 4}, + {'battle': 5}, + {'battle': 6}, + {'battle': 7, 'boss': 1}, +] +A1, B1, C1, D1, E1, F1, G1, 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 = ['Vboss_Hermit', 'Vboss_Lovers', 'Vboss_Chariot'] + MOVABLE_ENEMY_TURN = (2,) + MAP_HAS_SIREN = True + MAP_HAS_MOVABLE_ENEMY = True + MAP_HAS_MAP_STORY = False + MAP_HAS_FLEET_STEP = True + MAP_HAS_AMBUSH = False + MAP_HAS_MYSTERY = False + STAR_REQUIRE_1 = 0 + STAR_REQUIRE_2 = 0 + STAR_REQUIRE_3 = 0 + # ===== End of generated config ===== + + MAP_CHAPTER_SWITCH_20241219 = True + STAGE_ENTRANCE = ['half', '20240725'] + STAGE_INCREASE_AB = True + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (80, 255 - 17), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 17, 255), + 'prominence': 10, + 'distance': 50, + 'wlen': 1000 + } + HOMO_EDGE_COLOR_RANGE = (0, 17) + MAP_WALK_USE_CURRENT_FLEET = True + MAP_SWIPE_MULTIPLY = (1.180, 1.202) + MAP_SWIPE_MULTIPLY_MINITOUCH = (1.141, 1.162) + MAP_SWIPE_MULTIPLY_MAATOUCH = (1.108, 1.128) + MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom' + MAP_IS_ONE_TIME_STAGE = True + + +class Campaign(CampaignBase): + MAP = MAP + ENEMY_FILTER = '1L > 1M > 1E > 1C > 2L > 2M > 2E > 2C > 3L > 3M > 3E > 3C' + + def battle_0(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=2): + return True + + return self.battle_default() + + def battle_5(self): + if self.clear_siren(): + return True + if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0): + return True + + return self.battle_default() + + def battle_7(self): + return self.fleet_boss.clear_boss() diff --git a/config/template.json b/config/template.json index f7ada6909..336d087e3 100644 --- a/config/template.json +++ b/config/template.json @@ -720,7 +720,6 @@ "ServerUpdate": "00:00" }, "GemsFarming": { - "ChangeFlagship": "ship", "CommonCV": "any", "ChangeVanguard": "ship", "CommonDD": "any", @@ -789,54 +788,6 @@ "Storage": {} } }, - "Coalition": { - "Scheduler": { - "Enable": false, - "NextRun": "2020-01-01 00:00:00", - "Command": "Coalition", - "SuccessInterval": 30, - "FailureInterval": 30, - "ServerUpdate": "00:00" - }, - "Campaign": { - "Name": "dynamic", - "Event": "campaign_main", - "Mode": "normal", - "UseClearMode": true, - "UseFleetLock": true, - "UseAutoSearch": false, - "Use2xBook": false, - "AmbushEvade": true - }, - "Coalition": { - "Mode": "area1-normal", - "Fleet": "single" - }, - "StopCondition": { - "OilLimit": 1000, - "RunCount": 0, - "MapAchievement": "non_stop", - "StageIncrease": false, - "GetNewShip": false, - "ReachLevel": 0 - }, - "Emotion": { - "Mode": "calculate", - "Fleet1Value": 119, - "Fleet1Record": "2020-01-01 00:00:00", - "Fleet1Control": "prevent_yellow_face", - "Fleet1Recover": "not_in_dormitory", - "Fleet1Oath": false, - "Fleet2Value": 119, - "Fleet2Record": "2020-01-01 00:00:00", - "Fleet2Control": "prevent_yellow_face", - "Fleet2Recover": "not_in_dormitory", - "Fleet2Oath": false - }, - "Storage": { - "Storage": {} - } - }, "Event": { "Scheduler": { "Enable": false, @@ -1366,6 +1317,54 @@ "Storage": {} } }, + "Coalition": { + "Scheduler": { + "Enable": false, + "NextRun": "2020-01-01 00:00:00", + "Command": "Coalition", + "SuccessInterval": 30, + "FailureInterval": 30, + "ServerUpdate": "00:00" + }, + "Campaign": { + "Name": "dynamic", + "Event": "campaign_main", + "Mode": "normal", + "UseClearMode": true, + "UseFleetLock": true, + "UseAutoSearch": false, + "Use2xBook": false, + "AmbushEvade": true + }, + "Coalition": { + "Mode": "area1-normal", + "Fleet": "single" + }, + "StopCondition": { + "OilLimit": 1000, + "RunCount": 0, + "MapAchievement": "non_stop", + "StageIncrease": false, + "GetNewShip": false, + "ReachLevel": 0 + }, + "Emotion": { + "Mode": "calculate", + "Fleet1Value": 119, + "Fleet1Record": "2020-01-01 00:00:00", + "Fleet1Control": "prevent_yellow_face", + "Fleet1Recover": "not_in_dormitory", + "Fleet1Oath": false, + "Fleet2Value": 119, + "Fleet2Record": "2020-01-01 00:00:00", + "Fleet2Control": "prevent_yellow_face", + "Fleet2Recover": "not_in_dormitory", + "Fleet2Oath": false + }, + "Storage": { + "Storage": {} + } + }, "MaritimeEscort": { "Scheduler": { "Enable": false, diff --git a/dev_tools/map_extractor.py b/dev_tools/map_extractor.py index f9e1eb44a..b61bbf6cd 100644 --- a/dev_tools/map_extractor.py +++ b/dev_tools/map_extractor.py @@ -311,6 +311,12 @@ DIC_SIREN_NAME_CHI_TO_ENG = { 'jiulaimu_shixianggui': 'Jiulaimu_Statue', 'jiulaimu_emo': 'Jiulaimu_Demon', 'youlin_ylsb': 'Jiulaimu_Ghost', + + # A Note Through the Firmament + 'unknownV_boss_star': 'Vboss_Star', + 'unknownV_boss_hermit': 'Vboss_Hermit', + 'unknownV_boss_lovers': 'Vboss_Lovers', + 'unknownV_boss_chariot': 'Vboss_Chariot', } diff --git a/dev_tools/utils.py b/dev_tools/utils.py index ce6e8f6d1..e85e9682a 100644 --- a/dev_tools/utils.py +++ b/dev_tools/utils.py @@ -45,7 +45,7 @@ class LuaLoader: def filepath(self, path): return os.path.join(self.folder, self.server, path) - def _load_file(self, file): + def _load_file(self, file, keyword=None): """ Args: file (str): @@ -57,56 +57,21 @@ class LuaLoader: text = f.read() result = {} - matched = re.findall('function \(\)(.*?)end[()]', text, re.S) - if matched: - # Most files are in this format - """ - pg = pg or {} - slot0 = pg - slot0.chapter_template = {} - - (function () - ... - end)() - """ - for func in matched: - add = slpp.decode('{' + func + '}') - result.update(add) - elif text.startswith('pg'): - # Old format - """ - pg = pg or {} - pg.item_data_statistics = { - ... - } - """ - # or - """ - pg = pg or {} - - rawset(pg, "item_data_statistics", rawget(pg, "item_data_statistics") or { - ... - } - """ - text = '{' + text.split('{', 2)[2] - result = slpp.decode(text) - else: - # Another format, just bare data - """ - _G.pg.expedition_data_template[...] = { - ... - } - _G.pg.expedition_data_template[...] = { - ... - } - ... - """ + if text.startswith('_G'): text = '{' + text + '}' result = slpp.decode(text) - + else: + if keyword: + print(f'Finding keyword: {keyword}') + pattern = rf"^{re.escape(keyword)}.*?\{{\s*\n(.*?)^\}}" + else: + pattern = r"\{\s*\n(.*?)^\}" + m = re.search(pattern, text, re.S | re.M) + if m: + result = slpp.decode('{' + m.group(1) + '}') return result - def load(self, path): + def load(self, path, keyword=None): """ Load a lua file to python dictionary, handling the differences @@ -123,7 +88,7 @@ class LuaLoader: for file in tqdm(os.listdir(self.filepath(path))): result.update(self._load_file(f'./{path}/{file}')) else: - result = self._load_file(path) + result = self._load_file(path, keyword=keyword) print(f'{len(result.keys())} items loaded') return result diff --git a/module/campaign/gems_farming.py b/module/campaign/gems_farming.py index e0afdfce6..5b215ba27 100644 --- a/module/campaign/gems_farming.py +++ b/module/campaign/gems_farming.py @@ -79,22 +79,10 @@ class GemsFarming(CampaignRun, FleetEquipment, Dock): self.campaign.config.override(Emotion_Mode='ignore') self.campaign.config.override(EnemyPriority_EnemyScaleBalanceWeight='S1_enemy_first') - @property - def change_flagship(self): - return 'ship' in self.config.GemsFarming_ChangeFlagship - - @property - def change_flagship_equip(self): - return 'equip' in self.config.GemsFarming_ChangeFlagship - @property def change_vanguard(self): return 'ship' in self.config.GemsFarming_ChangeVanguard - @property - def change_vanguard_equip(self): - return 'equip' in self.config.GemsFarming_ChangeVanguard - @property def fleet_to_attack(self): if self.config.Fleet_FleetOrder == 'fleet1_standby_fleet2_all': @@ -110,31 +98,12 @@ class GemsFarming(CampaignRun, FleetEquipment, Dock): Returns: bool: True if flagship changed. """ - - if self.config.GemsFarming_CommonCV == 'any': - index_list = range(3, 5) - else: - index_list = range(0, 5) logger.hr('Change flagship', level=1) - logger.attr('ChangeFlagship', self.config.GemsFarming_ChangeFlagship) self.fleet_enter(self.fleet_to_attack) - if self.change_flagship_equip: - logger.hr('Record flagship equipment', level=2) - self.fleet_enter_ship(FLEET_DETAIL_ENTER_FLAGSHIP) - self.ship_equipment_record_image(index_list=index_list) - self.ship_equipment_take_off() - self.fleet_back() logger.hr('Change flagship', level=2) success = self.flagship_change_execute() - if self.change_flagship_equip: - logger.hr('Equip flagship equipment', level=2) - self.fleet_enter_ship(FLEET_DETAIL_ENTER_FLAGSHIP) - self.ship_equipment_take_off() - self.ship_equipment_take_on_image(index_list=index_list) - self.fleet_back() - return success def vanguard_change(self): @@ -148,23 +117,10 @@ class GemsFarming(CampaignRun, FleetEquipment, Dock): logger.hr('Change vanguard', level=1) logger.attr('ChangeVanguard', self.config.GemsFarming_ChangeVanguard) self.fleet_enter(self.fleet_to_attack) - if self.change_vanguard_equip: - logger.hr('Record vanguard equipment', level=2) - self.fleet_enter_ship(FLEET_DETAIL_ENTER) - self.ship_equipment_record_image() - self.ship_equipment_take_off() - self.fleet_back() logger.hr('Change vanguard', level=2) success = self.vanguard_change_execute() - if self.change_vanguard_equip: - logger.hr('Equip vanguard equipment', level=2) - self.fleet_enter_ship(FLEET_DETAIL_ENTER) - self.ship_equipment_take_off() - self.ship_equipment_take_on_image() - self.fleet_back() - return success def _dock_reset(self): @@ -391,7 +347,7 @@ class GemsFarming(CampaignRun, FleetEquipment, Dock): def triggered_stop_condition(self, oil_check=True): # Lv32 limit - if self.change_flagship and self.campaign.config.LV32_TRIGGERED: + if self.campaign.config.LV32_TRIGGERED: self._trigger_lv32 = True logger.hr('TRIGGERED LV32 LIMIT') return True @@ -411,7 +367,7 @@ class GemsFarming(CampaignRun, FleetEquipment, Dock): mode (str): `normal` or `hard` total (int): """ - self.config.STOP_IF_REACH_LV32 = self.change_flagship + self.config.override(STOP_IF_REACH_LV32=True) while 1: self._trigger_lv32 = False @@ -427,9 +383,7 @@ class GemsFarming(CampaignRun, FleetEquipment, Dock): # End if self._trigger_lv32 or self._trigger_emotion: - success = True - if self.change_flagship: - success = self.flagship_change() + success = self.flagship_change() if self.change_vanguard: success = success and self.vanguard_change() diff --git a/module/combat/combat.py b/module/combat/combat.py index 54ba73969..ffeb42ca8 100644 --- a/module/combat/combat.py +++ b/module/combat/combat.py @@ -67,7 +67,7 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan Returns: bool: """ - image = self.image_crop((0, 620, 1280, 720), copy=False) + image = self.image_crop((0, 620, 1280, 690), copy=False) similarity, button = TEMPLATE_COMBAT_LOADING.match_luma_result(image) if similarity > 0.85: loading = (button.area[0] + 38 - LOADING_BAR.area[0]) / (LOADING_BAR.area[2] - LOADING_BAR.area[0]) @@ -119,6 +119,8 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan return PAUSE_Seaside if PAUSE_Ninja.match_template_color(self.device.image, offset=(10, 10)): return PAUSE_Ninja + if PAUSE_ShadowPuppetry.match_luma(self.device.image, offset=(10, 10)): + return PAUSE_ShadowPuppetry return False def handle_combat_quit(self, offset=(20, 20), interval=3): @@ -214,6 +216,7 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan continue if self.handle_story_skip(): continue + # slow down the screenshot interval earlier if not interval_set: if self.is_combat_loading(): self.device.screenshot_interval_set('combat') @@ -225,6 +228,9 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan logger.attr('BattleUI', pause) if emotion_reduce: self.emotion.reduce(fleet_index) + # fallback slow down if is_combat_loading() not detected + if not interval_set: + self.device.screenshot_interval_set('combat') break def handle_battle_preparation(self): @@ -624,3 +630,9 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan # self.handle_map_after_combat_story() logger.info('Combat end.') + + +if __name__ == '__main__': + self = Combat('alas5') + self.image_file = r'C:\Users\LmeSzinc\Documents\MuMu共享文件夹\Screenshots\MuMu12-20251219-021500.png' + self.is_combat_loading() \ No newline at end of file diff --git a/module/combat_ui/assets.py b/module/combat_ui/assets.py index 0f33b2ed7..109bc4519 100644 --- a/module/combat_ui/assets.py +++ b/module/combat_ui/assets.py @@ -17,6 +17,7 @@ PAUSE_Ninja = Button(area={'cn': (1230, 37, 1246, 53), 'en': (1230, 37, 1246, 53 PAUSE_Nurse = Button(area={'cn': (1236, 33, 1251, 50), 'en': (1236, 33, 1251, 50), 'jp': (1236, 33, 1251, 50), 'tw': (1236, 33, 1251, 50)}, color={'cn': (200, 206, 209), 'en': (200, 206, 209), 'jp': (200, 206, 209), 'tw': (200, 206, 209)}, button={'cn': (1236, 33, 1251, 50), 'en': (1236, 33, 1251, 50), 'jp': (1236, 33, 1251, 50), 'tw': (1236, 33, 1251, 50)}, file={'cn': './assets/cn/combat_ui/PAUSE_Nurse.png', 'en': './assets/cn/combat_ui/PAUSE_Nurse.png', 'jp': './assets/cn/combat_ui/PAUSE_Nurse.png', 'tw': './assets/cn/combat_ui/PAUSE_Nurse.png'}) PAUSE_Pharaoh = Button(area={'cn': (1229, 55, 1259, 62), 'en': (1229, 55, 1259, 62), 'jp': (1229, 55, 1259, 62), 'tw': (1229, 55, 1259, 62)}, color={'cn': (164, 119, 78), 'en': (164, 119, 78), 'jp': (164, 119, 78), 'tw': (164, 119, 78)}, button={'cn': (1229, 55, 1259, 62), 'en': (1229, 55, 1259, 62), 'jp': (1229, 55, 1259, 62), 'tw': (1229, 55, 1259, 62)}, file={'cn': './assets/cn/combat_ui/PAUSE_Pharaoh.png', 'en': './assets/cn/combat_ui/PAUSE_Pharaoh.png', 'jp': './assets/cn/combat_ui/PAUSE_Pharaoh.png', 'tw': './assets/cn/combat_ui/PAUSE_Pharaoh.png'}) PAUSE_Seaside = Button(area={'cn': (1214, 31, 1239, 59), 'en': (1214, 31, 1239, 59), 'jp': (1214, 31, 1239, 59), 'tw': (1214, 31, 1239, 59)}, color={'cn': (172, 196, 212), 'en': (172, 196, 212), 'jp': (172, 196, 212), 'tw': (172, 196, 212)}, button={'cn': (1214, 31, 1239, 59), 'en': (1214, 31, 1239, 59), 'jp': (1214, 31, 1239, 59), 'tw': (1214, 31, 1239, 59)}, file={'cn': './assets/cn/combat_ui/PAUSE_Seaside.png', 'en': './assets/cn/combat_ui/PAUSE_Seaside.png', 'jp': './assets/cn/combat_ui/PAUSE_Seaside.png', 'tw': './assets/cn/combat_ui/PAUSE_Seaside.png'}) +PAUSE_ShadowPuppetry = Button(area={'cn': (1216, 37, 1234, 55), 'en': (1216, 37, 1234, 55), 'jp': (1216, 37, 1234, 55), 'tw': (1216, 37, 1234, 55)}, color={'cn': (139, 112, 72), 'en': (139, 112, 72), 'jp': (139, 112, 72), 'tw': (139, 112, 72)}, button={'cn': (1216, 37, 1234, 55), 'en': (1216, 37, 1234, 55), 'jp': (1216, 37, 1234, 55), 'tw': (1216, 37, 1234, 55)}, file={'cn': './assets/cn/combat_ui/PAUSE_ShadowPuppetry.png', 'en': './assets/cn/combat_ui/PAUSE_ShadowPuppetry.png', 'jp': './assets/cn/combat_ui/PAUSE_ShadowPuppetry.png', 'tw': './assets/cn/combat_ui/PAUSE_ShadowPuppetry.png'}) PAUSE_Star = Button(area={'cn': (1234, 36, 1250, 57), 'en': (1234, 36, 1250, 57), 'jp': (1234, 36, 1250, 57), 'tw': (1234, 36, 1250, 57)}, color={'cn': (169, 179, 179), 'en': (169, 179, 179), 'jp': (169, 179, 179), 'tw': (169, 179, 179)}, button={'cn': (1234, 36, 1250, 57), 'en': (1234, 36, 1250, 57), 'jp': (1234, 36, 1250, 57), 'tw': (1234, 36, 1250, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_Star.png', 'en': './assets/cn/combat_ui/PAUSE_Star.png', 'jp': './assets/cn/combat_ui/PAUSE_Star.png', 'tw': './assets/cn/combat_ui/PAUSE_Star.png'}) QUIT = Button(area={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp': (433, 490, 606, 547), 'tw': (433, 490, 606, 547)}, color={'cn': (199, 122, 114), 'en': (216, 168, 164), 'jp': (196, 120, 113), 'tw': (200, 126, 118)}, button={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp': (433, 490, 606, 547), 'tw': (433, 490, 606, 547)}, file={'cn': './assets/cn/combat_ui/QUIT.png', 'en': './assets/en/combat_ui/QUIT.png', 'jp': './assets/jp/combat_ui/QUIT.png', 'tw': './assets/tw/combat_ui/QUIT.png'}) QUIT_Christmas = Button(area={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, color={'cn': (195, 139, 166), 'en': (207, 166, 185), 'jp': (195, 139, 166), 'tw': (195, 139, 166)}, button={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, file={'cn': './assets/cn/combat_ui/QUIT_Christmas.png', 'en': './assets/en/combat_ui/QUIT_Christmas.png', 'jp': './assets/cn/combat_ui/QUIT_Christmas.png', 'tw': './assets/cn/combat_ui/QUIT_Christmas.png'}) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index 5d4e60bdf..d8d31f710 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3340,14 +3340,6 @@ } }, "GemsFarming": { - "ChangeFlagship": { - "type": "select", - "value": "ship", - "option": [ - "ship", - "ship_equip" - ] - }, "CommonCV": { "type": "select", "value": "any", @@ -3364,8 +3356,7 @@ "value": "ship", "option": [ "disabled", - "ship", - "ship_equip" + "ship" ] }, "CommonDD": { @@ -3479,10 +3470,12 @@ "event_20250724_cn", "event_20250814_cn", "event_20250912_cn", - "event_20251023_cn" + "event_20251023_cn", + "event_20251218_cn" ], "display": "hide", "option_cn": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -3550,6 +3543,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -3621,6 +3615,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -3688,6 +3683,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20251023_cn", "event_20220428_cn", "event_20250227_cn", "event_20250912_cn", @@ -4139,272 +4135,6 @@ } } }, - "Coalition": { - "Scheduler": { - "Enable": { - "type": "checkbox", - "value": false, - "option": [ - true, - false - ] - }, - "NextRun": { - "type": "datetime", - "value": "2020-01-01 00:00:00", - "validate": "datetime" - }, - "Command": { - "type": "input", - "value": "Coalition", - "display": "hide" - }, - "SuccessInterval": { - "type": "input", - "value": 30, - "display": "hide" - }, - "FailureInterval": { - "type": "input", - "value": 30, - "display": "hide" - }, - "ServerUpdate": { - "type": "input", - "value": "00:00", - "display": "hide" - } - }, - "Campaign": { - "Name": { - "type": "input", - "value": "dynamic", - "display": "hide" - }, - "Event": { - "type": "state", - "value": "campaign_main", - "option": [ - "coalition_20230323", - "coalition_20240627", - "coalition_20250626", - "coalition_20251120" - ], - "option_cn": [ - "coalition_20251120", - "coalition_20250626", - "coalition_20230323", - "coalition_20240627" - ], - "option_en": [ - "coalition_20251120", - "coalition_20250626", - "coalition_20230323", - "coalition_20240627" - ], - "option_jp": [ - "coalition_20251120", - "coalition_20250626", - "coalition_20230323", - "coalition_20240627" - ], - "option_tw": [ - "coalition_20251120", - "coalition_20250626", - "coalition_20240627", - "coalition_20230323" - ] - }, - "Mode": { - "type": "select", - "value": "normal", - "option": [ - "normal", - "hard" - ], - "display": "hide" - }, - "UseClearMode": { - "type": "checkbox", - "value": true, - "display": "hide" - }, - "UseFleetLock": { - "type": "checkbox", - "value": true, - "display": "hide" - }, - "UseAutoSearch": { - "type": "checkbox", - "value": false, - "display": "hide" - }, - "Use2xBook": { - "type": "checkbox", - "value": false, - "display": "hide" - }, - "AmbushEvade": { - "type": "checkbox", - "value": true, - "display": "hide" - } - }, - "Coalition": { - "Mode": { - "type": "select", - "value": "area1-normal", - "option": [ - "area1-normal", - "area1-hard", - "area2-normal", - "area2-hard", - "area3-normal", - "area3-hard", - "area4-normal", - "area4-hard", - "area5-normal", - "area5-hard", - "area6-normal", - "area6-hard" - ] - }, - "Fleet": { - "type": "select", - "value": "single", - "option": [ - "single", - "multi" - ] - } - }, - "StopCondition": { - "OilLimit": { - "type": "input", - "value": 1000 - }, - "RunCount": { - "type": "input", - "value": 0 - }, - "MapAchievement": { - "type": "select", - "value": "non_stop", - "option": [ - "non_stop", - "100_percent_clear", - "map_3_stars", - "threat_safe", - "threat_safe_without_3_stars" - ], - "display": "hide" - }, - "StageIncrease": { - "type": "checkbox", - "value": false, - "display": "hide" - }, - "GetNewShip": { - "type": "checkbox", - "value": false, - "display": "hide" - }, - "ReachLevel": { - "type": "input", - "value": 0, - "display": "hide" - } - }, - "Emotion": { - "Mode": { - "type": "select", - "value": "calculate", - "option": [ - "calculate", - "ignore", - "calculate_ignore" - ] - }, - "Fleet1Value": { - "type": "input", - "value": 119 - }, - "Fleet1Record": { - "type": "datetime", - "value": "2020-01-01 00:00:00", - "validate": "datetime", - "display": "disabled" - }, - "Fleet1Control": { - "type": "select", - "value": "prevent_yellow_face", - "option": [ - "keep_exp_bonus", - "prevent_green_face", - "prevent_yellow_face", - "prevent_red_face" - ] - }, - "Fleet1Recover": { - "type": "select", - "value": "not_in_dormitory", - "option": [ - "not_in_dormitory", - "dormitory_floor_1", - "dormitory_floor_2" - ] - }, - "Fleet1Oath": { - "type": "checkbox", - "value": false - }, - "Fleet2Value": { - "type": "input", - "value": 119, - "display": "hide" - }, - "Fleet2Record": { - "type": "datetime", - "value": "2020-01-01 00:00:00", - "validate": "datetime", - "display": "hide" - }, - "Fleet2Control": { - "type": "select", - "value": "prevent_yellow_face", - "option": [ - "keep_exp_bonus", - "prevent_green_face", - "prevent_yellow_face", - "prevent_red_face" - ], - "display": "hide" - }, - "Fleet2Recover": { - "type": "select", - "value": "not_in_dormitory", - "option": [ - "not_in_dormitory", - "dormitory_floor_1", - "dormitory_floor_2" - ], - "display": "hide" - }, - "Fleet2Oath": { - "type": "checkbox", - "value": false, - "display": "hide" - } - }, - "Storage": { - "Storage": { - "type": "storage", - "value": {}, - "valuetype": "ignore", - "display": "disabled" - } - } - }, "Event": { "Scheduler": { "Enable": { @@ -4528,9 +4258,11 @@ "event_20250724_cn", "event_20250814_cn", "event_20250912_cn", - "event_20251023_cn" + "event_20251023_cn", + "event_20251218_cn" ], "option_cn": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -4598,6 +4330,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -4669,6 +4402,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -4736,6 +4470,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20251023_cn", "event_20220428_cn", "event_20250227_cn", "event_20250912_cn", @@ -5259,9 +4994,11 @@ "event_20250724_cn", "event_20250814_cn", "event_20250912_cn", - "event_20251023_cn" + "event_20251023_cn", + "event_20251218_cn" ], "option_cn": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -5329,6 +5066,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -5400,6 +5138,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -5467,6 +5206,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20251023_cn", "event_20220428_cn", "event_20250227_cn", "event_20250912_cn", @@ -5990,9 +5730,11 @@ "event_20250724_cn", "event_20250814_cn", "event_20250912_cn", - "event_20251023_cn" + "event_20251023_cn", + "event_20251218_cn" ], "option_cn": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -6060,6 +5802,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -6131,6 +5874,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -6198,6 +5942,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20251023_cn", "event_20220428_cn", "event_20250227_cn", "event_20250912_cn", @@ -6721,9 +6466,11 @@ "event_20250724_cn", "event_20250814_cn", "event_20250912_cn", - "event_20251023_cn" + "event_20251023_cn", + "event_20251218_cn" ], "option_cn": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -6791,6 +6538,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -6862,6 +6610,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -6929,6 +6678,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20251023_cn", "event_20220428_cn", "event_20250227_cn", "event_20250912_cn", @@ -7452,9 +7202,11 @@ "event_20250724_cn", "event_20250814_cn", "event_20250912_cn", - "event_20251023_cn" + "event_20251023_cn", + "event_20251218_cn" ], "option_cn": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -7522,6 +7274,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -7593,6 +7346,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -7660,6 +7414,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20251023_cn", "event_20220428_cn", "event_20250227_cn", "event_20250912_cn", @@ -8183,9 +7938,11 @@ "event_20250724_cn", "event_20250814_cn", "event_20250912_cn", - "event_20251023_cn" + "event_20251023_cn", + "event_20251218_cn" ], "option_cn": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -8253,6 +8010,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -8324,6 +8082,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -8391,6 +8150,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20251023_cn", "event_20220428_cn", "event_20250227_cn", "event_20250912_cn", @@ -9248,6 +9008,272 @@ } } }, + "Coalition": { + "Scheduler": { + "Enable": { + "type": "checkbox", + "value": false, + "option": [ + true, + false + ] + }, + "NextRun": { + "type": "datetime", + "value": "2020-01-01 00:00:00", + "validate": "datetime" + }, + "Command": { + "type": "input", + "value": "Coalition", + "display": "hide" + }, + "SuccessInterval": { + "type": "input", + "value": 30, + "display": "hide" + }, + "FailureInterval": { + "type": "input", + "value": 30, + "display": "hide" + }, + "ServerUpdate": { + "type": "input", + "value": "00:00", + "display": "hide" + } + }, + "Campaign": { + "Name": { + "type": "input", + "value": "dynamic", + "display": "hide" + }, + "Event": { + "type": "state", + "value": "campaign_main", + "option": [ + "coalition_20230323", + "coalition_20240627", + "coalition_20250626", + "coalition_20251120" + ], + "option_cn": [ + "coalition_20251120", + "coalition_20250626", + "coalition_20230323", + "coalition_20240627" + ], + "option_en": [ + "coalition_20251120", + "coalition_20250626", + "coalition_20230323", + "coalition_20240627" + ], + "option_jp": [ + "coalition_20251120", + "coalition_20250626", + "coalition_20230323", + "coalition_20240627" + ], + "option_tw": [ + "coalition_20251120", + "coalition_20250626", + "coalition_20240627", + "coalition_20230323" + ] + }, + "Mode": { + "type": "select", + "value": "normal", + "option": [ + "normal", + "hard" + ], + "display": "hide" + }, + "UseClearMode": { + "type": "checkbox", + "value": true, + "display": "hide" + }, + "UseFleetLock": { + "type": "checkbox", + "value": true, + "display": "hide" + }, + "UseAutoSearch": { + "type": "checkbox", + "value": false, + "display": "hide" + }, + "Use2xBook": { + "type": "checkbox", + "value": false, + "display": "hide" + }, + "AmbushEvade": { + "type": "checkbox", + "value": true, + "display": "hide" + } + }, + "Coalition": { + "Mode": { + "type": "select", + "value": "area1-normal", + "option": [ + "area1-normal", + "area1-hard", + "area2-normal", + "area2-hard", + "area3-normal", + "area3-hard", + "area4-normal", + "area4-hard", + "area5-normal", + "area5-hard", + "area6-normal", + "area6-hard" + ] + }, + "Fleet": { + "type": "select", + "value": "single", + "option": [ + "single", + "multi" + ] + } + }, + "StopCondition": { + "OilLimit": { + "type": "input", + "value": 1000 + }, + "RunCount": { + "type": "input", + "value": 0 + }, + "MapAchievement": { + "type": "select", + "value": "non_stop", + "option": [ + "non_stop", + "100_percent_clear", + "map_3_stars", + "threat_safe", + "threat_safe_without_3_stars" + ], + "display": "hide" + }, + "StageIncrease": { + "type": "checkbox", + "value": false, + "display": "hide" + }, + "GetNewShip": { + "type": "checkbox", + "value": false, + "display": "hide" + }, + "ReachLevel": { + "type": "input", + "value": 0, + "display": "hide" + } + }, + "Emotion": { + "Mode": { + "type": "select", + "value": "calculate", + "option": [ + "calculate", + "ignore", + "calculate_ignore" + ] + }, + "Fleet1Value": { + "type": "input", + "value": 119 + }, + "Fleet1Record": { + "type": "datetime", + "value": "2020-01-01 00:00:00", + "validate": "datetime", + "display": "disabled" + }, + "Fleet1Control": { + "type": "select", + "value": "prevent_yellow_face", + "option": [ + "keep_exp_bonus", + "prevent_green_face", + "prevent_yellow_face", + "prevent_red_face" + ] + }, + "Fleet1Recover": { + "type": "select", + "value": "not_in_dormitory", + "option": [ + "not_in_dormitory", + "dormitory_floor_1", + "dormitory_floor_2" + ] + }, + "Fleet1Oath": { + "type": "checkbox", + "value": false + }, + "Fleet2Value": { + "type": "input", + "value": 119, + "display": "hide" + }, + "Fleet2Record": { + "type": "datetime", + "value": "2020-01-01 00:00:00", + "validate": "datetime", + "display": "hide" + }, + "Fleet2Control": { + "type": "select", + "value": "prevent_yellow_face", + "option": [ + "keep_exp_bonus", + "prevent_green_face", + "prevent_yellow_face", + "prevent_red_face" + ], + "display": "hide" + }, + "Fleet2Recover": { + "type": "select", + "value": "not_in_dormitory", + "option": [ + "not_in_dormitory", + "dormitory_floor_1", + "dormitory_floor_2" + ], + "display": "hide" + }, + "Fleet2Oath": { + "type": "checkbox", + "value": false, + "display": "hide" + } + }, + "Storage": { + "Storage": { + "type": "storage", + "value": {}, + "valuetype": "ignore", + "display": "disabled" + } + } + }, "MaritimeEscort": { "Scheduler": { "Enable": { @@ -10100,9 +10126,11 @@ "event_20250724_cn", "event_20250814_cn", "event_20250912_cn", - "event_20251023_cn" + "event_20251023_cn", + "event_20251218_cn" ], "option_cn": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -10170,6 +10198,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -10241,6 +10270,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -10308,6 +10338,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20251023_cn", "event_20220428_cn", "event_20250227_cn", "event_20250912_cn", @@ -10848,9 +10879,11 @@ "event_20250724_cn", "event_20250814_cn", "event_20250912_cn", - "event_20251023_cn" + "event_20251023_cn", + "event_20251218_cn" ], "option_cn": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -10918,6 +10951,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -10989,6 +11023,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -11056,6 +11091,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20251023_cn", "event_20220428_cn", "event_20250227_cn", "event_20250912_cn", @@ -11596,9 +11632,11 @@ "event_20250724_cn", "event_20250814_cn", "event_20250912_cn", - "event_20251023_cn" + "event_20251023_cn", + "event_20251218_cn" ], "option_cn": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -11666,6 +11704,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -11737,6 +11776,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -11804,6 +11844,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20251023_cn", "event_20220428_cn", "event_20250227_cn", "event_20250912_cn", @@ -12344,9 +12385,11 @@ "event_20250724_cn", "event_20250814_cn", "event_20250912_cn", - "event_20251023_cn" + "event_20251023_cn", + "event_20251218_cn" ], "option_cn": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -12414,6 +12457,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -12485,6 +12529,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -12552,6 +12597,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20251023_cn", "event_20220428_cn", "event_20250227_cn", "event_20250912_cn", @@ -13082,9 +13128,11 @@ "event_20250724_cn", "event_20250814_cn", "event_20250912_cn", - "event_20251023_cn" + "event_20251023_cn", + "event_20251218_cn" ], "option_cn": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -13152,6 +13200,7 @@ "event_20200227_cn" ], "option_en": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -13223,6 +13272,7 @@ "event_20200227_cn" ], "option_jp": [ + "event_20251218_cn", "event_20230914_cn", "event_20230803_cn", "event_20251023_cn", @@ -13290,6 +13340,7 @@ "event_20200227_cn" ], "option_tw": [ + "event_20251023_cn", "event_20220428_cn", "event_20250227_cn", "event_20250912_cn", diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index f3b09112a..8cd7e133a 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -265,15 +265,12 @@ C124LargeLeveling: value: 3 option: [ 3, 4, 5 ] GemsFarming: - ChangeFlagship: - value: ship - option: [ ship, ship_equip ] CommonCV: value: any option: [ any, langley, bogue, ranger, hermes ] ChangeVanguard: value: ship - option: [ disabled, ship, ship_equip ] + option: [ disabled, ship ] CommonDD: value: any option: [ any, favourite, aulick_or_foote , cassin_or_downes, z20_or_z21 ] diff --git a/module/config/argument/menu.json b/module/config/argument/menu.json index cd5607142..2cf2cd49f 100644 --- a/module/config/argument/menu.json +++ b/module/config/argument/menu.json @@ -35,7 +35,6 @@ "page": "setting", "tasks": [ "EventGeneral", - "Coalition", "Event", "Event2", "Event3", @@ -44,6 +43,7 @@ "Event6", "Raid", "Hospital", + "Coalition", "MaritimeEscort", "EventShop", "WarArchives" diff --git a/module/config/argument/task.yaml b/module/config/argument/task.yaml index 653f6b602..c29122b15 100644 --- a/module/config/argument/task.yaml +++ b/module/config/argument/task.yaml @@ -123,12 +123,6 @@ Event: EventGeneral: - EventGeneral - TaskBalancer - Coalition: - - Scheduler - - Campaign - - Coalition - - StopCondition - - Emotion Event: - Scheduler - Campaign @@ -194,7 +188,12 @@ Event: - Hospital - StopCondition - Emotion - + Coalition: + - Scheduler + - Campaign + - Coalition + - StopCondition + - Emotion MaritimeEscort: - Scheduler - MaritimeEscort diff --git a/module/config/config_generated.py b/module/config/config_generated.py index ec45389b0..5bf83b07b 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -148,9 +148,8 @@ class GeneratedConfig: C124LargeLeveling_PickupAmmo = 3 # 3, 4, 5 # Group `GemsFarming` - GemsFarming_ChangeFlagship = 'ship' # ship, ship_equip GemsFarming_CommonCV = 'any' # any, langley, bogue, ranger, hermes - GemsFarming_ChangeVanguard = 'ship' # disabled, ship, ship_equip + GemsFarming_ChangeVanguard = 'ship' # disabled, ship GemsFarming_CommonDD = 'any' # any, favourite, aulick_or_foote, cassin_or_downes, z20_or_z21 GemsFarming_ALLowLowVanguardLevel = True GemsFarming_StopIFAutoNotEnsured = True diff --git a/module/config/full_config_generated.py b/module/config/full_config_generated.py index d4ee4acd5..4d99fefa6 100644 --- a/module/config/full_config_generated.py +++ b/module/config/full_config_generated.py @@ -535,7 +535,6 @@ class FullGeneratedConfig: GemsFarming_Scheduler_SuccessInterval = None GemsFarming_Scheduler_FailureInterval = None GemsFarming_Scheduler_ServerUpdate = None - GemsFarming_GemsFarming_ChangeFlagship = None GemsFarming_GemsFarming_CommonCV = None GemsFarming_GemsFarming_ChangeVanguard = None GemsFarming_GemsFarming_CommonDD = None @@ -585,42 +584,6 @@ class FullGeneratedConfig: EventGeneral_TaskBalancer_TaskCall = None EventGeneral_Storage_Storage = None - # Task `Coalition` - Coalition_Scheduler_Enable = None - Coalition_Scheduler_NextRun = None - Coalition_Scheduler_Command = None - Coalition_Scheduler_SuccessInterval = None - Coalition_Scheduler_FailureInterval = None - Coalition_Scheduler_ServerUpdate = None - Coalition_Campaign_Name = None - Coalition_Campaign_Event = None - Coalition_Campaign_Mode = None - Coalition_Campaign_UseClearMode = None - Coalition_Campaign_UseFleetLock = None - Coalition_Campaign_UseAutoSearch = None - Coalition_Campaign_Use2xBook = None - Coalition_Campaign_AmbushEvade = None - Coalition_Coalition_Mode = None - Coalition_Coalition_Fleet = None - Coalition_StopCondition_OilLimit = None - Coalition_StopCondition_RunCount = None - Coalition_StopCondition_MapAchievement = None - Coalition_StopCondition_StageIncrease = None - Coalition_StopCondition_GetNewShip = None - Coalition_StopCondition_ReachLevel = None - Coalition_Emotion_Mode = None - Coalition_Emotion_Fleet1Value = None - Coalition_Emotion_Fleet1Record = None - Coalition_Emotion_Fleet1Control = None - Coalition_Emotion_Fleet1Recover = None - Coalition_Emotion_Fleet1Oath = None - Coalition_Emotion_Fleet2Value = None - Coalition_Emotion_Fleet2Record = None - Coalition_Emotion_Fleet2Control = None - Coalition_Emotion_Fleet2Recover = None - Coalition_Emotion_Fleet2Oath = None - Coalition_Storage_Storage = None - # Task `Event` Event_Scheduler_Enable = None Event_Scheduler_NextRun = None @@ -1020,6 +983,42 @@ class FullGeneratedConfig: Hospital_Emotion_Fleet2Oath = None Hospital_Storage_Storage = None + # Task `Coalition` + Coalition_Scheduler_Enable = None + Coalition_Scheduler_NextRun = None + Coalition_Scheduler_Command = None + Coalition_Scheduler_SuccessInterval = None + Coalition_Scheduler_FailureInterval = None + Coalition_Scheduler_ServerUpdate = None + Coalition_Campaign_Name = None + Coalition_Campaign_Event = None + Coalition_Campaign_Mode = None + Coalition_Campaign_UseClearMode = None + Coalition_Campaign_UseFleetLock = None + Coalition_Campaign_UseAutoSearch = None + Coalition_Campaign_Use2xBook = None + Coalition_Campaign_AmbushEvade = None + Coalition_Coalition_Mode = None + Coalition_Coalition_Fleet = None + Coalition_StopCondition_OilLimit = None + Coalition_StopCondition_RunCount = None + Coalition_StopCondition_MapAchievement = None + Coalition_StopCondition_StageIncrease = None + Coalition_StopCondition_GetNewShip = None + Coalition_StopCondition_ReachLevel = None + Coalition_Emotion_Mode = None + Coalition_Emotion_Fleet1Value = None + Coalition_Emotion_Fleet1Record = None + Coalition_Emotion_Fleet1Control = None + Coalition_Emotion_Fleet1Recover = None + Coalition_Emotion_Fleet1Oath = None + Coalition_Emotion_Fleet2Value = None + Coalition_Emotion_Fleet2Record = None + Coalition_Emotion_Fleet2Control = None + Coalition_Emotion_Fleet2Recover = None + Coalition_Emotion_Fleet2Oath = None + Coalition_Storage_Storage = None + # Task `MaritimeEscort` MaritimeEscort_Scheduler_Enable = None MaritimeEscort_Scheduler_NextRun = None diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index af16d54ae..2b627f887 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -94,10 +94,6 @@ "name": "Event General", "help": "" }, - "Coalition": { - "name": "DATE A LANE", - "help": "" - }, "Event": { "name": "Event", "help": "" @@ -130,6 +126,10 @@ "name": "Valley Hospital", "help": "" }, + "Coalition": { + "name": "DATE A LANE", + "help": "" + }, "MaritimeEscort": { "name": "Maritime Escort", "help": "" @@ -815,6 +815,7 @@ "event_20250814_cn": "Secrets of the Abyss", "event_20250912_cn": "A Dance for Amahara Above", "event_20251023_cn": "Tempesta and Islas de Libertád", + "event_20251218_cn": "A Note Through the Firmament", "raid_20200624": "Air Raid Drills with Essex Rerun", "raid_20210708": "Cross Wave rerun", "raid_20220127": "Mystery Investigation", @@ -1232,12 +1233,6 @@ "name": "Commission Farming Settings", "help": "Warning: This task allows players to get a small amount of gems, but not an efficient way to farm.\nPlayers who have recently started Azur Lane are easily superstitious about 0LB and low oil consumption, while being ignorant about character leveling.\nRunning this function will only make you feel fulfilled however in reality your account will not actually progress very much.\nThe main purpose of this task is to get extra cubes for players with a formed lineup. Please rationally treat gems as a by-product.\n\nFleet 1 is expected to consist of 1 0LB CV/CVL and 1 0LB Vanguard, Fleet 2 is expected to consist of support ships such as New Jersey or Shinano to provide external battle assistance.\nFor information about the drop mechanism/rate of urgent commissions, you can refer to (in Chinese Simplified)" }, - "ChangeFlagship": { - "name": "Change Flagship", - "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" - }, "CommonCV": { "name": "Flagship Common CV/CVL Preference", "help": "", @@ -1251,8 +1246,7 @@ "name": "Change Vanguard", "help": "Change vanguard if 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 level 100(70) common vanguard from eagle or ironblood after current flagship has reached level 32+ (Only CN players'0 limit break ship can reach level 100)\n\nThe vanguard's equipment is replaced when being switched out by first recording the current setup. Only populated equipment slots will be replaced.", "disabled": "Don't Change", - "ship": "Change Ship", - "ship_equip": "Change Ship + Gears" + "ship": "Change Ship" }, "CommonDD": { "name": "Flagship Common DD Preference", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index 932578798..4b2dba3f8 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -94,10 +94,6 @@ "name": "イベント共通設定", "help": "" }, - "Coalition": { - "name": "ネオンシティの探索者", - "help": "" - }, "Event": { "name": "イベント海域", "help": "" @@ -130,6 +126,10 @@ "name": "病院探訪", "help": "" }, + "Coalition": { + "name": "ネオンシティの探索者", + "help": "" + }, "MaritimeEscort": { "name": "Maritime Escort", "help": "" @@ -815,6 +815,7 @@ "event_20250814_cn": "淵層界の秘密", "event_20250912_cn": "アマハラに舞い奉れ", "event_20251023_cn": "テンペスタと自由群島", + "event_20251218_cn": "天穹に響く音謡", "raid_20200624": "特別演習超空強襲波(復刻)", "raid_20210708": "交錯する新たな波 (復刻)", "raid_20220127": "秘密事件調査", @@ -1232,12 +1233,6 @@ "name": "GemsFarming._info.name", "help": "GemsFarming._info.help" }, - "ChangeFlagship": { - "name": "GemsFarming.ChangeFlagship.name", - "help": "GemsFarming.ChangeFlagship.help", - "ship": "ship", - "ship_equip": "ship_equip" - }, "CommonCV": { "name": "GemsFarming.CommonCV.name", "help": "GemsFarming.CommonCV.help", @@ -1251,8 +1246,7 @@ "name": "GemsFarming.ChangeVanguard.name", "help": "GemsFarming.ChangeVanguard.help", "disabled": "disabled", - "ship": "ship", - "ship_equip": "ship_equip" + "ship": "ship" }, "CommonDD": { "name": "GemsFarming.CommonDD.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 09a14262c..652ecfc74 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -94,10 +94,6 @@ "name": "活动通用设置", "help": "" }, - "Coalition": { - "name": "DATE A LANE", - "help": "" - }, "Event": { "name": "活动图-1", "help": "" @@ -130,6 +126,10 @@ "name": "深谷来信", "help": "" }, + "Coalition": { + "name": "DATE A LANE", + "help": "" + }, "MaritimeEscort": { "name": "商船护航", "help": "" @@ -815,6 +815,7 @@ "event_20250814_cn": "奇渊下的秘密", "event_20250912_cn": "起舞于天原之上", "event_20251023_cn": "飓风与自由群岛", + "event_20251218_cn": "响彻于天穹之音", "raid_20200624": "复刻特别演习埃塞克斯级", "raid_20210708": "复刻穿越彼方的水线", "raid_20220127": "演习神秘事件调查", @@ -1232,12 +1233,6 @@ "name": "刷紧急委托", "help": "警告: 这个功能可以让玩家获取少量的钻石,但不是一个能高效获取钻石的方法\n玩碧蓝航线不久的玩家, 很容易迷信零破和低耗等, 而忽视了角色养成\n运行这个功能只会让你自己感觉很充实, 而你的帐号实际零提升\n这个功能的主要用途,是让阵容成型的玩家获取额外的魔方,请理性地把钻石当作副产物\n\n这个功能将在旗舰32级之后更换旗舰\n关于紧急委托刷新机制, 可阅读 https://bbs.nga.cn/read.php?tid=27134956\n委托油耗比: A3 > A1 > 2-4 > 2-1, 有活动图时建议选活动图, 2-1会拣问号有更多物资\n一队会完成所有的战斗, 前排应当为百级零破驱逐带输出装, 后排应该为33级及以下白皮零破航母\n二队应提供跨队支援(跨队弹幕、跨队辅助)" }, - "ChangeFlagship": { - "name": "更换旗舰", - "help": "当旗舰等级>=32或红脸时更换旗舰\n寻找等级在1-31之间的白皮航母,同时会在退役时选择更换下来的旗舰。所有等级大于1级的白皮航母均会被视为退役目标,请务必锁定不是目标的船。换船时更换旗舰装备,这通过记录之前的装备完成。\n\n换装备只会更换正在装备中的栏位,即使是白装也会更换。如果指定了旗舰,则会更换全部5个装备,未指定旗舰只会更换设备。", - "ship": "更换舰船", - "ship_equip": "更换舰船 + 装备" - }, "CommonCV": { "name": "指定旗舰航母", "help": "", @@ -1251,8 +1246,7 @@ "name": "更换前排", "help": "当前排红脸时更换前排,选择不更换则会强制红脸出击\n换前排通过找一艘心情不低于10、等级100的白鹰或铁血的白皮驱逐完成,所以尽量保证有足够多的驱逐。国服以外则为等级70的白鹰白船驱逐。\n\n换装备只会更换正在装备中的栏位,即使是白装也会更换。前排会更换全部5个装备。", "disabled": "不更换", - "ship": "更换舰船", - "ship_equip": "更换舰船 + 装备" + "ship": "更换舰船" }, "CommonDD": { "name": "指定前排", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 26df9a319..784b42dd8 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -94,10 +94,6 @@ "name": "活動通用", "help": "" }, - "Coalition": { - "name": "極地風暴", - "help": "" - }, "Event": { "name": "活動圖", "help": "" @@ -130,6 +126,10 @@ "name": "深谷来信", "help": "" }, + "Coalition": { + "name": "極地風暴", + "help": "" + }, "MaritimeEscort": { "name": "商船護航", "help": "" @@ -814,7 +814,8 @@ "event_20250724_cn": "鍊金術士與天際交會之塔", "event_20250814_cn": "奇淵下的秘密", "event_20250912_cn": "起舞於天原之上", - "event_20251023_cn": "Tempesta and Islas de Libertád", + "event_20251023_cn": "颶風與自由群島", + "event_20251218_cn": "A Note Through the Firmament", "raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20210708": "復刻穿越彼方的水線", "raid_20220127": "演習神秘事件調查", @@ -1232,12 +1233,6 @@ "name": "刷緊急委託", "help": "警告:這個功能可以讓玩家獲取少量的鑽石,但不是一個能高效獲取鑽石的方法\n玩碧藍航線不久的玩家,很容易迷信零破和低耗等,而忽視了角色養成\n執行這個功能只會讓你自己感覺很充實,而你的帳號實際零提升\n這個功能的主要用途,是讓陣容成型的玩家獲取額外的魔方,請理性地把鑽石當作副產物\n\n這個功能將在旗艦32級之後更換旗艦\n關於緊急委託刷新機制,可閱讀 https://bbs.nga.cn/read.php?tid=27134956\n委託油耗比: A3 > A1 > 2-4 > 2-1,有活動圖時建議選活動圖,2-1會撿問號有更多物資\n一隊會完成所有的戰鬥,前排應當為百級零破驅逐帶輸出裝,後排應該為33級及以下白船零破航母\n二隊應提供跨隊支援(跨隊彈幕、跨隊輔助)" }, - "ChangeFlagship": { - "name": "更換旗艦", - "help": "當旗艦等級>=32或紅臉時更換旗艦\n尋找等級在1-31之間的白皮航母,同時會在退役時選擇更換下來的旗艦。所有等級大於1級的白船航母均會被視為退役目標,請務必鎖定不是目標的船。換船時更換旗艦裝備,這通過記錄之前的裝備完成。\n\n換裝備只會更換正在裝備中的欄位,即使是白裝也會更換。如果指定了旗艦,則會更換全部5個裝備,未指定旗艦隻會更換設備。", - "ship": "更換艦船", - "ship_equip": "更換艦船 + 裝備" - }, "CommonCV": { "name": "指定旗艦航母", "help": "", @@ -1251,8 +1246,7 @@ "name": "更換前排", "help": "當前排紅臉時更換前排,選擇不更換則會強制紅臉出擊\n換前排通過找一艘心情不低於10、等級70的白鷹或鐵血的白船驅逐完成,所以盡量保證有足夠多的驅逐。國服則為等級100的白鷹白船驅逐。\n\n換裝備只會更換正在裝備中的欄位,即使是白裝也會更換。前排會更換全部5個裝備。", "disabled": "不更换", - "ship": "更換艦船", - "ship_equip": "更換艦船 + 裝備" + "ship": "更換艦船" }, "CommonDD": { "name": "指定前排", diff --git a/module/device/method/nemu_ipc.py b/module/device/method/nemu_ipc.py index bd0ffc80c..556255f32 100644 --- a/module/device/method/nemu_ipc.py +++ b/module/device/method/nemu_ipc.py @@ -273,6 +273,10 @@ class NemuIpcImpl: self.connect_id = connect_id # logger.info(f'NemuIpc connected: {self.connect_id}') + @retry + def connect_with_retry(self, on_thread=True): + self.connect(on_thread=on_thread) + def disconnect(self): if self.connect_id == 0: return @@ -497,11 +501,13 @@ class NemuIpc(Platform): logger.info(f'nemu_ipc is not available on MuMuPlayerGlobal, {self.emulator_instance.path}') raise RequestHumanTakeover try: - return NemuIpcImpl( + impl = NemuIpcImpl( nemu_folder=self.emulator_instance.emulator.abspath('../'), instance_id=self.emulator_instance.MuMuPlayer12_id, display_id=0 - ).__enter__() + ) + impl.connect_with_retry() + return impl except (NemuIpcIncompatible, NemuIpcError, JobTimeout) as e: logger.error(e) logger.error('Unable to initialize NemuIpc') diff --git a/module/exercise/hp_daemon.py b/module/exercise/hp_daemon.py index eff6288d1..7dbe30bd9 100644 --- a/module/exercise/hp_daemon.py +++ b/module/exercise/hp_daemon.py @@ -74,6 +74,7 @@ class HpDaemon(ModuleBase): PAUSE_Seaside, PAUSE_Star, PAUSE_Ninja, + PAUSE_ShadowPuppetry ]: 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/freebies/battle_pass.py b/module/freebies/battle_pass.py index 75dadff99..48950956e 100644 --- a/module/freebies/battle_pass.py +++ b/module/freebies/battle_pass.py @@ -83,7 +83,7 @@ class BattlePass(Combat, UI): if self.handle_battle_pass_popup(): confirm_timer.reset() continue - if self.config.SERVER == 'cn': + if self.config.SERVER in ['cn', 'jp', 'en']: if self.appear_then_click(POPUP_CONFIRM_WHITE_BATTLEPASS, offset=(20, 20), interval=3): confirm_timer.reset() continue diff --git a/module/map/assets.py b/module/map/assets.py index f74f86bee..2b2713fdf 100644 --- a/module/map/assets.py +++ b/module/map/assets.py @@ -7,13 +7,13 @@ from module.base.template import Template FLEET_1_ADVICE = Button(area={'cn': (1030, 207, 1074, 227), 'en': (1002, 216, 1064, 228), 'jp': (1030, 207, 1074, 228), 'tw': (1029, 206, 1074, 228)}, color={'cn': (243, 222, 179), 'en': (213, 179, 124), 'jp': (243, 222, 179), 'tw': (239, 214, 167)}, button={'cn': (1030, 207, 1074, 227), 'en': (1002, 216, 1064, 228), 'jp': (1030, 207, 1074, 228), 'tw': (1029, 206, 1074, 228)}, file={'cn': './assets/cn/map/FLEET_1_ADVICE.png', 'en': './assets/en/map/FLEET_1_ADVICE.png', 'jp': './assets/jp/map/FLEET_1_ADVICE.png', 'tw': './assets/tw/map/FLEET_1_ADVICE.png'}) FLEET_1_BAR = Button(area={'cn': (1012, 269, 1183, 515), 'en': (993, 270, 1164, 515), 'jp': (1012, 269, 1183, 515), 'tw': (1012, 268, 1183, 515)}, color={'cn': (177, 170, 154), 'en': (169, 168, 169), 'jp': (177, 170, 154), 'tw': (177, 168, 154)}, button={'cn': (1012, 269, 1183, 515), 'en': (993, 270, 1164, 515), 'jp': (1012, 269, 1183, 515), 'tw': (1012, 268, 1183, 515)}, file={'cn': './assets/cn/map/FLEET_1_BAR.png', 'en': './assets/en/map/FLEET_1_BAR.png', 'jp': './assets/jp/map/FLEET_1_BAR.png', 'tw': './assets/tw/map/FLEET_1_BAR.png'}) FLEET_1_CHOOSE = Button(area={'cn': (1021, 192, 1083, 251), 'en': (1003, 193, 1063, 251), 'jp': (1022, 192, 1083, 251), 'tw': (1019, 190, 1085, 251)}, color={'cn': (201, 162, 104), 'en': (192, 145, 84), 'jp': (201, 161, 102), 'tw': (198, 157, 100)}, button={'cn': (1021, 192, 1083, 251), 'en': (1003, 193, 1063, 251), 'jp': (1022, 192, 1083, 251), 'tw': (1019, 190, 1085, 251)}, file={'cn': './assets/cn/map/FLEET_1_CHOOSE.png', 'en': './assets/en/map/FLEET_1_CHOOSE.png', 'jp': './assets/jp/map/FLEET_1_CHOOSE.png', 'tw': './assets/tw/map/FLEET_1_CHOOSE.png'}) -FLEET_1_CLEAR = Button(area={'cn': (1107, 192, 1170, 251), 'en': (1089, 193, 1150, 251), 'jp': (1111, 192, 1166, 251), 'tw': (1106, 190, 1172, 250)}, color={'cn': (154, 158, 158), 'en': (141, 141, 143), 'jp': (152, 154, 155), 'tw': (154, 154, 154)}, button={'cn': (1107, 192, 1170, 251), 'en': (1089, 193, 1150, 251), 'jp': (1111, 192, 1166, 251), 'tw': (1106, 190, 1172, 250)}, file={'cn': './assets/cn/map/FLEET_1_CLEAR.png', 'en': './assets/en/map/FLEET_1_CLEAR.png', 'jp': './assets/jp/map/FLEET_1_CLEAR.png', 'tw': './assets/tw/map/FLEET_1_CLEAR.png'}) +FLEET_1_CLEAR = Button(area={'cn': (1117, 207, 1162, 228), 'en': (1093, 215, 1147, 230), 'jp': (1114, 207, 1165, 228), 'tw': (1117, 206, 1162, 228)}, color={'cn': (204, 205, 205), 'en': (165, 165, 167), 'jp': (179, 181, 180), 'tw': (193, 192, 193)}, button={'cn': (1117, 207, 1162, 228), 'en': (1093, 215, 1147, 230), 'jp': (1114, 207, 1165, 228), 'tw': (1117, 206, 1162, 228)}, file={'cn': './assets/cn/map/FLEET_1_CLEAR.png', 'en': './assets/en/map/FLEET_1_CLEAR.png', 'jp': './assets/jp/map/FLEET_1_CLEAR.png', 'tw': './assets/tw/map/FLEET_1_CLEAR.png'}) FLEET_1_HARD_SATIESFIED = Button(area={'cn': (211, 142, 364, 186), 'en': (188, 154, 338, 178), 'jp': (211, 142, 364, 186), 'tw': (224, 153, 325, 177)}, color={'cn': (61, 42, 37), 'en': (88, 75, 62), 'jp': (61, 42, 37), 'tw': (95, 79, 61)}, button={'cn': (211, 142, 364, 186), 'en': (188, 154, 338, 178), 'jp': (211, 142, 364, 186), 'tw': (224, 153, 325, 177)}, file={'cn': './assets/cn/map/FLEET_1_HARD_SATIESFIED.png', 'en': './assets/en/map/FLEET_1_HARD_SATIESFIED.png', 'jp': './assets/jp/map/FLEET_1_HARD_SATIESFIED.png', 'tw': './assets/tw/map/FLEET_1_HARD_SATIESFIED.png'}) FLEET_1_IN_USE = Button(area={'cn': (391, 177, 474, 260), 'en': (373, 179, 453, 260), 'jp': (391, 177, 474, 260), 'tw': (391, 177, 475, 260)}, color={'cn': (198, 188, 179), 'en': (198, 151, 161), 'jp': (198, 188, 179), 'tw': (113, 107, 122)}, button={'cn': (391, 177, 474, 260), 'en': (373, 179, 453, 260), 'jp': (391, 177, 474, 260), 'tw': (391, 177, 475, 260)}, file={'cn': './assets/cn/map/FLEET_1_IN_USE.png', 'en': './assets/en/map/FLEET_1_IN_USE.png', 'jp': './assets/jp/map/FLEET_1_IN_USE.png', 'tw': './assets/tw/map/FLEET_1_IN_USE.png'}) FLEET_2_ADVICE = Button(area={'cn': (1030, 321, 1074, 341), 'en': (1010, 330, 1071, 342), 'jp': (1030, 321, 1074, 342), 'tw': (1029, 320, 1074, 342)}, color={'cn': (243, 222, 179), 'en': (223, 188, 131), 'jp': (243, 222, 179), 'tw': (239, 213, 168)}, button={'cn': (1030, 321, 1074, 341), 'en': (1010, 330, 1071, 342), 'jp': (1030, 321, 1074, 342), 'tw': (1029, 320, 1074, 342)}, file={'cn': './assets/cn/map/FLEET_2_ADVICE.png', 'en': './assets/en/map/FLEET_2_ADVICE.png', 'jp': './assets/jp/map/FLEET_2_ADVICE.png', 'tw': './assets/tw/map/FLEET_2_ADVICE.png'}) FLEET_2_BAR = Button(area={'cn': (1012, 383, 1183, 628), 'en': (994, 384, 1165, 629), 'jp': (1012, 383, 1183, 628), 'tw': (1013, 383, 1184, 629)}, color={'cn': (177, 169, 153), 'en': (169, 167, 168), 'jp': (177, 169, 153), 'tw': (177, 168, 152)}, button={'cn': (1012, 383, 1183, 628), 'en': (994, 384, 1165, 629), 'jp': (1012, 383, 1183, 628), 'tw': (1013, 383, 1184, 629)}, file={'cn': './assets/cn/map/FLEET_2_BAR.png', 'en': './assets/en/map/FLEET_2_BAR.png', 'jp': './assets/jp/map/FLEET_2_BAR.png', 'tw': './assets/tw/map/FLEET_2_BAR.png'}) FLEET_2_CHOOSE = Button(area={'cn': (1022, 306, 1083, 365), 'en': (1003, 307, 1063, 365), 'jp': (1021, 306, 1082, 365), 'tw': (1019, 304, 1084, 365)}, color={'cn': (202, 163, 104), 'en': (191, 144, 84), 'jp': (201, 161, 102), 'tw': (198, 157, 101)}, button={'cn': (1022, 306, 1083, 365), 'en': (1003, 307, 1063, 365), 'jp': (1021, 306, 1082, 365), 'tw': (1019, 304, 1084, 365)}, file={'cn': './assets/cn/map/FLEET_2_CHOOSE.png', 'en': './assets/en/map/FLEET_2_CHOOSE.png', 'jp': './assets/jp/map/FLEET_2_CHOOSE.png', 'tw': './assets/tw/map/FLEET_2_CHOOSE.png'}) -FLEET_2_CLEAR = Button(area={'cn': (1109, 306, 1169, 365), 'en': (1092, 307, 1152, 365), 'jp': (1113, 306, 1169, 365), 'tw': (1109, 303, 1175, 365)}, color={'cn': (155, 158, 159), 'en': (140, 141, 143), 'jp': (151, 153, 154), 'tw': (151, 152, 154)}, button={'cn': (1109, 306, 1169, 365), 'en': (1092, 307, 1152, 365), 'jp': (1113, 306, 1169, 365), 'tw': (1109, 303, 1175, 365)}, file={'cn': './assets/cn/map/FLEET_2_CLEAR.png', 'en': './assets/en/map/FLEET_2_CLEAR.png', 'jp': './assets/jp/map/FLEET_2_CLEAR.png', 'tw': './assets/tw/map/FLEET_2_CLEAR.png'}) +FLEET_2_CLEAR = Button(area={'cn': (1117, 321, 1162, 341), 'en': (1095, 329, 1149, 344), 'jp': (1117, 321, 1167, 342), 'tw': (1120, 321, 1164, 341)}, color={'cn': (205, 206, 205), 'en': (165, 165, 166), 'jp': (180, 181, 181), 'tw': (206, 205, 206)}, button={'cn': (1117, 321, 1162, 341), 'en': (1095, 329, 1149, 344), 'jp': (1117, 321, 1167, 342), 'tw': (1120, 321, 1164, 341)}, file={'cn': './assets/cn/map/FLEET_2_CLEAR.png', 'en': './assets/en/map/FLEET_2_CLEAR.png', 'jp': './assets/jp/map/FLEET_2_CLEAR.png', 'tw': './assets/tw/map/FLEET_2_CLEAR.png'}) FLEET_2_HARD_SATIESFIED = Button(area={'cn': (208, 372, 361, 401), 'en': (188, 378, 328, 402), 'jp': (208, 372, 361, 401), 'tw': (215, 377, 306, 400)}, color={'cn': (75, 54, 43), 'en': (97, 88, 78), 'jp': (75, 54, 43), 'tw': (83, 68, 48)}, button={'cn': (208, 372, 361, 401), 'en': (188, 378, 328, 402), 'jp': (208, 372, 361, 401), 'tw': (215, 377, 306, 400)}, file={'cn': './assets/cn/map/FLEET_2_HARD_SATIESFIED.png', 'en': './assets/en/map/FLEET_2_HARD_SATIESFIED.png', 'jp': './assets/jp/map/FLEET_2_HARD_SATIESFIED.png', 'tw': './assets/tw/map/FLEET_2_HARD_SATIESFIED.png'}) FLEET_2_IN_USE = Button(area={'cn': (391, 351, 475, 374), 'en': (374, 352, 453, 373), 'jp': (391, 351, 475, 374), 'tw': (391, 351, 475, 374)}, color={'cn': (182, 165, 200), 'en': (151, 152, 162), 'jp': (182, 165, 200), 'tw': (182, 165, 200)}, button={'cn': (391, 351, 475, 374), 'en': (374, 352, 453, 373), 'jp': (391, 351, 475, 374), 'tw': (391, 351, 475, 374)}, file={'cn': './assets/cn/map/FLEET_2_IN_USE.png', 'en': './assets/en/map/FLEET_2_IN_USE.png', 'jp': './assets/cn/map/FLEET_2_IN_USE.png', 'tw': './assets/cn/map/FLEET_2_IN_USE.png'}) FLEET_2_IN_USE_W15 = Button(area={'cn': (390, 290, 475, 319), 'en': (371, 290, 456, 319), 'jp': (390, 290, 475, 319), 'tw': (390, 290, 475, 319)}, color={'cn': (128, 131, 147), 'en': (128, 131, 147), 'jp': (128, 131, 147), 'tw': (128, 131, 147)}, button={'cn': (390, 290, 475, 319), 'en': (371, 290, 456, 319), 'jp': (390, 290, 475, 319), 'tw': (390, 290, 475, 319)}, file={'cn': './assets/cn/map/FLEET_2_IN_USE_W15.png', 'en': './assets/en/map/FLEET_2_IN_USE_W15.png', 'jp': './assets/cn/map/FLEET_2_IN_USE_W15.png', 'tw': './assets/cn/map/FLEET_2_IN_USE_W15.png'}) @@ -36,7 +36,7 @@ MAP_PREPARATION_CANCEL = Button(area={'cn': (234, 12, 278, 47), 'en': (234, 12, SUBMARINE_ADVICE = Button(area={'cn': (1030, 457, 1074, 477), 'en': (1002, 466, 1064, 478), 'jp': (1030, 457, 1074, 478), 'tw': (1035, 462, 1080, 484)}, color={'cn': (243, 222, 179), 'en': (222, 186, 129), 'jp': (243, 222, 179), 'tw': (240, 214, 168)}, button={'cn': (1030, 457, 1074, 477), 'en': (1002, 466, 1064, 478), 'jp': (1030, 457, 1074, 478), 'tw': (1035, 462, 1080, 484)}, file={'cn': './assets/cn/map/SUBMARINE_ADVICE.png', 'en': './assets/en/map/SUBMARINE_ADVICE.png', 'jp': './assets/jp/map/SUBMARINE_ADVICE.png', 'tw': './assets/tw/map/SUBMARINE_ADVICE.png'}) SUBMARINE_BAR = Button(area={'cn': (1012, 519, 1183, 597), 'en': (994, 520, 1165, 597), 'jp': (1013, 519, 1184, 597), 'tw': (1013, 518, 1184, 597)}, color={'cn': (200, 184, 147), 'en': (170, 175, 190), 'jp': (200, 184, 147), 'tw': (196, 180, 145)}, button={'cn': (1012, 519, 1183, 597), 'en': (994, 520, 1165, 597), 'jp': (1013, 519, 1184, 597), 'tw': (1013, 518, 1184, 597)}, file={'cn': './assets/cn/map/SUBMARINE_BAR.png', 'en': './assets/en/map/SUBMARINE_BAR.png', 'jp': './assets/jp/map/SUBMARINE_BAR.png', 'tw': './assets/tw/map/SUBMARINE_BAR.png'}) SUBMARINE_CHOOSE = Button(area={'cn': (1022, 443, 1082, 501), 'en': (1003, 443, 1063, 501), 'jp': (1021, 443, 1082, 501), 'tw': (1019, 440, 1084, 501)}, color={'cn': (202, 162, 104), 'en': (190, 143, 82), 'jp': (209, 167, 106), 'tw': (198, 156, 100)}, button={'cn': (1022, 443, 1082, 501), 'en': (1003, 443, 1063, 501), 'jp': (1021, 443, 1082, 501), 'tw': (1019, 440, 1084, 501)}, file={'cn': './assets/cn/map/SUBMARINE_CHOOSE.png', 'en': './assets/en/map/SUBMARINE_CHOOSE.png', 'jp': './assets/jp/map/SUBMARINE_CHOOSE.png', 'tw': './assets/tw/map/SUBMARINE_CHOOSE.png'}) -SUBMARINE_CLEAR = Button(area={'cn': (1109, 443, 1169, 501), 'en': (1093, 443, 1153, 501), 'jp': (1113, 442, 1169, 501), 'tw': (1109, 440, 1175, 501)}, color={'cn': (156, 158, 159), 'en': (139, 140, 143), 'jp': (151, 153, 154), 'tw': (152, 152, 155)}, button={'cn': (1109, 443, 1169, 501), 'en': (1093, 443, 1153, 501), 'jp': (1113, 442, 1169, 501), 'tw': (1109, 440, 1175, 501)}, file={'cn': './assets/cn/map/SUBMARINE_CLEAR.png', 'en': './assets/en/map/SUBMARINE_CLEAR.png', 'jp': './assets/jp/map/SUBMARINE_CLEAR.png', 'tw': './assets/tw/map/SUBMARINE_CLEAR.png'}) +SUBMARINE_CLEAR = Button(area={'cn': (1117, 457, 1162, 478), 'en': (1095, 465, 1149, 480), 'jp': (1117, 457, 1167, 478), 'tw': (1120, 457, 1164, 478)}, color={'cn': (204, 205, 204), 'en': (164, 164, 166), 'jp': (180, 181, 181), 'tw': (204, 204, 205)}, button={'cn': (1117, 457, 1162, 478), 'en': (1095, 465, 1149, 480), 'jp': (1117, 457, 1167, 478), 'tw': (1120, 457, 1164, 478)}, file={'cn': './assets/cn/map/SUBMARINE_CLEAR.png', 'en': './assets/en/map/SUBMARINE_CLEAR.png', 'jp': './assets/jp/map/SUBMARINE_CLEAR.png', 'tw': './assets/tw/map/SUBMARINE_CLEAR.png'}) SUBMARINE_HARD_SATIESFIED = Button(area={'cn': (211, 514, 375, 539), 'en': (189, 517, 339, 541), 'jp': (211, 514, 375, 539), 'tw': (217, 511, 309, 536)}, color={'cn': (59, 57, 58), 'en': (68, 69, 66), 'jp': (59, 57, 58), 'tw': (99, 95, 90)}, button={'cn': (211, 514, 375, 539), 'en': (189, 517, 339, 541), 'jp': (211, 514, 375, 539), 'tw': (217, 511, 309, 536)}, file={'cn': './assets/cn/map/SUBMARINE_HARD_SATIESFIED.png', 'en': './assets/en/map/SUBMARINE_HARD_SATIESFIED.png', 'jp': './assets/jp/map/SUBMARINE_HARD_SATIESFIED.png', 'tw': './assets/tw/map/SUBMARINE_HARD_SATIESFIED.png'}) SUBMARINE_IN_USE = Button(area={'cn': (454, 427, 537, 510), 'en': (436, 429, 517, 510), 'jp': (454, 427, 537, 510), 'tw': (454, 427, 538, 510)}, color={'cn': (99, 98, 116), 'en': (183, 170, 163), 'jp': (99, 98, 116), 'tw': (129, 116, 105)}, button={'cn': (454, 427, 537, 510), 'en': (436, 429, 517, 510), 'jp': (454, 427, 537, 510), 'tw': (454, 427, 538, 510)}, file={'cn': './assets/cn/map/SUBMARINE_IN_USE.png', 'en': './assets/en/map/SUBMARINE_IN_USE.png', 'jp': './assets/jp/map/SUBMARINE_IN_USE.png', 'tw': './assets/tw/map/SUBMARINE_IN_USE.png'}) SWITCH_OVER = Button(area={'cn': (947, 654, 1118, 706), 'en': (945, 647, 1119, 702), 'jp': (946, 653, 1119, 707), 'tw': (947, 654, 1118, 706)}, color={'cn': (144, 158, 198), 'en': (139, 154, 194), 'jp': (142, 156, 195), 'tw': (145, 159, 197)}, button={'cn': (947, 654, 1118, 706), 'en': (945, 647, 1119, 702), 'jp': (946, 653, 1119, 707), 'tw': (947, 654, 1118, 706)}, file={'cn': './assets/cn/map/SWITCH_OVER.png', 'en': './assets/en/map/SWITCH_OVER.png', 'jp': './assets/jp/map/SWITCH_OVER.png', 'tw': './assets/tw/map/SWITCH_OVER.png'}) diff --git a/module/map/map_fleet_preparation.py b/module/map/map_fleet_preparation.py index 1dd7efafb..1edb78787 100644 --- a/module/map/map_fleet_preparation.py +++ b/module/map/map_fleet_preparation.py @@ -354,6 +354,8 @@ class FleetPreparation(InfoHandler): pass else: submarine.clear() + else: + self.config.SUBMARINE = 0 return False # Submarine. @@ -363,9 +365,23 @@ class FleetPreparation(InfoHandler): logger.attr('map_allow_submarine', map_allow_submarine) if map_allow_submarine: if self.config.Submarine_Fleet: + if fleet_2.allow(): + self.device.click(fleet_2._clear) + # no need to take new screenshot, because submarine check does not need the fleet 2 part submarine.ensure_to_be(self.config.Submarine_Fleet) else: - submarine.clear() + # clear submarine and fleet2 together using simple click + # this is faster because no need to wait clicking animation to disappear + # click success can be guaranteed by later calls of clear() + op = False + if fleet_2.allow(): + self.device.click(fleet_2._clear) + op = True + if submarine.allow(): + self.device.click(submarine._clear) + op = True + if op: + self.device.screenshot() # No need, this may clear FLEET_2 by mistake, clear FLEET_2 in map config. # if not fleet_2.allow(): diff --git a/module/os/fleet.py b/module/os/fleet.py index b4ed2fe63..03e61a8fd 100644 --- a/module/os/fleet.py +++ b/module/os/fleet.py @@ -287,7 +287,7 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh): result = set() # Record story history to clear click record clicked_story = False - + stuck_timer = Timer(20, count=5).start() confirm_timer.reset() while 1: if skip_first_screenshot: @@ -299,6 +299,7 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh): event = self.handle_map_event(drop=drop) if event: confirm_timer.reset() + stuck_timer.reset() result.add('event') if event == 'story_skip': clicked_story = True @@ -314,6 +315,7 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh): continue if self.handle_retirement(): confirm_timer.reset() + stuck_timer.reset() continue if self.handle_walk_out_of_step(): if walk_out_of_step: @@ -323,27 +325,33 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh): if self.handle_popup_confirm('WALK_UNTIL_STABLE'): # Confirm to submit items, in siren scanning devices confirm_timer.reset() + stuck_timer.reset() continue # Accident click if self.is_in_globe(): self.os_globe_goto_map() confirm_timer.reset() + stuck_timer.reset() continue if self.is_in_storage(): self.storage_quit() confirm_timer.reset() + stuck_timer.reset() continue if self.is_in_os_mission(): self.os_mission_quit() confirm_timer.reset() + stuck_timer.reset() continue if self.handle_os_game_tips(): confirm_timer.reset() + stuck_timer.reset() continue if self.is_in_map_order(): self.order_quit() confirm_timer.reset() + stuck_timer.reset() continue # Combat @@ -352,6 +360,7 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh): # self.ui_back(check_button=self.is_in_map) self.combat(expected_end=self.is_in_map, fleet_index=self.fleet_show_index, save_get_items=drop) confirm_timer.reset() + stuck_timer.reset() result.add('event') continue @@ -360,18 +369,21 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh): self.interval_clear(PORT_SUPPLY_CHECK) self.handle_akashi_supply_buy(CLICK_SAFE_AREA) confirm_timer.reset() + stuck_timer.reset() result.add('akashi') continue # A game bug that AUTO_SEARCH_REWARD from the last cleared zone popups if self.appear_then_click(AUTO_SEARCH_REWARD, offset=(50, 50), interval=3): confirm_timer.reset() + stuck_timer.reset() continue # Enemy searching if not enemy_searching_appear and self.enemy_searching_appear(): enemy_searching_appear = True confirm_timer.reset() + stuck_timer.reset() continue else: if enemy_searching_appear: @@ -380,6 +392,7 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh): logger.info('Enemy searching appeared.') enemy_searching_appear = False confirm_timer.reset() + stuck_timer.reset() result.add('search') if self.is_in_map(): self.enemy_searching_color_initial() @@ -396,16 +409,34 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh): if confirm_timer.reached(): break else: + if stuck_timer.reached(): + logger.warning(f"homo_loca stuck at current view, try reset.") + if self.fleet_reset_view(): + stuck_timer.reset() confirm_timer.reset() record = current else: confirm_timer.reset() + stuck_timer.reset() result = '_'.join(result) logger.info(f'Walk stabled, result: {result}') self.device.screenshot_interval_set() return result + def fleet_reset_view(self): + """ + Returns: + bool: If reset + """ + current_fleet = self.fleet_selector.get() + if not current_fleet: + logger.warning('Failed to get OpSi fleet') + return False + self.fleet_selector.open() + self.fleet_selector.click(current_fleet) + return True + def port_goto(self, allow_port_arrive=True): """ A simple and poor implement to goto port. Searching port on radar. @@ -569,6 +600,12 @@ class OSFleet(OSCamera, Combat, Fleet, OSAsh): self.predict() self.predict_radar() + fleets = self.view.select(is_current_fleet=True) + if fleets.count == 0: + logger.warning('Current fleet not found on local view, reset camera view to current fleet.') + if self.fleet_reset_view(): + self.wait_until_camera_stable() + continue # Calculate destination grids = self.radar.select(is_question=True) if grids: diff --git a/module/os_shop/shop.py b/module/os_shop/shop.py index 5f08eb921..b97f0c0d1 100644 --- a/module/os_shop/shop.py +++ b/module/os_shop/shop.py @@ -268,9 +268,9 @@ class OSShop(PortShop, AkashiShop): @cached_property def yellow_coins_preserve(self): if self.is_cl1_enabled: - return self.config.OS_CL1_YELLOW_COINS_PRESERVE + return 100000 else: - return self.config.OS_NORMAL_YELLOW_COINS_PRESERVE + return 35000 def get_currency_coins(self, item): if item.cost == 'YellowCoins': diff --git a/module/research/selector.py b/module/research/selector.py index 1aebedbd9..0e94dc36d 100644 --- a/module/research/selector.py +++ b/module/research/selector.py @@ -239,7 +239,7 @@ class ResearchSelector(ResearchUI): # 2022.08.23 Allow all E-2, disassemble equipment is now supported # Ignore E-2 if don't have any boxes in storage to disassemble, # Or will enter a loop of starting research, trying to disassemble, cancel research - if not self.storage_has_boxes or self.config.SERVER in ['tw']: + if not self.storage_has_boxes: if self.config.SERVER == 'jp': if project.genre.upper() == 'E' and str(project.duration) != '6': return False diff --git a/module/storage/assets.py b/module/storage/assets.py index 9b60c9b23..895608587 100644 --- a/module/storage/assets.py +++ b/module/storage/assets.py @@ -11,11 +11,11 @@ DISASSEMBLE = Button(area={'cn': (357, 666, 456, 690), 'en': (346, 668, 467, 684 DISASSEMBLE_CANCEL = Button(area={'cn': (900, 659, 973, 690), 'en': (881, 659, 993, 684), 'jp': (899, 658, 971, 691), 'tw': (900, 659, 973, 690)}, color={'cn': (186, 186, 187), 'en': (192, 192, 193), 'jp': (167, 167, 168), 'tw': (186, 186, 187)}, button={'cn': (863, 649, 1015, 700), 'en': (854, 649, 1021, 699), 'jp': (860, 647, 1021, 704), 'tw': (863, 649, 1015, 700)}, file={'cn': './assets/cn/storage/DISASSEMBLE_CANCEL.png', 'en': './assets/en/storage/DISASSEMBLE_CANCEL.png', 'jp': './assets/jp/storage/DISASSEMBLE_CANCEL.png', 'tw': './assets/cn/storage/DISASSEMBLE_CANCEL.png'}) DISASSEMBLE_CONFIRM = Button(area={'cn': (1108, 657, 1183, 690), 'en': (1063, 658, 1230, 681), 'jp': (1108, 657, 1185, 691), 'tw': (1108, 657, 1183, 690)}, color={'cn': (202, 149, 143), 'en': (204, 152, 145), 'jp': (198, 134, 126), 'tw': (202, 149, 143)}, button={'cn': (1067, 650, 1225, 698), 'en': (1063, 651, 1230, 697), 'jp': (1070, 645, 1230, 704), 'tw': (1067, 650, 1225, 698)}, file={'cn': './assets/cn/storage/DISASSEMBLE_CONFIRM.png', 'en': './assets/en/storage/DISASSEMBLE_CONFIRM.png', 'jp': './assets/jp/storage/DISASSEMBLE_CONFIRM.png', 'tw': './assets/cn/storage/DISASSEMBLE_CONFIRM.png'}) DISASSEMBLE_COUNT_OCR = Button(area={'cn': (612, 662, 687, 695), 'en': (625, 664, 685, 694), 'jp': (612, 662, 687, 695), 'tw': (612, 662, 687, 695)}, color={'cn': (60, 63, 81), 'en': (72, 74, 85), 'jp': (60, 63, 81), 'tw': (60, 63, 81)}, button={'cn': (612, 662, 687, 695), 'en': (625, 664, 685, 694), 'jp': (612, 662, 687, 695), 'tw': (612, 662, 687, 695)}, file={'cn': './assets/cn/storage/DISASSEMBLE_COUNT_OCR.png', 'en': './assets/en/storage/DISASSEMBLE_COUNT_OCR.png', 'jp': './assets/jp/storage/DISASSEMBLE_COUNT_OCR.png', 'tw': './assets/tw/storage/DISASSEMBLE_COUNT_OCR.png'}) -DISASSEMBLE_POPUP_CONFIRM = Button(area={'cn': (746, 564, 815, 594), 'en': (717, 568, 841, 590), 'jp': (743, 564, 818, 596), 'tw': (746, 565, 814, 594)}, color={'cn': (148, 179, 219), 'en': (160, 187, 223), 'jp': (127, 166, 214), 'tw': (147, 178, 217)}, button={'cn': (707, 558, 854, 603), 'en': (708, 558, 851, 601), 'jp': (706, 553, 859, 608), 'tw': (746, 565, 814, 594)}, file={'cn': './assets/cn/storage/DISASSEMBLE_POPUP_CONFIRM.png', 'en': './assets/en/storage/DISASSEMBLE_POPUP_CONFIRM.png', 'jp': './assets/jp/storage/DISASSEMBLE_POPUP_CONFIRM.png', 'tw': './assets/tw/storage/DISASSEMBLE_POPUP_CONFIRM.png'}) +DISASSEMBLE_POPUP_CONFIRM = Button(area={'cn': (746, 564, 815, 594), 'en': (717, 568, 841, 590), 'jp': (743, 564, 818, 596), 'tw': (746, 565, 814, 594)}, color={'cn': (148, 179, 219), 'en': (160, 187, 223), 'jp': (127, 166, 214), 'tw': (147, 178, 217)}, button={'cn': (707, 558, 854, 603), 'en': (708, 558, 851, 601), 'jp': (706, 553, 859, 608), 'tw': (701, 553, 860, 608)}, file={'cn': './assets/cn/storage/DISASSEMBLE_POPUP_CONFIRM.png', 'en': './assets/en/storage/DISASSEMBLE_POPUP_CONFIRM.png', 'jp': './assets/jp/storage/DISASSEMBLE_POPUP_CONFIRM.png', 'tw': './assets/tw/storage/DISASSEMBLE_POPUP_CONFIRM.png'}) EQUIPMENT_EMPTY = Button(area={'cn': (1127, 353, 1155, 395), 'en': (1127, 353, 1155, 395), 'jp': (1127, 353, 1155, 395), 'tw': (1127, 353, 1155, 395)}, color={'cn': (95, 74, 86), 'en': (95, 74, 86), 'jp': (95, 74, 86), 'tw': (95, 74, 86)}, button={'cn': (1127, 353, 1155, 395), 'en': (1127, 353, 1155, 395), 'jp': (1127, 353, 1155, 395), 'tw': (1127, 353, 1155, 395)}, file={'cn': './assets/cn/storage/EQUIPMENT_EMPTY.png', 'en': './assets/en/storage/EQUIPMENT_EMPTY.png', 'jp': './assets/jp/storage/EQUIPMENT_EMPTY.png', 'tw': './assets/tw/storage/EQUIPMENT_EMPTY.png'}) -EQUIPMENT_ENTER = Button(area={'cn': (1021, 667, 1077, 691), 'en': (1020, 669, 1071, 686), 'jp': (1019, 664, 1079, 692), 'tw': (1021, 667, 1077, 691)}, color={'cn': (222, 187, 122), 'en': (200, 161, 99), 'jp': (220, 182, 118), 'tw': (222, 187, 122)}, button={'cn': (954, 656, 1091, 698), 'en': (954, 659, 1084, 689), 'jp': (949, 652, 1095, 701), 'tw': (954, 656, 1091, 698)}, file={'cn': './assets/cn/storage/EQUIPMENT_ENTER.png', 'en': './assets/en/storage/EQUIPMENT_ENTER.png', 'jp': './assets/jp/storage/EQUIPMENT_ENTER.png', 'tw': './assets/cn/storage/EQUIPMENT_ENTER.png'}) -EQUIPMENT_FILTER = Button(area={'cn': (805, 23, 841, 38), 'en': (746, 23, 781, 36), 'jp': (792, 22, 854, 38), 'tw': (805, 23, 841, 38)}, color={'cn': (155, 171, 210), 'en': (142, 160, 201), 'jp': (96, 112, 160), 'tw': (155, 171, 210)}, button={'cn': (794, 7, 883, 45), 'en': (742, 13, 819, 36), 'jp': (791, 7, 885, 46), 'tw': (794, 7, 883, 45)}, file={'cn': './assets/cn/storage/EQUIPMENT_FILTER.png', 'en': './assets/en/storage/EQUIPMENT_FILTER.png', 'jp': './assets/jp/storage/EQUIPMENT_FILTER.png', 'tw': './assets/cn/storage/EQUIPMENT_FILTER.png'}) -EQUIPMENT_FILTER_CONFIRM = Button(area={'cn': (763, 615, 837, 646), 'en': (734, 620, 865, 643), 'jp': (761, 613, 838, 648), 'tw': (763, 615, 837, 646)}, color={'cn': (140, 172, 211), 'en': (156, 183, 217), 'jp': (120, 157, 203), 'tw': (140, 172, 211)}, button={'cn': (721, 605, 881, 657), 'en': (727, 608, 872, 653), 'jp': (721, 602, 885, 660), 'tw': (721, 605, 881, 657)}, file={'cn': './assets/cn/storage/EQUIPMENT_FILTER_CONFIRM.png', 'en': './assets/en/storage/EQUIPMENT_FILTER_CONFIRM.png', 'jp': './assets/jp/storage/EQUIPMENT_FILTER_CONFIRM.png', 'tw': './assets/cn/storage/EQUIPMENT_FILTER_CONFIRM.png'}) +EQUIPMENT_ENTER = Button(area={'cn': (1021, 667, 1077, 691), 'en': (1020, 669, 1071, 686), 'jp': (1019, 664, 1079, 692), 'tw': (1020, 666, 1077, 693)}, color={'cn': (222, 187, 122), 'en': (200, 161, 99), 'jp': (220, 182, 118), 'tw': (217, 182, 119)}, button={'cn': (954, 656, 1091, 698), 'en': (954, 659, 1084, 689), 'jp': (949, 652, 1095, 701), 'tw': (950, 653, 1097, 700)}, file={'cn': './assets/cn/storage/EQUIPMENT_ENTER.png', 'en': './assets/en/storage/EQUIPMENT_ENTER.png', 'jp': './assets/jp/storage/EQUIPMENT_ENTER.png', 'tw': './assets/tw/storage/EQUIPMENT_ENTER.png'}) +EQUIPMENT_FILTER = Button(area={'cn': (805, 23, 841, 38), 'en': (746, 23, 781, 36), 'jp': (792, 22, 854, 38), 'tw': (797, 21, 839, 41)}, color={'cn': (155, 171, 210), 'en': (142, 160, 201), 'jp': (96, 112, 160), 'tw': (151, 166, 206)}, button={'cn': (794, 7, 883, 45), 'en': (742, 13, 819, 36), 'jp': (791, 7, 885, 46), 'tw': (791, 5, 885, 47)}, file={'cn': './assets/cn/storage/EQUIPMENT_FILTER.png', 'en': './assets/en/storage/EQUIPMENT_FILTER.png', 'jp': './assets/jp/storage/EQUIPMENT_FILTER.png', 'tw': './assets/tw/storage/EQUIPMENT_FILTER.png'}) +EQUIPMENT_FILTER_CONFIRM = Button(area={'cn': (763, 615, 837, 646), 'en': (734, 620, 865, 643), 'jp': (761, 613, 838, 648), 'tw': (762, 615, 837, 646)}, color={'cn': (140, 172, 211), 'en': (156, 183, 217), 'jp': (120, 157, 203), 'tw': (134, 165, 205)}, button={'cn': (721, 605, 881, 657), 'en': (727, 608, 872, 653), 'jp': (721, 602, 885, 660), 'tw': (715, 601, 885, 660)}, file={'cn': './assets/cn/storage/EQUIPMENT_FILTER_CONFIRM.png', 'en': './assets/en/storage/EQUIPMENT_FILTER_CONFIRM.png', 'jp': './assets/jp/storage/EQUIPMENT_FILTER_CONFIRM.png', 'tw': './assets/tw/storage/EQUIPMENT_FILTER_CONFIRM.png'}) EQUIPMENT_FULL = Button(area={'cn': (453, 498, 527, 528), 'en': (460, 499, 521, 520), 'jp': (450, 496, 529, 529), 'tw': (453, 498, 527, 528)}, color={'cn': (154, 183, 221), 'en': (168, 194, 226), 'jp': (134, 170, 216), 'tw': (154, 183, 221)}, button={'cn': (413, 487, 569, 538), 'en': (421, 489, 566, 534), 'jp': (410, 482, 574, 540), 'tw': (413, 487, 569, 538)}, file={'cn': './assets/cn/storage/EQUIPMENT_FULL.png', 'en': './assets/en/storage/EQUIPMENT_FULL.png', 'jp': './assets/jp/storage/EQUIPMENT_FULL.png', 'tw': './assets/cn/storage/EQUIPMENT_FULL.png'}) MATERIAL_CHECK = Button(area={'cn': (258, 664, 305, 687), 'en': (1123, 658, 1156, 691), 'jp': (89, 662, 138, 690), 'tw': (258, 664, 305, 687)}, color={'cn': (106, 106, 111), 'en': (195, 161, 99), 'jp': (94, 93, 99), 'tw': (106, 106, 111)}, button={'cn': (258, 664, 305, 687), 'en': (1123, 658, 1156, 691), 'jp': (89, 662, 138, 690), 'tw': (258, 664, 305, 687)}, file={'cn': './assets/cn/storage/MATERIAL_CHECK.png', 'en': './assets/en/storage/MATERIAL_CHECK.png', 'jp': './assets/jp/storage/MATERIAL_CHECK.png', 'tw': './assets/cn/storage/MATERIAL_CHECK.png'}) MATERIAL_ENTER = Button(area={'cn': (1180, 666, 1237, 691), 'en': (1184, 669, 1227, 685), 'jp': (1178, 666, 1238, 692), 'tw': (1180, 666, 1237, 691)}, color={'cn': (217, 179, 119), 'en': (202, 163, 103), 'jp': (217, 176, 116), 'tw': (217, 179, 119)}, button={'cn': (1114, 656, 1251, 698), 'en': (1121, 663, 1243, 685), 'jp': (1107, 652, 1256, 702), 'tw': (1114, 656, 1251, 698)}, file={'cn': './assets/cn/storage/MATERIAL_ENTER.png', 'en': './assets/en/storage/MATERIAL_ENTER.png', 'jp': './assets/jp/storage/MATERIAL_ENTER.png', 'tw': './assets/cn/storage/MATERIAL_ENTER.png'}) diff --git a/module/template/assets.py b/module/template/assets.py index 59b6b26bd..3973aded9 100644 --- a/module/template/assets.py +++ b/module/template/assets.py @@ -239,6 +239,10 @@ TEMPLATE_SIREN_U81 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_U TEMPLATE_SIREN_UDFFortress2 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_UDFFortress2.gif', 'en': './assets/en/template/TEMPLATE_SIREN_UDFFortress2.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_UDFFortress2.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_UDFFortress2.gif'}) TEMPLATE_SIREN_UlrichVonHutten = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_UlrichVonHutten.gif', 'en': './assets/en/template/TEMPLATE_SIREN_UlrichVonHutten.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_UlrichVonHutten.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_UlrichVonHutten.gif'}) TEMPLATE_SIREN_Vauquelin = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Vauquelin.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Vauquelin.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Vauquelin.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Vauquelin.gif'}) +TEMPLATE_SIREN_Vboss_Chariot = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Vboss_Chariot.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Vboss_Chariot.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Vboss_Chariot.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Vboss_Chariot.gif'}) +TEMPLATE_SIREN_Vboss_Hermit = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Vboss_Hermit.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Vboss_Hermit.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Vboss_Hermit.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Vboss_Hermit.gif'}) +TEMPLATE_SIREN_Vboss_Lovers = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Vboss_Lovers.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Vboss_Lovers.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Vboss_Lovers.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Vboss_Lovers.gif'}) +TEMPLATE_SIREN_Vboss_Star = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Vboss_Star.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Vboss_Star.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Vboss_Star.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Vboss_Star.gif'}) TEMPLATE_SIREN_Victorious = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Victorious.gif', 'en': './assets/cn/template/TEMPLATE_SIREN_Victorious.gif', 'jp': './assets/cn/template/TEMPLATE_SIREN_Victorious.gif', 'tw': './assets/cn/template/TEMPLATE_SIREN_Victorious.gif'}) TEMPLATE_SIREN_Volga = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Volga.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Volga.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Volga.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Volga.gif'}) TEMPLATE_SIREN_Wakaba = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Wakaba.gif', 'en': './assets/en/template/TEMPLATE_SIREN_Wakaba.gif', 'jp': './assets/jp/template/TEMPLATE_SIREN_Wakaba.gif', 'tw': './assets/tw/template/TEMPLATE_SIREN_Wakaba.gif'}) diff --git a/module/ui/assets.py b/module/ui/assets.py index 9bdf14a57..73d632b61 100644 --- a/module/ui/assets.py +++ b/module/ui/assets.py @@ -88,7 +88,7 @@ SHOP_CHECK = Button(area={'cn': (149, 23, 192, 44), 'en': (143, 25, 199, 41), 'j SHOP_GOTO_MUNITIONS = Button(area={'cn': (840, 560, 999, 600), 'en': (840, 560, 999, 600), 'jp': (836, 570, 964, 613), 'tw': (840, 560, 999, 600)}, color={'cn': (122, 87, 75), 'en': (122, 87, 75), 'jp': (118, 88, 83), 'tw': (122, 87, 75)}, button={'cn': (840, 560, 999, 600), 'en': (840, 560, 999, 600), 'jp': (836, 570, 964, 613), 'tw': (840, 560, 999, 600)}, file={'cn': './assets/cn/ui/SHOP_GOTO_MUNITIONS.png', 'en': './assets/en/ui/SHOP_GOTO_MUNITIONS.png', 'jp': './assets/jp/ui/SHOP_GOTO_MUNITIONS.png', 'tw': './assets/tw/ui/SHOP_GOTO_MUNITIONS.png'}) SHOP_GOTO_SUPPLY_PACK = Button(area={'cn': (1044, 321, 1094, 366), 'en': (1044, 321, 1094, 366), 'jp': (1044, 321, 1094, 366), 'tw': (883, 537, 929, 579)}, color={'cn': (198, 155, 150), 'en': (198, 155, 150), 'jp': (198, 155, 150), 'tw': (197, 131, 140)}, button={'cn': (902, 105, 1211, 490), 'en': (902, 105, 1211, 490), 'jp': (902, 105, 1211, 490), 'tw': (810, 353, 987, 638)}, file={'cn': './assets/cn/ui/SHOP_GOTO_SUPPLY_PACK.png', 'en': './assets/en/ui/SHOP_GOTO_SUPPLY_PACK.png', 'jp': './assets/jp/ui/SHOP_GOTO_SUPPLY_PACK.png', 'tw': './assets/tw/ui/SHOP_GOTO_SUPPLY_PACK.png'}) SP_CHECK = Button(area={'cn': (123, 63, 206, 109), 'en': (123, 63, 206, 109), 'jp': (125, 66, 205, 107), 'tw': (123, 63, 206, 109)}, color={'cn': (95, 110, 145), 'en': (95, 110, 145), 'jp': (78, 92, 127), 'tw': (95, 110, 145)}, button={'cn': (123, 63, 206, 109), 'en': (123, 63, 206, 109), 'jp': (125, 66, 205, 107), 'tw': (123, 63, 206, 109)}, file={'cn': './assets/cn/ui/SP_CHECK.png', 'en': './assets/en/ui/SP_CHECK.png', 'jp': './assets/jp/ui/SP_CHECK.png', 'tw': './assets/tw/ui/SP_CHECK.png'}) -STORAGE_CHECK = Button(area={'cn': (120, 14, 175, 40), 'en': (123, 14, 209, 36), 'jp': (121, 13, 176, 41), 'tw': (120, 14, 175, 40)}, color={'cn': (137, 151, 188), 'en': (119, 133, 174), 'jp': (137, 156, 196), 'tw': (137, 151, 188)}, button={'cn': (120, 14, 175, 40), 'en': (123, 14, 209, 36), 'jp': (121, 13, 176, 41), 'tw': (120, 14, 175, 40)}, file={'cn': './assets/cn/ui/STORAGE_CHECK.png', 'en': './assets/en/ui/STORAGE_CHECK.png', 'jp': './assets/jp/ui/STORAGE_CHECK.png', 'tw': './assets/cn/ui/STORAGE_CHECK.png'}) +STORAGE_CHECK = Button(area={'cn': (120, 14, 175, 40), 'en': (123, 14, 209, 36), 'jp': (121, 13, 176, 41), 'tw': (120, 9, 176, 45)}, color={'cn': (137, 151, 188), 'en': (119, 133, 174), 'jp': (137, 156, 196), 'tw': (120, 132, 169)}, button={'cn': (120, 14, 175, 40), 'en': (123, 14, 209, 36), 'jp': (121, 13, 176, 41), 'tw': (120, 9, 176, 45)}, file={'cn': './assets/cn/ui/STORAGE_CHECK.png', 'en': './assets/en/ui/STORAGE_CHECK.png', 'jp': './assets/jp/ui/STORAGE_CHECK.png', 'tw': './assets/tw/ui/STORAGE_CHECK.png'}) SUPPLY_PACK_CHECK = Button(area={'cn': (60, 232, 104, 265), 'en': (60, 232, 104, 265), 'jp': (61, 237, 102, 265), 'tw': (82, 241, 150, 266)}, color={'cn': (120, 193, 236), 'en': (121, 193, 236), 'jp': (101, 186, 233), 'tw': (118, 196, 233)}, button={'cn': (60, 232, 104, 265), 'en': (60, 232, 104, 265), 'jp': (61, 237, 102, 265), 'tw': (82, 241, 150, 266)}, file={'cn': './assets/cn/ui/SUPPLY_PACK_CHECK.png', 'en': './assets/en/ui/SUPPLY_PACK_CHECK.png', 'jp': './assets/jp/ui/SUPPLY_PACK_CHECK.png', 'tw': './assets/tw/ui/SUPPLY_PACK_CHECK.png'}) TACTICAL_CHECK = Button(area={'cn': (122, 14, 231, 38), 'en': (119, 17, 302, 36), 'jp': (122, 12, 232, 37), 'tw': (122, 15, 230, 39)}, color={'cn': (145, 161, 200), 'en': (110, 124, 164), 'jp': (155, 171, 209), 'tw': (158, 174, 212)}, button={'cn': (122, 14, 231, 38), 'en': (119, 17, 302, 36), 'jp': (122, 12, 232, 37), 'tw': (122, 15, 230, 39)}, file={'cn': './assets/cn/ui/TACTICAL_CHECK.png', 'en': './assets/en/ui/TACTICAL_CHECK.png', 'jp': './assets/jp/ui/TACTICAL_CHECK.png', 'tw': './assets/tw/ui/TACTICAL_CHECK.png'}) WAR_ARCHIVES_CHECK = Button(area={'cn': (95, 41, 114, 70), 'en': (95, 41, 114, 70), 'jp': (95, 41, 114, 70), 'tw': (95, 41, 114, 70)}, color={'cn': (137, 177, 208), 'en': (137, 177, 208), 'jp': (137, 177, 208), 'tw': (137, 177, 208)}, button={'cn': (95, 41, 114, 70), 'en': (95, 41, 114, 70), 'jp': (95, 41, 114, 70), 'tw': (95, 41, 114, 70)}, file={'cn': './assets/cn/ui/WAR_ARCHIVES_CHECK.png', 'en': './assets/en/ui/WAR_ARCHIVES_CHECK.png', 'jp': './assets/jp/ui/WAR_ARCHIVES_CHECK.png', 'tw': './assets/tw/ui/WAR_ARCHIVES_CHECK.png'}) diff --git a/module/ui_white/assets.py b/module/ui_white/assets.py index 5f0a38895..eb5681dfc 100644 --- a/module/ui_white/assets.py +++ b/module/ui_white/assets.py @@ -26,7 +26,7 @@ MAIN_TAB_SWITCH_WHITE = Button(area={'cn': (966, 548, 999, 582), 'en': (966, 548 MISSION_NOTICE_WHITE = Button(area={'cn': (923, 657, 947, 671), 'en': (923, 657, 947, 671), 'jp': (923, 657, 947, 671), 'tw': (923, 657, 947, 671)}, color={'cn': (227, 168, 159), 'en': (227, 168, 159), 'jp': (227, 168, 159), 'tw': (227, 168, 159)}, button={'cn': (923, 657, 947, 671), 'en': (923, 657, 947, 671), 'jp': (923, 657, 947, 671), 'tw': (923, 657, 947, 671)}, file={'cn': './assets/cn/ui_white/MISSION_NOTICE_WHITE.png', 'en': './assets/en/ui_white/MISSION_NOTICE_WHITE.png', 'jp': './assets/jp/ui_white/MISSION_NOTICE_WHITE.png', 'tw': './assets/tw/ui_white/MISSION_NOTICE_WHITE.png'}) POPUP_CANCEL_WHITE = Button(area={'cn': (487, 491, 531, 513), 'en': (471, 492, 547, 513), 'jp': (481, 490, 534, 516), 'tw': (487, 491, 531, 513)}, color={'cn': (214, 214, 214), 'en': (205, 206, 205), 'jp': (202, 203, 202), 'tw': (214, 214, 214)}, button={'cn': (487, 491, 531, 513), 'en': (471, 492, 547, 513), 'jp': (481, 490, 534, 516), 'tw': (487, 491, 531, 513)}, file={'cn': './assets/cn/ui_white/POPUP_CANCEL_WHITE.png', 'en': './assets/en/ui_white/POPUP_CANCEL_WHITE.png', 'jp': './assets/jp/ui_white/POPUP_CANCEL_WHITE.png', 'tw': './assets/cn/ui_white/POPUP_CANCEL_WHITE.png'}) POPUP_CONFIRM_WHITE = Button(area={'cn': (746, 494, 791, 515), 'en': (727, 495, 810, 515), 'jp': (743, 491, 796, 518), 'tw': (744, 491, 794, 518)}, color={'cn': (133, 216, 255), 'en': (107, 207, 255), 'jp': (109, 207, 255), 'tw': (111, 207, 249)}, button={'cn': (746, 494, 791, 515), 'en': (727, 495, 810, 515), 'jp': (743, 491, 796, 518), 'tw': (744, 491, 794, 518)}, file={'cn': './assets/cn/ui_white/POPUP_CONFIRM_WHITE.png', 'en': './assets/en/ui_white/POPUP_CONFIRM_WHITE.png', 'jp': './assets/jp/ui_white/POPUP_CONFIRM_WHITE.png', 'tw': './assets/tw/ui_white/POPUP_CONFIRM_WHITE.png'}) -POPUP_CONFIRM_WHITE_BATTLEPASS = Button(area={'cn': (744, 490, 795, 513), 'en': (744, 490, 795, 513), 'jp': (744, 490, 795, 513), 'tw': (744, 490, 795, 513)}, color={'cn': (119, 211, 255), 'en': (119, 211, 255), 'jp': (119, 211, 255), 'tw': (119, 211, 255)}, button={'cn': (744, 490, 795, 513), 'en': (744, 490, 795, 513), 'jp': (744, 490, 795, 513), 'tw': (744, 490, 795, 513)}, file={'cn': './assets/cn/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png', 'en': './assets/cn/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png', 'jp': './assets/cn/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png', 'tw': './assets/cn/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png'}) +POPUP_CONFIRM_WHITE_BATTLEPASS = Button(area={'cn': (744, 490, 795, 513), 'en': (721, 492, 818, 510), 'jp': (739, 488, 800, 515), 'tw': (744, 490, 795, 513)}, color={'cn': (119, 211, 255), 'en': (149, 221, 255), 'jp': (103, 206, 255), 'tw': (119, 211, 255)}, button={'cn': (744, 490, 795, 513), 'en': (721, 492, 818, 510), 'jp': (739, 488, 800, 515), 'tw': (744, 490, 795, 513)}, file={'cn': './assets/cn/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png', 'en': './assets/en/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png', 'jp': './assets/jp/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png', 'tw': './assets/cn/ui_white/POPUP_CONFIRM_WHITE_BATTLEPASS.png'}) POPUP_SINGLE_WHITE = Button(area={'cn': (623, 493, 668, 515), 'en': (623, 493, 668, 515), 'jp': (623, 493, 668, 515), 'tw': (623, 493, 668, 515)}, color={'cn': (131, 215, 255), 'en': (131, 215, 255), 'jp': (131, 215, 255), 'tw': (131, 215, 255)}, button={'cn': (623, 493, 668, 515), 'en': (623, 493, 668, 515), 'jp': (623, 493, 668, 515), 'tw': (623, 493, 668, 515)}, file={'cn': './assets/cn/ui_white/POPUP_SINGLE_WHITE.png', 'en': './assets/cn/ui_white/POPUP_SINGLE_WHITE.png', 'jp': './assets/cn/ui_white/POPUP_SINGLE_WHITE.png', 'tw': './assets/cn/ui_white/POPUP_SINGLE_WHITE.png'}) REWARD_1_WHITE = Button(area={'cn': (437, 278, 496, 306), 'en': (411, 283, 523, 300), 'jp': (442, 279, 491, 305), 'tw': (441, 280, 490, 306)}, color={'cn': (255, 193, 97), 'en': (255, 212, 150), 'jp': (255, 195, 101), 'tw': (255, 199, 111)}, button={'cn': (437, 278, 496, 306), 'en': (411, 283, 523, 300), 'jp': (442, 279, 491, 305), 'tw': (441, 280, 490, 306)}, file={'cn': './assets/cn/ui_white/REWARD_1_WHITE.png', 'en': './assets/en/ui_white/REWARD_1_WHITE.png', 'jp': './assets/jp/ui_white/REWARD_1_WHITE.png', 'tw': './assets/tw/ui_white/REWARD_1_WHITE.png'}) REWARD_2_WHITE = Button(area={'cn': (436, 419, 497, 448), 'en': (411, 425, 523, 442), 'jp': (442, 421, 492, 446), 'tw': (439, 422, 490, 448)}, color={'cn': (255, 192, 94), 'en': (255, 212, 146), 'jp': (255, 196, 103), 'tw': (255, 198, 109)}, button={'cn': (436, 419, 497, 448), 'en': (411, 425, 523, 442), 'jp': (442, 421, 492, 446), 'tw': (439, 422, 490, 448)}, file={'cn': './assets/cn/ui_white/REWARD_2_WHITE.png', 'en': './assets/en/ui_white/REWARD_2_WHITE.png', 'jp': './assets/jp/ui_white/REWARD_2_WHITE.png', 'tw': './assets/tw/ui_white/REWARD_2_WHITE.png'}) diff --git a/module/war_archives/assets.py b/module/war_archives/assets.py index b1ad00ed0..91139e443 100644 --- a/module/war_archives/assets.py +++ b/module/war_archives/assets.py @@ -29,7 +29,7 @@ TEMPLATE_MOONLIT_OVERTURE = Template(file={'cn': './assets/cn/war_archives/TEMPL 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_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/cn/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'}) +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'}) TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png', 'en': './assets/en/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png', 'jp': './assets/cn/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png', 'tw': './assets/cn/war_archives/TEMPLATE_SCHERZO_OF_IRON_AND_BLOOD.png'}) TEMPLATE_SKYBOUND_ORATORIO = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png', 'en': './assets/en/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png', 'jp': './assets/cn/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png', 'tw': './assets/cn/war_archives/TEMPLATE_SKYBOUND_ORATORIO.png'}) TEMPLATE_STARS_OF_THE_SHIMMERING_FJORD = Template(file={'cn': './assets/cn/war_archives/TEMPLATE_STARS_OF_THE_SHIMMERING_FJORD.png', 'en': './assets/en/war_archives/TEMPLATE_STARS_OF_THE_SHIMMERING_FJORD.png', 'jp': './assets/cn/war_archives/TEMPLATE_STARS_OF_THE_SHIMMERING_FJORD.png', 'tw': './assets/tw/war_archives/TEMPLATE_STARS_OF_THE_SHIMMERING_FJORD.png'})