StarRailCopilot/tasks/freebies/gift_of_odyssey.py
2025-01-16 20:17:07 +08:00

85 lines
3.1 KiB
Python

from module.base.timer import Timer
from module.logger import logger
from module.ocr.ocr import Ocr
from tasks.base.page import page_event
from tasks.base.ui import UI
from tasks.freebies.assets.assets_freebies_gift_of_odyssey import (
OCR_CLAIM,
OCR_EVENT,
EVENT_SELECTED,
GET_REWARD_BUTTON,
)
from tasks.freebies.keywords import KEYWORDS_FREEBIES_GIFT_OF_ODYSSEY, GiftOfOdysseyEvent
class GiftofOdyssey(UI):
def run(self):
logger.hr("Gift of Odyssey", level=1)
self.ui_ensure(page_event)
if self._select_event():
logger.info("Event selected")
self._get_reward()
def _select_event(self):
logger.info("Selecting Gift of Odyssey event")
ocr = Ocr(OCR_EVENT)
# When Gift of Odyssey event is the first event, the ocr results will be effected due to the animation of selected event
timer = Timer(0.5, count=1).start()
while 1:
self.device.screenshot()
results = ocr.matched_ocr(self.device.image, GiftOfOdysseyEvent)
if len(results) == 0 and timer.reached():
logger.info("Event not found, probably already been claimed")
self.config.stored.GiftofOdysseyClaimed.value = 7
return False
if len(results) == 1:
break
skip_first_screenshot = True
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if self.appear(EVENT_SELECTED):
break
if self.device.click(results[0]):
continue
return True
def _get_claim_status(self, image):
ocr = Ocr(OCR_CLAIM)
results = ocr.matched_ocr(image, GiftOfOdysseyEvent)
claimed = [result for result in results if result == KEYWORDS_FREEBIES_GIFT_OF_ODYSSEY.Claimed]
claim = [result for result in results if result == KEYWORDS_FREEBIES_GIFT_OF_ODYSSEY.Claim]
awaiting = [result for result in results if result == KEYWORDS_FREEBIES_GIFT_OF_ODYSSEY.Awaiting_check_in]
status = len(claimed), len(claim), len(awaiting)
logger.info(f"Claim status (Claimed, Claim, Awaiting check in): {status}")
if sum(status) != 7:
logger.warning("Num of OCR results is not seven")
self.config.stored.GiftofOdysseyClaimed.value = status[0]
return status
def _get_reward(self):
logger.info("Getting reward")
skip_first_screenshot = True
interval = Timer(2)
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if self.appear(EVENT_SELECTED):
_, claim, _ = self._get_claim_status(self.device.image)
if claim == 0:
logger.info("No more reward to get")
break
if self.handle_reward():
continue
if interval.reached():
if self.appear_then_click(GET_REWARD_BUTTON):
interval.reset()