mirror of
https://gitee.com/sui-feng-cb/AzurLaneAutoScript1
synced 2026-03-19 23:33:33 +08:00
Mov: reward mail support to separate module
Del: MAIL_CLICK_SAFE_AREA, MAIL_COLLECT sufficient as substitute
This commit is contained in:
10
module/mail/assets.py
Normal file
10
module/mail/assets.py
Normal file
@@ -0,0 +1,10 @@
|
||||
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.
|
||||
|
||||
MAIL_COLLECT = Button(area={'cn': (865, 583, 947, 601), 'en': (865, 583, 947, 601), 'jp': (865, 583, 947, 601), 'tw': (865, 583, 947, 601)}, color={'cn': (151, 180, 216), 'en': (151, 180, 216), 'jp': (151, 180, 216), 'tw': (151, 180, 216)}, button={'cn': (865, 583, 947, 601), 'en': (865, 583, 947, 601), 'jp': (865, 583, 947, 601), 'tw': (865, 583, 947, 601)}, file={'cn': './assets/cn/mail/MAIL_COLLECT.png', 'en': './assets/en/mail/MAIL_COLLECT.png', 'jp': './assets/jp/mail/MAIL_COLLECT.png', 'tw': './assets/tw/mail/MAIL_COLLECT.png'})
|
||||
MAIL_COLLECTED = Button(area={'cn': (835, 578, 975, 606), 'en': (835, 578, 975, 606), 'jp': (835, 578, 975, 606), 'tw': (835, 578, 975, 606)}, color={'cn': (54, 63, 71), 'en': (54, 63, 71), 'jp': (54, 63, 71), 'tw': (54, 63, 71)}, button={'cn': (835, 578, 975, 606), 'en': (835, 578, 975, 606), 'jp': (835, 578, 975, 606), 'tw': (835, 578, 975, 606)}, file={'cn': './assets/cn/mail/MAIL_COLLECTED.png', 'en': './assets/en/mail/MAIL_COLLECTED.png', 'jp': './assets/jp/mail/MAIL_COLLECTED.png', 'tw': './assets/tw/mail/MAIL_COLLECTED.png'})
|
||||
MAIL_DELETE = Button(area={'cn': (428, 567, 500, 584), 'en': (428, 567, 500, 584), 'jp': (428, 567, 500, 584), 'tw': (428, 567, 500, 584)}, color={'cn': (216, 173, 169), 'en': (216, 173, 169), 'jp': (216, 173, 169), 'tw': (216, 173, 169)}, button={'cn': (428, 567, 500, 584), 'en': (428, 567, 500, 584), 'jp': (428, 567, 500, 584), 'tw': (428, 567, 500, 584)}, file={'cn': './assets/cn/mail/MAIL_DELETE.png', 'en': './assets/en/mail/MAIL_DELETE.png', 'jp': './assets/jp/mail/MAIL_DELETE.png', 'tw': './assets/tw/mail/MAIL_DELETE.png'})
|
||||
MAIL_ENTER = Button(area={'cn': (1207, 393, 1253, 429), 'en': (1207, 393, 1253, 429), 'jp': (1207, 393, 1253, 429), 'tw': (1207, 393, 1253, 429)}, color={'cn': (109, 107, 95), 'en': (109, 107, 95), 'jp': (109, 107, 95), 'tw': (109, 107, 95)}, button={'cn': (1207, 393, 1253, 429), 'en': (1207, 393, 1253, 429), 'jp': (1207, 393, 1253, 429), 'tw': (1207, 393, 1253, 429)}, file={'cn': './assets/cn/mail/MAIL_ENTER.png', 'en': './assets/en/mail/MAIL_ENTER.png', 'jp': './assets/jp/mail/MAIL_ENTER.png', 'tw': './assets/tw/mail/MAIL_ENTER.png'})
|
||||
238
module/mail/mail.py
Normal file
238
module/mail/mail.py
Normal file
@@ -0,0 +1,238 @@
|
||||
import re
|
||||
|
||||
import numpy as np
|
||||
|
||||
from module.base.button import ButtonGrid
|
||||
from module.base.decorator import cached_property
|
||||
from module.base.filter import Filter
|
||||
from module.base.timer import Timer
|
||||
from module.base.utils import crop, rgb2gray
|
||||
from module.combat.assets import *
|
||||
from module.logger import logger
|
||||
from module.mail.assets import *
|
||||
from module.statistics.item import ItemGrid
|
||||
from module.ui.page import *
|
||||
from module.ui.ui import UI
|
||||
|
||||
MAIL_BUTTON_GRID = ButtonGrid(
|
||||
origin=(137, 207), delta=(0, 97),
|
||||
button_shape=(64, 64), grid_shape=(1, 3),
|
||||
name='MAIL_BUTTON_GRID')
|
||||
FILTER_REGEX = re.compile(
|
||||
'^(cube|coin|oil|merit|gem)$',
|
||||
flags=re.IGNORECASE)
|
||||
FILTER_ATTR = ['name']
|
||||
FILTER = Filter(FILTER_REGEX, FILTER_ATTR)
|
||||
|
||||
|
||||
class Mail(UI):
|
||||
def _reward_mail_enter(self, delete=False, skip_first_screenshot=True):
|
||||
"""
|
||||
Goes to mail page
|
||||
Also deletes viewed mails to ensure the relevant
|
||||
row entries are in view
|
||||
|
||||
Args:
|
||||
delete (bool):
|
||||
Enable extra step to delete old
|
||||
already collected mail entries
|
||||
skip_first_screenshot (bool):
|
||||
"""
|
||||
btn = MAIL_BUTTON_GRID.buttons[0].move((350, 0))
|
||||
while 1:
|
||||
if skip_first_screenshot:
|
||||
skip_first_screenshot = False
|
||||
else:
|
||||
self.device.screenshot()
|
||||
|
||||
if self.appear(page_main.check_button, offset=(30, 30), interval=3):
|
||||
self.device.click(MAIL_ENTER)
|
||||
continue
|
||||
if delete:
|
||||
if self.appear_then_click(MAIL_DELETE, offset=(350, 20), interval=3):
|
||||
continue
|
||||
if self.handle_popup_confirm('MAIL_DELETE'):
|
||||
delete = False
|
||||
continue
|
||||
else:
|
||||
if self.appear(MAIL_DELETE, offset=(350, 20), interval=3):
|
||||
self.device.click(btn)
|
||||
continue
|
||||
if self.handle_info_bar():
|
||||
continue
|
||||
|
||||
# End
|
||||
if not delete and self.appear(MAIL_COLLECT, offset=(20, 20)):
|
||||
break
|
||||
|
||||
def _reward_mail_exit(self, skip_first_screenshot=True):
|
||||
"""
|
||||
Exits from mail page back into page_main
|
||||
|
||||
Args:
|
||||
skip_first_screenshot (bool):
|
||||
"""
|
||||
while 1:
|
||||
if skip_first_screenshot:
|
||||
skip_first_screenshot = False
|
||||
else:
|
||||
self.device.screenshot()
|
||||
|
||||
if self.appear(GET_ITEMS_1, offset=(30, 30), interval=1):
|
||||
self.device.click(MAIL_COLLECT)
|
||||
continue
|
||||
if self.appear(GET_ITEMS_2, offset=(30, 30), interval=1):
|
||||
self.device.click(MAIL_COLLECT)
|
||||
continue
|
||||
if self.appear(MAIL_DELETE, offset=(350, 20), interval=3):
|
||||
self.device.click(MAIL_ENTER)
|
||||
continue
|
||||
if self.handle_info_bar():
|
||||
continue
|
||||
|
||||
# End
|
||||
if self.appear(page_main.check_button, offset=(30, 30)):
|
||||
break
|
||||
|
||||
@cached_property
|
||||
def _reward_mail_grid(self):
|
||||
"""
|
||||
This grid only comprises the top 3 mail rows
|
||||
|
||||
Returns:
|
||||
ItemGrid
|
||||
"""
|
||||
mail_item_grid = ItemGrid(MAIL_BUTTON_GRID, templates={},
|
||||
amount_area=(60, 74, 96, 95))
|
||||
mail_item_grid.load_template_folder('./assets/stats_basic')
|
||||
mail_item_grid.similarity = 0.85
|
||||
return mail_item_grid
|
||||
|
||||
def _reward_mail_get_collectable(self):
|
||||
"""
|
||||
Loads filter and scans the items in the mail grid
|
||||
then returns a subset of those that are collectable
|
||||
|
||||
Returns:
|
||||
list[Item]
|
||||
"""
|
||||
FILTER.load(self.config.Reward_MailFilter.strip())
|
||||
items = self._reward_mail_grid.predict(
|
||||
self.device.image,
|
||||
name=True,
|
||||
amount=False,
|
||||
cost=False,
|
||||
price=False,
|
||||
tag=False
|
||||
)
|
||||
filtered = FILTER.apply(items, None)
|
||||
logger.attr('Item_sort', ' > '.join([str(item) for item in filtered]))
|
||||
return filtered
|
||||
|
||||
def _reward_mail_selected(self, button, image):
|
||||
"""
|
||||
Check if mail (button) is selected i.e.
|
||||
has bottom yellow border
|
||||
|
||||
Args:
|
||||
button (Button):
|
||||
image (np.ndarray): Screenshot
|
||||
|
||||
Returns:
|
||||
bool
|
||||
"""
|
||||
area = button.area
|
||||
check_area = tuple([area[0], area[3] + 3, area[2], area[3] + 5])
|
||||
im = rgb2gray(crop(image, check_area))
|
||||
return True if np.mean(im) < 182 else False
|
||||
|
||||
def _reward_mail_collect_one(self, item, skip_first_screenshot=True):
|
||||
"""
|
||||
Executes the collecting sequence on
|
||||
one mail item
|
||||
|
||||
Args:
|
||||
item (Item):
|
||||
skip_first_screenshot (bool):
|
||||
"""
|
||||
btn = item._button
|
||||
click_timer = Timer(1.5, count=3)
|
||||
while 1:
|
||||
if skip_first_screenshot:
|
||||
skip_first_screenshot = False
|
||||
else:
|
||||
self.device.screenshot()
|
||||
|
||||
if click_timer.reached():
|
||||
if not self._reward_mail_selected(btn, self.device.image):
|
||||
self.device.click(btn.move((350, 0)))
|
||||
click_timer.reset()
|
||||
continue
|
||||
click_timer.reset()
|
||||
if self.appear_then_click(MAIL_COLLECT, offset=(20, 20), interval=3):
|
||||
click_timer.reset()
|
||||
continue
|
||||
if self.appear(GET_ITEMS_1, offset=(30, 30), interval=1):
|
||||
self.device.click(MAIL_COLLECT)
|
||||
click_timer.reset()
|
||||
continue
|
||||
if self.appear(GET_ITEMS_2, offset=(30, 30), interval=1):
|
||||
self.device.click(MAIL_COLLECT)
|
||||
click_timer.reset()
|
||||
continue
|
||||
if self.handle_info_bar():
|
||||
click_timer.reset()
|
||||
continue
|
||||
|
||||
# End
|
||||
if self.appear(MAIL_COLLECTED, offset=(20, 20)):
|
||||
break
|
||||
|
||||
def _reward_mail_collect(self, skip_first_screenshot=True):
|
||||
"""
|
||||
Executes the collecting sequence to
|
||||
applicable mail items
|
||||
|
||||
Args:
|
||||
skip_first_screenshot (bool):
|
||||
"""
|
||||
for _ in range(5):
|
||||
if skip_first_screenshot:
|
||||
skip_first_screenshot = False
|
||||
else:
|
||||
self.device.screenshot()
|
||||
|
||||
collectable = self._reward_mail_get_collectable()
|
||||
if not collectable:
|
||||
break
|
||||
|
||||
self._reward_mail_collect_one(collectable[0])
|
||||
|
||||
logger.info('Finished collecting all applicable mail')
|
||||
|
||||
def reward_mail(self, collect=True, delete=False):
|
||||
"""
|
||||
Collects mail rewards
|
||||
|
||||
Args:
|
||||
collect (bool):
|
||||
delete (bool):
|
||||
"""
|
||||
if not collect:
|
||||
return False
|
||||
logger.info('Mail reward')
|
||||
|
||||
self._reward_mail_enter(delete)
|
||||
self._reward_mail_collect()
|
||||
self._reward_mail_exit()
|
||||
|
||||
def run(self):
|
||||
"""
|
||||
Pages:
|
||||
in: Any page
|
||||
out: page_main, may have info_bar
|
||||
"""
|
||||
self.ui_goto(page_main)
|
||||
self.reward_mail(collect=self.config.Reward_CollectMail,
|
||||
delete=self.config.Reward_DeleteMail)
|
||||
self.config.task_delay(success=True)
|
||||
Reference in New Issue
Block a user