1
0
mirror of https://github.com/0O0o0oOoO00/Alas.git synced 2026-05-19 00:39:28 +08:00
Files
Alas/module/equipment/equipment_change.py

511 lines
21 KiB
Python

import gl
from module.base.button import ButtonGrid
from module.base.decorator import Config, cached_property
from module.base.utils import *
from module.config.config import AzurLaneConfig
from module.device.device import Device
from module.equipment.assets import *
from module.equipment.assets_override import equip_assets_override
from module.equipment.equipment import Equipment, EquipmentOld, EquipmentNew
from module.logger import logger
from module.storage.storage import StorageHandler
from module.ui.assets import BACK_ARROW
from module.ui.scroll import Scroll
from module.ui.switch import Switch
# 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 EquipmentChangeOld(EquipmentOld):
equip_list = {}
equipping_list = []
@equip_assets_override("old")
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}")
@equip_assets_override("old")
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)
@equip_assets_override("old")
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')
@equip_assets_override("old")
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)
@equip_assets_override("old")
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()
@equip_assets_override("old")
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)
@equip_assets_override("old")
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
class EquipmentChangeNew(EquipmentNew):
equipment_list = {}
@equip_assets_override("new")
def equipping_set(self, enable=False):
if equipping_filter.set('on' if enable else 'off', main=self):
self.wait_until_stable(SWIPE_AREA)
@equip_assets_override("new")
def ship_equipment_record_image(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.ship_side_navbar_ensure(bottom=1)
self.equipment_list = {}
for index, button in enumerate(EQUIPMENT_GRID.buttons):
if index not in index_list:
continue
crop_image = self.image_crop(button, copy=False)
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:
# Enter equipment info
self.ui_click(appear_button=EQUIPMENT_OPEN,
click_button=EQUIP_INFO_BAR[(index, 0)],
check_button=UPGRADE_ENTER)
# Enter upgrade inform
self.ui_click(click_button=UPGRADE_ENTER,
check_button=UPGRADE_ENTER_CHECK, skip_first_screenshot=True)
self.equipment_list[index] = self.image_crop(EQUIP_SAVE)
# Quit upgrade inform
self.ui_click(
click_button=UPGRADE_QUIT, check_button=EQUIPMENT_OPEN, appear_button=UPGRADE_ENTER_CHECK,
skip_first_screenshot=True)
logger.info(f"Recorded equipment index list: {list(self.equipment_list.keys())}")
@equip_assets_override("new")
def ship_equipment_take_on_image(self, index_list=range(0, 5), skip_first_screenshot=True):
"""
Equip the equipment previously recorded
"""
logger.info('Take on equipment')
self.ship_side_navbar_ensure(bottom=2)
for index in index_list:
if index in self.equipment_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_equipment(index)
@Config.when(DEVICE_CONTROL_METHOD='minitouch')
@equip_assets_override("new")
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)
@equip_assets_override("new")
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()
@equip_assets_override("new")
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)
@equip_assets_override("new")
def _find_equipment(self, index):
"""
Find the equipment previously recorded
Pages:
in: EQUIPMENT STATUS
"""
self.equipping_set(False)
res = cv2.matchTemplate(self.device.screenshot(), np.array(
self.equipment_list[index]), cv2.TM_CCOEFF_NORMED)
_, sim, _, point = cv2.minMaxLoc(res)
if sim > SIM_VALUE:
self._equip_equipment(point)
return
if not EQUIPMENT_SCROLL.appear(main=self):
logger.warning('No recorded equipment was found.')
self.ui_back(check_button=globals()[f'EQUIP_TAKE_ON_{index}'], appear_button=EQUIPPING_OFF)
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.equipment_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
class EquipmentChange(StorageHandler):
def __init__(self, config, device=None, task=None):
conf = AzurLaneConfig.build_azurlane_config(config, task)
dev = Device.build_device(conf, device)
self.equipment_change_old: EquipmentChangeOld = EquipmentChangeOld(config=conf, device=dev, task=task)
self.equipment_change_new: EquipmentChangeNew = EquipmentChangeNew(config=conf, device=dev, task=task)
StorageHandler.__init__(self, config=conf, device=dev, task=task)
self.equipment_change_switch_stack = collections.deque()
self.equipment_change_current_use = self.equipment_change_new
def switch_equipment_change_to_old(self):
self.equipment_change_switch_stack.append(self.equipment_change_current_use)
self.equipment_change_current_use = self.equipment_change_new
def switch_equipment_change_to_new(self):
self.equipment_change_switch_stack.append(self.equipment_change_current_use)
self.equipment_change_current_use = self.equipment_change_new
def switch_equipment_change_back(self):
if len(self.equipment_change_switch_stack) == 0:
self.equipment_change_current_use = self.equipment_change_new
return
self.equipment_change_current_use = self.equipment_change_switch_stack.pop()
'''
EquipmentChangeOld
'''
@cached_property
def equip_list(self):
return self.equipment_change_old.equip_list
@cached_property
def equipping_list(self):
return self.equipment_change_old.equipping_list
def get_equiping_list(self, skip_first_screenshot=True):
return self.equipment_change_old.get_equiping_list(skip_first_screenshot=skip_first_screenshot)
def record_equipment(self, index_list=range(0, 5)):
return self.equipment_change_old.record_equipment(index_list=index_list)
def equipment_take_on(self, *args, **kwargs):
if "index_list" in kwargs or "skip_first_screenshot" in kwargs:
return EquipmentChangeOld.equipment_take_on(self.equipment_change_old, *args, **kwargs)
else:
return EquipmentOld.equipment_take_on(self.equipment_change_old, *args, **kwargs)
@Config.when(DEVICE_CONTROL_METHOD='minitouch')
def _equipment_swipe(self, distance=190):
return self.equipment_change_old._equipment_swipe(distance=distance)
@Config.when(DEVICE_CONTROL_METHOD=None)
def _equipment_swipe(self, distance=300):
return self.equipment_change_old._equipment_swipe(distance=distance)
# def _equip_equipment(self, point, offset=(100, 100)):
# return self.equipment_change_old._equip_equipment(point, offset=offset)
def _find_equip(self, index):
return self.equipment_change_old._find_equip(index)
'''
EquipmentChangeOld.EquipmentOld
'''
@cached_property
def equipment_has_take_on(self):
return self.equipment_change_old.equipment_has_take_on
'''in Public section'''
# def equipping_set(self, enable=False):
# return self.equipment_change_old.equipping_set(enable=enable)
def _equip_view_swipe(self, distance, check_button=EQUIPMENT_OPEN):
return self.equipment_change_old._equip_view_swipe(distance=distance, check_button=check_button)
def equip_view_next(self, check_button=EQUIPMENT_OPEN):
return self.equipment_change_old.equip_view_next(check_button=check_button)
def equip_view_prev(self, check_button=EQUIPMENT_OPEN):
return self.equipment_change_old.equip_view_prev(check_button=check_button)
def equip_enter(self, click_button, check_button=EQUIPMENT_OPEN, long_click=True, skil_first_screenshot=True):
return self.equipment_change_old.equip_enter(click_button=click_button, check_button=check_button, long_click=long_click, skil_first_screenshot=skil_first_screenshot)
@cached_property
def _equip_side_navbar(self):
return self.equipment_change_old._equip_side_navbar
def equip_side_navbar_ensure(self, upper=None, bottom=None):
return self.equipment_change_old.equip_side_navbar_ensure(upper=upper, bottom=bottom)
def _equip_take_off_one(self, skip_first_screenshot=True):
return self.equipment_change_old._equip_take_off_one(skip_first_screenshot=skip_first_screenshot)
def equipment_take_off(self, enter, out, fleet):
return self.equipment_change_old.equipment_take_off(enter, out, fleet)
def _equip_take_on_one(self, index, skip_first_screenshot=True):
return self.equipment_change_old._equip_take_on_one(index=index, skip_first_screenshot=skip_first_screenshot)
'''in EquipmentChangeOld section'''
# def equipment_take_on(self, enter, out, fleet):
# return self.equipment_change_old.equipment_take_on(enter, out, fleet)
'''
EquipmentChangeNew
'''
@cached_property
def equipment_list(self):
return self.equipment_change_new.equipment_list
'''in Public section'''
# def equipping_set(self, enable=False):
# return self.equipment_change_new.equipping_set(enable=enable)
def ship_equipment_record_image(self, index_list=range(0, 5)):
return self.equipment_change_new.ship_equipment_record_image(index_list=index_list)
def ship_equipment_take_on_image(self, index_list=range(0, 5), skip_first_screenshot=True):
return self.equipment_change_new.ship_equipment_take_on_image(index_list=index_list, skip_first_screenshot=skip_first_screenshot)
@Config.when(DEVICE_CONTROL_METHOD='minitouch')
def _equipment_swipe(self, distance=190):
return self.equipment_change_new._equipment_swipe(distance=distance)
@Config.when(DEVICE_CONTROL_METHOD=None)
def _equipment_swipe(self, distance=300):
return self.equipment_change_new._equipment_swipe(distance=distance)
'''in Public section'''
# def _equip_equipment(self, point, offset=(100, 100)):
# return self.equipment_change_new._equip_equipment(point, offset=offset)
def _find_equipment(self, index):
return self.equipment_change_new._find_equipment(index)
'''
EquipmentChangeNew.EquipmentNew
'''
@cached_property
def equipment_has_take_on(self):
return self.equipment_change_new.equipment_has_take_on
def _ship_view_swipe(self, distance, check_button=EQUIPMENT_OPEN):
return self.equipment_change_new._ship_view_swipe(distance=distance, check_button=check_button)
def ship_view_next(self, check_button=EQUIPMENT_OPEN):
return self.equipment_change_new.ship_view_next(check_button=check_button)
def ship_view_prev(self, check_button=EQUIPMENT_OPEN):
return self.equipment_change_new.ship_view_prev(check_button=check_button)
def ship_info_enter(self, click_button, check_button=EQUIPMENT_OPEN, long_click=True, skil_first_screenshot=True):
return self.equipment_change_new.ship_info_enter(click_button=click_button, check_button=check_button, long_click=long_click, skil_first_screenshot=skil_first_screenshot)
@cached_property
def _ship_side_navbar(self):
return self.equipment_change_new._ship_side_navbar
def ship_side_navbar_ensure(self, upper=None, bottom=None):
return self.equipment_change_new.ship_side_navbar_ensure(upper=upper, bottom=bottom)
def ship_equipment_take_off(self, skip_first_screenshot=True):
return self.equipment_change_new.ship_equipment_take_off(skip_first_screenshot=skip_first_screenshot)
def fleet_equipment_take_off(self, enter, long_click, out):
return self.equipment_change_new.fleet_equipment_take_off(enter, long_click, out)
def ship_equipment_take_on_preset(self, index, skip_first_screenshot=True):
return self.equipment_change_new.ship_equipment_take_on_preset(index, skip_first_screenshot=skip_first_screenshot)
def fleet_equipment_take_on_preset(self, preset_record, enter, long_click, out):
return self.equipment_change_new.fleet_equipment_take_on_preset(preset_record, enter, long_click, out)
'''
Public
'''
def equipping_set(self, enable=False):
return self.equipment_change_current_use.equipping_set(enable=enable)
def _equip_equipment(self, point, offset=(100, 100)):
return self.equipment_change_current_use._equip_equipment(point, offset=offset)