1
0
mirror of https://gitee.com/sui-feng-cb/AzurLaneAutoScript1 synced 2026-03-09 18:39:04 +08:00
AzurLaneAutoScript/module/campaign/gems_farming.py

314 lines
10 KiB
Python
Raw Normal View History

2021-08-12 06:14:24 +08:00
from module.base.decorator import Config
from module.map.assets import FLEET_PREPARATION
2021-08-12 06:14:24 +08:00
from module.config.config import AzurLaneConfig
2021-06-29 23:08:59 +08:00
from module.campaign.run import CampaignRun
from module.handler.assets import AUTO_SEARCH_MENU_EXIT, AUTO_SEARCH_MENU_CONTINUE
2021-06-29 23:08:59 +08:00
from module.combat.level import LevelOcr
2021-07-06 15:50:33 +08:00
from module.ocr.ocr import Digit
2021-06-29 23:08:59 +08:00
from module.equipment.assets import *
from module.equipment.fleet_equipment import OCR_FLEET_INDEX
from module.retire.dock import *
from module.ui.page import page_fleet
2021-07-05 02:24:38 +08:00
2021-06-29 23:08:59 +08:00
2021-06-30 02:15:57 +08:00
from module.equipment.equipment_change import EquipmentChange
2021-06-29 23:08:59 +08:00
2021-06-30 02:15:57 +08:00
SIM_VALUE = 0.95
class GemsFarming(CampaignRun, EquipmentChange):
def _fleet_detail_enter(self):
2021-06-29 23:08:59 +08:00
self.ui_ensure(page_fleet)
self.ui_ensure_index(self.config.FLEET_1, letter=OCR_FLEET_INDEX,
2021-06-30 02:15:57 +08:00
next_button=FLEET_NEXT, prev_button=FLEET_PREV)
def _ship_detail_enter(self, button):
self._fleet_detail_enter()
self.equip_enter(button)
def flagship_change(self):
self._ship_detail_enter(FLEET_ENTER_FLAGSHIP)
self.record_equipment()
self._equip_take_off_one()
self._fleet_detail_enter()
2021-06-29 23:08:59 +08:00
self.flagship_change_execute()
2021-06-30 02:15:57 +08:00
self._ship_detail_enter(FLEET_ENTER_FLAGSHIP)
self._equip_take_off_one()
self.equipment_take_on()
2021-07-06 16:48:52 +08:00
def vanguard_change(self):
self._ship_detail_enter(FLEET_ENTER)
self.record_equipment()
self._equip_take_off_one()
self._fleet_detail_enter()
self.vanguard_change_execute()
self._ship_detail_enter(FLEET_ENTER)
self._equip_take_off_one()
self.equipment_take_on()
2021-06-30 02:15:57 +08:00
def _ship_change_confirm(self, button):
2021-06-30 02:15:57 +08:00
self.dock_select_one(button)
2021-06-30 02:15:57 +08:00
self.dock_filter_set_faster()
self.dock_select_confirm(check_button=page_fleet.check_button)
2021-06-29 23:08:59 +08:00
def get_common_rarity_cv(self):
"""
Returns:
Button:
2021-06-29 23:08:59 +08:00
"""
2021-07-06 15:50:33 +08:00
level_grids = CARD_LEVEL_GRIDS
card_grids = CARD_GRIDS
template = globals()[f'TEMPLATE_{self.config.COMMON_CV_NAME}']
self.dock_sort_method_dsc_set()
ocr = LevelOcr(level_grids.buttons, name='DOCK_LEVEL_OCR')
list_level = ocr.ocr(self.device.image)
for button, level in zip(card_grids.buttons, list_level):
2021-07-06 15:50:33 +08:00
if level == 1 and template.match(self.device.image.crop(button.area), similarity=SIM_VALUE):
return button
self.dock_sort_method_dsc_set(False)
list_level = ocr.ocr(self.device.image)
for button, level in zip(card_grids.buttons, list_level):
if level == 1 and template.match(self.device.image.crop(button.area), similarity=SIM_VALUE):
return button
2021-06-30 02:15:57 +08:00
return None
2021-06-30 02:15:57 +08:00
def get_common_rarity_dd(self):
"""
Returns:
Button:
"""
2021-07-06 15:50:33 +08:00
level_grids = CARD_LEVEL_GRIDS
card_grids = CARD_GRIDS
emotion_grids = CARD_EMOTION_GRIDS
2021-07-06 15:50:33 +08:00
level_ocr = LevelOcr(level_grids.buttons, name='DOCK_LEVEL_OCR', threshold=64)
list_level = level_ocr.ocr(self.device.image)
emotion_ocr = Digit(emotion_grids.buttons, name='DOCK_EMOTION_OCR', threshold=176)
list_emotion = emotion_ocr.ocr(self.device.image)
2021-07-06 16:48:52 +08:00
for button, level, emotion in list(zip(card_grids.buttons, list_level, list_emotion))[::-1]:
2021-07-06 15:50:33 +08:00
if level == 100 and emotion == 150:
return button
2021-06-29 23:08:59 +08:00
return None
def flagship_change_execute(self):
"""
Returns:
bool: If success.
Pages:
in: page_fleet
out: page_fleet
"""
self.ui_click(FLEET_ENTER_FLAGSHIP,
appear_button=page_fleet.check_button, check_button=DOCK_CHECK, skip_first_screenshot=True)
2021-06-30 02:15:57 +08:00
self.dock_filter_set_faster(
2021-08-09 16:50:36 +08:00
index='cv', rarity='common', extra='enhanceable', sort='total')
2021-07-06 16:48:52 +08:00
self.dock_favourite_set(False)
2021-06-29 23:08:59 +08:00
self.device.screenshot()
ship = self.get_common_rarity_cv()
if ship is not None:
2021-06-30 02:15:57 +08:00
self._ship_change_confirm(ship)
2021-06-29 23:08:59 +08:00
logger.info('Change flagship success')
return True
else:
logger.info('Change flagship failed, no CV in common rarity.')
self.dock_filter_set_faster()
self.ui_back(check_button=page_fleet.check_button)
return False
2021-06-30 18:04:31 +08:00
_trigger_lv32 = False
2021-08-12 05:19:39 +08:00
_trigger_emotion = False
2021-06-30 18:04:31 +08:00
def triggered_stop_condition(self, oil_check=True):
# Lv32 limit
if self.config.STOP_IF_REACH_LV32 and self.campaign.config.LV32_TRIGGERED:
self._trigger_lv32 = True
logger.hr('Triggered lv32 limit')
return True
2021-08-12 05:19:39 +08:00
if self.config.GEMS_AUTO_SEARCH_FARMING and self.campaign.config.GEMS_EMOTION_TRIGGRED:
self._trigger_emotion = True
logger.hr('Triggered emotion limit')
return True
2021-06-30 18:04:31 +08:00
return super().triggered_stop_condition(oil_check=oil_check)
@Config.when(GEMS_LEVEL_CHECK=True)
def handle_auto_search_continue(self):
"""
Override AutoSearchHandler definition
for 2x book handling if needed
"""
if self.appear(AUTO_SEARCH_MENU_EXIT, offset=self._auto_search_menu_offset, interval=2):
self.map_is_2x_book = self.config.ENABLE_2X_BOOK
self.handle_2x_book_setting(mode='auto')
self.device.click(AUTO_SEARCH_MENU_EXIT)
self.interval_reset(AUTO_SEARCH_MENU_EXIT)
return True
return False
@Config.when(GEMS_AUTO_SEARCH_FARMING=True)
def handle_combat_low_emotion(self):
if not self.config.IGNORE_LOW_EMOTION_WARN:
return False
if self.handle_popup_cancel('IGNORE_LOW_EMOTION'):
self.config.GEMS_EMOTION_TRIGGRED = True
logger.hr('Emotion withdraw')
if self.campaign.is_in_map():
self.campaign.withdraw()
elif self.appear(FLEET_PREPARATION, offset=(20, 20)):
self.campaign.enter_map_cancel()
else:
return False
2021-08-12 06:14:24 +08:00
@Config.when(GEMS_AUTO_SEARCH_FARMING=True)
2021-08-12 05:19:39 +08:00
def run(self, name, folder='campaign_main', total=0):
name = name.lower()
if not name[0].isdigit():
folder = self.config.EVENT_NAME
else:
name = 'campaign_' + name.replace('-', '_')
while 1:
backup = self.config.cover(
STOP_IF_REACH_LV32=True,
FLEET_1=self.config.GEMS_FLEET_1,
FLEET_2=self.config.GEMS_FLEET_2,
FLEET_BOSS=1,
SUBMARINE=0,
FLEET_1_FORMATION=1,
FLEET_2_FORMATION=1,
FLEET_1_AUTO_MODE='combat_auto',
FLEET_2_AUTO_MODE='combat_auto',
ENABLE_MAP_FLEET_LOCK=True,
ENABLE_AUTO_SEARCH=True,
ENABLE_2X_BOOK=False,
STOP_IF_MAP_REACH='no',
ENABLE_EMOTION_REDUCE=False,
IGNORE_LOW_EMOTION_WARN=True,
GEMS_AUTO_SEARCH_FARMING = True,
)
self._trigger_lv32 = False
super().run(name=name, folder=folder, total=total)
# End
if self._trigger_lv32 or self._trigger_emotion:
self.flagship_change()
self.vanguard_change()
self._trigger_lv32 = False
self._trigger_emotion = False
self.campaign.config.LV32_TRIGGERED = False
2021-08-12 06:14:24 +08:00
self.campaign.config.GEMS_EMOTION_TRIGGRED = False
2021-08-12 05:19:39 +08:00
self.campaign.config.GEMS_LEVEL_CHECK = False
continue
else:
backup.recover()
break
2021-08-12 07:58:03 +08:00
@Config.when(GEMS_AUTO_SEARCH_FARMING=False)
def run(self, name, folder='campaign_main', total=0):
name = name.lower()
if not name[0].isdigit():
folder = self.config.EVENT_NAME
else:
name = 'campaign_' + name.replace('-', '_')
while 1:
backup = self.config.cover(
STOP_IF_REACH_LV32=True,
FLEET_1=self.config.GEMS_FLEET_1,
FLEET_2=self.config.GEMS_FLEET_2,
FLEET_BOSS=1,
SUBMARINE=0,
FLEET_1_FORMATION=1,
FLEET_2_FORMATION=1,
FLEET_1_AUTO_MODE='combat_auto',
FLEET_2_AUTO_MODE='combat_auto',
ENABLE_MAP_FLEET_LOCK=True,
ENABLE_AUTO_SEARCH=False,
ENABLE_2X_BOOK=False,
STOP_IF_MAP_REACH='no',
ENABLE_EMOTION_REDUCE=False,
IGNORE_LOW_EMOTION_WARN=True,
)
self._trigger_lv32 = False
2021-08-12 05:19:39 +08:00
2021-08-12 07:58:03 +08:00
super().run(name=name, folder=folder, total=total)
# End
if self._trigger_lv32:
self.flagship_change()
self._trigger_lv32 = False
self.campaign.config.LV32_TRIGGERED = False
backup.recover()
continue
else:
backup.recover()
break
2021-07-06 16:48:52 +08:00
def vanguard_change_execute(self):
"""
Returns:
bool: If success.
Pages:
in: page_fleet
out: page_fleet
"""
self.ui_click(FLEET_ENTER,
appear_button=page_fleet.check_button, check_button=DOCK_CHECK, skip_first_screenshot=True)
self.dock_filter_set_faster(
index='dd', rarity='common', faction='eagle')
self.dock_favourite_set(False)
self.device.screenshot()
ship = self.get_common_rarity_dd()
if ship is not None:
self._ship_change_confirm(ship)
logger.info('Change vanguard ship success')
return True
else:
logger.info('Change vanguard ship failed, no DD in common rarity.')
self.dock_filter_set_faster()
self.ui_back(check_button=page_fleet.check_button)
return False
2021-06-30 02:15:57 +08:00
if __name__ == '__main__':
2021-07-05 02:24:38 +08:00
from module.config.config import AzurLaneConfig
from module.device.device import Device
2021-06-30 02:15:57 +08:00
config = AzurLaneConfig('alas_cn')
az = GemsFarming(config, Device(config=config))
az.device.screenshot()
2021-07-06 16:48:52 +08:00
# az.flagship_change()
2021-08-12 06:14:24 +08:00
az.run('2-4')