mirror of
https://github.com/LmeSzinc/StarRailCopilot.git
synced 2024-11-26 18:20:42 +00:00
eb2a58d7f5
- 修复原地寻路报warning - 修复到达误判
113 lines
3.6 KiB
Python
113 lines
3.6 KiB
Python
from module.base.button import Button
|
|
from module.logger import logger
|
|
from module.exception import CampaignEnd
|
|
from module.exception import ScriptError
|
|
from module.map.map import Map
|
|
from module.map.map_base import CampaignMap
|
|
from module.base.decorator import Config
|
|
|
|
|
|
class CampaignBase(Map):
|
|
FUNCTION_NAME_BASE = 'battle_'
|
|
ENTRANCE = Button(area=(), color=(), button=(), name='default_button')
|
|
MAP: CampaignMap
|
|
|
|
def battle_default(self):
|
|
if self.clear_enemy():
|
|
return True
|
|
|
|
logger.warning('No battle executed.')
|
|
return False
|
|
|
|
def battle_boss(self):
|
|
if self.brute_clear_boss():
|
|
return True
|
|
|
|
logger.warning('No battle executed.')
|
|
return False
|
|
|
|
@Config.when(POOR_MAP_DATA=True, MAP_CLEAR_ALL_THIS_TIME=False)
|
|
def execute_a_battle(self):
|
|
logger.hr(f'{self.FUNCTION_NAME_BASE}{self.battle_count}', level=2)
|
|
logger.info('Running with poor map data.')
|
|
if self.fleet_2_break_siren_caught():
|
|
return True
|
|
self.clear_all_mystery()
|
|
|
|
if self.battle_count >= 3:
|
|
self.pick_up_ammo()
|
|
|
|
if self.map.select(is_boss=True):
|
|
if self.brute_clear_boss():
|
|
return True
|
|
else:
|
|
if self.clear_siren():
|
|
return True
|
|
return self.clear_enemy()
|
|
|
|
logger.warning('No battle executed.')
|
|
return False
|
|
|
|
@Config.when(MAP_CLEAR_ALL_THIS_TIME=True)
|
|
def execute_a_battle(self):
|
|
logger.hr(f'{self.FUNCTION_NAME_BASE}{self.battle_count}', level=2)
|
|
logger.info('Using function: clear_all')
|
|
if self.fleet_2_break_siren_caught():
|
|
return True
|
|
self.clear_all_mystery()
|
|
|
|
if self.battle_count >= 3:
|
|
self.pick_up_ammo()
|
|
|
|
remain = self.map.select(is_enemy=True, is_boss=False)
|
|
logger.info('Enemy remain: {}')
|
|
if remain.count > 0:
|
|
if self.clear_siren():
|
|
return True
|
|
return self.battle_default()
|
|
else:
|
|
backup = self.config.FLEET_BOSS
|
|
if self.config.FLEET_2 != 0:
|
|
self.config.FLEET_BOSS = 2
|
|
result = self.battle_boss()
|
|
self.config.FLEET_BOSS = backup
|
|
return result
|
|
|
|
@Config.when(MAP_CLEAR_ALL_THIS_TIME=False, POOR_MAP_DATA=False)
|
|
def execute_a_battle(self):
|
|
func = self.FUNCTION_NAME_BASE + 'default'
|
|
for extra_battle in range(10):
|
|
if hasattr(self, self.FUNCTION_NAME_BASE + str(self.battle_count - extra_battle)):
|
|
func = self.FUNCTION_NAME_BASE + str(self.battle_count - extra_battle)
|
|
break
|
|
|
|
logger.hr(f'{self.FUNCTION_NAME_BASE}{self.battle_count}', level=2)
|
|
logger.info(f'Using function: {func}')
|
|
func = self.__getattribute__(func)
|
|
|
|
result = func()
|
|
if not result:
|
|
logger.warning('No combat executed.')
|
|
raise ScriptError('No combat executed.')
|
|
|
|
return result
|
|
|
|
def run(self):
|
|
logger.hr(self.ENTRANCE, level=2)
|
|
self.handle_spare_fleet()
|
|
self.ENTRANCE.area = self.ENTRANCE.button
|
|
self.enter_map(self.ENTRANCE, mode=self.config.CAMPAIGN_MODE)
|
|
self.handle_map_fleet_lock()
|
|
self.handle_fleet_reverse()
|
|
self.map_init(self.MAP)
|
|
|
|
for _ in range(20):
|
|
try:
|
|
self.execute_a_battle()
|
|
except CampaignEnd:
|
|
logger.hr('Campaign end')
|
|
return True
|
|
|
|
logger.warning('Battle function exhausted.')
|
|
raise ScriptError('Battle function exhausted.')
|