diff --git a/assets/cn/combat_ui/PAUSE_MaidCafe.png b/assets/cn/combat_ui/PAUSE_MaidCafe.png new file mode 100644 index 000000000..f51bdf9fb Binary files /dev/null and b/assets/cn/combat_ui/PAUSE_MaidCafe.png differ diff --git a/assets/cn/combat_ui/QUIT_MaidCafe.png b/assets/cn/combat_ui/QUIT_MaidCafe.png new file mode 100644 index 000000000..483934f28 Binary files /dev/null and b/assets/cn/combat_ui/QUIT_MaidCafe.png differ diff --git a/campaign/Readme.md b/campaign/Readme.md index e258ea10d..9607d909c 100644 --- a/campaign/Readme.md +++ b/campaign/Readme.md @@ -274,3 +274,4 @@ To add a new event, add a new row in here, and run `python -m module.config.conf | 20251127 | coalition 20251120 | DATE A LANE | - | - | - | DATE A LANE | | 20251211 | event 20251023 cn | Tempesta and Islas de Libertád | - | - | - | 颶風與自由群島 | | 20251218 | event 20251218 cn | A Note Through the Firmament | 响彻于天穹之音 | A Note Through the Firmament | 天穹に響く音謡 | - | +| 20251231 | event 20251218 cn | A Note Through the Firmament | - | - | - | 響徹於天穹之音 | diff --git a/campaign/event_20251218_cn/a1.py b/campaign/event_20251218_cn/a1.py index 7e692435f..a017abcd1 100644 --- a/campaign/event_20251218_cn/a1.py +++ b/campaign/event_20251218_cn/a1.py @@ -73,6 +73,7 @@ class Config: 'distance': 50, 'wlen': 1000 } + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) HOMO_EDGE_COLOR_RANGE = (0, 17) MAP_WALK_USE_CURRENT_FLEET = True MAP_SWIPE_MULTIPLY = (1.232, 1.255) diff --git a/campaign/event_20251218_cn/b1.py b/campaign/event_20251218_cn/b1.py index 8216822be..b87ff6fa4 100644 --- a/campaign/event_20251218_cn/b1.py +++ b/campaign/event_20251218_cn/b1.py @@ -73,6 +73,7 @@ class Config: 'distance': 50, 'wlen': 1000 } + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) HOMO_EDGE_COLOR_RANGE = (0, 17) MAP_WALK_USE_CURRENT_FLEET = True MAP_SWIPE_MULTIPLY = (1.217, 1.240) diff --git a/campaign/event_20251218_cn/c1.py b/campaign/event_20251218_cn/c1.py index fd594847a..ae69348f5 100644 --- a/campaign/event_20251218_cn/c1.py +++ b/campaign/event_20251218_cn/c1.py @@ -73,6 +73,7 @@ class Config: 'distance': 50, 'wlen': 1000 } + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) HOMO_EDGE_COLOR_RANGE = (0, 17) MAP_WALK_USE_CURRENT_FLEET = True MAP_SWIPE_MULTIPLY = (1.232, 1.255) diff --git a/campaign/event_20251218_cn/d1.py b/campaign/event_20251218_cn/d1.py index cf99034b0..4fdd5db3d 100644 --- a/campaign/event_20251218_cn/d1.py +++ b/campaign/event_20251218_cn/d1.py @@ -74,6 +74,7 @@ class Config: 'distance': 50, 'wlen': 1000 } + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) HOMO_EDGE_COLOR_RANGE = (0, 17) MAP_WALK_USE_CURRENT_FLEET = True MAP_SWIPE_MULTIPLY = (1.217, 1.240) diff --git a/campaign/event_20251218_cn/sp.py b/campaign/event_20251218_cn/sp.py index f74e5236f..8cec53c7b 100644 --- a/campaign/event_20251218_cn/sp.py +++ b/campaign/event_20251218_cn/sp.py @@ -78,6 +78,7 @@ class Config: 'distance': 50, 'wlen': 1000 } + HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)]) HOMO_EDGE_COLOR_RANGE = (0, 17) MAP_WALK_USE_CURRENT_FLEET = True MAP_SWIPE_MULTIPLY = (1.180, 1.202) diff --git a/module/combat/combat.py b/module/combat/combat.py index ffeb42ca8..9ff52afbd 100644 --- a/module/combat/combat.py +++ b/module/combat/combat.py @@ -121,6 +121,8 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan return PAUSE_Ninja if PAUSE_ShadowPuppetry.match_luma(self.device.image, offset=(10, 10)): return PAUSE_ShadowPuppetry + if PAUSE_MaidCafe.match_template_color(self.device.image, offset=(10, 10)): + return PAUSE_MaidCafe return False def handle_combat_quit(self, offset=(20, 20), interval=3): @@ -168,6 +170,10 @@ class Combat(Level, HPBalancer, Retirement, SubmarineCall, CombatAuto, CombatMan self.device.click(QUIT_Ninja) timer.reset() return True + if QUIT_MaidCafe.match_luma(self.device.image, offset=offset): + self.device.click(QUIT_MaidCafe) + timer.reset() + return True return False def ensure_combat_oil_loaded(self): diff --git a/module/combat_ui/assets.py b/module/combat_ui/assets.py index 109bc4519..f66c58ff1 100644 --- a/module/combat_ui/assets.py +++ b/module/combat_ui/assets.py @@ -11,6 +11,7 @@ PAUSE_DOUBLE_CHECK = Button(area={'cn': (1226, 35, 1231, 60), 'en': (1226, 35, 1 PAUSE_Devil = Button(area={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, color={'cn': (193, 98, 108), 'en': (193, 98, 108), 'jp': (193, 98, 108), 'tw': (193, 98, 108)}, button={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_Devil.png', 'en': './assets/cn/combat_ui/PAUSE_Devil.png', 'jp': './assets/cn/combat_ui/PAUSE_Devil.png', 'tw': './assets/cn/combat_ui/PAUSE_Devil.png'}) PAUSE_HolyLight = Button(area={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, color={'cn': (54, 40, 27), 'en': (54, 40, 27), 'jp': (54, 40, 27), 'tw': (54, 40, 27)}, button={'cn': (1233, 35, 1250, 57), 'en': (1233, 35, 1250, 57), 'jp': (1233, 35, 1250, 57), 'tw': (1233, 35, 1250, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_HolyLight.png', 'en': './assets/cn/combat_ui/PAUSE_HolyLight.png', 'jp': './assets/cn/combat_ui/PAUSE_HolyLight.png', 'tw': './assets/cn/combat_ui/PAUSE_HolyLight.png'}) PAUSE_Iridescent_Fantasy = Button(area={'cn': (1232, 33, 1252, 57), 'en': (1232, 33, 1252, 57), 'jp': (1232, 33, 1252, 57), 'tw': (1232, 33, 1252, 57)}, color={'cn': (124, 139, 190), 'en': (124, 139, 190), 'jp': (124, 139, 190), 'tw': (124, 139, 190)}, button={'cn': (1232, 33, 1252, 57), 'en': (1232, 33, 1252, 57), 'jp': (1232, 33, 1252, 57), 'tw': (1232, 33, 1252, 57)}, file={'cn': './assets/cn/combat_ui/PAUSE_Iridescent_Fantasy.png', 'en': './assets/en/combat_ui/PAUSE_Iridescent_Fantasy.png', 'jp': './assets/jp/combat_ui/PAUSE_Iridescent_Fantasy.png', 'tw': './assets/tw/combat_ui/PAUSE_Iridescent_Fantasy.png'}) +PAUSE_MaidCafe = Button(area={'cn': (1230, 35, 1248, 54), 'en': (1230, 35, 1248, 54), 'jp': (1230, 35, 1248, 54), 'tw': (1230, 35, 1248, 54)}, color={'cn': (159, 145, 139), 'en': (159, 145, 139), 'jp': (159, 145, 139), 'tw': (159, 145, 139)}, button={'cn': (1230, 35, 1248, 54), 'en': (1230, 35, 1248, 54), 'jp': (1230, 35, 1248, 54), 'tw': (1230, 35, 1248, 54)}, file={'cn': './assets/cn/combat_ui/PAUSE_MaidCafe.png', 'en': './assets/cn/combat_ui/PAUSE_MaidCafe.png', 'jp': './assets/cn/combat_ui/PAUSE_MaidCafe.png', 'tw': './assets/cn/combat_ui/PAUSE_MaidCafe.png'}) PAUSE_Neon = Button(area={'cn': (1228, 32, 1250, 59), 'en': (1228, 32, 1250, 59), 'jp': (1228, 32, 1250, 59), 'tw': (1228, 32, 1250, 59)}, color={'cn': (106, 137, 80), 'en': (106, 137, 80), 'jp': (106, 137, 80), 'tw': (106, 137, 80)}, button={'cn': (1228, 32, 1250, 59), 'en': (1228, 32, 1250, 59), 'jp': (1228, 32, 1250, 59), 'tw': (1228, 32, 1250, 59)}, file={'cn': './assets/cn/combat_ui/PAUSE_Neon.png', 'en': './assets/cn/combat_ui/PAUSE_Neon.png', 'jp': './assets/cn/combat_ui/PAUSE_Neon.png', 'tw': './assets/cn/combat_ui/PAUSE_Neon.png'}) PAUSE_New = Button(area={'cn': (1231, 29, 1253, 56), 'en': (1231, 29, 1253, 56), 'jp': (1231, 29, 1253, 56), 'tw': (1231, 29, 1253, 56)}, color={'cn': (156, 158, 166), 'en': (156, 158, 166), 'jp': (156, 158, 166), 'tw': (156, 158, 166)}, button={'cn': (1231, 29, 1253, 56), 'en': (1231, 29, 1253, 56), 'jp': (1231, 29, 1253, 56), 'tw': (1231, 29, 1253, 56)}, file={'cn': './assets/cn/combat_ui/PAUSE_New.png', 'en': './assets/en/combat_ui/PAUSE_New.png', 'jp': './assets/jp/combat_ui/PAUSE_New.png', 'tw': './assets/tw/combat_ui/PAUSE_New.png'}) PAUSE_Ninja = Button(area={'cn': (1230, 37, 1246, 53), 'en': (1230, 37, 1246, 53), 'jp': (1230, 37, 1246, 53), 'tw': (1230, 37, 1246, 53)}, color={'cn': (135, 109, 92), 'en': (135, 109, 92), 'jp': (135, 109, 92), 'tw': (135, 109, 92)}, button={'cn': (1230, 37, 1246, 53), 'en': (1230, 37, 1246, 53), 'jp': (1230, 37, 1246, 53), 'tw': (1230, 37, 1246, 53)}, file={'cn': './assets/cn/combat_ui/PAUSE_Ninja.png', 'en': './assets/cn/combat_ui/PAUSE_Ninja.png', 'jp': './assets/cn/combat_ui/PAUSE_Ninja.png', 'tw': './assets/cn/combat_ui/PAUSE_Ninja.png'}) @@ -23,6 +24,7 @@ QUIT = Button(area={'cn': (420, 490, 593, 548), 'en': (473, 508, 567, 532), 'jp' QUIT_Christmas = Button(area={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, color={'cn': (195, 139, 166), 'en': (207, 166, 185), 'jp': (195, 139, 166), 'tw': (195, 139, 166)}, button={'cn': (400, 506, 477, 525), 'en': (410, 507, 469, 524), 'jp': (400, 506, 477, 525), 'tw': (400, 506, 477, 525)}, file={'cn': './assets/cn/combat_ui/QUIT_Christmas.png', 'en': './assets/en/combat_ui/QUIT_Christmas.png', 'jp': './assets/cn/combat_ui/QUIT_Christmas.png', 'tw': './assets/cn/combat_ui/QUIT_Christmas.png'}) QUIT_Cyber = Button(area={'cn': (393, 506, 470, 524), 'en': (393, 506, 470, 524), 'jp': (393, 506, 470, 524), 'tw': (393, 506, 470, 524)}, color={'cn': (255, 198, 190), 'en': (255, 198, 190), 'jp': (255, 198, 190), 'tw': (255, 198, 190)}, button={'cn': (393, 506, 470, 524), 'en': (393, 506, 470, 524), 'jp': (393, 506, 470, 524), 'tw': (393, 506, 470, 524)}, file={'cn': './assets/cn/combat_ui/QUIT_Cyber.png', 'en': './assets/cn/combat_ui/QUIT_Cyber.png', 'jp': './assets/cn/combat_ui/QUIT_Cyber.png', 'tw': './assets/tw/combat_ui/QUIT_Cyber.png'}) QUIT_Iridescent_Fantasy = Button(area={'cn': (391, 522, 464, 540), 'en': (402, 507, 460, 523), 'jp': (391, 522, 464, 540), 'tw': (391, 522, 464, 540)}, color={'cn': (121, 73, 79), 'en': (255, 174, 164), 'jp': (108, 60, 70), 'tw': (121, 73, 79)}, button={'cn': (391, 522, 464, 540), 'en': (402, 507, 460, 523), 'jp': (391, 522, 464, 540), 'tw': (391, 522, 464, 540)}, file={'cn': './assets/cn/combat_ui/QUIT_Iridescent_Fantasy.png', 'en': './assets/en/combat_ui/QUIT_Iridescent_Fantasy.png', 'jp': './assets/jp/combat_ui/QUIT_Iridescent_Fantasy.png', 'tw': './assets/cn/combat_ui/QUIT_Iridescent_Fantasy.png'}) +QUIT_MaidCafe = Button(area={'cn': (423, 549, 501, 568), 'en': (423, 549, 501, 568), 'jp': (423, 549, 501, 568), 'tw': (423, 549, 501, 568)}, color={'cn': (168, 142, 133), 'en': (168, 142, 133), 'jp': (168, 142, 133), 'tw': (168, 142, 133)}, button={'cn': (423, 549, 501, 568), 'en': (423, 549, 501, 568), 'jp': (423, 549, 501, 568), 'tw': (423, 549, 501, 568)}, file={'cn': './assets/cn/combat_ui/QUIT_MaidCafe.png', 'en': './assets/cn/combat_ui/QUIT_MaidCafe.png', 'jp': './assets/cn/combat_ui/QUIT_MaidCafe.png', 'tw': './assets/cn/combat_ui/QUIT_MaidCafe.png'}) QUIT_New = Button(area={'cn': (394, 506, 467, 524), 'en': (404, 506, 463, 523), 'jp': (394, 506, 467, 524), 'tw': (393, 505, 471, 524)}, color={'cn': (255, 180, 171), 'en': (255, 195, 187), 'jp': (255, 180, 171), 'tw': (255, 200, 193)}, button={'cn': (394, 506, 467, 524), 'en': (404, 506, 463, 523), 'jp': (394, 506, 467, 524), 'tw': (393, 505, 471, 524)}, file={'cn': './assets/cn/combat_ui/QUIT_New.png', 'en': './assets/en/combat_ui/QUIT_New.png', 'jp': './assets/cn/combat_ui/QUIT_New.png', 'tw': './assets/tw/combat_ui/QUIT_New.png'}) QUIT_Ninja = Button(area={'cn': (398, 509, 477, 528), 'en': (398, 509, 477, 528), 'jp': (398, 509, 477, 528), 'tw': (398, 509, 477, 528)}, color={'cn': (148, 138, 134), 'en': (148, 138, 134), 'jp': (148, 138, 134), 'tw': (148, 138, 134)}, button={'cn': (398, 509, 477, 528), 'en': (398, 509, 477, 528), 'jp': (398, 509, 477, 528), 'tw': (398, 509, 477, 528)}, file={'cn': './assets/cn/combat_ui/QUIT_Ninja.png', 'en': './assets/cn/combat_ui/QUIT_Ninja.png', 'jp': './assets/cn/combat_ui/QUIT_Ninja.png', 'tw': './assets/cn/combat_ui/QUIT_Ninja.png'}) QUIT_Nurse = Button(area={'cn': (400, 507, 477, 525), 'en': (400, 507, 477, 525), 'jp': (400, 507, 477, 525), 'tw': (400, 507, 477, 525)}, color={'cn': (254, 193, 170), 'en': (254, 193, 170), 'jp': (254, 193, 170), 'tw': (254, 193, 170)}, button={'cn': (400, 507, 477, 525), 'en': (400, 507, 477, 525), 'jp': (400, 507, 477, 525), 'tw': (400, 507, 477, 525)}, file={'cn': './assets/cn/combat_ui/QUIT_Nurse.png', 'en': './assets/cn/combat_ui/QUIT_Nurse.png', 'jp': './assets/cn/combat_ui/QUIT_Nurse.png', 'tw': './assets/cn/combat_ui/QUIT_Nurse.png'}) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index c5ee69342..f1ea51341 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -1925,7 +1925,6 @@ "type": "select", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "display": "hide", @@ -1939,10 +1938,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -2335,7 +2333,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -2348,10 +2345,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -2739,7 +2735,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -2752,10 +2747,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -4520,7 +4514,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -4533,10 +4526,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -4941,7 +4933,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -4954,10 +4945,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -5362,7 +5352,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -5375,10 +5364,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -5783,7 +5771,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -5796,10 +5783,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, @@ -6194,7 +6180,6 @@ "type": "state", "value": "campaign_main", "option": [ - "event_20251023_cn", "event_20251218_cn" ], "option_cn": [ @@ -6207,10 +6192,9 @@ "event_20251218_cn" ], "option_tw": [ - "event_20251023_cn" + "event_20251218_cn" ], "option_bold": [ - "event_20251023_cn", "event_20251218_cn" ] }, diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 74dc50919..e74a4901e 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -781,7 +781,7 @@ "event_20250814_cn": "奇淵下的秘密", "event_20250912_cn": "起舞於天原之上", "event_20251023_cn": "颶風與自由群島", - "event_20251218_cn": "A Note Through the Firmament", + "event_20251218_cn": "響徹於天穹之音", "raid_20200624": "特別演習埃塞克斯級(復刻)", "raid_20210708": "復刻穿越彼方的水線", "raid_20220127": "演習神秘事件調查", diff --git a/module/exercise/hp_daemon.py b/module/exercise/hp_daemon.py index 7dbe30bd9..e79bce505 100644 --- a/module/exercise/hp_daemon.py +++ b/module/exercise/hp_daemon.py @@ -74,7 +74,8 @@ class HpDaemon(ModuleBase): PAUSE_Seaside, PAUSE_Star, PAUSE_Ninja, - PAUSE_ShadowPuppetry + PAUSE_ShadowPuppetry, + PAUSE_MaidCafe, ]: self.attacker_hp = self._calculate_hp(image, area=ATTACKER_HP_AREA_New.area, reverse=True) self.defender_hp = self._calculate_hp(image, area=DEFENDER_HP_AREA_New.area, reverse=True) diff --git a/module/os/map_operation.py b/module/os/map_operation.py index 1d3a37106..c783afbb6 100644 --- a/module/os/map_operation.py +++ b/module/os/map_operation.py @@ -57,6 +57,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle name = ocr.ocr(self.device.image) name = "".join(name.split()) name = name.lower() + name = name.strip('\\/-') if '-' in name: name = name.split('-')[0] if 'é' in name: # Méditerranée name maps @@ -89,6 +90,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle # For JP only ocr = Ocr(MAP_NAME, lang='jp', letter=(157, 173, 192), threshold=127, name='OCR_OS_MAP_NAME') name = ocr.ocr(self.device.image) + name = name.strip('\\/-') self.is_zone_name_hidden = '安全' in name # Remove punctuations for char in '・': @@ -117,6 +119,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle # For TW only ocr = Ocr(MAP_NAME, lang='tw', letter=(198, 215, 239), threshold=127, name='OCR_OS_MAP_NAME') name = ocr.ocr(self.device.image) + name = name.strip('\\/-') self.is_zone_name_hidden = '安全' in name # Remove '塞壬要塞海域' if '塞' in name: @@ -130,6 +133,7 @@ class OSMapOperation(MapOrderHandler, MissionHandler, PortHandler, StorageHandle # For CN only ocr = Ocr(MAP_NAME, lang='cnocr', letter=(214, 231, 255), threshold=127, name='OCR_OS_MAP_NAME') name = ocr.ocr(self.device.image) + name = name.strip('\\/-') self.is_zone_name_hidden = '安全' in name if '-' in name: name = name.split('-')[0]