StarRailCopilot/campaign/campaign_hard/campaign_hard.py

97 lines
3.0 KiB
Python

from module.base.timer import Timer
from module.campaign.campaign_base import CampaignBase
from module.hard.equipment import HardEquipment
from module.logger import logger
from module.map.assets import MAP_PREPARATION, FLEET_PREPARATION
from module.exception import CampaignEnd
from module.ui.ui import CAMPAIGN_CHECK
class Config:
MAP_HAS_AMBUSH = False
ENABLE_EMOTION_REDUCE = False
ENABLE_HP_BALANCE = False
class Campaign(CampaignBase, HardEquipment):
def run(self):
logger.hr(self.ENTRANCE, level=2)
self.enter_map(self.ENTRANCE, mode='hard')
self.map = self.MAP
self.map.reset()
if self.config.FLEET_HARD == 1:
self.ensure_edge_insight(reverse=True)
self.full_scan_find_boss()
else:
self.fleet_switch_click()
self.ensure_no_info_bar()
self.ensure_edge_insight()
self.full_scan_find_boss()
try:
self.clear_boss()
except CampaignEnd:
logger.hr('Campaign end')
def fleet_preparation(self):
self.equipment_take_on()
def _expected_combat_end(self, expected):
return 'in_stage'
def clear_boss(self):
grids = self.map.select(is_boss=True)
grids = grids.add(self.map.select(may_boss=True, is_enemy=True))
logger.info('May boss: %s' % self.map.select(may_boss=True))
logger.info('May boss and is enemy: %s' % self.map.select(may_boss=True, is_enemy=True))
logger.info('Is boss: %s' % self.map.select(is_boss=True))
# logger.info('Grids: %s' % grids)
if grids:
logger.hr('Clear BOSS')
grids = grids.sort(cost=True, weight=True)
logger.info('Grids: %s' % str(grids))
self._goto(grids[0], expected='boss')
raise CampaignEnd('BOSS Clear.')
logger.warning('BOSS not detected, trying all boss spawn point.')
self.clear_potential_boss()
return False
def equipment_take_off_when_finished(self):
logger.info('equipment_take_off_when_finished')
campaign_timer = Timer(2)
map_timer = Timer(1)
fleet_timer = Timer(1)
while 1:
self.device.screenshot()
# Enter campaign
if campaign_timer.reached() and self.appear_then_click(self.ENTRANCE):
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):
self.equipment_take_off()
self.ui_back(check_button=CAMPAIGN_CHECK, appear_button=FLEET_PREPARATION)
break
# Retire
if self.handle_retirement():
continue
# Emotion
pass
return True