StarRailCopilot/tasks/rogue/event/reward.py
2024-09-10 22:41:00 +08:00

130 lines
5.3 KiB
Python

from datetime import datetime, timedelta
from module.base.timer import Timer
from module.logger import logger
from tasks.base.assets.assets_base_popup import GET_REWARD
from tasks.combat.interact import CombatInteract
from tasks.dungeon.ui.state import DungeonState
from tasks.rogue.assets.assets_rogue_reward import REWARD_CLOSE, USE_IMMERSIFIER, USE_STAMINA
from tasks.rogue.blessing.ui import RogueUI
class RogueReward(RogueUI, CombatInteract, DungeonState):
def claim_domain_reward(
self,
use_trailblaze_power=False,
use_immersifier=True,
skip_first_screenshot=True
):
"""
Pages:
in: page_main, DUNGEON_COMBAT_INTERACT, near immersifier
"""
logger.hr('Claim domain reward', level=2)
logger.info(f'use_trailblaze_power={use_trailblaze_power}, use_immersifier={use_immersifier}')
if not use_trailblaze_power and not use_immersifier:
return
confirm = Timer(0.6, count=2).start()
init = False
initial_stamina = 0
initial_immersifier = 0
exhausted = False
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if self.is_in_main():
if confirm.reached():
break
if exhausted:
break
else:
confirm.reset()
if not exhausted and self.handle_combat_interact():
self.interval_clear(USE_STAMINA)
confirm.reset()
continue
if self.handle_reward():
self.interval_clear(USE_STAMINA)
confirm.reset()
continue
if self.appear(REWARD_CLOSE, interval=2):
self.update_stamina_status()
if not init:
initial_stamina = self.config.stored.TrailblazePower.value
initial_immersifier = self.config.stored.Immersifier.value
init = True
if use_trailblaze_power and self.config.stored.TrailblazePower.value >= 40:
self.device.click(USE_STAMINA)
self.interval_reset(USE_STAMINA)
self.interval_clear(GET_REWARD)
confirm.reset()
continue
elif use_immersifier and self.config.stored.Immersifier.value > 0:
self.device.click(USE_IMMERSIFIER)
self.interval_reset(USE_STAMINA)
self.interval_clear(GET_REWARD)
confirm.reset()
continue
else:
logger.info('Cannot claim more rewards')
self.device.click(REWARD_CLOSE)
self.interval_reset(USE_STAMINA)
confirm.reset()
exhausted = True
continue
with self.config.multi_set():
claimed = 0
diff = initial_immersifier - self.config.stored.Immersifier.value
if diff >= 1:
claimed += diff
self.config.stored.Immersifier.add(-diff)
diff = initial_stamina - self.config.stored.TrailblazePower.value
if diff + 2 >= 40:
# Stamina may recover while receiving
diff = int((diff + 2) // 40)
claimed += diff
self.config.stored.TrailblazePower.add(-diff)
# Clicked button, closed reward popup, planer page closed by game itself, exhausted=False, claimed once
# Cannot claim more, clicked REWARD_CLOSE to close planer page, exhausted=True, nothing claimed at last
if not exhausted:
claimed += 1
if use_trailblaze_power:
self.config.stored.TrailblazePower.add(-1)
elif use_immersifier:
self.config.stored.Immersifier.add(-1)
logger.info(f'Claimed planer reward {claimed} times')
if self.config.stored.DungeonDouble.rogue > 0:
self.config.stored.DungeonDouble.rogue -= claimed
return claimed
def can_claim_domain_reward(
self,
use_trailblaze_power=False,
use_immersifier=True
):
if not use_trailblaze_power and not use_immersifier:
logger.info('Cannot claim domain reward, as all disabled')
return False
if self.config.is_task_enabled('Ornament'):
logger.info(f'Cannot claim domain reward, saving immersifiers for ornament')
return False
if use_immersifier:
if self.config.stored.Immersifier.value > 0:
logger.info(f'Can claim domain reward, got immersifiers')
return True
if datetime.now() - self.config.stored.Immersifier.time > timedelta(minutes=15):
logger.info(f'Can claim domain reward, immersifier record outdated')
return True
if use_trailblaze_power and self.config.stored.TrailblazePower.predict_current() >= 40:
logger.info(f'Can claim domain reward, got enough trailblaze power')
return True
logger.info('Cannot claim domain reward, requirements not satisfied')
return False