diff --git a/assets/cn/campaign/my_DOCK_SHIP_DOWN.png b/assets/cn/campaign/my_DOCK_SHIP_DOWN.png new file mode 100644 index 000000000..412a7c0f7 Binary files /dev/null and b/assets/cn/campaign/my_DOCK_SHIP_DOWN.png differ diff --git a/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png b/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png new file mode 100644 index 000000000..d3cadfafc Binary files /dev/null and b/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png differ diff --git a/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png b/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png new file mode 100644 index 000000000..29a02b152 Binary files /dev/null and b/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png differ diff --git a/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2.png b/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2.png new file mode 100644 index 000000000..2e98744c3 Binary files /dev/null and b/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2.png differ diff --git a/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png b/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png new file mode 100644 index 000000000..646aafa30 Binary files /dev/null and b/assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png differ diff --git a/assets/cn/campaign/my_FLEET_ENTER_HARD_1.png b/assets/cn/campaign/my_FLEET_ENTER_HARD_1.png new file mode 100644 index 000000000..e3e22d7f0 Binary files /dev/null and b/assets/cn/campaign/my_FLEET_ENTER_HARD_1.png differ diff --git a/assets/cn/campaign/my_FLEET_ENTER_HARD_1_3.png b/assets/cn/campaign/my_FLEET_ENTER_HARD_1_3.png new file mode 100644 index 000000000..ebcebeb38 Binary files /dev/null and b/assets/cn/campaign/my_FLEET_ENTER_HARD_1_3.png differ diff --git a/assets/cn/campaign/my_FLEET_ENTER_HARD_2.png b/assets/cn/campaign/my_FLEET_ENTER_HARD_2.png new file mode 100644 index 000000000..37a52e5f4 Binary files /dev/null and b/assets/cn/campaign/my_FLEET_ENTER_HARD_2.png differ diff --git a/assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png b/assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png new file mode 100644 index 000000000..819fa9dcc Binary files /dev/null and b/assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png differ diff --git a/assets/cn/equipment/old_EQUIP_1.png b/assets/cn/equipment/old_EQUIP_1.png new file mode 100644 index 000000000..53f70fd22 Binary files /dev/null and b/assets/cn/equipment/old_EQUIP_1.png differ diff --git a/assets/cn/equipment/old_EQUIP_2.png b/assets/cn/equipment/old_EQUIP_2.png new file mode 100644 index 000000000..ecc6cf29b Binary files /dev/null and b/assets/cn/equipment/old_EQUIP_2.png differ diff --git a/assets/cn/equipment/old_EQUIP_3.png b/assets/cn/equipment/old_EQUIP_3.png new file mode 100644 index 000000000..dc890355f Binary files /dev/null and b/assets/cn/equipment/old_EQUIP_3.png differ diff --git a/assets/cn/equipment/old_FLEET_DETAIL_CHECK.png b/assets/cn/equipment/old_FLEET_DETAIL_CHECK.png new file mode 100644 index 000000000..0bfc387c4 Binary files /dev/null and b/assets/cn/equipment/old_FLEET_DETAIL_CHECK.png differ diff --git a/assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png b/assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png new file mode 100644 index 000000000..6d7c68e36 Binary files /dev/null and b/assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png differ diff --git a/config/template.json b/config/template.json index 4a57f0a48..92cf25714 100644 --- a/config/template.json +++ b/config/template.json @@ -619,6 +619,8 @@ "CommonCV": "any", "ChangeVanguard": "ship", "CommonDD": "any", + "ALLowLowVanguardLevel": true, + "StopIFAutoNotEnsured": true, "CommissionLimit": true }, "Campaign": { @@ -650,6 +652,20 @@ "Fleet2Step": 2, "FleetOrder": "fleet1_all_fleet2_standby" }, + "VanguardFilter": { + "Sort": "default", + "Index": "default", + "Faction": "default", + "Rarity": "default", + "Extra": "default" + }, + "FlagshipFilter": { + "Sort": "default", + "Index": "default", + "Faction": "default", + "Rarity": "default", + "Extra": "default" + }, "Storage": { "Storage": {} } diff --git a/module/campaign/gems_farming.py b/module/campaign/gems_farming.py index e1d0098ea..e48972958 100644 --- a/module/campaign/gems_farming.py +++ b/module/campaign/gems_farming.py @@ -456,3 +456,547 @@ class GemsFarming(CampaignRun, FleetEquipment, Dock): continue else: break + + +import inflection +from module.campaign.my_assets import * +from module.exception import * +from module.equipment.old_fleet_equipment import DailyEquipment +from module.equipment.old_equipment_change import OldEquipmentChange +from module.equipment.old_assets import * + +class GemsFarming(GemsFarming): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.old_equip = DailyEquipment(config=self.config, device=self.device) + + def event_hard_mode_override(self): + HARDMODEMAPS = [ + 'c1', 'c2', 'c3', + 'd1', 'd2', 'd3', + 'ht1', 'ht2', 'ht3', 'ht4', 'ht5', 'ht6', + ] + if inflection.underscore(self.config.Campaign_Name) in HARDMODEMAPS: + logger.info('Is in hard mode, switch ship changing method.') + self._ship_detail_enter = self._ship_detail_enter_hard + self._fleet_detail_enter = self._fleet_detail_enter_hard + self.page_fleet_check_button = FLEET_PREPARATION + if self.config.Fleet_FleetOrder == 'fleet1_all_fleet2_standby': + self.FLEET_ENTER_FLAGSHIP = my_FLEET_ENTER_FLAGSHIP_HARD_1 + self.FLEET_ENTER = my_FLEET_ENTER_HARD_1 + self.FLEET_ENTER_FLAGSHIP_3_POSITION = my_FLEET_ENTER_FLAGSHIP_HARD_1_3 + self.FLEET_ENTER_3_POSITION = my_FLEET_ENTER_HARD_1_3 + elif self.config.Fleet_FleetOrder == 'fleet1_standby_fleet2_all': + self.FLEET_ENTER_FLAGSHIP = my_FLEET_ENTER_FLAGSHIP_HARD_2 + self.FLEET_ENTER = my_FLEET_ENTER_HARD_2 + self.FLEET_ENTER_FLAGSHIP_3_POSITION = my_FLEET_ENTER_FLAGSHIP_HARD_2_3 + self.FLEET_ENTER_3_POSITION = my_FLEET_ENTER_HARD_2_3 + else: + logger.critical('Fleet Order Error, please check your settings') + from module.exception import RequestHumanTakeover + raise RequestHumanTakeover + self.hard_mode = True + else: + self._ship_detail_enter = self._ship_detail_enter + self._fleet_detail_enter = self._fleet_detail_enter + self.page_fleet_check_button = page_fleet.check_button + self.FLEET_ENTER_FLAGSHIP = old_FLEET_ENTER_FLAGSHIP + self._FLEET_ENTER_FLAGSHIP = self.FLEET_ENTER_FLAGSHIP + self.FLEET_ENTER = FLEET_ENTER + self._FLEET_ENTER = FLEET_ENTER + self.hard_mode = False + + def load_campaign(self, name, folder='campaign_main'): + CampaignRun.load_campaign(self, name, folder) + + class GemsCampaign(GemsCampaignOverride, self.module.Campaign): + pass + + self.campaign = GemsCampaign(device=self.campaign.device, config=self.campaign.config) + 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 + + def _fleet_detail_enter(self): + """ + Enter GEMS_FLEET page + """ + self.ui_ensure(page_fleet) + _fleet_to_change = self.config.Fleet_Fleet1 + if self.config.Fleet_FleetOrder == 'fleet1_all_fleet2_standby': + _fleet_to_change = self.config.Fleet_Fleet1 + elif self.config.Fleet_FleetOrder == 'fleet1_standby_fleet2_all': + _fleet_to_change = self.config.Fleet_Fleet2 + self.ui_ensure_index(_fleet_to_change, letter=OCR_FLEET_INDEX, + next_button=FLEET_NEXT, prev_button=FLEET_PREV, skip_first_screenshot=True) + + def _ship_detail_enter(self, button): + self._fleet_detail_enter() + self.old_equip.equip_enter(button) + + def _fleet_detail_enter_hard(self): + from module.retire.retirement import Retirement + _retire_class = Retirement(config=self.config, device=self.device) + self.campaign.ensure_campaign_ui(self.stage) + button_area = self.campaign.ENTRANCE.button + button = Button(name=str(self.stage), area=button_area, color=(0, 0, 0), button=button_area) + for __ in range(5): + self.campaign.ensure_campaign_ui(self.stage) + self.ui_click(click_button=button, appear_button=BACK_ARROW, check_button=MAP_PREPARATION) + for _ in range(30): + self.device.screenshot() + if self.appear_then_click(MAP_PREPARATION): + self.device.sleep(0.5) + if _retire_class.handle_retirement(): + continue + if self.appear(button=FLEET_PREPARATION, offset=(50, 50)): + return + from module.exception import GameStuckError + raise GameStuckError + + def _ship_detail_enter_hard(self, button): + self._fleet_detail_enter_hard() + self.old_equip.equip_enter(button) + + def flagship_change(self): + """ + Change flagship and flagship's equipment + If config.GemsFarming_CommonCV == 'any', only change auxiliary equipment + + 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) + if self.change_flagship_equip: + logger.hr('Record flagship equipment', level=2) + self._ship_detail_enter(self.FLEET_ENTER_FLAGSHIP) + self.old_equip.record_equipment(index_list=index_list) + self.old_equip._equip_take_off_one() + self.ui_back(self.page_fleet_check_button) + + logger.hr('Change flagship', level=2) + self._fleet_detail_enter() + success = self.flagship_change_execute() + + if self.change_flagship_equip: + logger.hr('Equip flagship equipment', level=2) + self._ship_detail_enter(self.FLEET_ENTER_FLAGSHIP) + self.old_equip._equip_take_off_one() + + OldEquipmentChange.equipment_take_on(self.old_equip, index_list=index_list) + self.ui_back(self.page_fleet_check_button) + + return success + + def vanguard_change(self): + """ + Change vanguard and vanguard's equipment + + Returns: + bool: True if vanguard changed + """ + + logger.hr('Change vanguard', level=1) + logger.attr('ChangeVanguard', self.config.GemsFarming_ChangeVanguard) + if self.change_vanguard_equip: + logger.hr('Record vanguard equipment', level=2) + self._ship_detail_enter(self.FLEET_ENTER) + self.old_equip.record_equipment() + self.old_equip._equip_take_off_one() + self.ui_back(self.page_fleet_check_button) + + logger.hr('Change vanguard', level=2) + self._fleet_detail_enter() + success = self.vanguard_change_execute() + + if self.change_vanguard_equip: + logger.hr('Equip vanguard equipment', level=2) + self._ship_detail_enter(self.FLEET_ENTER) + self.old_equip._equip_take_off_one() + + self.old_equip.equipment_take_on() + self.ui_back(self.page_fleet_check_button) + + return success + + def _ship_change_confirm(self, button): + + self.dock_select_one(button) + self.dock_filter_set() + self.dock_sort_method_dsc_set() + self.dock_select_confirm(check_button=self.page_fleet_check_button) + + def get_common_rarity_cv(self, lv=31, emotion=16): + """ + Get a common rarity cv by config.GemsFarming_CommonCV + If config.GemsFarming_CommonCV == 'any', return a common lv1 ~ lv33 cv + Returns: + Ship: + """ + + logger.hr('FINDING FLAGSHIP') + + scanner = ShipScanner( + level=(1, lv), emotion=(emotion, 150), fleet=self.config.Fleet_Fleet1, status='free') + scanner.disable('rarity') + + if self.config.GemsFarming_CommonCV == 'any': + + self.dock_sort_method_dsc_set(False) + + ships = scanner.scan(self.device.image) + if ships: + # Don't need to change current + return ships + + scanner.set_limitation(fleet=0) + return scanner.scan(self.device.image, output=False) + + else: + template = { + 'BOGUE': TEMPLATE_BOGUE, + 'HERMES': TEMPLATE_HERMES, + 'LANGLEY': TEMPLATE_LANGLEY, + 'RANGER': TEMPLATE_RANGER + }[f'{self.config.GemsFarming_CommonCV.upper()}'] + + self.dock_sort_method_dsc_set() + + ships = scanner.scan(self.device.image) + if ships: + # Don't need to change current + return ships + + scanner.set_limitation(fleet=0) + candidates = [ship for ship in scanner.scan(self.device.image, output=False) + if template.match(self.image_crop(ship.button, copy=False), similarity=SIM_VALUE)] + + if candidates: + return candidates + + logger.info('No specific CV was found, try reversed order.') + self.dock_sort_method_dsc_set(False) + + candidates = [ship for ship in scanner.scan(self.device.image) + if template.match(self.image_crop(ship.button, copy=False), similarity=SIM_VALUE)] + + return candidates + + def get_common_rarity_dd(self, emotion=16): + """ + Get a common rarity dd with level is 100 (70 for servers except CN) and emotion > 10 + Returns: + Ship: + """ + logger.hr('FINDING VANGUARD') + + if self.config.SERVER in ['cn']: + max_level = 100 + else: + max_level = 70 + if self.config.full_config.Hook_HookGeneral_Enable and self.config.GemsFarming_ALLowLowVanguardLevel: + min_level = 2 + else: + min_level = max_level + if self.hard_mode: + min_level = max(min_level, 49) + scanner = ShipScanner(level=(min_level, max_level), emotion=(emotion, 150), status='free') + scanner.disable('rarity') + + self.dock_sort_method_dsc_set() + + ships = scanner.scan(self.device.image) + if ships: + # Don't need to change current + return ships + + scanner.set_limitation(fleet=0) + + if self.config.GemsFarming_CommonDD == 'any': + return scanner.scan(self.device.image, output=False) + + candidates = self.find_candidates(self.get_templates(self.config.GemsFarming_CommonDD), scanner) + + if candidates: + return candidates + + logger.info('No specific DD was found, try reversed order.') + self.dock_sort_method_dsc_set(False) + + candidates = self.find_candidates(self.get_templates(self.config.GemsFarming_CommonDD), scanner) + + return candidates + + def find_candidates(self, template, scanner): + """ + Find candidates based on template matching using a scanner. + + """ + candidates = [] + for item in template: + candidates = [ship for ship in scanner.scan(self.device.image, output=False) + if item.match(self.image_crop(ship.button, copy=False), similarity=SIM_VALUE)] + if candidates: + break + return candidates + + @staticmethod + def get_templates(common_dd): + """ + Returns the corresponding template list based on CommonDD + """ + if common_dd == 'any': + return [ + TEMPLATE_CASSIN_1, TEMPLATE_CASSIN_2, + TEMPLATE_DOWNES_1, TEMPLATE_DOWNES_2, + TEMPLATE_AULICK, + TEMPLATE_FOOTE + ] + elif common_dd == 'aulick_or_foote': + return [ + TEMPLATE_AULICK, + TEMPLATE_FOOTE + ] + elif common_dd == 'cassin_or_downes': + return [ + TEMPLATE_CASSIN_1, TEMPLATE_CASSIN_2, + TEMPLATE_DOWNES_1, TEMPLATE_DOWNES_2 + ] + else: + logger.error(f'Invalid CommonDD setting: {common_dd}') + raise ScriptError(f'Invalid CommonDD setting: {common_dd}') + + def solve_hard_flagship_black(self): + if self.hard_mode: + self.ui_click(self.FLEET_ENTER_FLAGSHIP, + appear_button=self.page_fleet_check_button, check_button=DOCK_CHECK, + skip_first_screenshot=True) + if self.appear(my_DOCK_SHIP_DOWN): + self.ui_click(my_DOCK_SHIP_DOWN, + appear_button=DOCK_CHECK, check_button=self.page_fleet_check_button, + skip_first_screenshot=True) + else: + self.ui_back(check_button=FLEET_PREPARATION) + self._FLEET_ENTER_FLAGSHIP = self.FLEET_ENTER_FLAGSHIP + self.FLEET_ENTER_FLAGSHIP = self.FLEET_ENTER_FLAGSHIP_3_POSITION + + def flagship_change_execute(self): + """ + Returns: + bool: If success. + + Pages: + in: page_fleet + out: page_fleet + """ + self.solve_hard_flagship_black() + self.ui_click(self.FLEET_ENTER_FLAGSHIP, + appear_button=self.page_fleet_check_button, check_button=DOCK_CHECK, skip_first_screenshot=True) + + # self.dock_filter_set( + # index='cv', rarity='common', extra='enhanceable', sort='total') + + self.dock_filter_set( + sort=self.config.FlagshipFilter_Sort if self.config.FlagshipFilter_Sort != 'default' else 'total', + index=self.config.FlagshipFilter_Index if self.config.FlagshipFilter_Index != 'default' else 'cv', + faction=self.config.FlagshipFilter_Faction if self.config.FlagshipFilter_Faction != 'default' else 'all', + rarity=self.config.FlagshipFilter_Rarity if self.config.FlagshipFilter_Rarity != 'default' else 'common', + extra=self.config.FlagshipFilter_Extra if self.config.FlagshipFilter_Extra != 'default' else 'enhanceable' + ) + self.dock_favourite_set(False) + + ship = self.get_common_rarity_cv() + if ship: + self._ship_change_confirm(min(ship, key=lambda s: (s.level, -s.emotion)).button) + if self.hard_mode: + self.FLEET_ENTER_FLAGSHIP = self._FLEET_ENTER_FLAGSHIP + + logger.info('Change flagship success') + return True + else: + logger.info('Change flagship failed, no CV in common rarity.') + + if self.config.SERVER in ['cn']: + max_level = 100 + else: + max_level = 70 + ship = self.get_common_rarity_cv(lv=max_level, emotion=0) + if ship and self.hard_mode: + self._ship_change_confirm(min(ship, key=lambda s: (s.level, -s.emotion)).button) + else: + if self.hard_mode: + raise RequestHumanTakeover + self.dock_filter_set() + self.ui_back(check_button=self.page_fleet_check_button) + if self.hard_mode: + self.FLEET_ENTER_FLAGSHIP = self._FLEET_ENTER_FLAGSHIP + return False + + def solve_hard_vanguard_black(self): + if self.hard_mode: + self.ui_click(self.FLEET_ENTER, + appear_button=self.page_fleet_check_button, check_button=DOCK_CHECK, + skip_first_screenshot=True) + if self.appear(my_DOCK_SHIP_DOWN): + self.ui_click(my_DOCK_SHIP_DOWN, + appear_button=DOCK_CHECK, check_button=self.page_fleet_check_button, + skip_first_screenshot=True) + else: + self.ui_back(check_button=FLEET_PREPARATION) + self._FLEET_ENTER = self.FLEET_ENTER + self.FLEET_ENTER = self.FLEET_ENTER_3_POSITION + + def vanguard_change_execute(self): + """ + Returns: + bool: If success. + + Pages: + in: page_fleet + out: page_fleet + """ + self.solve_hard_vanguard_black() + self.ui_click(self.FLEET_ENTER, + appear_button=self.page_fleet_check_button, check_button=DOCK_CHECK, skip_first_screenshot=True) + # self.dock_filter_set( + # index='dd', rarity='common', faction='eagle', extra='can_limit_break') + + self.dock_filter_set( + sort=self.config.VanguardFilter_Sort if self.config.VanguardFilter_Sort != 'default' else 'level', + index=self.config.VanguardFilter_Index if self.config.VanguardFilter_Index != 'default' else 'dd', + faction=self.config.VanguardFilter_Faction if self.config.VanguardFilter_Faction != 'default' else 'eagle', + rarity=self.config.VanguardFilter_Rarity if self.config.VanguardFilter_Rarity != 'default' else 'common', + extra=self.config.VanguardFilter_Extra if self.config.VanguardFilter_Extra != 'default' else 'can_limit_break' + ) + self.dock_favourite_set(False) + + ship = self.get_common_rarity_dd() + if ship: + if self.hard_mode: + self.FLEET_ENTER = self._FLEET_ENTER + self._ship_change_confirm(max(ship, key=lambda s: s.emotion).button) + + logger.info('Change vanguard ship success') + return True + else: + logger.info('Change vanguard ship failed, no DD in common rarity.') + + ship = self.get_common_rarity_dd(emotion=0) + if ship and self.hard_mode: + self._ship_change_confirm(min(ship, key=lambda s: (s.level, -s.emotion)).button) + else: + if self.hard_mode: + raise RequestHumanTakeover + self.dock_filter_set() + self.ui_back(check_button=self.page_fleet_check_button) + if self.hard_mode: + self.FLEET_ENTER = self._FLEET_ENTER + return False + + _trigger_lv32 = False + _trigger_emotion = False + + def triggered_stop_condition(self, oil_check=True): + # Lv32 limit + if self.change_flagship and self.campaign.config.LV32_TRIGGERED: + self._trigger_lv32 = True + logger.hr('TRIGGERED LV32 LIMIT') + return True + + if self.campaign.map_is_auto_search and self.campaign.config.GEMS_EMOTION_TRIGGERED: + self._trigger_emotion = True + logger.hr('TRIGGERED EMOTION LIMIT') + return True + + return super().triggered_stop_condition(oil_check=oil_check) + + def run(self, name, folder='campaign_main', mode='normal', total=0): + """ + Args: + name (str): Name of .py file. + folder (str): Name of the file folder under campaign. + mode (str): `normal` or `hard` + total (int): + """ + self.config.STOP_IF_REACH_LV32 = self.change_flagship + self.campaign_floder = folder + self.event_hard_mode_override() + while 1: + self._trigger_lv32 = False + is_limit = self.config.StopCondition_RunCount + + try: + super().run(name=name, folder=folder, total=total) + except CampaignEnd as e: + if e.args[0] == 'Emotion withdraw': + self._trigger_emotion = True + else: + raise e + except RequestHumanTakeover as e: + try: + if (e.args[0] == 'Hard not satisfied') and self.hard_mode: + if self.change_flagship and self.change_vanguard: + self.flagship_change() + self.vanguard_change() + else: + raise RequestHumanTakeover + else: + raise RequestHumanTakeover + except RequestHumanTakeover as e: + raise RequestHumanTakeover + except Exception as e: + from module.exception import GameStuckError + raise GameStuckError + + # End + if self._trigger_lv32 or self._trigger_emotion: + success = True + if self.change_flagship: + success = self.flagship_change() + if self.change_vanguard: + success = success and self.vanguard_change() + + if is_limit and self.config.StopCondition_RunCount <= 0: + logger.hr('Triggered stop condition: Run count') + self.config.StopCondition_RunCount = 0 + self.config.Scheduler_Enable = False + break + + self._trigger_lv32 = False + self._trigger_emotion = False + self.campaign.config.LV32_TRIGGERED = False + self.campaign.config.GEMS_EMOTION_TRIGGERED = False + + # Scheduler + if self.config.task_switched(): + self.campaign.ensure_auto_search_exit() + self.config.task_stop() + elif not success: + self.campaign.ensure_auto_search_exit() + self.config.task_delay(minute=30) + self.config.task_stop() + + continue + else: + break diff --git a/module/campaign/my_assets.py b/module/campaign/my_assets.py new file mode 100644 index 000000000..a613e38d2 --- /dev/null +++ b/module/campaign/my_assets.py @@ -0,0 +1,15 @@ +from module.base.button import Button +from module.base.template import Template + +# This file was automatically generated by dev_tools/button_extract.py. +# Don't modify it manually. + +my_DOCK_SHIP_DOWN = Button(area={'cn': (93, 90, 225, 266), 'en': (93, 90, 225, 266), 'jp': (93, 90, 225, 266), 'tw': (93, 90, 225, 266)}, color={'cn': (68, 67, 69), 'en': (68, 67, 69), 'jp': (68, 67, 69), 'tw': (68, 67, 69)}, button={'cn': (93, 90, 225, 266), 'en': (93, 90, 225, 266), 'jp': (93, 90, 225, 266), 'tw': (93, 90, 225, 266)}, file={'cn': './assets/cn/campaign/my_DOCK_SHIP_DOWN.png', 'en': './assets/cn/campaign/my_DOCK_SHIP_DOWN.png', 'jp': './assets/cn/campaign/my_DOCK_SHIP_DOWN.png', 'tw': './assets/cn/campaign/my_DOCK_SHIP_DOWN.png'}) +my_FLEET_ENTER_FLAGSHIP_HARD_1 = Button(area={'cn': (389, 158, 472, 241), 'en': (389, 158, 472, 241), 'jp': (389, 158, 472, 241), 'tw': (389, 158, 472, 241)}, color={'cn': (144, 160, 164), 'en': (144, 160, 164), 'jp': (144, 160, 164), 'tw': (144, 160, 164)}, button={'cn': (389, 158, 472, 241), 'en': (389, 158, 472, 241), 'jp': (389, 158, 472, 241), 'tw': (389, 158, 472, 241)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1.png'}) +my_FLEET_ENTER_FLAGSHIP_HARD_1_3 = Button(area={'cn': (598, 179, 677, 258), 'en': (598, 179, 677, 258), 'jp': (598, 179, 677, 258), 'tw': (598, 179, 677, 258)}, color={'cn': (48, 54, 66), 'en': (48, 54, 66), 'jp': (48, 54, 66), 'tw': (48, 54, 66)}, button={'cn': (598, 179, 677, 258), 'en': (598, 179, 677, 258), 'jp': (598, 179, 677, 258), 'tw': (598, 179, 677, 258)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_1_3.png'}) +my_FLEET_ENTER_FLAGSHIP_HARD_2 = Button(area={'cn': (389, 291, 472, 374), 'en': (389, 291, 472, 374), 'jp': (389, 291, 472, 374), 'tw': (389, 291, 472, 374)}, color={'cn': (177, 165, 150), 'en': (177, 165, 150), 'jp': (177, 165, 150), 'tw': (177, 165, 150)}, button={'cn': (389, 291, 472, 374), 'en': (389, 291, 472, 374), 'jp': (389, 291, 472, 374), 'tw': (389, 291, 472, 374)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2.png'}) +my_FLEET_ENTER_FLAGSHIP_HARD_2_3 = Button(area={'cn': (595, 290, 679, 374), 'en': (595, 290, 679, 374), 'jp': (595, 290, 679, 374), 'tw': (595, 290, 679, 374)}, color={'cn': (49, 57, 68), 'en': (49, 57, 68), 'jp': (49, 57, 68), 'tw': (49, 57, 68)}, button={'cn': (595, 290, 679, 374), 'en': (595, 290, 679, 374), 'jp': (595, 290, 679, 374), 'tw': (595, 290, 679, 374)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_FLAGSHIP_HARD_2_3.png'}) +my_FLEET_ENTER_HARD_1 = Button(area={'cn': (705, 158, 788, 241), 'en': (705, 158, 788, 241), 'jp': (705, 158, 788, 241), 'tw': (705, 158, 788, 241)}, color={'cn': (147, 157, 154), 'en': (147, 157, 154), 'jp': (147, 157, 154), 'tw': (147, 157, 154)}, button={'cn': (705, 158, 788, 241), 'en': (705, 158, 788, 241), 'jp': (705, 158, 788, 241), 'tw': (705, 158, 788, 241)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_HARD_1.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_HARD_1.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_HARD_1.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_HARD_1.png'}) +my_FLEET_ENTER_HARD_1_3 = Button(area={'cn': (910, 176, 994, 260), 'en': (910, 176, 994, 260), 'jp': (910, 176, 994, 260), 'tw': (910, 176, 994, 260)}, color={'cn': (47, 59, 73), 'en': (47, 59, 73), 'jp': (47, 59, 73), 'tw': (47, 59, 73)}, button={'cn': (910, 176, 994, 260), 'en': (910, 176, 994, 260), 'jp': (910, 176, 994, 260), 'tw': (910, 176, 994, 260)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_HARD_1_3.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_HARD_1_3.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_HARD_1_3.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_HARD_1_3.png'}) +my_FLEET_ENTER_HARD_2 = Button(area={'cn': (705, 291, 788, 374), 'en': (705, 291, 788, 374), 'jp': (705, 291, 788, 374), 'tw': (705, 291, 788, 374)}, color={'cn': (169, 182, 200), 'en': (169, 182, 200), 'jp': (169, 182, 200), 'tw': (169, 182, 200)}, button={'cn': (705, 291, 788, 374), 'en': (705, 291, 788, 374), 'jp': (705, 291, 788, 374), 'tw': (705, 291, 788, 374)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_HARD_2.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_HARD_2.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_HARD_2.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_HARD_2.png'}) +my_FLEET_ENTER_HARD_2_3 = Button(area={'cn': (910, 288, 996, 374), 'en': (910, 288, 996, 374), 'jp': (910, 288, 996, 374), 'tw': (910, 288, 996, 374)}, color={'cn': (52, 56, 64), 'en': (52, 56, 64), 'jp': (52, 56, 64), 'tw': (52, 56, 64)}, button={'cn': (910, 288, 996, 374), 'en': (910, 288, 996, 374), 'jp': (910, 288, 996, 374), 'tw': (910, 288, 996, 374)}, file={'cn': './assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png', 'en': './assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png', 'jp': './assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png', 'tw': './assets/cn/campaign/my_FLEET_ENTER_HARD_2_3.png'}) diff --git a/module/config/argument/args.json b/module/config/argument/args.json index cf783acb7..c97016eba 100644 --- a/module/config/argument/args.json +++ b/module/config/argument/args.json @@ -3051,6 +3051,14 @@ "z20_or_z21" ] }, + "ALLowLowVanguardLevel": { + "type": "checkbox", + "value": true + }, + "StopIFAutoNotEnsured": { + "type": "checkbox", + "value": true + }, "CommissionLimit": { "type": "checkbox", "value": true @@ -3582,6 +3590,174 @@ "display": "display" } }, + "VanguardFilter": { + "Sort": { + "type": "select", + "value": "default", + "option": [ + "default", + "rarity", + "level", + "total", + "join", + "intimacy", + "stat" + ] + }, + "Index": { + "type": "select", + "value": "default", + "option": [ + "default", + "all", + "vanguard", + "main", + "dd", + "cl", + "ca", + "bb", + "cv", + "repair", + "ss", + "others", + "not_available" + ] + }, + "Faction": { + "type": "select", + "value": "default", + "option": [ + "default", + "all", + "eagle", + "royal", + "sakura", + "iron", + "dragon", + "sardegna", + "northern", + "iris", + "vichya", + "other", + "not_available" + ] + }, + "Rarity": { + "type": "select", + "value": "default", + "option": [ + "default", + "all", + "common", + "rare", + "elite", + "super_rare", + "ultra" + ] + }, + "Extra": { + "type": "select", + "value": "default", + "option": [ + "default", + "no_limit", + "has_skin", + "can_retrofit", + "enhanceable", + "can_limit_break", + "not_level_max", + "can_awaken", + "can_awaken_plus", + "special", + "oath_skin", + "not_available" + ] + } + }, + "FlagshipFilter": { + "Sort": { + "type": "select", + "value": "default", + "option": [ + "default", + "rarity", + "level", + "total", + "join", + "intimacy", + "stat" + ] + }, + "Index": { + "type": "select", + "value": "default", + "option": [ + "default", + "all", + "vanguard", + "main", + "dd", + "cl", + "ca", + "bb", + "cv", + "repair", + "ss", + "others", + "not_available" + ] + }, + "Faction": { + "type": "select", + "value": "default", + "option": [ + "default", + "all", + "eagle", + "royal", + "sakura", + "iron", + "dragon", + "sardegna", + "northern", + "iris", + "vichya", + "other", + "not_available" + ] + }, + "Rarity": { + "type": "select", + "value": "default", + "option": [ + "default", + "all", + "common", + "rare", + "elite", + "super_rare", + "ultra" + ] + }, + "Extra": { + "type": "select", + "value": "default", + "option": [ + "default", + "no_limit", + "has_skin", + "can_retrofit", + "enhanceable", + "can_limit_break", + "not_level_max", + "can_awaken", + "can_awaken_plus", + "special", + "oath_skin", + "not_available" + ] + } + }, "Storage": { "Storage": { "type": "storage", diff --git a/module/config/argument/argument.yaml b/module/config/argument/argument.yaml index 24a549752..61116fb8d 100644 --- a/module/config/argument/argument.yaml +++ b/module/config/argument/argument.yaml @@ -277,6 +277,8 @@ GemsFarming: CommonDD: value: any option: [ any, favourite, aulick_or_foote , cassin_or_downes, z20_or_z21 ] + ALLowLowVanguardLevel: true + StopIFAutoNotEnsured: true CommissionLimit: true # ==================== Event ==================== @@ -774,6 +776,41 @@ AzurLaneUncensored: GameManager: AutoRestart: true +# ==================== GemsFarmingShipFilter ==================== + +FlagshipFilter: + Sort: + value: 'default' + option: ['default', 'rarity', 'level', 'total', 'join', 'intimacy', 'stat'] + Index: + value: 'default' + option: ['default', 'all', 'vanguard', 'main', 'dd', 'cl', 'ca', 'bb', 'cv', 'repair', 'ss', 'others', 'not_available'] + Faction: + value: 'default' + option: ['default', 'all', 'eagle', 'royal', 'sakura', 'iron', 'dragon', 'sardegna', 'northern', 'iris', 'vichya', 'other', 'not_available'] + Rarity: + value: 'default' + option: ['default', 'all', 'common', 'rare', 'elite', 'super_rare', 'ultra'] + Extra: + value: 'default' + option: ['default', 'no_limit', 'has_skin', 'can_retrofit', 'enhanceable', 'can_limit_break', 'not_level_max', 'can_awaken', 'can_awaken_plus', 'special', 'oath_skin', 'not_available'] +VanguardFilter: + Sort: + value: 'default' + option: ['default', 'rarity', 'level', 'total', 'join', 'intimacy', 'stat'] + Index: + value: 'default' + option: ['default', 'all', 'vanguard', 'main', 'dd', 'cl', 'ca', 'bb', 'cv', 'repair', 'ss', 'others', 'not_available'] + Faction: + value: 'default' + option: ['default', 'all', 'eagle', 'royal', 'sakura', 'iron', 'dragon', 'sardegna', 'northern', 'iris', 'vichya', 'other', 'not_available'] + Rarity: + value: 'default' + option: ['default', 'all', 'common', 'rare', 'elite', 'super_rare', 'ultra'] + Extra: + value: 'default' + option: ['default', 'no_limit', 'has_skin', 'can_retrofit', 'enhanceable', 'can_limit_break', 'not_level_max', 'can_awaken', 'can_awaken_plus', 'special', 'oath_skin', 'not_available'] + # ==================== Cheat ==================== HookGeneral: diff --git a/module/config/argument/task.yaml b/module/config/argument/task.yaml index 2e6d9742b..d6aefb02d 100644 --- a/module/config/argument/task.yaml +++ b/module/config/argument/task.yaml @@ -106,6 +106,8 @@ Farm: - Campaign - StopCondition - Fleet + - VanguardFilter + - FlagshipFilter # ==================== Event ==================== diff --git a/module/config/config_generated.py b/module/config/config_generated.py index 302393b36..9ac6b7bd0 100644 --- a/module/config/config_generated.py +++ b/module/config/config_generated.py @@ -152,6 +152,8 @@ class GeneratedConfig: GemsFarming_CommonCV = 'any' # any, langley, bogue, ranger, hermes GemsFarming_ChangeVanguard = 'ship' # disabled, ship, ship_equip GemsFarming_CommonDD = 'any' # any, favourite, aulick_or_foote, cassin_or_downes, z20_or_z21 + GemsFarming_ALLowLowVanguardLevel = True + GemsFarming_StopIFAutoNotEnsured = True GemsFarming_CommissionLimit = True # Group `EventGeneral` @@ -463,6 +465,20 @@ class GeneratedConfig: # Group `GameManager` GameManager_AutoRestart = True + # Group `FlagshipFilter` + FlagshipFilter_Sort = 'default' # default, rarity, level, total, join, intimacy, stat + FlagshipFilter_Index = 'default' # default, all, vanguard, main, dd, cl, ca, bb, cv, repair, ss, others, not_available + FlagshipFilter_Faction = 'default' # default, all, eagle, royal, sakura, iron, dragon, sardegna, northern, iris, vichya, other, not_available + FlagshipFilter_Rarity = 'default' # default, all, common, rare, elite, super_rare, ultra + FlagshipFilter_Extra = 'default' # default, no_limit, has_skin, can_retrofit, enhanceable, can_limit_break, not_level_max, can_awaken, can_awaken_plus, special, oath_skin, not_available + + # Group `VanguardFilter` + VanguardFilter_Sort = 'default' # default, rarity, level, total, join, intimacy, stat + VanguardFilter_Index = 'default' # default, all, vanguard, main, dd, cl, ca, bb, cv, repair, ss, others, not_available + VanguardFilter_Faction = 'default' # default, all, eagle, royal, sakura, iron, dragon, sardegna, northern, iris, vichya, other, not_available + VanguardFilter_Rarity = 'default' # default, all, common, rare, elite, super_rare, ultra + VanguardFilter_Extra = 'default' # default, no_limit, has_skin, can_retrofit, enhanceable, can_limit_break, not_level_max, can_awaken, can_awaken_plus, special, oath_skin, not_available + # Group `HookGeneral` HookGeneral_Enable = False HookGeneral_RestartEveryTime = True diff --git a/module/config/full_config_generated.py b/module/config/full_config_generated.py index 4814c6bb8..4cb8a5436 100644 --- a/module/config/full_config_generated.py +++ b/module/config/full_config_generated.py @@ -470,6 +470,8 @@ class FullGeneratedConfig: GemsFarming_GemsFarming_CommonCV = None GemsFarming_GemsFarming_ChangeVanguard = None GemsFarming_GemsFarming_CommonDD = None + GemsFarming_GemsFarming_ALLowLowVanguardLevel = None + GemsFarming_GemsFarming_StopIFAutoNotEnsured = None GemsFarming_GemsFarming_CommissionLimit = None GemsFarming_Campaign_Name = None GemsFarming_Campaign_Event = None @@ -494,6 +496,16 @@ class FullGeneratedConfig: GemsFarming_Fleet_Fleet2Mode = None GemsFarming_Fleet_Fleet2Step = None GemsFarming_Fleet_FleetOrder = None + GemsFarming_VanguardFilter_Sort = None + GemsFarming_VanguardFilter_Index = None + GemsFarming_VanguardFilter_Faction = None + GemsFarming_VanguardFilter_Rarity = None + GemsFarming_VanguardFilter_Extra = None + GemsFarming_FlagshipFilter_Sort = None + GemsFarming_FlagshipFilter_Index = None + GemsFarming_FlagshipFilter_Faction = None + GemsFarming_FlagshipFilter_Rarity = None + GemsFarming_FlagshipFilter_Extra = None GemsFarming_Storage_Storage = None # Task `EventGeneral` diff --git a/module/config/i18n/en-US.json b/module/config/i18n/en-US.json index 248810313..ee73d37e8 100644 --- a/module/config/i18n/en-US.json +++ b/module/config/i18n/en-US.json @@ -1247,6 +1247,14 @@ "cassin_or_downes": "Cassin or Downes", "z20_or_z21": "Z20 or Z21" }, + "ALLowLowVanguardLevel": { + "name": "GemsFarming.ALLowLowVanguardLevel.name", + "help": "GemsFarming.ALLowLowVanguardLevel.help" + }, + "StopIFAutoNotEnsured": { + "name": "GemsFarming.StopIFAutoNotEnsured.name", + "help": "GemsFarming.StopIFAutoNotEnsured.help" + }, "CommissionLimit": { "name": "Prevent Too Many Urgent Commissions", "help": "When running 7x24, prevent having a lot of urgent commissions and not being able to complete daily commissions. It is recommended to select only short-terms and high-yields in the commission filter" @@ -2681,6 +2689,162 @@ "help": "Log back into the game when the game has been ended." } }, + "FlagshipFilter": { + "_info": { + "name": "FlagshipFilter._info.name", + "help": "FlagshipFilter._info.help" + }, + "Sort": { + "name": "FlagshipFilter.Sort.name", + "help": "FlagshipFilter.Sort.help", + "default": "default", + "rarity": "rarity", + "level": "level", + "total": "total", + "join": "join", + "intimacy": "intimacy", + "stat": "stat" + }, + "Index": { + "name": "FlagshipFilter.Index.name", + "help": "FlagshipFilter.Index.help", + "default": "default", + "all": "all", + "vanguard": "vanguard", + "main": "main", + "dd": "dd", + "cl": "cl", + "ca": "ca", + "bb": "bb", + "cv": "cv", + "repair": "repair", + "ss": "ss", + "others": "others", + "not_available": "not_available" + }, + "Faction": { + "name": "FlagshipFilter.Faction.name", + "help": "FlagshipFilter.Faction.help", + "default": "default", + "all": "all", + "eagle": "eagle", + "royal": "royal", + "sakura": "sakura", + "iron": "iron", + "dragon": "dragon", + "sardegna": "sardegna", + "northern": "northern", + "iris": "iris", + "vichya": "vichya", + "other": "other", + "not_available": "not_available" + }, + "Rarity": { + "name": "FlagshipFilter.Rarity.name", + "help": "FlagshipFilter.Rarity.help", + "default": "default", + "all": "all", + "common": "common", + "rare": "rare", + "elite": "elite", + "super_rare": "super_rare", + "ultra": "ultra" + }, + "Extra": { + "name": "FlagshipFilter.Extra.name", + "help": "FlagshipFilter.Extra.help", + "default": "default", + "no_limit": "no_limit", + "has_skin": "has_skin", + "can_retrofit": "can_retrofit", + "enhanceable": "enhanceable", + "can_limit_break": "can_limit_break", + "not_level_max": "not_level_max", + "can_awaken": "can_awaken", + "can_awaken_plus": "can_awaken_plus", + "special": "special", + "oath_skin": "oath_skin", + "not_available": "not_available" + } + }, + "VanguardFilter": { + "_info": { + "name": "VanguardFilter._info.name", + "help": "VanguardFilter._info.help" + }, + "Sort": { + "name": "VanguardFilter.Sort.name", + "help": "VanguardFilter.Sort.help", + "default": "default", + "rarity": "rarity", + "level": "level", + "total": "total", + "join": "join", + "intimacy": "intimacy", + "stat": "stat" + }, + "Index": { + "name": "VanguardFilter.Index.name", + "help": "VanguardFilter.Index.help", + "default": "default", + "all": "all", + "vanguard": "vanguard", + "main": "main", + "dd": "dd", + "cl": "cl", + "ca": "ca", + "bb": "bb", + "cv": "cv", + "repair": "repair", + "ss": "ss", + "others": "others", + "not_available": "not_available" + }, + "Faction": { + "name": "VanguardFilter.Faction.name", + "help": "VanguardFilter.Faction.help", + "default": "default", + "all": "all", + "eagle": "eagle", + "royal": "royal", + "sakura": "sakura", + "iron": "iron", + "dragon": "dragon", + "sardegna": "sardegna", + "northern": "northern", + "iris": "iris", + "vichya": "vichya", + "other": "other", + "not_available": "not_available" + }, + "Rarity": { + "name": "VanguardFilter.Rarity.name", + "help": "VanguardFilter.Rarity.help", + "default": "default", + "all": "all", + "common": "common", + "rare": "rare", + "elite": "elite", + "super_rare": "super_rare", + "ultra": "ultra" + }, + "Extra": { + "name": "VanguardFilter.Extra.name", + "help": "VanguardFilter.Extra.help", + "default": "default", + "no_limit": "no_limit", + "has_skin": "has_skin", + "can_retrofit": "can_retrofit", + "enhanceable": "enhanceable", + "can_limit_break": "can_limit_break", + "not_level_max": "not_level_max", + "can_awaken": "can_awaken", + "can_awaken_plus": "can_awaken_plus", + "special": "special", + "oath_skin": "oath_skin", + "not_available": "not_available" + } + }, "HookGeneral": { "_info": { "name": "HookGeneral._info.name", diff --git a/module/config/i18n/ja-JP.json b/module/config/i18n/ja-JP.json index efbb51da4..5e8223dee 100644 --- a/module/config/i18n/ja-JP.json +++ b/module/config/i18n/ja-JP.json @@ -1247,6 +1247,14 @@ "cassin_or_downes": "GemsFarming.CommonDD.cassin_or_downes", "z20_or_z21": "GemsFarming.CommonDD.z20_or_z21" }, + "ALLowLowVanguardLevel": { + "name": "GemsFarming.ALLowLowVanguardLevel.name", + "help": "GemsFarming.ALLowLowVanguardLevel.help" + }, + "StopIFAutoNotEnsured": { + "name": "GemsFarming.StopIFAutoNotEnsured.name", + "help": "GemsFarming.StopIFAutoNotEnsured.help" + }, "CommissionLimit": { "name": "GemsFarming.CommissionLimit.name", "help": "GemsFarming.CommissionLimit.help" @@ -2681,6 +2689,162 @@ "help": "GameManager.AutoRestart.help" } }, + "FlagshipFilter": { + "_info": { + "name": "FlagshipFilter._info.name", + "help": "FlagshipFilter._info.help" + }, + "Sort": { + "name": "FlagshipFilter.Sort.name", + "help": "FlagshipFilter.Sort.help", + "default": "default", + "rarity": "rarity", + "level": "level", + "total": "total", + "join": "join", + "intimacy": "intimacy", + "stat": "stat" + }, + "Index": { + "name": "FlagshipFilter.Index.name", + "help": "FlagshipFilter.Index.help", + "default": "default", + "all": "all", + "vanguard": "vanguard", + "main": "main", + "dd": "dd", + "cl": "cl", + "ca": "ca", + "bb": "bb", + "cv": "cv", + "repair": "repair", + "ss": "ss", + "others": "others", + "not_available": "not_available" + }, + "Faction": { + "name": "FlagshipFilter.Faction.name", + "help": "FlagshipFilter.Faction.help", + "default": "default", + "all": "all", + "eagle": "eagle", + "royal": "royal", + "sakura": "sakura", + "iron": "iron", + "dragon": "dragon", + "sardegna": "sardegna", + "northern": "northern", + "iris": "iris", + "vichya": "vichya", + "other": "other", + "not_available": "not_available" + }, + "Rarity": { + "name": "FlagshipFilter.Rarity.name", + "help": "FlagshipFilter.Rarity.help", + "default": "default", + "all": "all", + "common": "common", + "rare": "rare", + "elite": "elite", + "super_rare": "super_rare", + "ultra": "ultra" + }, + "Extra": { + "name": "FlagshipFilter.Extra.name", + "help": "FlagshipFilter.Extra.help", + "default": "default", + "no_limit": "no_limit", + "has_skin": "has_skin", + "can_retrofit": "can_retrofit", + "enhanceable": "enhanceable", + "can_limit_break": "can_limit_break", + "not_level_max": "not_level_max", + "can_awaken": "can_awaken", + "can_awaken_plus": "can_awaken_plus", + "special": "special", + "oath_skin": "oath_skin", + "not_available": "not_available" + } + }, + "VanguardFilter": { + "_info": { + "name": "VanguardFilter._info.name", + "help": "VanguardFilter._info.help" + }, + "Sort": { + "name": "VanguardFilter.Sort.name", + "help": "VanguardFilter.Sort.help", + "default": "default", + "rarity": "rarity", + "level": "level", + "total": "total", + "join": "join", + "intimacy": "intimacy", + "stat": "stat" + }, + "Index": { + "name": "VanguardFilter.Index.name", + "help": "VanguardFilter.Index.help", + "default": "default", + "all": "all", + "vanguard": "vanguard", + "main": "main", + "dd": "dd", + "cl": "cl", + "ca": "ca", + "bb": "bb", + "cv": "cv", + "repair": "repair", + "ss": "ss", + "others": "others", + "not_available": "not_available" + }, + "Faction": { + "name": "VanguardFilter.Faction.name", + "help": "VanguardFilter.Faction.help", + "default": "default", + "all": "all", + "eagle": "eagle", + "royal": "royal", + "sakura": "sakura", + "iron": "iron", + "dragon": "dragon", + "sardegna": "sardegna", + "northern": "northern", + "iris": "iris", + "vichya": "vichya", + "other": "other", + "not_available": "not_available" + }, + "Rarity": { + "name": "VanguardFilter.Rarity.name", + "help": "VanguardFilter.Rarity.help", + "default": "default", + "all": "all", + "common": "common", + "rare": "rare", + "elite": "elite", + "super_rare": "super_rare", + "ultra": "ultra" + }, + "Extra": { + "name": "VanguardFilter.Extra.name", + "help": "VanguardFilter.Extra.help", + "default": "default", + "no_limit": "no_limit", + "has_skin": "has_skin", + "can_retrofit": "can_retrofit", + "enhanceable": "enhanceable", + "can_limit_break": "can_limit_break", + "not_level_max": "not_level_max", + "can_awaken": "can_awaken", + "can_awaken_plus": "can_awaken_plus", + "special": "special", + "oath_skin": "oath_skin", + "not_available": "not_available" + } + }, "HookGeneral": { "_info": { "name": "HookGeneral._info.name", diff --git a/module/config/i18n/zh-CN.json b/module/config/i18n/zh-CN.json index 410bdaf2a..4ad0cb100 100644 --- a/module/config/i18n/zh-CN.json +++ b/module/config/i18n/zh-CN.json @@ -1247,6 +1247,14 @@ "cassin_or_downes": "卡辛或唐斯", "z20_or_z21": "Z20或Z21" }, + "ALLowLowVanguardLevel": { + "name": "可更换低等级前排", + "help": "倍率打开时,前排等级限制改为10以上即可。若为困难模式(如CD图)改为49级。" + }, + "StopIFAutoNotEnsured": { + "name": "无法设置职能时停止任务", + "help": "无法设置舰队职能时,以以下方式停止任务以免跨队队伍出击,石油被大量消耗:\n若设置了错误推送则推送任务停止的消息并停止该任务。\n若没有设置错误推送,则直接停止Alas。" + }, "CommissionLimit": { "name": "防止紧急委托数量过多", "help": "在7x24运行时防止紧急委托数量过多做不完每日委托,建议在委托过滤器仅选择短时长高收益委托" @@ -2681,6 +2689,162 @@ "help": "游戏被强制结束后自动登录游戏" } }, + "FlagshipFilter": { + "_info": { + "name": "后排主力过滤器", + "help": "" + }, + "Sort": { + "name": "排序", + "help": "", + "default": "默认", + "rarity": "稀有度", + "level": "等级", + "total": "综合性能", + "join": "入手时间", + "intimacy": "好感度", + "stat": "心情值" + }, + "Index": { + "name": "索引", + "help": "", + "default": "默认", + "all": "全部", + "vanguard": "前排先锋", + "main": "后排主力", + "dd": "驱逐", + "cl": "轻巡", + "ca": "重巡", + "bb": "战列", + "cv": "航母", + "repair": "维修", + "ss": "潜艇", + "others": "其他", + "not_available": "not_available" + }, + "Faction": { + "name": "阵营", + "help": "", + "default": "默认", + "all": "全部", + "eagle": "白鹰", + "royal": "皇家", + "sakura": "重樱", + "iron": "铁血", + "dragon": "东煌", + "sardegna": "撒丁帝国", + "northern": "北方联合", + "iris": "自由鸢尾", + "vichya": "维希教廷", + "other": "其他", + "not_available": "not_available" + }, + "Rarity": { + "name": "稀有度", + "help": "", + "default": "默认", + "all": "全部", + "common": "普通", + "rare": "稀有", + "elite": "精锐", + "super_rare": "超稀有", + "ultra": "海上传奇" + }, + "Extra": { + "name": "附加索引", + "help": "", + "default": "默认", + "no_limit": "无限制", + "has_skin": "可换装", + "can_retrofit": "可改造", + "enhanceable": "可强化", + "can_limit_break": "可突破", + "not_level_max": "未满级", + "can_awaken": "可认知觉醒", + "can_awaken_plus": "可认知觉醒II", + "special": "特殊", + "oath_skin": "誓约换装", + "not_available": "not_available" + } + }, + "VanguardFilter": { + "_info": { + "name": "前排先锋过滤器", + "help": "" + }, + "Sort": { + "name": "排序", + "help": "", + "default": "默认", + "rarity": "稀有度", + "level": "等级", + "total": "综合性能", + "join": "入手时间", + "intimacy": "好感度", + "stat": "心情值" + }, + "Index": { + "name": "索引", + "help": "", + "default": "默认", + "all": "全部", + "vanguard": "前排先锋", + "main": "后排主力", + "dd": "驱逐", + "cl": "轻巡", + "ca": "重巡", + "bb": "战列", + "cv": "航母", + "repair": "维修", + "ss": "潜艇", + "others": "其他", + "not_available": "not_available" + }, + "Faction": { + "name": "阵营", + "help": "", + "default": "默认", + "all": "全部", + "eagle": "白鹰", + "royal": "皇家", + "sakura": "重樱", + "iron": "铁血", + "dragon": "东煌", + "sardegna": "撒丁帝国", + "northern": "北方联合", + "iris": "自由鸢尾", + "vichya": "维希教廷", + "other": "其他", + "not_available": "not_available" + }, + "Rarity": { + "name": "稀有度", + "help": "", + "default": "默认", + "all": "全部", + "common": "普通", + "rare": "稀有", + "elite": "精锐", + "super_rare": "超稀有", + "ultra": "海上传奇" + }, + "Extra": { + "name": "附加索引", + "help": "", + "default": "默认", + "no_limit": "无限制", + "has_skin": "可换装", + "can_retrofit": "可改造", + "enhanceable": "可强化", + "can_limit_break": "可突破", + "not_level_max": "未满级", + "can_awaken": "可认知觉醒", + "can_awaken_plus": "可认知觉醒II", + "special": "特殊", + "oath_skin": "誓约换装", + "not_available": "not_available" + } + }, "HookGeneral": { "_info": { "name": "基本设置", diff --git a/module/config/i18n/zh-TW.json b/module/config/i18n/zh-TW.json index 9748f9226..ef168b8b9 100644 --- a/module/config/i18n/zh-TW.json +++ b/module/config/i18n/zh-TW.json @@ -1247,6 +1247,14 @@ "cassin_or_downes": "卡辛或唐斯", "z20_or_z21": "Z20或Z21" }, + "ALLowLowVanguardLevel": { + "name": "GemsFarming.ALLowLowVanguardLevel.name", + "help": "GemsFarming.ALLowLowVanguardLevel.help" + }, + "StopIFAutoNotEnsured": { + "name": "GemsFarming.StopIFAutoNotEnsured.name", + "help": "GemsFarming.StopIFAutoNotEnsured.help" + }, "CommissionLimit": { "name": "防止緊急委託數量過多", "help": "在7x24運行時防止緊急委託數量過多做不完每日委託,建議在委託過濾器僅選擇短時長高收益委託" @@ -2681,6 +2689,162 @@ "help": "遊戲被強制結束後自動登錄遊戲" } }, + "FlagshipFilter": { + "_info": { + "name": "FlagshipFilter._info.name", + "help": "FlagshipFilter._info.help" + }, + "Sort": { + "name": "FlagshipFilter.Sort.name", + "help": "FlagshipFilter.Sort.help", + "default": "default", + "rarity": "rarity", + "level": "level", + "total": "total", + "join": "join", + "intimacy": "intimacy", + "stat": "stat" + }, + "Index": { + "name": "FlagshipFilter.Index.name", + "help": "FlagshipFilter.Index.help", + "default": "default", + "all": "all", + "vanguard": "vanguard", + "main": "main", + "dd": "dd", + "cl": "cl", + "ca": "ca", + "bb": "bb", + "cv": "cv", + "repair": "repair", + "ss": "ss", + "others": "others", + "not_available": "not_available" + }, + "Faction": { + "name": "FlagshipFilter.Faction.name", + "help": "FlagshipFilter.Faction.help", + "default": "default", + "all": "all", + "eagle": "eagle", + "royal": "royal", + "sakura": "sakura", + "iron": "iron", + "dragon": "dragon", + "sardegna": "sardegna", + "northern": "northern", + "iris": "iris", + "vichya": "vichya", + "other": "other", + "not_available": "not_available" + }, + "Rarity": { + "name": "FlagshipFilter.Rarity.name", + "help": "FlagshipFilter.Rarity.help", + "default": "default", + "all": "all", + "common": "common", + "rare": "rare", + "elite": "elite", + "super_rare": "super_rare", + "ultra": "ultra" + }, + "Extra": { + "name": "FlagshipFilter.Extra.name", + "help": "FlagshipFilter.Extra.help", + "default": "default", + "no_limit": "no_limit", + "has_skin": "has_skin", + "can_retrofit": "can_retrofit", + "enhanceable": "enhanceable", + "can_limit_break": "can_limit_break", + "not_level_max": "not_level_max", + "can_awaken": "can_awaken", + "can_awaken_plus": "can_awaken_plus", + "special": "special", + "oath_skin": "oath_skin", + "not_available": "not_available" + } + }, + "VanguardFilter": { + "_info": { + "name": "VanguardFilter._info.name", + "help": "VanguardFilter._info.help" + }, + "Sort": { + "name": "VanguardFilter.Sort.name", + "help": "VanguardFilter.Sort.help", + "default": "default", + "rarity": "rarity", + "level": "level", + "total": "total", + "join": "join", + "intimacy": "intimacy", + "stat": "stat" + }, + "Index": { + "name": "VanguardFilter.Index.name", + "help": "VanguardFilter.Index.help", + "default": "default", + "all": "all", + "vanguard": "vanguard", + "main": "main", + "dd": "dd", + "cl": "cl", + "ca": "ca", + "bb": "bb", + "cv": "cv", + "repair": "repair", + "ss": "ss", + "others": "others", + "not_available": "not_available" + }, + "Faction": { + "name": "VanguardFilter.Faction.name", + "help": "VanguardFilter.Faction.help", + "default": "default", + "all": "all", + "eagle": "eagle", + "royal": "royal", + "sakura": "sakura", + "iron": "iron", + "dragon": "dragon", + "sardegna": "sardegna", + "northern": "northern", + "iris": "iris", + "vichya": "vichya", + "other": "other", + "not_available": "not_available" + }, + "Rarity": { + "name": "VanguardFilter.Rarity.name", + "help": "VanguardFilter.Rarity.help", + "default": "default", + "all": "all", + "common": "common", + "rare": "rare", + "elite": "elite", + "super_rare": "super_rare", + "ultra": "ultra" + }, + "Extra": { + "name": "VanguardFilter.Extra.name", + "help": "VanguardFilter.Extra.help", + "default": "default", + "no_limit": "no_limit", + "has_skin": "has_skin", + "can_retrofit": "can_retrofit", + "enhanceable": "enhanceable", + "can_limit_break": "can_limit_break", + "not_level_max": "not_level_max", + "can_awaken": "can_awaken", + "can_awaken_plus": "can_awaken_plus", + "special": "special", + "oath_skin": "oath_skin", + "not_available": "not_available" + } + }, "HookGeneral": { "_info": { "name": "HookGeneral._info.name", diff --git a/module/equipment/old_assets.py b/module/equipment/old_assets.py new file mode 100644 index 000000000..17821a368 --- /dev/null +++ b/module/equipment/old_assets.py @@ -0,0 +1,11 @@ +from module.base.button import Button +from module.base.template import Template + +# This file was automatically generated by dev_tools/button_extract.py. +# Don't modify it manually. + +old_EQUIP_1 = Button(area={'cn': (1191, 266, 1247, 319), 'en': (1191, 266, 1247, 319), 'jp': (1191, 266, 1247, 319), 'tw': (1191, 266, 1247, 319)}, color={'cn': (98, 142, 207), 'en': (98, 142, 207), 'jp': (98, 142, 207), 'tw': (98, 142, 207)}, button={'cn': (1191, 266, 1247, 319), 'en': (1191, 266, 1247, 319), 'jp': (1191, 266, 1247, 319), 'tw': (1191, 266, 1247, 319)}, file={'cn': './assets/cn/equipment/old_EQUIP_1.png', 'en': './assets/cn/equipment/old_EQUIP_1.png', 'jp': './assets/cn/equipment/old_EQUIP_1.png', 'tw': './assets/cn/equipment/old_EQUIP_1.png'}) +old_EQUIP_2 = Button(area={'cn': (1191, 366, 1247, 419), 'en': (1191, 366, 1247, 419), 'jp': (1191, 366, 1247, 419), 'tw': (1191, 366, 1247, 419)}, color={'cn': (95, 139, 202), 'en': (95, 139, 202), 'jp': (95, 139, 202), 'tw': (95, 139, 202)}, button={'cn': (1191, 366, 1247, 419), 'en': (1191, 366, 1247, 419), 'jp': (1191, 366, 1247, 419), 'tw': (1191, 366, 1247, 419)}, file={'cn': './assets/cn/equipment/old_EQUIP_2.png', 'en': './assets/cn/equipment/old_EQUIP_2.png', 'jp': './assets/cn/equipment/old_EQUIP_2.png', 'tw': './assets/cn/equipment/old_EQUIP_2.png'}) +old_EQUIP_3 = Button(area={'cn': (1191, 466, 1247, 519), 'en': (1191, 466, 1247, 519), 'jp': (1191, 466, 1247, 519), 'tw': (1191, 466, 1247, 519)}, color={'cn': (94, 137, 201), 'en': (94, 137, 201), 'jp': (94, 137, 201), 'tw': (94, 137, 201)}, button={'cn': (1191, 466, 1247, 519), 'en': (1191, 466, 1247, 519), 'jp': (1191, 466, 1247, 519), 'tw': (1191, 466, 1247, 519)}, file={'cn': './assets/cn/equipment/old_EQUIP_3.png', 'en': './assets/cn/equipment/old_EQUIP_3.png', 'jp': './assets/cn/equipment/old_EQUIP_3.png', 'tw': './assets/cn/equipment/old_EQUIP_3.png'}) +old_FLEET_DETAIL_CHECK = Button(area={'cn': (915, 647, 980, 679), 'en': (915, 647, 980, 679), 'jp': (915, 647, 980, 679), 'tw': (915, 647, 980, 679)}, color={'cn': (234, 195, 154), 'en': (234, 195, 154), 'jp': (234, 195, 154), 'tw': (234, 195, 154)}, button={'cn': (915, 647, 980, 679), 'en': (915, 647, 980, 679), 'jp': (915, 647, 980, 679), 'tw': (915, 647, 980, 679)}, file={'cn': './assets/cn/equipment/old_FLEET_DETAIL_CHECK.png', 'en': './assets/cn/equipment/old_FLEET_DETAIL_CHECK.png', 'jp': './assets/cn/equipment/old_FLEET_DETAIL_CHECK.png', 'tw': './assets/cn/equipment/old_FLEET_DETAIL_CHECK.png'}) +old_FLEET_ENTER_FLAGSHIP = Button(area={'cn': (577, 306, 604, 321), 'en': (577, 306, 604, 321), 'jp': (577, 306, 604, 321), 'tw': (577, 306, 604, 321)}, color={'cn': (95, 83, 74), 'en': (95, 83, 74), 'jp': (95, 83, 74), 'tw': (95, 83, 74)}, button={'cn': (577, 306, 604, 321), 'en': (577, 306, 604, 321), 'jp': (577, 306, 604, 321), 'tw': (577, 306, 604, 321)}, file={'cn': './assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png', 'en': './assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png', 'jp': './assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png', 'tw': './assets/cn/equipment/old_FLEET_ENTER_FLAGSHIP.png'}) diff --git a/module/equipment/old_equipment.py b/module/equipment/old_equipment.py new file mode 100644 index 000000000..352aa91c8 --- /dev/null +++ b/module/equipment/old_equipment.py @@ -0,0 +1,272 @@ +from module.base.button import ButtonGrid +from module.base.decorator import cached_property +from module.base.timer import Timer +from module.logger import logger +from module.storage.storage import StorageHandler +from module.equipment.old_assets import * +from module.equipment.assets import * +from module.ui.assets import BACK_ARROW +from module.ui.navbar import Navbar +from module.ui.switch import Switch +from module.retire.assets import DOCK_CHECK, EQUIP_CONFIRM as RETIRE_EQUIP_CONFIRM + +equipping_filter = Switch('Equiping_filter') +equipping_filter.add_state('on', check_button=EQUIPPING_ON) +equipping_filter.add_state('off', check_button=EQUIPPING_OFF) + +SWIPE_DISTANCE = 250 +SWIPE_RANDOM_RANGE = (-40, -20, 40, 20) + +class OldEquipment(StorageHandler): + equipment_has_take_on = False + + def equipping_set(self, enable=False): + if equipping_filter.set('on' if enable else 'off', main=self): + self.wait_until_stable(SWIPE_AREA) + + def _equip_view_swipe(self, distance, check_button=EQUIPMENT_OPEN): + swipe_count = 0 + swipe_timer = Timer(5, count=10) + self.handle_info_bar() + SWIPE_CHECK.load_color(self.device.image) + SWIPE_CHECK._match_init = True # Disable ensure_template() on match(), allows ship to be properly determined + # whether actually different or not + while 1: + if not swipe_timer.started() or swipe_timer.reached(): + swipe_timer.reset() + self.device.swipe_vector(vector=(distance, 0), box=SWIPE_AREA.area, random_range=SWIPE_RANDOM_RANGE, + padding=0, duration=(0.1, 0.12), name='EQUIP_SWIPE') + # self.wait_until_appear(check_button, offset=(30, 30)) + skip_first_screenshot = True + while 1: + if skip_first_screenshot: + skip_first_screenshot = False + else: + self.device.screenshot() + if self.appear(check_button, offset=(30, 30)): + break + if self.appear(RETIRE_EQUIP_CONFIRM, offset=(30, 30)): + logger.info('RETIRE_EQUIP_CONFIRM popup in _equip_view_swipe()') + return False + swipe_count += 1 + + self.device.screenshot() + + if self.appear(RETIRE_EQUIP_CONFIRM, offset=(30, 30)): + logger.info('RETIRE_EQUIP_CONFIRM popup in _equip_view_swipe()') + return False + if SWIPE_CHECK.match(self.device.image): + if swipe_count > 1: + logger.info('Same ship on multiple swipes') + return False + continue + + if self.appear(check_button, offset=(30, 30)) and not SWIPE_CHECK.match(self.device.image): + logger.info('New ship detected on swipe') + return True + + def equip_view_next(self, check_button=EQUIPMENT_OPEN): + return self._equip_view_swipe(distance=-SWIPE_DISTANCE, check_button=check_button) + + def equip_view_prev(self, check_button=EQUIPMENT_OPEN): + return self._equip_view_swipe(distance=SWIPE_DISTANCE, check_button=check_button) + + def equip_enter(self, click_button, check_button=EQUIPMENT_OPEN, long_click=True, skil_first_screenshot=True): + enter_timer = Timer(10) + + while 1: + if skil_first_screenshot: + skil_first_screenshot = False + else: + self.device.screenshot() + + # End + if self.appear(check_button): + break + + # Long click accidentally became normal click, exit from dock + if long_click: + if self.appear(DOCK_CHECK, offset=(20, 20), interval=3): + logger.info(f'equip_enter {DOCK_CHECK} -> {BACK_ARROW}') + self.device.click(BACK_ARROW) + continue + if enter_timer.reached(): + if long_click: + self.device.long_click(click_button, duration=(1.5, 1.7)) + else: + self.device.click(click_button) + enter_timer.reset() + + @cached_property + def _equip_side_navbar(self): + """ + pry_sidebar 3 options + research. + equipment. + detail. + + regular_sidebar 4 options + enhancement. + limit break. + equipment. + detail. + + retrofit_sidebar 5 options + retrofit. + enhancement. + limit break. + equipment. + detail. + """ + equip_side_navbar = ButtonGrid( + origin=(21, 118), delta=(0, 94.5), button_shape=(60, 75), grid_shape=(1, 5), name='DETAIL_SIDE_NAVBAR') + + return Navbar(grids=equip_side_navbar, + active_color=(247, 255, 173), active_threshold=221, + inactive_color=(140, 162, 181), inactive_threshold=221) + + def equip_side_navbar_ensure(self, upper=None, bottom=None): + """ + Ensure able to transition to page + Whether page has completely loaded is handled + separately and optionally + + Args: + upper (int): + pry|regular|retrofit + 1|N/A|N/A for research. + N/A|N/A|1 for retrofit. + N/A|1|2 for enhancement. + N/A|2|3 for limit break. + 2|3|4 for equipment. + 3|4|5 for detail. + bottom (int): + pry|regular|retrofit + 3|N/A|N/A for research. + N/A|N/A|5 for retrofit. + N/A|4|4 for enhancement. + N/A|3|3 for limit break. + 2 for equipment. + 1 for detail. + + Returns: + bool: if side_navbar set ensured + """ + if self._equip_side_navbar.get_total(main=self) == 3: + if upper == 1 or bottom == 3: + logger.warning('Transitions to "research" is not supported') + return False + + if self._equip_side_navbar.set(self, upper=upper, bottom=bottom): + return True + return False + + def _equip_take_off_one(self, skip_first_screenshot=True): + bar_timer = Timer(5) + off_timer = Timer(5) + confirm_timer = Timer(5) + + while 1: + if skip_first_screenshot: + self.device.screenshot() + else: + skip_first_screenshot = False + + # End + # if self.handle_info_bar(): + # break + if off_timer.started() and self.info_bar_count(): + break + + if self.handle_storage_full(): + continue + + if confirm_timer.reached() and self.handle_popup_confirm(): + confirm_timer.reset() + continue + + if off_timer.reached(): + if not self.info_bar_count() and self.appear_then_click(EQUIP_OFF, offset=(20, 20)): + off_timer.reset() + continue + + if bar_timer.reached(): + if self.appear(EQUIPMENT_OPEN, offset=(20, 20)) and not self.appear(EQUIP_OFF, offset=(20, 20)): + self.device.click(EQUIPMENT_OPEN) + bar_timer.reset() + continue + + def equipment_take_off(self, enter, out, fleet): + """ + Args: + enter (Button): Long click to edit equipment. + out (Button): Button to confirm exit success. + fleet (list[int]): list of equipment record. [3, 1, 1, 1, 1, 1] + """ + logger.hr('Equipment take off') + 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.equip_view_next() + else: + self._equip_take_off_one() + self.ui_click(click_button=EQUIPMENT_CLOSE, check_button=EQUIPMENT_OPEN, offset=None) + + self.ui_back(out) + self.equipment_has_take_on = False + + def _equip_take_on_one(self, index, skip_first_screenshot=True): + bar_timer = Timer(5) + on_timer = Timer(5) + + while 1: + if skip_first_screenshot: + self.device.screenshot() + else: + skip_first_screenshot = False + + # End + # if self.handle_info_bar(): + # break + if on_timer.started() and self.info_bar_count(): + break + + if bar_timer.reached() and not self.appear(old_EQUIP_1, offset=10): + self.device.click(EQUIPMENT_OPEN) + # self.device.sleep(0.3) + bar_timer.reset() + continue + + if on_timer.reached() and self.appear(old_EQUIP_1, offset=10) and not self.info_bar_count(): + if index == 1: + self.device.click(old_EQUIP_1) + elif index == 2: + self.device.click(old_EQUIP_2) + elif index == 3: + self.device.click(old_EQUIP_3) + + on_timer.reset() + continue + + def equipment_take_on(self, enter, out, fleet): + """ + Args: + enter (Button): Long click to edit equipment. + out (Button): Button to confirm exit success. + fleet (list[int]): list of equipment record. [3, 1, 1, 1, 1, 1] + """ + logger.hr('Equipment take on') + 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.equip_view_next() + else: + self._equip_take_on_one(index=index) + self.ui_click(click_button=EQUIPMENT_CLOSE, check_button=EQUIPMENT_OPEN, offset=None) + + self.ui_back(out) + self.equipment_has_take_on = True diff --git a/module/equipment/old_equipment_change.py b/module/equipment/old_equipment_change.py new file mode 100644 index 000000000..9b169f574 --- /dev/null +++ b/module/equipment/old_equipment_change.py @@ -0,0 +1,168 @@ +import cv2 +import numpy as np + +from module.base.button import ButtonGrid +from module.base.utils import random_rectangle_vector +from module.equipment.old_equipment import OldEquipment +from module.logger import logger +from module.equipment.assets import * +from module.ui.assets import BACK_ARROW +from module.ui.scroll import Scroll +from module.ui.switch import Switch +from module.base.decorator import Config + +# Button of 5 equipments +EQUIP_INFO_BAR = ButtonGrid( + origin=(695, 127), delta=(86.25, 0), button_shape=(73, 73), grid_shape=(5, 1), name="EQUIP_INFO_BAR") +# Bottom-left corner of EQUIP_INFO_BAR, to detect whether the grid has an equipment +EQUIPMENT_GRID = ButtonGrid( + origin=(696, 170), delta=(86.25, 0), button_shape=(32, 32), grid_shape=(5, 1), name='EQUIPMENT_GRID') +EQUIPMENT_SCROLL = Scroll(EQUIP_SCROLL, color=(247, 211, 66), name='EQUIP_SCROLL') +SIM_VALUE = 0.90 + +equipping_filter = Switch('Equipping_filter') +equipping_filter.add_state('on', check_button=EQUIPPING_ON) +equipping_filter.add_state('off', check_button=EQUIPPING_OFF) + + +class OldEquipmentChange(OldEquipment): + equip_list = {} + equipping_list = [] + + def get_equiping_list(self, skip_first_screenshot=True): + ''' + Pages: + in: ship's details + ''' + logger.info("Get equipping list") + if skip_first_screenshot: + pass + else: + self.device.screenshot() + index = 0 + self.equipping_list = [] + for button in EQUIPMENT_GRID.buttons: + crop_image = self.image_crop(button) + edge_value = np.mean(np.abs(cv2.Sobel(crop_image, 3, 1, 1))) + # Nothing is 0.15~1 + # +1 is 40 + # +10 is 46 + if edge_value > 10: + self.equipping_list.append(index) + index += 1 + logger.info(f"Equipping list: {self.equipping_list}") + + def record_equipment(self, index_list=range(0, 5)): + ''' + Record equipment through upgrade page + Notice: The equipment icons in the upgrade page are the same size as the icons in the equipment status + ''' + logger.info('RECORD EQUIPMENT') + self.equip_side_navbar_ensure(bottom=1) + self.get_equiping_list() + + for index in index_list: + if index in self.equipping_list: + logger.info(f'Record {index}') + logger.info('Enter equipment info') + self.ui_click(appear_button=EQUIPMENT_OPEN, click_button=EQUIP_INFO_BAR[( + index, 0)], check_button=UPGRADE_ENTER) + logger.info('Enter upgrade inform') + self.ui_click(click_button=UPGRADE_ENTER, + check_button=UPGRADE_ENTER_CHECK, skip_first_screenshot=True) + logger.info('Save equipment tamplate') + self.equip_list[index] = self.image_crop(EQUIP_SAVE) + logger.info('Quit upgrade inform') + self.ui_click( + click_button=UPGRADE_QUIT, check_button=EQUIPMENT_OPEN, appear_button=UPGRADE_ENTER_CHECK, + skip_first_screenshot=True) + + def equipment_take_on(self, index_list=range(0, 5), skip_first_screenshot=True): + ''' + Equip the equipment previously recorded + ''' + logger.info('Take on equipment') + self.equip_side_navbar_ensure(bottom=2) + + for index in index_list: + if index in self.equipping_list: + logger.info(f'Take on {index}') + enter_button = globals()[ + 'EQUIP_TAKE_ON_{index}'.format(index=index)] + + self.ui_click(enter_button, check_button=EQUIPPING_ON, + skip_first_screenshot=skip_first_screenshot, offset=(5, 5)) + self.handle_info_bar() + self._find_equip(index) + + @Config.when(DEVICE_CONTROL_METHOD='minitouch') + def _equipment_swipe(self, distance=190): + # Distance of two commission is 146px + p1, p2 = random_rectangle_vector( + (0, -distance), box=(620, 67, 1154, 692), random_range=(-20, -5, 20, 5)) + self.device.drag(p1, p2, segments=2, shake=(25, 0), + point_random=(0, 0, 0, 0), shake_random=(-5, 0, 5, 0)) + self.device.sleep(0.3) + self.device.screenshot() + + @Config.when(DEVICE_CONTROL_METHOD=None) + def _equipment_swipe(self, distance=300): + # Distance of two commission is 146px + p1, p2 = random_rectangle_vector( + (0, -distance), box=(620, 67, 1154, 692), random_range=(-20, -5, 20, 5)) + self.device.drag(p1, p2, segments=2, shake=(25, 0), + point_random=(0, 0, 0, 0), shake_random=(-5, 0, 5, 0)) + self.device.sleep(0.3) + self.device.screenshot() + + def _equip_equipment(self, point, offset=(100, 100)): + ''' + Equip Equipment then back to ship details + Confirm the popup + Pages: + in: EQUIPMENT STATUS + out: SHIP_SIDEBAR_EQUIPMENT + ''' + logger.info('Equip equipment') + button = Button(area=(), color=(), button=(point[0], point[1], point[0] + offset[0], point[1] + offset[1]), + name='EQUIPMENT') + self.ui_click(appear_button=EQUIPPING_OFF, click_button=button, check_button=EQUIP_CONFIRM) + logger.info('Equip confirm') + self.ui_click(click_button=EQUIP_CONFIRM, check_button=SHIP_INFO_EQUIPMENT_CHECK) + + def _find_equip(self, index): + ''' + Find the equipment previously recorded + Pages: + in: EQUIPMENT STATUS + ''' + + self.equipping_set(False) + + res = cv2.matchTemplate(self.device.screenshot(), np.array( + self.equip_list[index]), cv2.TM_CCOEFF_NORMED) + _, sim, _, point = cv2.minMaxLoc(res) + + if sim > SIM_VALUE: + self._equip_equipment(point) + return + + for _ in range(0, 15): + self._equipment_swipe() + + if self.appear(EQUIP_CONFIRM, offset=(20, 20), interval=2): + self.device.click(BACK_ARROW) + continue + res = cv2.matchTemplate(self.device.screenshot(), np.array( + self.equip_list[index]), cv2.TM_CCOEFF_NORMED) + _, sim, _, point = cv2.minMaxLoc(res) + + if sim > SIM_VALUE: + self._equip_equipment(point) + break + if self.appear(EQUIPMENT_SCROLL_BOTTOM): + logger.warning('No recorded equipment was found.') + self.ui_back(check_button=globals()[f'EQUIP_TAKE_ON_{index}'], appear_button=EQUIPPING_OFF) + break + + return diff --git a/module/equipment/old_fleet_equipment.py b/module/equipment/old_fleet_equipment.py new file mode 100644 index 000000000..be8addf7b --- /dev/null +++ b/module/equipment/old_fleet_equipment.py @@ -0,0 +1,48 @@ +from module.equipment.old_equipment import OldEquipment +from module.equipment.old_equipment_change import OldEquipmentChange +from module.logger import logger +from module.ocr.ocr import Digit +from module.ui.assets import FLEET_CHECK +from module.ui.page import page_fleet +from module.equipment.assets import OCR_FLEET_INDEX, FLEET_NEXT, FLEET_PREV, FLEET_ENTER + +OCR_FLEET_INDEX = Digit(OCR_FLEET_INDEX, letter=(90, 154, 255), threshold=128, alphabet='123456') + + +class DailyEquipment(OldEquipmentChange): + equipment_has_take_on = False + + @property + def _fleet_daily(self): + fleet = self.config.FLEET_DAILY + if isinstance(fleet, list): + logger.info(f'Multiple daily fleets are set, change equipment only for the first one. fleet: {fleet}') + return fleet[0] + else: + return fleet + + def equipment_take_on(self): + if self.config.FLEET_DAILY_EQUIPMENT is None: + return False + if self.equipment_has_take_on: + return False + + self.ui_ensure(page_fleet) + self.ui_ensure_index(self._fleet_daily, letter=OCR_FLEET_INDEX, next_button=FLEET_NEXT, prev_button=FLEET_PREV) + OldEquipment.equipment_take_on(self, enter=FLEET_ENTER, out=FLEET_CHECK, fleet=self.config.FLEET_DAILY_EQUIPMENT) + self.equipment_has_take_on = True + self.device.sleep(1) + return True + + def equipment_take_off(self): + if self.config.FLEET_DAILY_EQUIPMENT is None: + return False + if not self.equipment_has_take_on: + return False + + self.ui_ensure(page_fleet) + self.ui_ensure_index(self._fleet_daily, letter=OCR_FLEET_INDEX, next_button=FLEET_NEXT, prev_button=FLEET_PREV) + super().equipment_take_off(enter=FLEET_ENTER, out=FLEET_CHECK, fleet=self.config.FLEET_DAILY_EQUIPMENT) + self.equipment_has_take_on = False + self.device.sleep(1) + return True