1
0
mirror of https://gitee.com/sui-feng-cb/AzurLaneAutoScript1 synced 2026-04-02 04:54:08 +08:00
This commit is contained in:
2026-03-31 13:54:36 +08:00
11 changed files with 50 additions and 15 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -7,8 +7,8 @@ from .campaign_16_base_submarine import Config as ConfigBase
MAP = CampaignMap('16-1') MAP = CampaignMap('16-1')
MAP.shape = 'I9' MAP.shape = 'I9'
MAP.camera_data = ['C2', 'C6', 'F2', 'F6'] MAP.camera_data = ['C2', 'C6', 'F2', 'F5']
MAP.camera_data_spawn_point = ['F6'] MAP.camera_data_spawn_point = ['F7']
MAP.camera_sight = (-2, -1, 3, 2) MAP.camera_sight = (-2, -1, 3, 2)
MAP.map_data = """ MAP.map_data = """
++ ME -- -- ME -- -- ME -- ++ ME -- -- ME -- -- ME --
@@ -57,6 +57,7 @@ class Config(ConfigBase):
MAP_HAS_FLEET_STEP = False MAP_HAS_FLEET_STEP = False
MAP_HAS_AMBUSH = True MAP_HAS_AMBUSH = True
MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom-right'
MAP_SWIPE_MULTIPLY = (1.050, 1.069) MAP_SWIPE_MULTIPLY = (1.050, 1.069)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.015, 1.034) MAP_SWIPE_MULTIPLY_MINITOUCH = (1.015, 1.034)
MAP_SWIPE_MULTIPLY_MAATOUCH = (0.985, 1.003) MAP_SWIPE_MULTIPLY_MAATOUCH = (0.985, 1.003)

View File

@@ -54,6 +54,7 @@ class Config(ConfigBase):
MAP_HAS_FLEET_STEP = False MAP_HAS_FLEET_STEP = False
MAP_HAS_AMBUSH = True MAP_HAS_AMBUSH = True
MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom-left'
MAP_SWIPE_MULTIPLY = (1.093, 1.113) MAP_SWIPE_MULTIPLY = (1.093, 1.113)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.057, 1.077) MAP_SWIPE_MULTIPLY_MINITOUCH = (1.057, 1.077)
MAP_SWIPE_MULTIPLY_MAATOUCH = (1.026, 1.045) MAP_SWIPE_MULTIPLY_MAATOUCH = (1.026, 1.045)

View File

