StarRailCopilot/module/campaign/campaign_base.py
LmeSzinc 8ec5099b58 Add: 适配穹顶下的圣咏曲AC图
- 修复UI导致的动态边缘识别出错
- 修复只识别出一队时的处理逻辑
- 修复处理战斗结束后跳出的剧情
- 修复辅助点击报CampaignEnd
- 修复游戏出现白屏bug时, 连续点击使用紧急维修
- 增加地图全清时, 使用二队打BOSS, 忽略FLEET_BOSS
- 增加被精英抓住的识别, 暂时还用不到
2020-05-22 21:48:56 +08:00

109 lines
3.4 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.')
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')
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.')