1
0
mirror of https://gitee.com/sui-feng-cb/AzurLaneAutoScript1 synced 2026-03-09 18:39:04 +08:00
AzurLaneAutoScript/module/os/tasks/stronghold.py
2026-01-20 20:31:15 +08:00

140 lines
5.0 KiB
Python

from module.config.config import TaskEnd
from module.logger import logger
from module.os.fleet import BossFleet
from module.os.map import OSMap
from module.os_handler.assets import OS_SUBMARINE_EMPTY
from module.ui.page import page_os
class OpsiStronghold(OSMap):
def clear_stronghold(self):
"""
Find a siren stronghold on globe map,
clear stronghold,
repair fleets in port.
Raises:
ActionPointLimit:
TaskEnd: If no more strongholds.
RequestHumanTakeover: If unable to clear boss, fleets exhausted.
"""
logger.hr('OS clear stronghold', level=1)
with self.config.multi_set():
self.config.OpsiStronghold_HasStronghold = True
self.cl1_ap_preserve()
self.os_map_goto_globe()
self.globe_update()
zone = self.find_siren_stronghold()
if zone is None:
# No siren stronghold, delay next run to tomorrow.
self.config.OpsiStronghold_HasStronghold = False
self.config.task_delay(server_update=True)
self.config.task_stop()
self.globe_enter(zone)
self.zone_init()
self.os_order_execute(recon_scan=True, submarine_call=False)
self.run_stronghold(submarine=self.config.OpsiStronghold_SubmarineEveryCombat)
if self.config.OpsiStronghold_SubmarineEveryCombat:
if self.zone.is_azur_port:
logger.info('Already in azur port')
else:
self.globe_goto(self.zone_nearest_azur_port(self.zone))
self.handle_fleet_repair_by_config(revert=False)
self.handle_fleet_resolve(revert=False)
def os_stronghold(self):
while True:
self.clear_stronghold()
self.config.check_task_switch()
def os_sumbarine_empty(self):
return self.match_template_color(OS_SUBMARINE_EMPTY, offset=(20, 20))
def stronghold_interrupt_check(self):
return self.os_sumbarine_empty() and self.no_meowfficer_searching()
def run_stronghold_one_fleet(self, fleet, submarine=False):
"""
Args
fleet (BossFleet):
submarine (bool): If use submarine every combat
Returns:
bool: If all cleared.
"""
self.config.override(
OpsiGeneral_DoRandomMapEvent=False,
HOMO_EDGE_DETECT=False,
STORY_OPTION=0
)
interrupt = [self.stronghold_interrupt_check, self.is_meowfficer_searching] if submarine else None
# Try 3 times, because fleet may stuck in fog.
for _ in range(3):
# Attack
self.fleet_set(fleet.fleet_index)
try:
self.run_auto_search(question=False, rescan=False, interrupt=interrupt)
except TaskEnd:
self.ui_ensure(page_os)
self.hp_reset()
self.hp_get()
# End
if self.get_stronghold_percentage() == '0':
logger.info('BOSS clear')
return True
elif any(self.need_repair):
logger.info('Auto search stopped, because fleet died')
# Re-enter to reset fleet position
prev = self.zone
self.globe_goto(self.zone_nearest_azur_port(self.zone))
self.handle_fog_block(repair=True)
self.globe_goto(prev, types='STRONGHOLD')
return False
elif submarine and self.os_sumbarine_empty():
logger.info('Submarine ammo exhausted, wait for the next clear')
self.globe_goto(self.zone_nearest_azur_port(self.zone))
return True
else:
logger.info('Auto search stopped, because fleet stuck')
# Re-enter to reset fleet position
prev = self.zone
self.globe_goto(self.zone_nearest_azur_port(self.zone))
self.handle_fog_block(repair=False)
self.globe_goto(prev, types='STRONGHOLD')
continue
def run_stronghold(self, submarine=False):
"""
All fleets take turns in attacking siren stronghold.
Args:
submarine (bool): If use submarine every combat
Returns:
bool: If success to clear.
Pages:
in: Siren logger (abyssal), boss appeared.
out: If success, dangerous or safe zone.
If failed, still in abyssal.
"""
logger.hr(f'Stronghold clear', level=1)
fleets = self.parse_fleet_filter()
for fleet in fleets:
logger.hr(f'Turn: {fleet}', level=2)
if not isinstance(fleet, BossFleet):
self.os_order_execute(recon_scan=False, submarine_call=True)
continue
result = self.run_stronghold_one_fleet(fleet, submarine=submarine)
if result:
return True
else:
continue
logger.critical('Unable to clear boss, fleets exhausted')
return False