mirror of
https://github.com/LmeSzinc/StarRailCopilot.git
synced 2024-11-24 09:33:34 +00:00
106 lines
3.8 KiB
Python
106 lines
3.8 KiB
Python
import re
|
|
|
|
import numpy as np
|
|
|
|
from module.base.timer import Timer
|
|
from module.logger import logger
|
|
from module.ocr.ocr import Ocr, OcrResultButton
|
|
from tasks.rogue.assets.assets_rogue_blessing import OCR_ROGUE_BUFF
|
|
from tasks.rogue.assets.assets_rogue_bonus import BONUS_BOTTOM_WHITE_BAR, BONUS_CONFIRM
|
|
from tasks.rogue.blessing.selector import RogueSelector
|
|
from tasks.rogue.blessing.utils import is_card_selected
|
|
from tasks.rogue.keywords import RogueBonus
|
|
|
|
|
|
class RogueBonusOcr(Ocr):
|
|
def after_process(self, result):
|
|
result = super().after_process(result)
|
|
if self.lang == 'cn':
|
|
replace_pattern_dict = {
|
|
"[宇宝][宙审]": "宇宙",
|
|
}
|
|
for pat, replace in replace_pattern_dict.items():
|
|
result = re.sub(pat, replace, result)
|
|
return result
|
|
|
|
|
|
class RogueBonusSelector(RogueSelector):
|
|
def _wait_bonus_page_loaded(self, timer=Timer(0.3, count=1), timeout=Timer(5, count=10)):
|
|
timer.reset()
|
|
timeout.reset()
|
|
while 1:
|
|
self.main.device.screenshot()
|
|
|
|
if timeout.reached():
|
|
logger.warning('Wait bonus page loaded timeout')
|
|
break
|
|
|
|
if self.main.appear(BONUS_BOTTOM_WHITE_BAR):
|
|
if timer.reached():
|
|
logger.info('Bonus page stabled')
|
|
break
|
|
else:
|
|
timer.reset()
|
|
|
|
def recognition(self):
|
|
self._wait_bonus_page_loaded()
|
|
ocr = RogueBonusOcr(OCR_ROGUE_BUFF)
|
|
results = ocr.matched_ocr(self.main.device.image, [RogueBonus])
|
|
expected_count = 3
|
|
if expected_count != len(results):
|
|
logger.warning(f"The OCR result does not match the bonus count. "
|
|
f"Expect {expected_count}, but recognized {len(results)} only.")
|
|
self.ocr_results = results
|
|
return results
|
|
|
|
def ui_select(self, target: OcrResultButton | None, skip_first_screenshot=True):
|
|
interval = Timer(1)
|
|
# start -> select
|
|
while 1:
|
|
if skip_first_screenshot:
|
|
skip_first_screenshot = False
|
|
else:
|
|
self.main.device.screenshot()
|
|
|
|
if is_card_selected(self.main, target, confirm_button=BONUS_CONFIRM):
|
|
break
|
|
if target is not None and interval.reached():
|
|
self.main.device.click(target)
|
|
interval.reset()
|
|
|
|
skip_first_screenshot = True
|
|
# Avoid double-clicking
|
|
interval = Timer(3, count=6)
|
|
# select -> confirm
|
|
while 1:
|
|
if skip_first_screenshot:
|
|
skip_first_screenshot = False
|
|
else:
|
|
self.main.device.screenshot()
|
|
|
|
if self.main.is_in_main():
|
|
logger.info("Main Page Checked")
|
|
break
|
|
if self.main.is_page_choose_curio():
|
|
logger.info("Choose curio page checked")
|
|
break
|
|
if self.main.is_page_choose_blessing():
|
|
logger.info("Choose blessing page checked")
|
|
break
|
|
if interval.reached():
|
|
self.main.device.click(BONUS_CONFIRM)
|
|
interval.reset()
|
|
|
|
def recognize_and_select(self):
|
|
self.recognition()
|
|
if not self.ocr_results:
|
|
self.ui_select(None)
|
|
options = {result.matched_keyword.en: result for result in self.ocr_results}
|
|
if self.main.config.RogueWorld_Bonus not in options.keys():
|
|
logger.warning(f"Can not find option: {self.main.config.RogueWorld_Bonus}, randomly choose one")
|
|
target = np.random.choice(list(options.values()))
|
|
else:
|
|
target = options[self.main.config.RogueWorld_Bonus]
|
|
logger.info(f"Choose bonus: {target}")
|
|
self.ui_select(target)
|