From 2609b4a70dbbecf6c6fb0b9ed894d8808a95bc83 Mon Sep 17 00:00:00 2001 From: LmeSzinc Date: Mon, 1 Jun 2020 02:01:04 +0800 Subject: [PATCH 1/6] Add: Timezone aware - Fix mat withdraw on slow device --- module/base/timer.py | 16 +++++++++++++++- module/campaign/run.py | 3 +-- module/config/config.py | 32 +++++++++++++++++++++++++++----- module/map/map_operation.py | 2 +- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/module/base/timer.py b/module/base/timer.py index a6dfe9dea..66ba8fa00 100644 --- a/module/base/timer.py +++ b/module/base/timer.py @@ -23,7 +23,7 @@ def future_time(string): string (str): Such as 14:59. Returns: - datetime.datetime: Time with given hour, minute, second in the future. + datetime.datetime: Time with given hour, minute in the future. """ hour, minute = [int(x) for x in string.split(':')] future = datetime.now().replace(hour=hour, minute=minute, second=0, microsecond=0) @@ -31,6 +31,20 @@ def future_time(string): return future +def past_time(string): + """ + Args: + string (str): Such as 14:59. + + Returns: + datetime.datetime: Time with given hour, minute in the past. + """ + hour, minute = [int(x) for x in string.split(':')] + past = datetime.now().replace(hour=hour, minute=minute, second=0, microsecond=0) + past = past - timedelta(days=1) if past > datetime.now() else past + return past + + def future_time_range(string): """ Args: diff --git a/module/campaign/run.py b/module/campaign/run.py index d997f6ab4..045218305 100644 --- a/module/campaign/run.py +++ b/module/campaign/run.py @@ -107,8 +107,7 @@ class CampaignRun(CampaignUI, Reward, LoginHandler): Returns: bool: If triggered a restart condition. """ - now = datetime.now() - if now.date() != self.start_time.date(): + if self.config.get_server_last_update(since=(0,)) > self.start_time: logger.hr('Triggered restart new day') return True if not self.campaign.config.IGNORE_LOW_EMOTION_WARN: diff --git a/module/config/config.py b/module/config/config.py index 369ca3b7b..8ef8897fb 100644 --- a/module/config/config.py +++ b/module/config/config.py @@ -2,15 +2,16 @@ import codecs import configparser import copy import os +from datetime import timezone import cv2 import numpy as np from PIL import Image +import module.config.server as server from module.base.timer import * from module.config.dictionary import * from module.logger import logger -import module.config.server as server class AzurLaneConfig: @@ -520,6 +521,30 @@ class AzurLaneConfig: self.C124_NON_S3_WITHDRAW_TOLERANCE = int(option['non_s3_enemy_withdraw_tolerance']) self.C124_AMMO_PICK_UP = int(option['ammo_pick_up_124']) + def get_server_timezone(self): + if self.SERVER == 'en': + return -7 + elif self.SERVER == 'cn': + return 8 + elif self.SERVER == 'jp': + return 9 + else: + return 8 + + def get_server_last_update(self, since): + """ + Args: + since (tuple(int)): Update hour in Azurlane, such as (0, 12, 18,). + + Returns: + datetime.datetime + """ + d = datetime.now(timezone.utc).astimezone() + diff = d.utcoffset() // timedelta(seconds=1) // 3600 - self.get_server_timezone() + since = np.sort((np.array(since) + diff) % 24) + update = sorted([past_time(f'{t}:00') for t in since])[-1] + return update + def record_executed_since(self, option, since): """ Args: @@ -530,10 +555,7 @@ class AzurLaneConfig: bool: If got a record after last game update. """ record = datetime.strptime(self.config.get(*option), self.TIME_FORMAT) - since = np.array(since) - - hour = since[since <= datetime.now().hour][-1] - update = datetime.now().replace(hour=hour, minute=0, second=0, microsecond=0) + update = self.get_server_last_update(since) logger.attr(f'{option[0]}_{option[1]}', f'Record time: {record}') logger.attr(f'{option[0]}_{option[1]}', f'Last update: {update}') diff --git a/module/map/map_operation.py b/module/map/map_operation.py index 008f801a6..8170bb0f2 100644 --- a/module/map/map_operation.py +++ b/module/map/map_operation.py @@ -128,7 +128,7 @@ class MapOperation(MysteryHandler, FleetPreparation, Retirement, FastForwardHand if self.handle_popup_confirm(): continue - if self.appear_then_click(WITHDRAW, interval=2): + if self.appear_then_click(WITHDRAW, interval=5): continue # End From 16cc5422196cf4e4112376d9e3248983ae39477b Mon Sep 17 00:00:00 2001 From: LmeSzinc Date: Mon, 1 Jun 2020 02:46:05 +0800 Subject: [PATCH 2/6] Fix: [EN] event map --- campaign/event_20200521_en/a1.py | 12 ++++++++++++ campaign/event_20200521_en/b2.py | 2 +- campaign/event_20200521_en/b3.py | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/campaign/event_20200521_en/a1.py b/campaign/event_20200521_en/a1.py index ed452dac4..3523049b5 100644 --- a/campaign/event_20200521_en/a1.py +++ b/campaign/event_20200521_en/a1.py @@ -13,6 +13,7 @@ MAP.map_data = ''' -- ME -- -- ++ ME -- ME -- SP -- -- ME ++ -- ME -- MB ''' +MAP.camera_data = ['D1', 'D3', 'F1', 'F3'] class Config: POOR_MAP_DATA = True @@ -25,6 +26,12 @@ class Config: TRUST_EDGE_LINES = True + INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40 + EDGE_LINES_HOUGHLINES_THRESHOLD = 40 + COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5 + MID_DIFF_RANGE_H = (140 - 3, 140 + 3) + MID_DIFF_RANGE_V = (143 - 3, 143 + 3) + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { 'height': (80, 255 - 40), 'width': (0.9, 10), @@ -42,3 +49,8 @@ class Config: class Campaign(CampaignBase): MAP = MAP + def handle_boss_appear_refocus(self): + if self.battle_count == 4: + self.map_swipe((-3, -2)) + + return super().handle_boss_appear_refocus() diff --git a/campaign/event_20200521_en/b2.py b/campaign/event_20200521_en/b2.py index f8a088fbe..9d3b321dc 100644 --- a/campaign/event_20200521_en/b2.py +++ b/campaign/event_20200521_en/b2.py @@ -74,5 +74,5 @@ class Campaign(CampaignBase): return self.battle_default() def battle_5(self): - return self.clear_boss() + return self.fleet_2.clear_boss() diff --git a/campaign/event_20200521_en/b3.py b/campaign/event_20200521_en/b3.py index c1d2dd764..7b5c9c5f0 100644 --- a/campaign/event_20200521_en/b3.py +++ b/campaign/event_20200521_en/b3.py @@ -82,6 +82,6 @@ class Campaign(CampaignBase): return self.battle_default() def battle_5(self): - return self.clear_boss() + return self.fleet_2.clear_boss() From 9615c6d7599e61e80e7d4a937904c30f280314e1 Mon Sep 17 00:00:00 2001 From: Cerz0 <62533167+Cerz0@users.noreply.github.com> Date: Mon, 1 Jun 2020 00:44:06 +0200 Subject: [PATCH 3/6] Create campaign_9_3.py --- campaign/campaign_main/campaign_9_3.py | 81 ++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 campaign/campaign_main/campaign_9_3.py diff --git a/campaign/campaign_main/campaign_9_3.py b/campaign/campaign_main/campaign_9_3.py new file mode 100644 index 000000000..fdf120fed --- /dev/null +++ b/campaign/campaign_main/campaign_9_3.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 + + +MAP = CampaignMap('9-3') +MAP.shape = 'H6' +MAP.map_data = ''' + MB -- ME -- ME -- ++ MB + ME ++ ++ ++ MB ME ++ -- + ME __ -- SP ++ ME ME -- + -- -- ME ++ SP -- __ ME + ++ -- ME MB ++ ++ ++ -- + ++ ++ -- ME -- ME ME MB +''' +MAP.weight_data = ''' + 10 10 10 10 10 10 10 10 + 10 10 10 10 10 10 10 10 + 10 10 10 10 10 10 20 10 + 10 10 20 10 10 10 10 10 + 10 10 10 10 10 10 10 10 + 10 10 10 10 10 10 10 10 +''' +#MAP.camera_data = ['D4'] +MAP.spawn_data = [ + {'battle': 0, 'enemy': 3}, + {'battle': 1, 'enemy': 2}, + {'battle': 2, 'enemy': 2}, + {'battle': 3, 'enemy': 1}, + {'battle': 4, 'enemy': 1}, + {'battle': 5, 'boss': 1}, + ] + +A1, B1, C1, D1, E1, F1, G1, H1, \ +A2, B2, C2, D2, E2, F2, G2, H2, \ +A3, B3, C3, D3, E3, F3, G3, H3, \ +A4, B4, C4, D4, E4, F4, G4, H4, \ +A5, B5, C5, D5, E5, F5, G5, H5, \ +A6, B6, C6, D6, E6, F6, G6, H6, \ + = MAP.flatten() + +road_main = RoadGrids([A2, A3, C5, D6, F2, F3, F6, G6, H4]) + +class Config: + INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40 + EDGE_LINES_HOUGHLINES_THRESHOLD = 40 + COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5 + INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (150, 255 - 24), + 'width': (0.9, 10), + 'prominence': 10, + 'distance': 35, + } + EDGE_LINES_FIND_PEAKS_PARAMETERS = { + 'height': (255 - 24, 255), + 'prominence': 10, + 'distance': 50, + 'width': (0, 10), + 'wlen': 1000, + } + +class Campaign(CampaignBase): + MAP = MAP + + def battle_0(self): + if self.clear_roadblocks([road_main]): + return True + if self.clear_potential_roadblocks([road_main]): + return True + + return self.battle_default() + + def battle_5(self): + boss = self.map.select(is_boss=True) + if boss: + if not self.check_accessibility(boss[0], fleet=2): + if self.clear_roadblocks([road_main]): + return True + + return self.fleet_2.clear_boss() \ No newline at end of file From c6611f19dc4c959a317f4585aa25255eb03fcf7c Mon Sep 17 00:00:00 2001 From: LmeSzinc Date: Mon, 1 Jun 2020 08:20:13 +0800 Subject: [PATCH 4/6] Add: Enhance module --- assets/cn/retire/DOCK_CHECK.png | Bin 0 -> 7504 bytes assets/cn/retire/DOCK_FILTER.png | Bin 0 -> 10395 bytes assets/cn/retire/DOCK_FILTER_CONFIRM.png | Bin 0 -> 10831 bytes assets/cn/retire/ENHANCE_CONFIRM.png | Bin 0 -> 12599 bytes assets/cn/retire/ENHANCE_FILLED.png | Bin 0 -> 7113 bytes assets/cn/retire/ENHANCE_RECOMMEND.png | Bin 0 -> 13115 bytes assets/cn/retire/ENHANCE_RELOAD.png | Bin 0 -> 5656 bytes assets/cn/retire/FILTER_INDEX_ALL_OFF.png | Bin 0 -> 8670 bytes assets/cn/retire/FILTER_INDEX_ALL_ON.png | Bin 0 -> 8166 bytes .../retire/FILTER_INDEX_ENHANCEMENT_OFF.png | Bin 0 -> 9047 bytes .../cn/retire/FILTER_INDEX_ENHANCEMENT_ON.png | Bin 0 -> 8532 bytes assets/cn/retire/SHIP_DETAIL_CHECK.png | Bin 0 -> 9150 bytes config/template.ini | 5 +- module/base/base.py | 7 +- module/config/argparser.py | 5 +- module/config/argparser_en.py | 5 +- module/config/config.py | 9 +- module/config/dictionary.py | 16 +- module/equipment/equipment.py | 113 +++++++++++--- module/retire/assets.py | 12 ++ module/retire/dock.py | 59 ++++++++ module/retire/enhancement.py | 140 ++++++++++++++++++ module/retire/retirement.py | 44 +++--- 23 files changed, 358 insertions(+), 57 deletions(-) create mode 100644 assets/cn/retire/DOCK_CHECK.png create mode 100644 assets/cn/retire/DOCK_FILTER.png create mode 100644 assets/cn/retire/DOCK_FILTER_CONFIRM.png create mode 100644 assets/cn/retire/ENHANCE_CONFIRM.png create mode 100644 assets/cn/retire/ENHANCE_FILLED.png create mode 100644 assets/cn/retire/ENHANCE_RECOMMEND.png create mode 100644 assets/cn/retire/ENHANCE_RELOAD.png create mode 100644 assets/cn/retire/FILTER_INDEX_ALL_OFF.png create mode 100644 assets/cn/retire/FILTER_INDEX_ALL_ON.png create mode 100644 assets/cn/retire/FILTER_INDEX_ENHANCEMENT_OFF.png create mode 100644 assets/cn/retire/FILTER_INDEX_ENHANCEMENT_ON.png create mode 100644 assets/cn/retire/SHIP_DETAIL_CHECK.png create mode 100644 module/retire/dock.py create mode 100644 module/retire/enhancement.py diff --git a/assets/cn/retire/DOCK_CHECK.png b/assets/cn/retire/DOCK_CHECK.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe7b78e2da32b0d809beab2da15740852562e40 GIT binary patch literal 7504 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 literal 0 HcmV?d00001 diff --git a/assets/cn/retire/DOCK_FILTER.png b/assets/cn/retire/DOCK_FILTER.png new file mode 100644 index 0000000000000000000000000000000000000000..05deb3fab11d503043917ee773f7505f32a29a7f GIT binary patch literal 10395 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 literal 0 HcmV?d00001 diff --git a/assets/cn/retire/ENHANCE_CONFIRM.png b/assets/cn/retire/ENHANCE_CONFIRM.png new file mode 100644 index 0000000000000000000000000000000000000000..7c8eefcfd3c2879058e751601e42ce18ffb8edfd GIT binary patch literal 12599 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 literal 0 HcmV?d00001 diff --git a/assets/cn/retire/ENHANCE_RECOMMEND.png b/assets/cn/retire/ENHANCE_RECOMMEND.png new file mode 100644 index 0000000000000000000000000000000000000000..0d46a394702c311b709c3e03e41cff3900e8586b GIT binary patch literal 13115 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 literal 0 HcmV?d00001 diff --git a/assets/cn/retire/ENHANCE_RELOAD.png b/assets/cn/retire/ENHANCE_RELOAD.png new file mode 100644 index 0000000000000000000000000000000000000000..14b59b77129fee7675f60447cdc1725c4e6598be GIT binary patch literal 5656 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 literal 0 HcmV?d00001 diff --git a/assets/cn/retire/FILTER_INDEX_ENHANCEMENT_ON.png b/assets/cn/retire/FILTER_INDEX_ENHANCEMENT_ON.png new file mode 100644 index 0000000000000000000000000000000000000000..41ff65ee10d08fc2d7af37e14503460ea7ac2f74 GIT binary patch literal 8532 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 235) > 100: + current = idx + 1 + total = idx + 1 + continue + if np.sum(color_similarity_2d(image, color=(140, 162, 181)) > 221) > 100: + total = idx + 1 + else: + break + if not current: + logger.warning('No ship details sidebar active.') + if total == 4: + current = 5 - current + elif total == 5: + current = 6 - current + else: + logger.warning('Ship details sidebar total count error.') + + logger.attr('Detail_sidebar', f'{current}/{total}') + if current == index: + return False + + self.device.click(DETAIL_SIDEBAR[0, total - index]) + return True + + def equip_sidebar_ensure(self, index, skip_first_screenshot=True): + """ + Args: + index (int): + 5 for retrofit. + 4 for enhancement. + 3 for limit break. + 2 for gem / equipment. + 1 for detail. + """ + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + if self._equip_sidebar_click(index): + self.device.sleep((0.3, 0.5)) + continue + else: + break + def _equip_take_off_one(self): bar_timer = Timer(5) off_timer = Timer(5) @@ -98,16 +175,16 @@ class Equipment(InfoHandler): fleet (list[int]): list of equipment record. [3, 1, 1, 1, 1, 1] """ logger.hr('Equipment take off') - self._equip_enter(enter) + self.equip_enter(enter) for index in '9'.join([str(x) for x in fleet if x > 0]): index = int(index) if index == 9: - self._view_next() + self.equip_view_next() else: self._equip_take_off_one() - self._equip_exit(out) + self.equip_quit(out) self.equipment_has_take_on = False def _equip_take_on_one(self, index): @@ -148,14 +225,14 @@ class Equipment(InfoHandler): fleet (list[int]): list of equipment record. [3, 1, 1, 1, 1, 1] """ logger.hr('Equipment take on') - self._equip_enter(enter) + self.equip_enter(enter) for index in '9'.join([str(x) for x in fleet if x > 0]): index = int(index) if index == 9: - self._view_next() + self.equip_view_next() else: self._equip_take_on_one(index=index) - self._equip_exit(out) + self.equip_quit(out) self.equipment_has_take_on = True diff --git a/module/retire/assets.py b/module/retire/assets.py index 240c68d89..3e136c789 100644 --- a/module/retire/assets.py +++ b/module/retire/assets.py @@ -6,8 +6,19 @@ from module.base.template import Template COMMON_SHIP_FILTER_DISABLE = Button(area={'cn': (666, 6, 802, 48), 'en': (665, 5, 803, 49)}, color={'cn': (71, 88, 125), 'en': (74, 90, 125)}, button={'cn': (666, 6, 802, 48), 'en': (665, 5, 803, 49)}, file={'cn': './assets/cn/retire/COMMON_SHIP_FILTER_DISABLE.png', 'en': './assets/en/retire/COMMON_SHIP_FILTER_DISABLE.png'}) COMMON_SHIP_FILTER_ENABLE = Button(area={'cn': (666, 6, 802, 48), 'en': (665, 5, 803, 49)}, color={'cn': (182, 145, 96), 'en': (183, 145, 94)}, button={'cn': (666, 6, 802, 48), 'en': (665, 5, 803, 49)}, file={'cn': './assets/cn/retire/COMMON_SHIP_FILTER_ENABLE.png', 'en': './assets/en/retire/COMMON_SHIP_FILTER_ENABLE.png'}) +DOCK_CHECK = Button(area={'cn': (121, 14, 175, 39), 'en': (121, 14, 175, 39)}, color={'cn': (156, 171, 207), 'en': (156, 171, 207)}, button={'cn': (121, 14, 175, 39), 'en': (121, 14, 175, 39)}, file={'cn': './assets/cn/retire/DOCK_CHECK.png', 'en': './assets/cn/retire/DOCK_CHECK.png'}) +DOCK_FILTER = Button(area={'cn': (1099, 5, 1193, 48), 'en': (1099, 5, 1193, 48)}, color={'cn': (70, 87, 127), 'en': (70, 87, 127)}, button={'cn': (1099, 5, 1193, 48), 'en': (1099, 5, 1193, 48)}, file={'cn': './assets/cn/retire/DOCK_FILTER.png', 'en': './assets/cn/retire/DOCK_FILTER.png'}) +DOCK_FILTER_CONFIRM = Button(area={'cn': (714, 613, 886, 671), 'en': (714, 613, 886, 671)}, color={'cn': (86, 133, 192), 'en': (86, 133, 192)}, button={'cn': (714, 613, 886, 671), 'en': (714, 613, 886, 671)}, file={'cn': './assets/cn/retire/DOCK_FILTER_CONFIRM.png', 'en': './assets/cn/retire/DOCK_FILTER_CONFIRM.png'}) +ENHANCE_CONFIRM = Button(area={'cn': (1127, 602, 1256, 644), 'en': (1127, 602, 1256, 644)}, color={'cn': (197, 146, 83), 'en': (197, 146, 83)}, button={'cn': (1127, 602, 1256, 644), 'en': (1127, 602, 1256, 644)}, file={'cn': './assets/cn/retire/ENHANCE_CONFIRM.png', 'en': './assets/cn/retire/ENHANCE_CONFIRM.png'}) +ENHANCE_FILLED = Button(area={'cn': (728, 440, 781, 454), 'en': (728, 440, 781, 454)}, color={'cn': (156, 138, 127), 'en': (156, 138, 127)}, button={'cn': (728, 440, 781, 454), 'en': (728, 440, 781, 454)}, file={'cn': './assets/cn/retire/ENHANCE_FILLED.png', 'en': './assets/cn/retire/ENHANCE_FILLED.png'}) +ENHANCE_RECOMMEND = Button(area={'cn': (959, 602, 1089, 644), 'en': (959, 602, 1089, 644)}, color={'cn': (85, 131, 190), 'en': (85, 131, 190)}, button={'cn': (959, 602, 1089, 644), 'en': (959, 602, 1089, 644)}, file={'cn': './assets/cn/retire/ENHANCE_RECOMMEND.png', 'en': './assets/cn/retire/ENHANCE_RECOMMEND.png'}) +ENHANCE_RELOAD = Button(area={'cn': (898, 277, 1164, 291), 'en': (898, 277, 1164, 291)}, color={'cn': (251, 231, 94), 'en': (251, 231, 94)}, button={'cn': (898, 277, 1164, 291), 'en': (898, 277, 1164, 291)}, file={'cn': './assets/cn/retire/ENHANCE_RELOAD.png', 'en': './assets/cn/retire/ENHANCE_RELOAD.png'}) EQUIP_CONFIRM = Button(area={'cn': (871, 516, 1044, 573), 'en': (870, 515, 1045, 574)}, color={'cn': (95, 143, 203), 'en': (103, 150, 208)}, button={'cn': (871, 516, 1044, 573), 'en': (870, 515, 1045, 574)}, file={'cn': './assets/cn/retire/EQUIP_CONFIRM.png', 'en': './assets/en/retire/EQUIP_CONFIRM.png'}) EQUIP_CONFIRM_2 = Button(area={'cn': (720, 541, 893, 598), 'en': (719, 540, 894, 600)}, color={'cn': (94, 142, 202), 'en': (108, 153, 208)}, button={'cn': (720, 541, 893, 598), 'en': (719, 540, 894, 600)}, file={'cn': './assets/cn/retire/EQUIP_CONFIRM_2.png', 'en': './assets/en/retire/EQUIP_CONFIRM_2.png'}) +FILTER_INDEX_ALL_OFF = Button(area={'cn': (285, 514, 421, 554), 'en': (285, 514, 421, 554)}, color={'cn': (124, 137, 154), 'en': (124, 137, 154)}, button={'cn': (285, 514, 421, 554), 'en': (285, 514, 421, 554)}, file={'cn': './assets/cn/retire/FILTER_INDEX_ALL_OFF.png', 'en': './assets/cn/retire/FILTER_INDEX_ALL_OFF.png'}) +FILTER_INDEX_ALL_ON = Button(area={'cn': (285, 514, 421, 554), 'en': (285, 514, 421, 554)}, color={'cn': (88, 122, 173), 'en': (88, 122, 173)}, button={'cn': (285, 514, 421, 554), 'en': (285, 514, 421, 554)}, file={'cn': './assets/cn/retire/FILTER_INDEX_ALL_ON.png', 'en': './assets/cn/retire/FILTER_INDEX_ALL_ON.png'}) +FILTER_INDEX_ENHANCEMENT_OFF = Button(area={'cn': (757, 514, 893, 554), 'en': (757, 514, 893, 554)}, color={'cn': (132, 144, 160), 'en': (132, 144, 160)}, button={'cn': (757, 514, 893, 554), 'en': (757, 514, 893, 554)}, file={'cn': './assets/cn/retire/FILTER_INDEX_ENHANCEMENT_OFF.png', 'en': './assets/cn/retire/FILTER_INDEX_ENHANCEMENT_OFF.png'}) +FILTER_INDEX_ENHANCEMENT_ON = Button(area={'cn': (757, 514, 893, 554), 'en': (757, 514, 893, 554)}, color={'cn': (98, 130, 178), 'en': (98, 130, 178)}, button={'cn': (757, 514, 893, 554), 'en': (757, 514, 893, 554)}, file={'cn': './assets/cn/retire/FILTER_INDEX_ENHANCEMENT_ON.png', 'en': './assets/cn/retire/FILTER_INDEX_ENHANCEMENT_ON.png'}) GET_ITEMS_1_RETIREMENT_SAVE = Button(area={'cn': (1031, 656, 1063, 688), 'en': (1031, 656, 1063, 688)}, color={'cn': (49, 44, 54), 'en': (49, 44, 54)}, button={'cn': (1031, 656, 1063, 688), 'en': (1031, 656, 1063, 688)}, file={'cn': './assets/cn/retire/GET_ITEMS_1_RETIREMENT_SAVE.png', 'en': './assets/en/retire/GET_ITEMS_1_RETIREMENT_SAVE.png'}) IN_RETIREMENT_CHECK = Button(area={'cn': (854, 641, 1027, 698), 'en': (853, 640, 1028, 700)}, color={'cn': (184, 99, 89), 'en': (184, 101, 92)}, button={'cn': (854, 641, 1027, 698), 'en': (853, 640, 1028, 700)}, file={'cn': './assets/cn/retire/IN_RETIREMENT_CHECK.png', 'en': './assets/en/retire/IN_RETIREMENT_CHECK.png'}) ONE_CLICK_RETIREMENT = Button(area={'cn': (639, 641, 811, 698), 'en': (637, 640, 813, 700)}, color={'cn': (94, 138, 194), 'en': (93, 136, 192)}, button={'cn': (639, 641, 811, 698), 'en': (637, 640, 813, 700)}, file={'cn': './assets/cn/retire/ONE_CLICK_RETIREMENT.png', 'en': './assets/en/retire/ONE_CLICK_RETIREMENT.png'}) @@ -16,6 +27,7 @@ RETIRE_APPEAR_2 = Button(area={'cn': (553, 492, 727, 550), 'en': (553, 481, 727, RETIRE_APPEAR_3 = Button(area={'cn': (753, 492, 927, 550), 'en': (753, 481, 927, 541)}, color={'cn': (94, 143, 202), 'en': (109, 152, 204)}, button={'cn': (753, 492, 927, 550), 'en': (753, 481, 927, 541)}, file={'cn': './assets/cn/retire/RETIRE_APPEAR_3.png', 'en': './assets/en/retire/RETIRE_APPEAR_3.png'}) SHIP_CONFIRM = Button(area={'cn': (1069, 641, 1241, 698), 'en': (1068, 640, 1243, 700)}, color={'cn': (84, 131, 190), 'en': (92, 136, 192)}, button={'cn': (1069, 641, 1241, 698), 'en': (1068, 640, 1243, 700)}, file={'cn': './assets/cn/retire/SHIP_CONFIRM.png', 'en': './assets/en/retire/SHIP_CONFIRM.png'}) SHIP_CONFIRM_2 = Button(area={'cn': (928, 617, 1100, 674), 'en': (927, 615, 1101, 675)}, color={'cn': (95, 143, 203), 'en': (104, 149, 206)}, button={'cn': (928, 617, 1100, 674), 'en': (927, 615, 1101, 675)}, file={'cn': './assets/cn/retire/SHIP_CONFIRM_2.png', 'en': './assets/en/retire/SHIP_CONFIRM_2.png'}) +SHIP_DETAIL_CHECK = Button(area={'cn': (121, 15, 230, 40), 'en': (121, 15, 230, 40)}, color={'cn': (152, 168, 206), 'en': (152, 168, 206)}, button={'cn': (121, 15, 230, 40), 'en': (121, 15, 230, 40)}, file={'cn': './assets/cn/retire/SHIP_DETAIL_CHECK.png', 'en': './assets/cn/retire/SHIP_DETAIL_CHECK.png'}) SORTING_CLICK = Button(area={'cn': (1004, 14, 1096, 42), 'en': (1002, 12, 1058, 44)}, color={'cn': (49, 54, 67), 'en': (47, 51, 65)}, button={'cn': (1004, 14, 1096, 42), 'en': (1002, 12, 1058, 44)}, file={'cn': './assets/cn/retire/SORTING_CLICK.png', 'en': './assets/en/retire/SORTING_CLICK.png'}) SORT_ASC = Button(area={'cn': (1014, 22, 1019, 26), 'en': (1014, 22, 1019, 26)}, color={'cn': (189, 207, 231), 'en': (189, 207, 231)}, button={'cn': (1014, 22, 1019, 26), 'en': (1014, 22, 1019, 26)}, file={'cn': './assets/cn/retire/SORT_ASC.png', 'en': './assets/en/retire/SORT_ASC.png'}) SORT_DESC = Button(area={'cn': (1014, 29, 1019, 33), 'en': (1014, 29, 1019, 33)}, color={'cn': (189, 207, 231), 'en': (189, 207, 231)}, button={'cn': (1014, 29, 1019, 33), 'en': (1014, 29, 1019, 33)}, file={'cn': './assets/cn/retire/SORT_DESC.png', 'en': './assets/en/retire/SORT_DESC.png'}) diff --git a/module/retire/dock.py b/module/retire/dock.py new file mode 100644 index 000000000..d9ab4ca8f --- /dev/null +++ b/module/retire/dock.py @@ -0,0 +1,59 @@ +from module.base.button import ButtonGrid +from module.base.switch import Switch +from module.equipment.equipment import Equipment +from module.retire.assets import * +from module.ui.ui import UI + +dock_sorting = Switch('Dork_sorting') +dock_sorting.add_status('Ascending', check_button=SORT_ASC, click_button=SORTING_CLICK) +dock_sorting.add_status('Descending', check_button=SORT_DESC, click_button=SORTING_CLICK) + +favourite_filter = Switch('Favourite_filter') +favourite_filter.add_status('on', check_button=COMMON_SHIP_FILTER_ENABLE) +favourite_filter.add_status('off', check_button=COMMON_SHIP_FILTER_DISABLE) + +filter_index_enhanceable = Switch('Filter_index_enhanceable') +filter_index_enhanceable.add_status('on', check_button=FILTER_INDEX_ENHANCEMENT_ON) +filter_index_enhanceable.add_status('off', check_button=FILTER_INDEX_ENHANCEMENT_OFF) + +filter_index_all = Switch('Filter_index_all') +filter_index_all.add_status('on', check_button=FILTER_INDEX_ALL_ON) +filter_index_all.add_status('off', check_button=FILTER_INDEX_ALL_OFF) + + +CARD_GRIDS = ButtonGrid( + origin=(93, 76), delta=(164 + 2 / 3, 227), button_shape=(138, 204), grid_shape=(7, 2), name='CARD') +CARD_RARITY_GRIDS = ButtonGrid( + origin=(93, 76), delta=(164 + 2 / 3, 227), button_shape=(138, 5), grid_shape=(7, 2), name='RARITY') + + +class Dock(UI, Equipment): + def handle_dock_cards_loading(self): + self.device.sleep((1, 1.5)) + + def dock_favourite_set(self, enable=False): + if favourite_filter.set('on' if enable else 'off', main=self): + self.handle_dock_cards_loading() + + def _dock_quit_check_func(self): + return not self.appear(DOCK_CHECK) + + def dock_quit(self): + self.ui_back(check_button=self._dock_quit_check_func, skip_first_screenshot=True) + + def dock_sort_method_dsc_set(self, enable=True): + if dock_sorting.set('on' if enable else 'off', main=self): + self.handle_dock_cards_loading() + + def dock_filter_enter(self): + self.ui_click(DOCK_FILTER, check_button=DOCK_FILTER_CONFIRM, skip_first_screenshot=True) + + def dock_filter_confirm(self): + self.ui_click(DOCK_FILTER_CONFIRM, check_button=DOCK_FILTER, skip_first_screenshot=True) + self.handle_dock_cards_loading() + + def dock_filter_index_enhance_set(self, enable): + filter_index_enhanceable.set('on' if enable else 'off', main=self) + + def dock_filter_index_all_set(self, enable): + filter_index_all.set('on' if enable else 'off', main=self) diff --git a/module/retire/enhancement.py b/module/retire/enhancement.py new file mode 100644 index 000000000..a7fefa9f9 --- /dev/null +++ b/module/retire/enhancement.py @@ -0,0 +1,140 @@ +import numpy as np + +from module.base.utils import color_bar_percentage +from module.combat.assets import GET_ITEMS_1 +from module.exception import ScriptError +from module.logger import logger +from module.retire.assets import * +from module.retire.dock import Dock, CARD_GRIDS + + +class Enhancement(Dock): + @property + def _retire_amount(self): + if self.config.RETIRE_AMOUNT == 'all': + return 2000 + if self.config.RETIRE_AMOUNT == '10': + return 10 + return 10 + + def _enhance_enter(self, favourite=False): + if favourite: + self.dock_favourite_set(enable=True) + + self.dock_filter_enter() + self.dock_filter_index_enhance_set(enable=True) + self.dock_filter_confirm() + + self.equip_enter(CARD_GRIDS[(0, 0)], check_button=SHIP_DETAIL_CHECK, long_click=False) + + def _enhance_quit(self): + self.equip_quit(DOCK_FILTER) + self.dock_favourite_set(enable=False) + self.dock_filter_enter() + self.dock_filter_index_all_set(enable=True) + self.dock_filter_confirm() + + def _enhance_confirm(self): + executed = False + while 1: + self.device.screenshot() + + # if self.appear_then_click(ENHANCE_CONFIRM, offset=(30, 30), interval=3): + # continue + if self.appear_then_click(EQUIP_CONFIRM, offset=(30, 30), interval=3): + continue + if self.appear_then_click(EQUIP_CONFIRM_2, offset=(30, 30), interval=3): + continue + if self.appear(GET_ITEMS_1, interval=2): + self.device.click(GET_ITEMS_1_RETIREMENT_SAVE) + self.interval_reset(ENHANCE_CONFIRM) + executed = True + continue + + # End + if executed and self.appear(ENHANCE_CONFIRM, offset=(30, 30)): + self.ensure_no_info_bar() + break + + def _enhance_choose(self, skip_first_screenshot=True): + """ + Page require: page_ship_enhance, without info_bar + """ + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + + if self.appear(EQUIP_CONFIRM, offset=(30, 30)): + return True + + self.equip_sidebar_ensure(index=4) + self.wait_until_appear(ENHANCE_RECOMMEND, offset=(5, 5), skip_first_screenshot=True) + + + status = color_bar_percentage(self.device.image, area=ENHANCE_RELOAD.area, prev_color=(231, 178, 74)) + logger.attr('Reload_enhanced', f'{int(status * 100)}%') + choose = np.sum(np.array(self.device.image.crop(ENHANCE_FILLED.area)) > 200) > 100 + + if self.info_bar_count(): + if status > 0.98: + logger.info('Fully enhanced for this ship') + self.equip_view_next(check_button=ENHANCE_RECOMMEND) + self.ensure_no_info_bar() + continue + else: + if choose: + logger.info('Unable to enhance this ship') + self.equip_view_next(check_button=ENHANCE_RECOMMEND) + self.ensure_no_info_bar() + continue + else: + logger.info('Enhancement material exhausted') + return False + + if self.appear_then_click(ENHANCE_RECOMMEND, offset=(5, 5), interval=2): + self.device.sleep(0.3) + self.appear_then_click(ENHANCE_CONFIRM) + + def enhance_ships(self, favourite=None): + """Page require: page_dock + + Args: + favourite (bool): + + Returns: + int: total enhanced + """ + if favourite is None: + favourite = self.config.ENHANCE_FAVOURITE + + logger.hr('Enhancement') + logger.info(f'Favourite={favourite}') + self._enhance_enter(favourite=favourite) + total = 0 + + while 1: + if not self._enhance_choose(): + break + self._enhance_confirm() + total += 10 + if total >= self._retire_amount: + break + + self._enhance_quit() + return total + + def _enhance_handler(self): + self.ui_click(RETIRE_APPEAR_3, check_button=DOCK_FILTER, skip_first_screenshot=True) + self.handle_dock_cards_loading() + + total = self.enhance_ships() + + self.dock_quit() + self.config.DOCK_FULL_TRIGGERED = True + + if total == 0: + logger.warning('No ship enhanced, exit') + raise ScriptError('No ship enhanced, exit') + return True diff --git a/module/retire/retirement.py b/module/retire/retirement.py index 94b690724..518aeb0a9 100644 --- a/module/retire/retirement.py +++ b/module/retire/retirement.py @@ -3,13 +3,14 @@ from module.base.decorator import Config from module.base.utils import get_color, color_similar from module.combat.assets import GET_ITEMS_1 from module.exception import ScriptError -from module.handler.info_handler import InfoHandler from module.logger import logger from module.retire.assets import * -from module.ui.ui import UI +from module.retire.enhancement import Enhancement -CARD_GRIDS = ButtonGrid(origin=(93, 76), delta=(164 + 2 / 3, 227), button_shape=(138, 204), grid_shape=(7, 2), name='CARD') -CARD_RARITY_GRIDS = ButtonGrid(origin=(93, 76), delta=(164 + 2 / 3, 227), button_shape=(138, 5), grid_shape=(7, 2), name='RARITY') +CARD_GRIDS = ButtonGrid( + origin=(93, 76), delta=(164 + 2 / 3, 227), button_shape=(138, 204), grid_shape=(7, 2), name='CARD') +CARD_RARITY_GRIDS = ButtonGrid( + origin=(93, 76), delta=(164 + 2 / 3, 227), button_shape=(138, 5), grid_shape=(7, 2), name='RARITY') CARD_RARITY_COLORS = { 'N': (174, 176, 187), @@ -20,10 +21,7 @@ CARD_RARITY_COLORS = { } -class Retirement(UI, InfoHandler): - def _handle_retirement_cards_loading(self): - self.device.sleep((1, 1.5)) - +class Retirement(Enhancement): def _retirement_choose(self, amount=10, target_rarity=('N',)): """ Args: @@ -80,7 +78,7 @@ class Retirement(UI, InfoHandler): if current != method: logger.info(f'Sorting set to {method}') self.device.click(SORTING_CLICK) - self._handle_retirement_cards_loading() + self.handle_dock_cards_loading() self.device.screenshot() return True else: @@ -106,7 +104,7 @@ class Retirement(UI, InfoHandler): if current != enable: logger.info(f'Common ship filter set to {enable}') self.device.click(COMMON_SHIP_FILTER_ENABLE) - self._handle_retirement_cards_loading() + self.handle_dock_cards_loading() self.device.screenshot() return True else: @@ -152,14 +150,6 @@ class Retirement(UI, InfoHandler): def _retirement_quit(self): self.ui_back(check_button=self._retirement_quit_check_func, skip_first_screenshot=True) - @property - def _retire_amount(self): - if self.config.RETIRE_MODE == 'all': - return 2000 - if self.config.RETIRE_MODE == '10': - return 10 - return 10 - @property def _retire_rarity(self): rarity = set() @@ -173,7 +163,7 @@ class Retirement(UI, InfoHandler): rarity.add('SSR') return rarity - @Config.when(USE_ONE_CLICK_RETIREMENT=True) + @Config.when(RETIREMENT_METHOD='one_click_retire') def retire_ships(self, amount=None, rarity=None): logger.hr('Retirement') logger.info('Using one click retirement.') @@ -206,7 +196,7 @@ class Retirement(UI, InfoHandler): logger.info(f'Total retired round: {total // 10}') return total - @Config.when(USE_ONE_CLICK_RETIREMENT=False) + @Config.when(RETIREMENT_METHOD='old_retire') def retire_ships(self, amount=None, rarity=None): """ Args: @@ -242,16 +232,22 @@ class Retirement(UI, InfoHandler): logger.info(f'Total retired: {total}') return total - def handle_retirement(self, amount=None, rarity=None): + def handle_retirement(self): if not self.config.ENABLE_RETIREMENT: return False if not self.retirement_appear(): return False - self.ui_click(RETIRE_APPEAR_1, check_button=IN_RETIREMENT_CHECK, skip_first_screenshot=True) - self._handle_retirement_cards_loading() + if self.config.RETIREMENT_METHOD == 'enhance': + return self._enhance_handler() + else: + return self._retire_handler() - total = self.retire_ships(amount=amount, rarity=rarity) + def _retire_handler(self): + self.ui_click(RETIRE_APPEAR_1, check_button=IN_RETIREMENT_CHECK, skip_first_screenshot=True) + self.handle_dock_cards_loading() + + total = self.retire_ships() self._retirement_quit() self.config.DOCK_FULL_TRIGGERED = True From f406022da0abea1448f81973cafea39442cabbb3 Mon Sep 17 00:00:00 2001 From: LmeSzinc Date: Mon, 1 Jun 2020 08:51:28 +0800 Subject: [PATCH 5/6] Fix: [EN] commission classification --- module/reward/commission.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/module/reward/commission.py b/module/reward/commission.py index de375c9ad..b5c8dafea 100644 --- a/module/reward/commission.py +++ b/module/reward/commission.py @@ -32,19 +32,19 @@ dictionary_cn = { 'urgent_ship': ['观舰'] } dictionary_en = { - 'major_comm': ['SelfTrainingl', 'Defense Exercise', 'Research Mission', 'Prep', 'Class', 'Cargo Transport'], + 'major_comm': ['SelfTraining', 'DefenseExercise', 'ResearchMission', 'Prep', 'Class', 'CargoTransport'], 'daily_comm': ['Daily', 'Awakening'], - 'extra_drill': ['Sailing', 'Defense Patrol', 'Buoy'], - 'extra_part': ['veinprotectoncommisionll', 'Forestprtectoncommisionl', 'Forestprotectoncommisionll'], - 'extra_cube': ['Exercise'], - 'extra_oil': ['oilextraction', 'FleetCargoTransport', 'oilExtractianl', '', 'oilExtractiaonll'], - 'extra_book': ['LargeMerchantEscort'], - 'urgent_drill': ['Cargo Defense', 'Scouts', 'Force', 'Elites', 'FrontierDefensePatrol'], - 'urgent_part': ['Lavella', 'Maui', 'Rendova', 'AidingWongbanna'], - 'urgent_book': ['Tyrant', 'Poro', 'Makira', 'Kapolo', 'Manne ', 'St.', 'Isle', 'Kotlin'], - 'urgent_box': ['Gear Transport', 'Handover'], - 'urgent_cube': ['MerchantRescuel', 'Attack'], - 'urgent_gem': ['VIP ', 'Holiday', 'Patrol Escort'], + 'extra_drill': ['Sailing', 'DefensePatrol', 'Buoy'], + 'extra_part': ['Protection'], + 'extra_cube': ['FleetExercise', 'EscortExercise', 'FleetCargo', 'CombatExercise'], + 'extra_oil': ['oil'], + 'extra_book': ['MerchantEscort'], + 'urgent_drill': ['CargoDefense', 'Destroy'], + 'urgent_part': ['Lavella', 'Maui', 'Rendova', 'banna'], + 'urgent_book': ['Tyrant', 'Poro', 'Makira', 'Kapolo', 'Manne ', 'Mary', 'Isle', 'Kotlin'], + 'urgent_box': ['Gear', 'Handover'], + 'urgent_cube': ['MerchantRescue', 'Attack'], + 'urgent_gem': ['VIP ', 'Holiday', 'PatrolEscort'], 'urgent_ship': ['Launch'] } @@ -181,7 +181,7 @@ class Commission: Returns: timedelta: datetime.timedelta instance. """ - string = string.replace('D', '0').replace(' ', '').replace('-', '') # Poor OCR + string = string.replace('D', '0') # Poor OCR result = re.search('(\d+):(\d+):(\d+)', string) if not result: logger.warning(f'Invalid time string: {string}') @@ -200,6 +200,7 @@ class Commission: Returns: str: Commission genre, such as 'urgent_gem'. """ + string = string.replace(' ', '').replace('-', '') for key, value in dictionary_en.items(): for keyword in value: if keyword in string: From ad5fcc2abca66ea89b427bd6ba7242a0a3a685bf Mon Sep 17 00:00:00 2001 From: LmeSzinc Date: Mon, 1 Jun 2020 09:25:51 +0800 Subject: [PATCH 6/6] Fix: No ship to enhance - When there ship to enhance, but dock full, try one_click_retire - Fix retire SR ship when using one_click_retire --- module/retire/dock.py | 2 +- module/retire/enhancement.py | 6 +----- module/retire/retirement.py | 32 ++++++++++++++++++++++++-------- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/module/retire/dock.py b/module/retire/dock.py index d9ab4ca8f..027a242aa 100644 --- a/module/retire/dock.py +++ b/module/retire/dock.py @@ -36,7 +36,7 @@ class Dock(UI, Equipment): self.handle_dock_cards_loading() def _dock_quit_check_func(self): - return not self.appear(DOCK_CHECK) + return not self.appear(DOCK_CHECK, offset=(20, 20)) def dock_quit(self): self.ui_back(check_button=self._dock_quit_check_func, skip_first_screenshot=True) diff --git a/module/retire/enhancement.py b/module/retire/enhancement.py index a7fefa9f9..925adca46 100644 --- a/module/retire/enhancement.py +++ b/module/retire/enhancement.py @@ -72,7 +72,6 @@ class Enhancement(Dock): self.equip_sidebar_ensure(index=4) self.wait_until_appear(ENHANCE_RECOMMEND, offset=(5, 5), skip_first_screenshot=True) - status = color_bar_percentage(self.device.image, area=ENHANCE_RELOAD.area, prev_color=(231, 178, 74)) logger.attr('Reload_enhanced', f'{int(status * 100)}%') choose = np.sum(np.array(self.device.image.crop(ENHANCE_FILLED.area)) > 200) > 100 @@ -134,7 +133,4 @@ class Enhancement(Dock): self.dock_quit() self.config.DOCK_FULL_TRIGGERED = True - if total == 0: - logger.warning('No ship enhanced, exit') - raise ScriptError('No ship enhanced, exit') - return True + return total diff --git a/module/retire/retirement.py b/module/retire/retirement.py index 518aeb0a9..5ee4e0e80 100644 --- a/module/retire/retirement.py +++ b/module/retire/retirement.py @@ -22,6 +22,8 @@ CARD_RARITY_COLORS = { class Retirement(Enhancement): + _unable_to_enhance = False + def _retirement_choose(self, amount=10, target_rarity=('N',)): """ Args: @@ -114,7 +116,7 @@ class Retirement(Enhancement): executed = False while 1: self.device.screenshot() - if self.config.RETIRE_SR or self.config.RETIRE_SSR or self.config.USE_ONE_CLICK_RETIREMENT: + if self.config.RETIRE_SR or self.config.RETIRE_SSR or self.config.RETIREMENT_METHOD == 'one_click_retire': if self.handle_popup_confirm(): continue if self.appear_then_click(SHIP_CONFIRM, offset=30, interval=2): @@ -238,10 +240,27 @@ class Retirement(Enhancement): if not self.retirement_appear(): return False - if self.config.RETIREMENT_METHOD == 'enhance': - return self._enhance_handler() + if self._unable_to_enhance: + self.config.RETIREMENT_METHOD = 'one_click_retire' + total = self._retire_handler() + self.config.RETIREMENT_METHOD = 'enhance' + self._unable_to_enhance = False + if not total: + logger.warning('No ship retired, exit') + raise ScriptError('No ship retired, exit') + elif 'retire' in self.config.RETIREMENT_METHOD or self._unable_to_enhance: + total = self._retire_handler() + self._unable_to_enhance = False + if not total: + logger.warning('No ship retired, exit') + raise ScriptError('No ship retired, exit') else: - return self._retire_handler() + total = self._enhance_handler() + if not total: + logger.info('No ship to enhance, but dock full, will try retire') + self._unable_to_enhance = True + + return True def _retire_handler(self): self.ui_click(RETIRE_APPEAR_1, check_button=IN_RETIREMENT_CHECK, skip_first_screenshot=True) @@ -252,7 +271,4 @@ class Retirement(Enhancement): self._retirement_quit() self.config.DOCK_FULL_TRIGGERED = True - if total == 0: - logger.warning('No ship retired, exit') - raise ScriptError('No ship retired, exit') - return True + return total