@@ -7,7 +7,7 @@ from .campaign_16_base_aircraft import Config as ConfigBase
MAP = CampaignMap('16-3') MAP = CampaignMap('16-3')
MAP.shape = 'K6' MAP.shape = 'K6'
MAP.camera_data = ['C2', 'C5', 'F2', 'F5', 'H2', 'H5'] MAP.camera_data = ['D3', 'E4', 'G2', 'H2']
MAP.camera_data_spawn_point = ['C5'] MAP.camera_data_spawn_point = ['C5']
MAP.camera_sight = (-2, -1, 3, 2) MAP.camera_sight = (-2, -1, 3, 2)
MAP.map_data = """ MAP.map_data = """
@@ -30,7 +30,11 @@ MAP.spawn_data = [
{'battle': 0, 'enemy': 3}, {'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 6}, {'battle': 1, 'enemy': 6},
{'battle': 2, 'enemy': 3}, {'battle': 2, 'enemy': 3},
{'battle': 3, 'boss': 1}, {'battle': 3},
{'battle': 4},
{'battle': 5},
{'battle': 6},
{'battle': 7, 'boss': 1},
] ]
MAP.spawn_data_loop = [ MAP.spawn_data_loop = [
{'battle': 0, 'enemy': 3}, {'battle': 0, 'enemy': 3},
@@ -56,6 +60,7 @@ class Config(ConfigBase):
MAP_HAS_FLEET_STEP = False MAP_HAS_FLEET_STEP = False
MAP_HAS_AMBUSH = True MAP_HAS_AMBUSH = True
MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom-left'
MAP_SWIPE_MULTIPLY = (1.180, 1.202) MAP_SWIPE_MULTIPLY = (1.180, 1.202)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.141, 1.162) MAP_SWIPE_MULTIPLY_MINITOUCH = (1.141, 1.162)
MAP_SWIPE_MULTIPLY_MAATOUCH = (1.108, 1.128) MAP_SWIPE_MULTIPLY_MAATOUCH = (1.108, 1.128)

View File

@@ -7,7 +7,7 @@ from .campaign_16_base_aircraft import Config as ConfigBase
MAP = CampaignMap('16-4') MAP = CampaignMap('16-4')
MAP.shape = 'K8' MAP.shape = 'K8'
MAP.camera_data = ['C2', 'C6', 'F2', 'F6', 'H2', 'H6'] MAP.camera_data = ['C2', 'F5', 'F2', 'H2', 'H5']
MAP.camera_data_spawn_point = ['C6'] MAP.camera_data_spawn_point = ['C6']
MAP.camera_sight = (-2, -1, 3, 2) MAP.camera_sight = (-2, -1, 3, 2)
MAP.map_data = """ MAP.map_data = """
@@ -31,6 +31,17 @@ MAP.weight_data = """
50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50 50
""" """
MAP.spawn_data = [ MAP.spawn_data = [
{'battle': 0, 'enemy': 5},
{'battle': 1, 'enemy': 3},
{'battle': 2, 'enemy': 5},
{'battle': 3},
{'battle': 4},
{'battle': 5},
{'battle': 6},
{'battle': 7},
{'battle': 8, 'boss': 1},
]
MAP.spawn_data_loop = [
{'battle': 0, 'enemy': 5}, {'battle': 0, 'enemy': 5},
{'battle': 1, 'enemy': 3}, {'battle': 1, 'enemy': 3},
{'battle': 2, 'enemy': 5}, {'battle': 2, 'enemy': 5},
@@ -54,6 +65,7 @@ class Config(ConfigBase):
MAP_HAS_FLEET_STEP = False MAP_HAS_FLEET_STEP = False
MAP_HAS_AMBUSH = True MAP_HAS_AMBUSH = True
MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom-left'
MAP_SWIPE_MULTIPLY = (1.003, 1.022) MAP_SWIPE_MULTIPLY = (1.003, 1.022)
MAP_SWIPE_MULTIPLY_MINITOUCH = (0.970, 0.988) MAP_SWIPE_MULTIPLY_MINITOUCH = (0.970, 0.988)
MAP_SWIPE_MULTIPLY_MAATOUCH = (0.942, 0.959) MAP_SWIPE_MULTIPLY_MAATOUCH = (0.942, 0.959)

View File

@@ -17,7 +17,9 @@ class Config:
'prominence': 10, 'prominence': 10,
'distance': 35, 'distance': 35,
} }
HOMO_CANNY_THRESHOLD = (50, 100) # Handle fog on map, static homography parameters and lower canny threshold
HOMO_STORAGE = ((8, 6), [(137.405, 104.804), (1046.044, 104.804), (-12.171, 652.093), (1166.717, 652.093)])
HOMO_CANNY_THRESHOLD = (50, 80)
class CampaignBase(CampaignBase_): class CampaignBase(CampaignBase_):

View File

@@ -14,9 +14,11 @@ class CampaignBase(CampaignBase_):
ENEMY_FILTER = '1T > 1L > 1E > 1M > 2T > 2L > 2E > 2M > 3T > 3L > 3E > 3M' ENEMY_FILTER = '1T > 1L > 1E > 1M > 2T > 2L > 2E > 2M > 3T > 3L > 3E > 3M'
def map_init(self, map_): def map_init(self, map_):
# submarine battle after entering map
# all emenies spawned already, so no need to wait enemy searching
if self.use_support_fleet: if self.use_support_fleet:
logger.hr(f'{self.FUNCTION_NAME_BASE}SUBMARINE', level=2) logger.hr(f'{self.FUNCTION_NAME_BASE}SUBMARINE', level=2)
self.combat(balance_hp=False, emotion_reduce=False, save_get_items=False) self.combat(balance_hp=False, emotion_reduce=False, save_get_items=False, expected_end='no_searching')
super().map_init(map_) super().map_init(map_)
def handle_submarine_support_popup(self): def handle_submarine_support_popup(self):

View File

@@ -4,8 +4,8 @@ from module.base.template import Template
# This file was automatically generated by dev_tools/button_extract.py. # This file was automatically generated by dev_tools/button_extract.py.
# Don't modify it manually. # Don't modify it manually.
AIR_STRIKE_CANCEL = Button(area={'cn': (886, 644, 948, 675), 'en': (886, 644, 948, 675), 'jp': (948, 644, 1009, 676), 'tw': (886, 644, 948, 675)}, color={'cn': (195, 144, 139), 'en': (195, 144, 139), 'jp': (194, 124, 117), 'tw': (195, 144, 139)}, button={'cn': (886, 644, 948, 675), 'en': (886, 644, 948, 675), 'jp': (948, 644, 1009, 676), 'tw': (886, 644, 948, 675)}, file={'cn': './assets/cn/handler/AIR_STRIKE_CANCEL.png', 'en': './assets/cn/handler/AIR_STRIKE_CANCEL.png', 'jp': './assets/jp/handler/AIR_STRIKE_CANCEL.png', 'tw': './assets/cn/handler/AIR_STRIKE_CANCEL.png'}) AIR_STRIKE_CANCEL = Button(area={'cn': (887, 644, 948, 676), 'en': (887, 644, 948, 676), 'jp': (948, 644, 1009, 676), 'tw': (887, 644, 948, 676)}, color={'cn': (193, 141, 135), 'en': (193, 141, 135), 'jp': (194, 124, 117), 'tw': (193, 141, 135)}, button={'cn': (887, 644, 948, 676), 'en': (887, 644, 948, 676), 'jp': (948, 644, 1009, 676), 'tw': (887, 644, 948, 676)}, file={'cn': './assets/cn/handler/AIR_STRIKE_CANCEL.png', 'en': './assets/cn/handler/AIR_STRIKE_CANCEL.png', 'jp': './assets/jp/handler/AIR_STRIKE_CANCEL.png', 'tw': './assets/cn/handler/AIR_STRIKE_CANCEL.png'})
AIR_STRIKE_CONFIRM = Button(area={'cn': (1100, 644, 1161, 675), 'en': (1100, 644, 1161, 675), 'jp': (1161, 644, 1222, 675), 'tw': (1100, 644, 1161, 675)}, color={'cn': (132, 163, 203), 'en': (132, 163, 203), 'jp': (137, 170, 211), 'tw': (132, 163, 203)}, button={'cn': (1100, 644, 1161, 675), 'en': (1100, 644, 1161, 675), 'jp': (1161, 644, 1222, 675), 'tw': (1100, 644, 1161, 675)}, file={'cn': './assets/cn/handler/AIR_STRIKE_CONFIRM.png', 'en': './assets/cn/handler/AIR_STRIKE_CONFIRM.png', 'jp': './assets/jp/handler/AIR_STRIKE_CONFIRM.png', 'tw': './assets/cn/handler/AIR_STRIKE_CONFIRM.png'}) AIR_STRIKE_CONFIRM = Button(area={'cn': (1100, 644, 1161, 675), 'en': (1100, 644, 1161, 675), 'jp': (1161, 644, 1222, 675), 'tw': (1100, 644, 1161, 675)}, color={'cn': (129, 161, 199), 'en': (129, 161, 199), 'jp': (137, 170, 211), 'tw': (129, 161, 199)}, button={'cn': (1100, 644, 1161, 675), 'en': (1100, 644, 1161, 675), 'jp': (1161, 644, 1222, 675), 'tw': (1100, 644, 1161, 675)}, file={'cn': './assets/cn/handler/AIR_STRIKE_CONFIRM.png', 'en': './assets/cn/handler/AIR_STRIKE_CONFIRM.png', 'jp': './assets/jp/handler/AIR_STRIKE_CONFIRM.png', 'tw': './assets/cn/handler/AIR_STRIKE_CONFIRM.png'})
AIR_STRIKE_ENTER = Button(area={'cn': (1194, 456, 1249, 530), 'en': (1194, 456, 1249, 530), 'jp': (1194, 456, 1249, 530), 'tw': (1194, 456, 1249, 530)}, color={'cn': (123, 124, 131), 'en': (123, 124, 131), 'jp': (123, 124, 131), 'tw': (123, 124, 131)}, button={'cn': (1194, 456, 1249, 530), 'en': (1194, 456, 1249, 530), 'jp': (1194, 456, 1249, 530), 'tw': (1194, 456, 1249, 530)}, file={'cn': './assets/cn/handler/AIR_STRIKE_ENTER.png', 'en': './assets/cn/handler/AIR_STRIKE_ENTER.png', 'jp': './assets/cn/handler/AIR_STRIKE_ENTER.png', 'tw': './assets/cn/handler/AIR_STRIKE_ENTER.png'}) AIR_STRIKE_ENTER = Button(area={'cn': (1194, 456, 1249, 530), 'en': (1194, 456, 1249, 530), 'jp': (1194, 456, 1249, 530), 'tw': (1194, 456, 1249, 530)}, color={'cn': (123, 124, 131), 'en': (123, 124, 131), 'jp': (123, 124, 131), 'tw': (123, 124, 131)}, button={'cn': (1194, 456, 1249, 530), 'en': (1194, 456, 1249, 530), 'jp': (1194, 456, 1249, 530), 'tw': (1194, 456, 1249, 530)}, file={'cn': './assets/cn/handler/AIR_STRIKE_ENTER.png', 'en': './assets/cn/handler/AIR_STRIKE_ENTER.png', 'jp': './assets/cn/handler/AIR_STRIKE_ENTER.png', 'tw': './assets/cn/handler/AIR_STRIKE_ENTER.png'})
ANDROID_NO_RESPOND = Button(area={'cn': (341, 433, 391, 472), 'en': (341, 433, 391, 472), 'jp': (341, 433, 391, 472), 'tw': (341, 433, 391, 472)}, color={'cn': (217, 237, 235), 'en': (217, 237, 235), 'jp': (217, 237, 235), 'tw': (217, 237, 235)}, button={'cn': (341, 433, 391, 472), 'en': (341, 433, 391, 472), 'jp': (341, 433, 391, 472), 'tw': (341, 433, 391, 472)}, file={'cn': './assets/cn/handler/ANDROID_NO_RESPOND.png', 'en': './assets/en/handler/ANDROID_NO_RESPOND.png', 'jp': './assets/jp/handler/ANDROID_NO_RESPOND.png', 'tw': './assets/tw/handler/ANDROID_NO_RESPOND.png'}) ANDROID_NO_RESPOND = Button(area={'cn': (341, 433, 391, 472), 'en': (341, 433, 391, 472), 'jp': (341, 433, 391, 472), 'tw': (341, 433, 391, 472)}, color={'cn': (217, 237, 235), 'en': (217, 237, 235), 'jp': (217, 237, 235), 'tw': (217, 237, 235)}, button={'cn': (341, 433, 391, 472), 'en': (341, 433, 391, 472), 'jp': (341, 433, 391, 472), 'tw': (341, 433, 391, 472)}, file={'cn': './assets/cn/handler/ANDROID_NO_RESPOND.png', 'en': './assets/en/handler/ANDROID_NO_RESPOND.png', 'jp': './assets/jp/handler/ANDROID_NO_RESPOND.png', 'tw': './assets/tw/handler/ANDROID_NO_RESPOND.png'})
AUTO_SEARCH_MAP_OPTION_OFF = Button(area={'cn': (1205, 549, 1275, 566), 'en': (1203, 552, 1277, 564), 'jp': (1204, 547, 1276, 568), 'tw': (1205, 546, 1275, 567)}, color={'cn': (196, 169, 169), 'en': (151, 132, 138), 'jp': (179, 153, 156), 'tw': (153, 132, 137)}, button={'cn': (1205, 549, 1275, 566), 'en': (1203, 552, 1277, 564), 'jp': (1204, 547, 1276, 568), 'tw': (1205, 546, 1275, 567)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_MAP_OPTION_OFF.png', 'en': './assets/en/handler/AUTO_SEARCH_MAP_OPTION_OFF.png', 'jp': './assets/jp/handler/AUTO_SEARCH_MAP_OPTION_OFF.png', 'tw': './assets/tw/handler/AUTO_SEARCH_MAP_OPTION_OFF.png'}) AUTO_SEARCH_MAP_OPTION_OFF = Button(area={'cn': (1205, 549, 1275, 566), 'en': (1203, 552, 1277, 564), 'jp': (1204, 547, 1276, 568), 'tw': (1205, 546, 1275, 567)}, color={'cn': (196, 169, 169), 'en': (151, 132, 138), 'jp': (179, 153, 156), 'tw': (153, 132, 137)}, button={'cn': (1205, 549, 1275, 566), 'en': (1203, 552, 1277, 564), 'jp': (1204, 547, 1276, 568), 'tw': (1205, 546, 1275, 567)}, file={'cn': './assets/cn/handler/AUTO_SEARCH_MAP_OPTION_OFF.png', 'en': './assets/en/handler/AUTO_SEARCH_MAP_OPTION_OFF.png', 'jp': './assets/jp/handler/AUTO_SEARCH_MAP_OPTION_OFF.png', 'tw': './assets/tw/handler/AUTO_SEARCH_MAP_OPTION_OFF.png'})

View File

@@ -121,6 +121,8 @@ class EnemySearchingHandler(InfoHandler):
if self.handle_in_stage(): if self.handle_in_stage():
return True return True
if self.handle_auto_search_exit(drop=drop): if self.handle_auto_search_exit(drop=drop):
timeout.limit = 10
timeout.reset()
continue continue
# Popups # Popups
@@ -148,6 +150,7 @@ class EnemySearchingHandler(InfoHandler):
if appeared: if appeared:
self.handle_enemy_flashing() self.handle_enemy_flashing()
self.device.sleep(0.3) self.device.sleep(0.3)
self.device.screenshot()
logger.info('Enemy searching appeared.') logger.info('Enemy searching appeared.')
break break
self.enemy_searching_color_initial() self.enemy_searching_color_initial()
@@ -155,7 +158,6 @@ class EnemySearchingHandler(InfoHandler):
logger.info('Enemy searching timeout.') logger.info('Enemy searching timeout.')
break break
self.device.screenshot()
return True return True
def handle_in_map_no_enemy_searching(self, drop=None): def handle_in_map_no_enemy_searching(self, drop=None):
@@ -173,15 +175,15 @@ class EnemySearchingHandler(InfoHandler):
while 1: while 1:
self.device.screenshot() self.device.screenshot()
# End if not self.is_in_map():
if timeout.reached(): timeout.reset()
break
# Stage might ends, # Stage might ends,
# although here expects an enemy searching animation. # although here expects an enemy searching animation.
if self.handle_in_stage(): if self.handle_in_stage():
return True return True
if self.handle_auto_search_exit(drop=drop): if self.handle_auto_search_exit(drop=drop):
timeout.reset()
continue continue
# Popups # Popups
@@ -198,4 +200,9 @@ class EnemySearchingHandler(InfoHandler):
timeout.reset() timeout.reset()
continue continue
# End
if timeout.reached():
logger.info('No enemy searching in map.')
break
return True return True

View File

@@ -377,12 +377,17 @@ class Map(Fleet):
grids = self.map.select(may_boss=True, is_accessible=True).sort('weight', 'cost') grids = self.map.select(may_boss=True, is_accessible=True).sort('weight', 'cost')
logger.info('May boss: %s' % grids) logger.info('May boss: %s' % grids)
battle_count = self.battle_count battle_count = self.battle_count
is_single_boss = self.map.select(may_boss=True).count == 1
if is_single_boss:
expected = 'boss'
else:
expected = ''
for grid in grids: for grid in grids:
logger.hr('Clear potential BOSS') logger.hr('Clear potential BOSS')
grids = grids.sort('weight', 'cost') grids = grids.sort('weight', 'cost')
logger.info('Grid: %s' % str(grid)) logger.info('Grid: %s' % str(grid))
self.fleet_boss.clear_chosen_enemy(grid) self.fleet_boss.clear_chosen_enemy(grid, expected=expected)
if self.battle_count > battle_count: if self.battle_count > battle_count:
logger.info('Boss guessing correct.') logger.info('Boss guessing correct.')
return True return True
@@ -397,7 +402,7 @@ class Map(Fleet):
roadblocks = self.brute_find_roadblocks(grid, fleet=self.fleet_boss_index) roadblocks = self.brute_find_roadblocks(grid, fleet=self.fleet_boss_index)
roadblocks = roadblocks.sort('weight', 'cost') roadblocks = roadblocks.sort('weight', 'cost')
logger.info('Grids: %s' % str(roadblocks)) logger.info('Grids: %s' % str(roadblocks))
self.fleet_1.clear_chosen_enemy(roadblocks[0]) self.fleet_1.clear_chosen_enemy(roadblocks[0], expected=expected)
return True return True
return False return False