1
0
mirror of https://github.com/sui-feng-cb/AzurLaneAutoScript1.git synced 2026-08-18 12:43:00 +08:00

Opt: restructure OS strategic search flow to reduce redundant operations

This commit is contained in:
positnuec
2026-08-13 21:45:35 +08:00
parent 2d2db92c3c
commit 602a35a660
4 changed files with 44 additions and 19 deletions

View File

@@ -1009,8 +1009,11 @@ class OSMap(OSFleet, Map, GlobeCamera, StorageHandler, StrategicSearchHandler):
self.hp_get()
self._solved_map_event = set()
self._solved_fleet_mechanism = False
self.clear_question()
self.map_rescan()
self.get_current_zone()
logger.attr('is_zone_name_hidden', self.is_zone_name_hidden)
if self.is_zone_name_hidden:
self.clear_question()
self.map_rescan()
def _swipe_camera_avoid_ui(self, grid, ref=None, _ui_avoid_count=0, name='Grid'):
"""
@@ -1026,12 +1029,12 @@ class OSMap(OSFleet, Map, GlobeCamera, StorageHandler, StrategicSearchHandler):
Returns:
bool: True if the camera swiped and the map should be rescanned; False if the grid is safe to click.
"""
if _ui_avoid_count < 3 and area_cross_area(grid.button, MAP_OPTIONS_AREA.area, threshold=0):
if _ui_avoid_count < 2 and area_cross_area(grid.button, MAP_OPTIONS_AREA.area, threshold=0):
if ref is None:
ref = self.view.center_loca
vector = np.array(grid.location) - np.array(ref)
vector = tuple((vector // 2).astype(int))
logger.info(f'{name} grid {grid} overlaps with map options area, swipe {vector}')
logger.info(f'{name} grid {grid} overlaps with map options area, swipe: {vector}')
self.map_swipe(vector)
return True
return False

View File

@@ -169,8 +169,12 @@ class OpsiCrossMonth(OSMap):
continue
else:
logger.hr(f'OS meowfficer farming, zone_id={zone.zone_id}', level=1)
self.globe_goto(zone, types='SAFE', refresh=True)
self.fleet_set(self.config.OpsiFleet_Fleet)
logger.attr('is_zone_name_hidden', self.is_zone_name_hidden)
if self.zone.zone_id != zone.zone_id or not self.is_zone_name_hidden:
self.globe_goto(zone, types='SAFE', refresh=True)
self.run_auto_search()
self.handle_after_auto_search()
self.run_strategic_search()
self.handle_after_auto_search()
else:

View File

@@ -52,12 +52,15 @@ class OpsiHazard1Leveling(OSMap):
else:
zone = 22
logger.hr(f'OS hazard 1 leveling, zone_id={zone}', level=1)
self.fleet_set(self.config.OpsiFleet_Fleet)
if self.zone.zone_id != zone or not self.is_zone_name_hidden:
self.globe_goto(self.name_to_zone(zone), types='SAFE', refresh=True)
self.fleet_set(self.config.OpsiFleet_Fleet)
self.run_auto_search()
self.handle_after_auto_search()
self.run_strategic_search()
self.get_current_zone()
# is_zone_name_hidden is refreshed inside run_strategic_search
if self.is_zone_name_hidden and not len(self._solved_map_event):
self.run_auto_search()
self.fleets_clear_question()
self.handle_after_auto_search()
self.config.check_task_switch()

View File

@@ -6,6 +6,17 @@ from module.os.map import OSMap
class OpsiMeowfficerFarming(OSMap):
def check_ap(self, cost=0):
# Check action points first to avoid using remaining AP when it not enough for tomorrow's daily
# When not running CL1 and use oil
keep_current_ap = True
check_rest_ap = True
if self.is_cl1_enabled and self.cl1_enough_yellow_coins:
check_rest_ap = False
if not self.is_cl1_enabled and self.config.OpsiGeneral_BuyActionPointLimit > 0:
keep_current_ap = False
self.action_point_set(cost=cost, keep_current_ap=keep_current_ap, check_rest_ap=check_rest_ap)
def os_meowfficer_farming(self):
"""
Recommend 3 or 5 for higher meowfficer searching point per action points ratio.
@@ -48,17 +59,6 @@ class OpsiMeowfficerFarming(OSMap):
logger.info('Ash beacon not fully collected, ignore action point limit temporarily')
self.config.OS_ACTION_POINT_PRESERVE = 0
logger.attr('OS_ACTION_POINT_PRESERVE', self.config.OS_ACTION_POINT_PRESERVE)
if not ap_checked:
# Check action points first to avoid using remaining AP when it not enough for tomorrow's daily
# When not running CL1 and use oil
keep_current_ap = True
check_rest_ap = True
if self.is_cl1_enabled and self.cl1_enough_yellow_coins:
check_rest_ap = False
if not self.is_cl1_enabled and self.config.OpsiGeneral_BuyActionPointLimit > 0:
keep_current_ap = False
self.action_point_set(cost=0, keep_current_ap=keep_current_ap, check_rest_ap=check_rest_ap)
ap_checked = True
# (1252, 1012) is the coordinate of zone 134 (the center zone) in os_globe_map.png
if self.config.OpsiMeowfficerFarming_TargetZone != 0:
@@ -68,13 +68,28 @@ class OpsiMeowfficerFarming(OSMap):
logger.warning(f'wrong zone_id input:{self.config.OpsiMeowfficerFarming_TargetZone}')
raise RequestHumanTakeover('wrong input, task stopped')
else:
# Refill current AP every round to keep strategic search running
self.check_ap(cost=100)
logger.hr(f'OS meowfficer farming, zone_id={zone.zone_id}', level=1)
self.globe_goto(zone, types='SAFE', refresh=True)
self.fleet_set(self.config.OpsiFleet_Fleet)
logger.attr('is_zone_name_hidden', self.is_zone_name_hidden)
if self.zone.zone_id != zone.zone_id or not self.is_zone_name_hidden:
self.globe_goto(zone, types='SAFE', refresh=True)
self.run_auto_search()
self.handle_after_auto_search()
self.check_ap()
self.run_strategic_search()
# is_zone_name_hidden is refreshed inside run_strategic_search
if self.is_zone_name_hidden and not len(self._solved_map_event):
self.run_auto_search()
self.fleets_clear_question()
self.handle_after_auto_search()
self.config.check_task_switch()
else:
if not ap_checked:
# Check action points once at the start, without using AP boxes
self.check_ap(cost=0)
ap_checked = True
zones = self.zone_select(hazard_level=self.config.OpsiMeowfficerFarming_HazardLevel) \
.delete(SelectedGrids([self.zone])) \
.delete(SelectedGrids(self.zones.select(is_port=True))) \