StarRailCopilot/module/map/map_operation.py
2020-03-29 01:41:34 +08:00

162 lines
4.7 KiB
Python

from module.base.timer import Timer
from module.handler.enemy_searching import EnemySearchingHandler
from module.handler.urgent_commission import UrgentCommissionHandler
from module.logger import logger
from module.map.assets import *
from module.map.exception import CampaignEnd
from module.map.map_fleet_preparation import FleetPreparation
from module.retire.retirement import Retirement
class MapOperation(UrgentCommissionHandler, EnemySearchingHandler, FleetPreparation, Retirement):
def fleet_switch_click(self):
"""
Switch fleet.
"""
logger.info('Switch over')
if self.appear_then_click(SWITCH_OVER):
pass
else:
logger.warning('No buttons detected.')
self.device.sleep((1, 1.5))
# self.ensure_no_info_bar()
def enter_map(self, button, mode='normal'):
"""Enter a campaign.
Args:
button: Campaign to enter.
mode (str): 'normal' or 'hard' or 'cd'
"""
logger.hr('Enter map')
campaign_timer = Timer(2)
map_timer = Timer(1)
fleet_timer = Timer(1)
checked_in_map = False
while 1:
self.device.screenshot()
if not checked_in_map and self.is_in_map():
logger.info('Already in map.')
return False
else:
checked_in_map = True
# Enter campaign
if campaign_timer.reached() and self.appear_then_click(button):
campaign_timer.reset()
continue
# Map preparation
if map_timer.reached() and self.appear(MAP_PREPARATION):
self.device.click(MAP_PREPARATION)
map_timer.reset()
campaign_timer.reset()
continue
# Fleet preparation
if fleet_timer.reached() and self.appear(FLEET_PREPARATION):
if self.config.ENABLE_FLEET_CONTROL:
if mode == 'normal' or mode == 'hard':
self.fleet_preparation()
self.device.click(FLEET_PREPARATION)
fleet_timer.reset()
campaign_timer.reset()
continue
# Retire
if self.handle_retirement():
continue
# Emotion
pass
# Urgent commission
if self.handle_urgent_commission():
continue
# End
if self.handle_in_map_with_enemy_searching():
break
return True
def withdraw(self):
"""
Withdraw campaign.
"""
logger.hr('Map withdraw')
while 1:
self.device.screenshot()
if self.appear_then_click(WITHDRAW, interval=2):
continue
if self.appear_then_click(WITHDRAW_CONFIRM, offset=True, interval=2):
continue
# End
if self.handle_in_stage():
raise CampaignEnd('Withdraw')
def handle_map_cat_attack(self):
"""
Click to skip the animation when cat attacks.
"""
if self.appear_then_click(MAP_CAT_ATTACK, genre='cat_attack', interval=2):
logger.info('Skip map cat attack')
return True
return False
def handle_map_fleet_lock(self, lock=None, skip_first_screenshot=True):
"""
Args:
lock (bool, optional): Set to lock or unlock.
skip_first_screenshot (bool):
Returns:
bool: If fleet lock changed.
"""
if lock is None:
lock = self.config.ENABLE_MAP_FLEET_LOCK
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
if lock:
if self.appear(FLEET_LOCKED):
logger.attr('Map_fleet', 'locked')
return False
elif self.appear_then_click(FLEET_UNLOCKED, interval=1):
continue
else:
if self.appear(FLEET_UNLOCKED):
logger.attr('Map_fleet', 'unlocked')
return False
elif self.appear_then_click(FLEET_LOCKED, interval=1):
continue
return True
def handle_fleet_reverse(self):
"""
The game chooses the fleet with a smaller index to be the first fleet,
no matter what we choose in fleet preparation.
Returns:
bool: Fleet changed
"""
if (self.config.FLEET_2 == 0) or (self.config.FLEET_2 > self.config.FLEET_1):
return False
self.fleet_switch_click()
return True
def handle_spare_fleet(self):
pass