This commit is contained in:
kyO The NinjA 2020-06-03 14:26:06 -03:00
commit 580fae1883
40 changed files with 280 additions and 67 deletions

View File

@ -17,7 +17,7 @@ EN support, Thanks **[@whoamikyo](https://github.com/whoamikyo)**
- **主线图出击** 暂时仅支持前六章和7-2 - **主线图出击** 暂时仅支持前六章和7-2
- **活动图出击** 支持「穹顶下的圣咏曲」(event_20200521_cn), 针对D1D3有优化, 支持处理光之壁(舰队无法在有光之壁的格子进行通行), 支持开荒 - **活动图出击** 支持「峡湾间的反击」(event_20200603_cn), 针对SP1-SP3有优化, 支持开荒
- **每日任务** 半小时左右一套做完, 重复运行时会跳过当天做过的 - **每日任务** 半小时左右一套做完, 重复运行时会跳过当天做过的

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -32,8 +32,8 @@ A4, B4, C4, D4, E4, F4, \
class Config: class Config:
FLEET_2 = 0 FLEET_BOSS = 1
SUBMARINE = 0
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 40), 'height': (120, 255 - 40),
'width': (1.5, 10), 'width': (1.5, 10),
@ -59,7 +59,7 @@ class Campaign(CampaignBase):
def battle_2(self): def battle_2(self):
self.clear_all_mystery() self.clear_all_mystery()
if not self.check_accessibility(D4): if not self.check_accessibility(D4, fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -48,7 +48,7 @@ class Campaign(CampaignBase):
def battle_3(self): def battle_3(self):
self.clear_all_mystery() self.clear_all_mystery()
if not self.check_accessibility(D1): if not self.check_accessibility(D1, fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -48,7 +48,7 @@ class Campaign(CampaignBase):
def battle_3(self): def battle_3(self):
self.clear_all_mystery() self.clear_all_mystery()
if not self.check_accessibility(E1): if not self.check_accessibility(E1, fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -41,7 +41,7 @@ class Campaign(CampaignBase):
return self.battle_default() return self.battle_default()
def battle_3(self): def battle_3(self):
if not self.check_accessibility(G1): if not self.check_accessibility(G1, fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -33,8 +33,8 @@ A4, B4, C4, D4, E4, F4, G4, \
class Config: class Config:
FLEET_2 = 0 FLEET_BOSS = 1
SUBMARINE = 0
MAP_MYSTERY_HAS_CARRIER = True MAP_MYSTERY_HAS_CARRIER = True
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 40), 'height': (120, 255 - 40),
@ -61,7 +61,7 @@ class Campaign(CampaignBase):
def battle_3(self): def battle_3(self):
self.clear_all_mystery() self.clear_all_mystery()
if not self.check_accessibility(G2): if not self.check_accessibility(G2, fleet='boss'):
return self.battle_default() return self.fleet_boss.battle_default()
return self.clear_boss() return self.clear_boss()

View File

@ -45,7 +45,7 @@ class Campaign(CampaignBase):
def battle_3(self): def battle_3(self):
self.clear_all_mystery() self.clear_all_mystery()
if not self.check_accessibility(H1): if not self.check_accessibility(H1, fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -47,7 +47,7 @@ class Campaign(CampaignBase):
def battle_3(self): def battle_3(self):
self.clear_all_mystery() self.clear_all_mystery()
if not self.check_accessibility(A4): if not self.check_accessibility(A4, fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -50,10 +50,10 @@ class Campaign(CampaignBase):
return self.battle_default() return self.battle_default()
def battle_3(self): def battle_3(self):
if not self.check_accessibility(H3): if not self.check_accessibility(H3, fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()
def handle_boss_appear_refocus(self): def handle_boss_appear_refocus(self):
for data in self.map.spawn_data: for data in self.map.spawn_data:

View File

@ -39,8 +39,8 @@ A6, B6, C6, D6, E6, F6, \
class Config: class Config:
FLEET_2 = 0 FLEET_BOSS = 1
SUBMARINE = 0
MAP_MYSTERY_HAS_CARRIER = True MAP_MYSTERY_HAS_CARRIER = True
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 40), 'height': (120, 255 - 40),
@ -72,7 +72,7 @@ class Campaign(CampaignBase):
boss = self.map.select(is_boss=True) boss = self.map.select(is_boss=True)
if boss: if boss:
if not self.check_accessibility(boss[0]): if not self.check_accessibility(boss[0], fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -58,7 +58,7 @@ class Campaign(CampaignBase):
boss = self.map.select(is_boss=True) boss = self.map.select(is_boss=True)
if boss: if boss:
if not self.check_accessibility(boss[0]): if not self.check_accessibility(boss[0], fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -54,7 +54,7 @@ class Campaign(CampaignBase):
boss = self.map.select(is_boss=True) boss = self.map.select(is_boss=True)
if boss: if boss:
if not self.check_accessibility(boss[0]): if not self.check_accessibility(boss[0], fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -65,10 +65,10 @@ class Campaign(CampaignBase):
def battle_4(self): def battle_4(self):
boss = self.map.select(is_boss=True) boss = self.map.select(is_boss=True)
if boss: if boss:
if not self.check_accessibility(boss[0]): if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]): if self.clear_roadblocks([road_main]):
return True return True
if self.clear_potential_roadblocks([road_main]): if self.clear_potential_roadblocks([road_main]):
return True return True
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -41,9 +41,9 @@ A6, B6, C6, D6, E6, F6, G6, H6, \
class Config: class Config:
FLEET_2 = 0 FLEET_BOSS = 1
SUBMARINE = 0
MAP_MYSTERY_HAS_CARRIER = True MAP_MYSTERY_HAS_CARRIER = True
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = { INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 40), 'height': (120, 255 - 40),
'width': (1.5, 10), 'width': (1.5, 10),
@ -71,7 +71,7 @@ class Campaign(CampaignBase):
boss = self.map.select(is_boss=True) boss = self.map.select(is_boss=True)
if boss: if boss:
if not self.check_accessibility(boss[0]): if not self.check_accessibility(boss[0], fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -51,7 +51,7 @@ class Campaign(CampaignBase):
boss = self.map.select(is_boss=True) boss = self.map.select(is_boss=True)
if boss: if boss:
if not self.check_accessibility(boss[0]): if not self.check_accessibility(boss[0], fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -51,7 +51,7 @@ class Campaign(CampaignBase):
boss = self.map.select(is_boss=True) boss = self.map.select(is_boss=True)
if boss: if boss:
if not self.check_accessibility(boss[0]): if not self.check_accessibility(boss[0], fleet='boss'):
return self.battle_default() return self.battle_default()
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -62,10 +62,10 @@ class Campaign(CampaignBase):
def battle_4(self): def battle_4(self):
boss = self.map.select(is_boss=True) boss = self.map.select(is_boss=True)
if boss: if boss:
if not self.check_accessibility(boss[0]): if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_center]): if self.clear_roadblocks([road_center]):
return True return True
if self.clear_potential_roadblocks([road_ring]): if self.clear_potential_roadblocks([road_ring]):
return True return True
return self.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -42,7 +42,7 @@ road_mystery = RoadGrids([[C4, D5], D4, G2, [G1, H2]])
class Config: class Config:
SUBMARINE = 0 FLEET_BOSS = 1
MAP_MYSTERY_HAS_CARRIER = True MAP_MYSTERY_HAS_CARRIER = True
@ -70,7 +70,7 @@ class Campaign(CampaignBase):
boss = self.map.select(is_boss=True) boss = self.map.select(is_boss=True)
if boss: if boss:
if not self.check_accessibility(boss[0], fleet=2): if not self.check_accessibility(boss[0], fleet='boss'):
return self.clear_roadblocks([road_boss]) return self.clear_roadblocks([road_boss])
return self.fleet_2.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -64,7 +64,7 @@ class Campaign(CampaignBase):
boss = self.map.select(is_boss=True) boss = self.map.select(is_boss=True)
if boss: if boss:
if not self.check_accessibility(boss[0], fleet=2): if not self.check_accessibility(boss[0], fleet='boss'):
return self.clear_roadblocks([road_boss]) return self.clear_roadblocks([road_boss])
return self.fleet_2.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -77,7 +77,7 @@ class Campaign(CampaignBase):
boss = self.map.select(is_boss=True) boss = self.map.select(is_boss=True)
if boss: if boss:
if not self.check_accessibility(boss[0], fleet=2): if not self.check_accessibility(boss[0], fleet='boss'):
return self.clear_roadblocks([road_boss]) return self.clear_roadblocks([road_boss])
return self.fleet_2.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -68,9 +68,12 @@ class Campaign(CampaignBase):
def battle_5(self): def battle_5(self):
self.clear_all_mystery() self.clear_all_mystery()
if not self.config.FLEET_2:
self.pick_up_ammo()
boss = self.map.select(is_boss=True) boss = self.map.select(is_boss=True)
if boss: if boss:
if not self.check_accessibility(boss[0], fleet=2): if not self.check_accessibility(boss[0], fleet='boss'):
return self.clear_roadblocks([road_boss]) return self.clear_roadblocks([road_boss])
return self.fleet_2.clear_boss() return self.fleet_boss.clear_boss()

View File

@ -0,0 +1,73 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
MAP = CampaignMap()
MAP.map_data = '''
++ ++ ++ -- ME -- -- -- -- ++ --
-- ME -- ++ -- ++ ++ ME -- ++ ME
ME -- -- ME -- ME ++ -- ME ++ --
-- -- -- -- -- ++ ME -- -- -- SP
ME -- -- ME -- -- -- __ -- -- SP
-- -- ME ++ -- MS -- ME -- -- --
-- -- -- ++ MB -- MB ++ ++ ++ ++
'''
MAP.camera_data = ['D3', 'D5', 'H3', 'H5']
MAP.weight_data = '''
10 10 10 10 40 10 10 10 10 10 50
10 30 10 10 10 10 10 20 10 10 50
30 10 10 10 10 20 10 10 10 10 50
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
30 10 20 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
'''
MAP.spawn_data = [
{'battle': 0, 'enemy': 3, 'siren': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'boss': 1},
]
class Config:
SUBMARINE = 0
POOR_MAP_DATA = True
MAP_HAS_AMBUSH = False
MAP_HAS_FLEET_STEP = True
MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_SIREN = True
MAP_HAS_DYNAMIC_RED_BORDER = False
MAP_HAS_MAP_STORY = True
MAP_SIREN_TEMPLATE = ['Z18']
MAP_SIREN_COUNT = 1
TRUST_EDGE_LINES = False
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (100, 255 - 24),
'width': 1,
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 24, 255),
'prominence': 2,
'distance': 50,
'wlen': 1000
}
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_siren():
return True
if self.fleet_2_break_siren_caught():
return True
return self.battle_default()
def battle_4(self):
return self.fleet_boss.clear_boss()

View File

@ -0,0 +1,55 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from campaign.event_20200603_cn.sp1 import Config as ConfigBase
MAP = CampaignMap()
MAP.map_data = '''
-- -- ++ ++ SP -- SP ++ ++ ++ ++
-- ME ++ ++ -- -- -- -- -- ME ME
ME -- -- MS -- -- -- ME -- -- MB
++ -- -- -- ME -- ME ++ __ -- MB
-- -- ++ ++ ++ MS -- ++ -- -- ME
-- ME -- ME ++ -- -- -- -- ME ++
-- -- -- -- -- ME ME ME ME -- ++
'''
MAP.camera_data = ['D3', 'D5', 'H3', 'H5']
MAP.weight_data = '''
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
'''
MAP.spawn_data = [
{'battle': 0, 'enemy': 3, 'siren': 2},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4},
{'battle': 5, 'boss': 1},
]
class Config(ConfigBase):
FLEET_BOSS = 2
# POOR_MAP_DATA = True
MAP_SIREN_TEMPLATE = ['Z2']
MAP_SIREN_COUNT = 2
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_siren():
return True
if self.fleet_2_break_siren_caught():
return True
return self.battle_default()
def battle_5(self):
return self.fleet_2.clear_boss()

View File

@ -0,0 +1,55 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from campaign.event_20200603_cn.sp1 import Config as ConfigBase
MAP = CampaignMap()
MAP.map_data = '''
++ ++ ++ MS ++ ME -- ME ++ ++ ++
SP -- -- -- -- -- MS -- ME ME --
SP -- -- -- -- ME -- __ -- -- ME
++ ++ ++ MS -- ++ ++ -- ME ++ --
MB MB ++ -- ME ++ ++ -- -- ++ ++
-- -- -- -- -- -- -- -- -- ME --
ME ME -- ME -- ME ++ ME -- ME --
'''
MAP.camera_data = ['D3', 'D5', 'G3', 'G5']
MAP.weight_data = '''
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10 10 10
'''
MAP.spawn_data = [
{'battle': 0, 'enemy': 3, 'siren': 2},
{'battle': 1, 'enemy': 2, 'siren': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5, 'boss': 1},
]
class Config(ConfigBase):
FLEET_BOSS = 2
# POOR_MAP_DATA = True
MAP_SIREN_TEMPLATE = ['Z19']
MAP_SIREN_COUNT = 2
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_siren():
return True
if self.fleet_2_break_siren_caught():
return True
return self.battle_default()
def battle_5(self):
return self.fleet_2.clear_boss()

View File

@ -5,6 +5,7 @@ import shutil
from gooey import Gooey, GooeyParser from gooey import Gooey, GooeyParser
import module.config.server as server
from alas import AzurLaneAutoScript from alas import AzurLaneAutoScript
from module.config.dictionary import dic_chi_to_eng, dic_eng_to_chi from module.config.dictionary import dic_chi_to_eng, dic_eng_to_chi
from module.logger import logger, pyw_name from module.logger import logger, pyw_name
@ -81,7 +82,10 @@ def main(ini_name=''):
config = update_config_from_template(config, file=config_file) config = update_config_from_template(config, file=config_file)
event_folder = [dic_eng_to_chi.get(f, f) for f in os.listdir('./campaign') if f.startswith('event_')][::-1] event_folder = [f for f in os.listdir('./campaign') if f.startswith('event_') and f.split('_')[-1] == server.server]
event_latest = sorted([f for f in event_folder], reverse=True)[0]
event_folder = [dic_eng_to_chi.get(f, f) for f in event_folder][::-1]
event_latest = dic_eng_to_chi.get(event_latest, event_latest)
saved_config = {} saved_config = {}
for opt, option in config.items(): for opt, option in config.items():
@ -141,12 +145,12 @@ def main(ini_name=''):
f1.add_argument('--舰队步长1', default=default('--舰队步长1'), choices=['1', '2', '3', '4', '5', '6']) f1.add_argument('--舰队步长1', default=default('--舰队步长1'), choices=['1', '2', '3', '4', '5', '6'])
f2 = fleet.add_argument_group('BOSS队') f2 = fleet.add_argument_group('BOSS队')
f2.add_argument('--舰队编号2', default=default('--舰队编号2'), choices=['1', '2', '3', '4', '5', '6']) f2.add_argument('--舰队编号2', default=default('--舰队编号2'), choices=['不使用', '1', '2', '3', '4', '5', '6'])
f2.add_argument('--舰队阵型2', default=default('--舰队阵型2'), choices=['单纵阵', '复纵阵', '轮形阵']) f2.add_argument('--舰队阵型2', default=default('--舰队阵型2'), choices=['单纵阵', '复纵阵', '轮形阵'])
f2.add_argument('--舰队步长2', default=default('--舰队步长2'), choices=['1', '2', '3', '4', '5', '6']) f2.add_argument('--舰队步长2', default=default('--舰队步长2'), choices=['1', '2', '3', '4', '5', '6'])
f3 = fleet.add_argument_group('备用道中队') f3 = fleet.add_argument_group('备用道中队')
f3.add_argument('--舰队编号3', default=default('--舰队编号3'), choices=['1', '2', '3', '4', '5', '6']) f3.add_argument('--舰队编号3', default=default('--舰队编号3'), choices=['不使用', '1', '2', '3', '4', '5', '6'])
f3.add_argument('--舰队阵型3', default=default('--舰队阵型3'), choices=['单纵阵', '复纵阵', '轮形阵']) f3.add_argument('--舰队阵型3', default=default('--舰队阵型3'), choices=['单纵阵', '复纵阵', '轮形阵'])
f3.add_argument('--舰队步长3', default=default('--舰队步长3'), choices=['1', '2', '3', '4', '5', '6']) f3.add_argument('--舰队步长3', default=default('--舰队步长3'), choices=['1', '2', '3', '4', '5', '6'])
@ -316,7 +320,7 @@ def main(ini_name=''):
# ==========每日活动图三倍PT========== # ==========每日活动图三倍PT==========
event_ab_parser = subs.add_parser('每日活动图三倍PT') event_ab_parser = subs.add_parser('每日活动图三倍PT')
event_name = event_ab_parser.add_argument_group('选择活动', '') event_name = event_ab_parser.add_argument_group('选择活动', '')
event_name.add_argument('--活动名称ab', default=default('--活动名称ab'), choices=event_folder, help='例如 event_20200326_cn') event_name.add_argument('--活动名称ab', default=event_latest, choices=event_folder, help='例如 event_20200326_cn')
# ==========主线图========== # ==========主线图==========
main_parser = subs.add_parser('主线图') main_parser = subs.add_parser('主线图')
@ -328,8 +332,7 @@ def main(ini_name=''):
event_parser = subs.add_parser('活动图') event_parser = subs.add_parser('活动图')
description = """ description = """
支持穹顶下的圣咏曲(event_20200521_cn), 针对D1D3有优化 支持峡湾间的反击(event_20200603_cn), 针对SP1-SP3有优化
D3第一次进图和100%通关时均有剧情战斗, 会导致报错
出击未优化关卡或地图未达到安全海域时, 使用开荒模式运行(较慢) 出击未优化关卡或地图未达到安全海域时, 使用开荒模式运行(较慢)
""" """
event = event_parser.add_argument_group( event = event_parser.add_argument_group(
@ -340,7 +343,7 @@ def main(ini_name=''):
event.add_argument('--sp地图', default=default('--sp地图'), event.add_argument('--sp地图', default=default('--sp地图'),
choices=['sp1', 'sp2', 'sp3'], choices=['sp1', 'sp2', 'sp3'],
help='例如 sp3') help='例如 sp3')
event.add_argument('--活动名称', default=default('--活动名称'), choices=event_folder, help='例如 event_20200312_cn') event.add_argument('--活动名称', default=event_latest, choices=event_folder, help='例如 event_20200312_cn')
# ==========半自动========== # ==========半自动==========
semi_parser = subs.add_parser('半自动辅助点击') semi_parser = subs.add_parser('半自动辅助点击')

View File

@ -5,6 +5,7 @@ import shutil
from gooey import Gooey, GooeyParser from gooey import Gooey, GooeyParser
import module.config.server as server
from alas import AzurLaneAutoScript from alas import AzurLaneAutoScript
from module.config.dictionary import dic_true_eng_to_eng, dic_eng_to_true_eng from module.config.dictionary import dic_true_eng_to_eng, dic_eng_to_true_eng
from module.logger import logger, pyw_name from module.logger import logger, pyw_name
@ -79,7 +80,10 @@ def main(ini_name=''):
config = update_config_from_template(config, file=config_file) config = update_config_from_template(config, file=config_file)
event_folder = [dic_eng_to_true_eng.get(f, f) for f in os.listdir('./campaign') if f.startswith('event_')][::-1] event_folder = [f for f in os.listdir('./campaign') if f.startswith('event_') and f.split('_')[-1] == server.server]
event_latest = sorted([f for f in event_folder], reverse=True)[0]
event_folder = [dic_eng_to_true_eng.get(f, f) for f in event_folder][::-1]
event_latest = dic_eng_to_true_eng.get(event_latest, event_latest)
saved_config = {} saved_config = {}
for opt, option in config.items(): for opt, option in config.items():
@ -139,12 +143,12 @@ def main(ini_name=''):
f1.add_argument('--fleet_step_1', default=default('--fleet_step_1'), choices=['1', '2', '3', '4', '5', '6'], help='In event map, fleet has limit on moving, so fleet_step is how far can a fleet goes in one operation, if map cleared, it will be ignored') f1.add_argument('--fleet_step_1', default=default('--fleet_step_1'), choices=['1', '2', '3', '4', '5', '6'], help='In event map, fleet has limit on moving, so fleet_step is how far can a fleet goes in one operation, if map cleared, it will be ignored')
f2 = fleet.add_argument_group('Boss Fleet') f2 = fleet.add_argument_group('Boss Fleet')
f2.add_argument('--fleet_index_2', default=default('--fleet_index_2'), choices=['1', '2', '3', '4', '5', '6']) f2.add_argument('--fleet_index_2', default=default('--fleet_index_2'), choices=['do_not_use', '1', '2', '3', '4', '5', '6'])
f2.add_argument('--fleet_formation_2', default=default('--fleet_formation_2'), choices=['Line Ahead', 'Double Line', 'Diamond']) f2.add_argument('--fleet_formation_2', default=default('--fleet_formation_2'), choices=['Line Ahead', 'Double Line', 'Diamond'])
f2.add_argument('--fleet_step_2', default=default('--fleet_step_2'), choices=['1', '2', '3', '4', '5', '6'], help='In event map, fleet has limit on moving, so fleet_step is how far can a fleet goes in one operation, if map cleared, it will be ignored') f2.add_argument('--fleet_step_2', default=default('--fleet_step_2'), choices=['1', '2', '3', '4', '5', '6'], help='In event map, fleet has limit on moving, so fleet_step is how far can a fleet goes in one operation, if map cleared, it will be ignored')
f3 = fleet.add_argument_group('Alternate Mob Fleet') f3 = fleet.add_argument_group('Alternate Mob Fleet')
f3.add_argument('--fleet_index_3', default=default('--fleet_index_3'), choices=['1', '2', '3', '4', '5', '6']) f3.add_argument('--fleet_index_3', default=default('--fleet_index_3'), choices=['do_not_use', '1', '2', '3', '4', '5', '6'])
f3.add_argument('--fleet_formation_3', default=default('--fleet_formation_3'), choices=['Line Ahead', 'Double Line', 'Diamond']) f3.add_argument('--fleet_formation_3', default=default('--fleet_formation_3'), choices=['Line Ahead', 'Double Line', 'Diamond'])
f3.add_argument('--fleet_step_3', default=default('--fleet_step_3'), choices=['1', '2', '3', '4', '5', '6'], help='In event map, fleet has limit on moving, so fleet_step is how far can a fleet goes in one operation, if map cleared, it will be ignored') f3.add_argument('--fleet_step_3', default=default('--fleet_step_3'), choices=['1', '2', '3', '4', '5', '6'], help='In event map, fleet has limit on moving, so fleet_step is how far can a fleet goes in one operation, if map cleared, it will be ignored')
@ -314,7 +318,7 @@ def main(ini_name=''):
# ==========event_daily_ab========== # ==========event_daily_ab==========
event_ab_parser = subs.add_parser('event_daily_bonus') event_ab_parser = subs.add_parser('event_daily_bonus')
event_name = event_ab_parser.add_argument_group('Choose an event', 'bonus for first clear each day') event_name = event_ab_parser.add_argument_group('Choose an event', 'bonus for first clear each day')
event_name.add_argument('--event_name_ab', default=default('--event_name_ab'), choices=event_folder, help='There a dropdown menu with many options') event_name.add_argument('--event_name_ab', default=event_latest, choices=event_folder, help='There a dropdown menu with many options')
# event_name.add_argument('--enable_hard_bonus', default=default('--enable_hard_bonus'), choices=['yes', 'no'], help='Will enable Daily bonus for Event hard maps') # Trying implement all event maps # event_name.add_argument('--enable_hard_bonus', default=default('--enable_hard_bonus'), choices=['yes', 'no'], help='Will enable Daily bonus for Event hard maps') # Trying implement all event maps
# ==========main========== # ==========main==========
@ -337,7 +341,7 @@ def main(ini_name=''):
event.add_argument('--sp_stage', default=default('--sp_stage'), event.add_argument('--sp_stage', default=default('--sp_stage'),
choices=['sp1', 'sp2', 'sp3'], choices=['sp1', 'sp2', 'sp3'],
help='E.g sp3') help='E.g sp3')
event.add_argument('--event_name', default=default('--event_name'), choices=event_folder, help='There a dropdown menu with many options') event.add_argument('--event_name', default=event_latest, choices=event_folder, help='There a dropdown menu with many options')
# ==========半自动========== # ==========半自动==========
semi_parser = subs.add_parser('semi_auto') semi_parser = subs.add_parser('semi_auto')

View File

@ -419,7 +419,7 @@ class AzurLaneConfig:
self.ENABLE_FLEET_CONTROL = to_bool(option['enable_fleet_control']) self.ENABLE_FLEET_CONTROL = to_bool(option['enable_fleet_control'])
self.ENABLE_MAP_FLEET_LOCK = to_bool(option['enable_map_fleet_lock']) self.ENABLE_MAP_FLEET_LOCK = to_bool(option['enable_map_fleet_lock'])
for n in ['1', '2', '3']: for n in ['1', '2', '3']:
self.__setattr__(f'FLEET_{n}', int(option[f'fleet_index_{n}'])) self.__setattr__(f'FLEET_{n}', int(option[f'fleet_index_{n}']) if to_bool(option[f'fleet_index_{n}']) else 0)
self.__setattr__(f'FLEET_{n}_FORMATION', int(option[f'fleet_formation_{n}'].split('_')[1])) self.__setattr__(f'FLEET_{n}_FORMATION', int(option[f'fleet_formation_{n}'].split('_')[1]))
self.__setattr__(f'FLEET_{n}_STEP', int(option[f'fleet_step_{n}'])) self.__setattr__(f'FLEET_{n}_STEP', int(option[f'fleet_step_{n}']))
self.COMBAT_AUTO_MODE = option['combat_auto_mode'] self.COMBAT_AUTO_MODE = option['combat_auto_mode']

View File

@ -387,6 +387,7 @@ dic_chi_to_eng = {
'复刻苍红的回响': 'event_20200423_cn', '复刻苍红的回响': 'event_20200423_cn',
'夜幕下的归途': 'event_20200507_cn', '夜幕下的归途': 'event_20200507_cn',
'穹顶下的圣咏曲': 'event_20200521_cn', '穹顶下的圣咏曲': 'event_20200521_cn',
'峡湾间的反击': 'event_20200603_cn',
} }
dic_eng_to_chi = {v: k for k, v in dic_chi_to_eng.items()} dic_eng_to_chi = {v: k for k, v in dic_chi_to_eng.items()}

View File

@ -22,7 +22,8 @@ IN_MAP = Button(area={'cn': (749, 654, 921, 707), 'en': (748, 652, 922, 702)}, c
IN_STAGE = Button(area={'cn': (122, 16, 172, 39), 'en': (120, 18, 208, 40)}, color={'cn': (149, 167, 207), 'en': (104, 118, 157)}, button={'cn': (122, 16, 172, 39), 'en': (120, 18, 208, 40)}, file={'cn': './assets/cn/handler/IN_STAGE.png', 'en': './assets/en/handler/IN_STAGE.png'}) IN_STAGE = Button(area={'cn': (122, 16, 172, 39), 'en': (120, 18, 208, 40)}, color={'cn': (149, 167, 207), 'en': (104, 118, 157)}, button={'cn': (122, 16, 172, 39), 'en': (120, 18, 208, 40)}, file={'cn': './assets/cn/handler/IN_STAGE.png', 'en': './assets/en/handler/IN_STAGE.png'})
LOGIN_ANNOUNCE = Button(area={'cn': (1160, 45, 1227, 90), 'en': (1159, 44, 1228, 91)}, color={'cn': (174, 61, 56), 'en': (193, 79, 73)}, button={'cn': (1160, 45, 1227, 90), 'en': (1159, 44, 1228, 91)}, file={'cn': './assets/cn/handler/LOGIN_ANNOUNCE.png', 'en': './assets/en/handler/LOGIN_ANNOUNCE.png'}) LOGIN_ANNOUNCE = Button(area={'cn': (1160, 45, 1227, 90), 'en': (1159, 44, 1228, 91)}, color={'cn': (174, 61, 56), 'en': (193, 79, 73)}, button={'cn': (1160, 45, 1227, 90), 'en': (1159, 44, 1228, 91)}, file={'cn': './assets/cn/handler/LOGIN_ANNOUNCE.png', 'en': './assets/en/handler/LOGIN_ANNOUNCE.png'})
LOGIN_CHECK = Button(area={'cn': (77, 655, 154, 711), 'en': (77, 655, 154, 711)}, color={'cn': (33, 36, 33), 'en': (33, 36, 33)}, button={'cn': (416, 294, 534, 400), 'en': (416, 294, 534, 400)}, file={'cn': './assets/cn/handler/LOGIN_CHECK.png', 'en': './assets/en/handler/LOGIN_CHECK.png'}) LOGIN_CHECK = Button(area={'cn': (77, 655, 154, 711), 'en': (77, 655, 154, 711)}, color={'cn': (33, 36, 33), 'en': (33, 36, 33)}, button={'cn': (416, 294, 534, 400), 'en': (416, 294, 534, 400)}, file={'cn': './assets/cn/handler/LOGIN_CHECK.png', 'en': './assets/en/handler/LOGIN_CHECK.png'})
LOGIN_GAME_UPDATE = Button(area={'cn': (700, 471, 873, 529), 'en': (699, 470, 874, 530)}, color={'cn': (238, 170, 78), 'en': (236, 167, 74)}, button={'cn': (700, 471, 873, 529), 'en': (699, 470, 874, 530)}, file={'cn': './assets/cn/handler/LOGIN_GAME_UPDATE.png', 'en': './assets/en/handler/LOGIN_GAME_UPDATE.png'}) LOGIN_CONFIRM = Button(area={'cn': (464, 372, 814, 426), 'en': (464, 372, 814, 426)}, color={'cn': (39, 174, 229), 'en': (39, 174, 229)}, button={'cn': (464, 372, 814, 426), 'en': (464, 372, 814, 426)}, file={'cn': './assets/cn/handler/LOGIN_CONFIRM.png', 'en': './assets/en/handler/LOGIN_CONFIRM.png'})
LOGIN_GAME_UPDATE = Button(area={'cn': (700, 471, 873, 529), 'en': (700, 471, 873, 529)}, color={'cn': (238, 170, 78), 'en': (238, 170, 78)}, button={'cn': (700, 471, 873, 529), 'en': (700, 471, 873, 529)}, file={'cn': './assets/cn/handler/LOGIN_GAME_UPDATE.png', 'en': './assets/en/handler/LOGIN_GAME_UPDATE.png'})
LOGIN_RETURN_SIGN = Button(area={'cn': (1, 7, 104, 47), 'en': (1195, 524, 1272, 547)}, color={'cn': (158, 214, 229), 'en': (202, 202, 203)}, button={'cn': (1, 7, 104, 47), 'en': (1195, 524, 1272, 547)}, file={'cn': './assets/cn/handler/LOGIN_RETURN_SIGN.png', 'en': './assets/en/handler/LOGIN_RETURN_SIGN.png'}) LOGIN_RETURN_SIGN = Button(area={'cn': (1, 7, 104, 47), 'en': (1195, 524, 1272, 547)}, color={'cn': (158, 214, 229), 'en': (202, 202, 203)}, button={'cn': (1, 7, 104, 47), 'en': (1195, 524, 1272, 547)}, file={'cn': './assets/cn/handler/LOGIN_RETURN_SIGN.png', 'en': './assets/en/handler/LOGIN_RETURN_SIGN.png'})
MAP_AIR_RAID = Button(area={'cn': (350, 447, 1280, 472), 'en': (350, 447, 1280, 472)}, color={'cn': (154, 43, 46), 'en': (154, 43, 46)}, button={'cn': (350, 447, 1280, 472), 'en': (350, 447, 1280, 472)}, file={'cn': './assets/cn/handler/MAP_AIR_RAID.png', 'en': './assets/en/handler/MAP_AIR_RAID.png'}) MAP_AIR_RAID = Button(area={'cn': (350, 447, 1280, 472), 'en': (350, 447, 1280, 472)}, color={'cn': (154, 43, 46), 'en': (154, 43, 46)}, button={'cn': (350, 447, 1280, 472), 'en': (350, 447, 1280, 472)}, file={'cn': './assets/cn/handler/MAP_AIR_RAID.png', 'en': './assets/en/handler/MAP_AIR_RAID.png'})
MAP_AMBUSH = Button(area={'cn': (261, 433, 1280, 449), 'en': (261, 433, 1280, 449)}, color={'cn': (161, 41, 43), 'en': (161, 41, 43)}, button={'cn': (261, 433, 1280, 449), 'en': (261, 433, 1280, 449)}, file={'cn': './assets/cn/handler/MAP_AMBUSH.png', 'en': './assets/en/handler/MAP_AMBUSH.png'}) MAP_AMBUSH = Button(area={'cn': (261, 433, 1280, 449), 'en': (261, 433, 1280, 449)}, color={'cn': (161, 41, 43), 'en': (161, 41, 43)}, button={'cn': (261, 433, 1280, 449), 'en': (261, 433, 1280, 449)}, file={'cn': './assets/cn/handler/MAP_AMBUSH.png', 'en': './assets/en/handler/MAP_AMBUSH.png'})

View File

@ -26,6 +26,8 @@ class LoginHandler(Combat):
continue continue
if self.appear_then_click(LOGIN_RETURN_SIGN, offset=(30, 30), interval=1): if self.appear_then_click(LOGIN_RETURN_SIGN, offset=(30, 30), interval=1):
continue continue
if self.appear_then_click(LOGIN_CONFIRM, offset=(30, 30), interval=1):
continue
if self.info_bar_count() and self.appear_then_click(LOGIN_CHECK, interval=0.5): if self.info_bar_count() and self.appear_then_click(LOGIN_CHECK, interval=0.5):
logger.info('Login success') logger.info('Login success')

View File

@ -50,11 +50,18 @@ class Fleet(Camera, MapOperation, AmbushHandler):
@property @property
def fleet_boss(self): def fleet_boss(self):
if self.config.FLEET_BOSS == 2 and self.config.FLEET_2: if self.config.FLEET_BOSS == 2 or self.config.FLEET_2:
return self.fleet_2 return self.fleet_2
else: else:
return self.fleet_1 return self.fleet_1
@property
def fleet_boss_index(self):
if self.config.FLEET_BOSS == 2 or self.config.FLEET_2:
return 1
else:
return 1
@property @property
def fleet_step(self): def fleet_step(self):
if not self.config.MAP_HAS_FLEET_STEP: if not self.config.MAP_HAS_FLEET_STEP:
@ -84,6 +91,7 @@ class Fleet(Camera, MapOperation, AmbushHandler):
location (tuple, str, GridInfo): Destination. location (tuple, str, GridInfo): Destination.
""" """
location = location_ensure(location) location = location_ensure(location)
siren_count = self.map.select(is_siren=True).count
result_mystery = '' result_mystery = ''
while 1: while 1:
@ -99,7 +107,7 @@ class Fleet(Camera, MapOperation, AmbushHandler):
self.device.click(grid) self.device.click(grid)
arrived = False arrived = False
# Wait to confirm fleet arrived. It does't appear immediately if fleet in combat . # Wait to confirm fleet arrived. It does't appear immediately if fleet in combat .
add = self.config.MAP_SIREN_MOVE_WAIT * self.config.MAP_SIREN_COUNT \ add = self.config.MAP_SIREN_MOVE_WAIT * min(self.config.MAP_SIREN_COUNT, siren_count) \
if self.config.MAP_HAS_MOVABLE_ENEMY and not self.config.ENABLE_FAST_FORWARD else 0 if self.config.MAP_HAS_MOVABLE_ENEMY and not self.config.ENABLE_FAST_FORWARD else 0
arrive_timer = Timer(0.3 + add) arrive_timer = Timer(0.3 + add)
arrive_unexpected_timer = Timer(1.5 + add) arrive_unexpected_timer = Timer(1.5 + add)
@ -409,13 +417,18 @@ class Fleet(Camera, MapOperation, AmbushHandler):
""" """
Args: Args:
grid (Grid): grid (Grid):
fleet (int): 1, 2 fleet (int, str): 1, 2, 'boss'
Returns: Returns:
bool: If accessible. bool: If accessible.
""" """
if fleet is None: if fleet is None:
return grid.is_accessible return grid.is_accessible
if isinstance(fleet, str) and fleet.isdigit():
fleet = int(fleet)
if fleet == 'boss':
fleet = self.fleet_boss_index
if fleet == self.fleet_current_index: if fleet == self.fleet_current_index:
return grid.is_accessible return grid.is_accessible
else: else:

View File

@ -27,5 +27,8 @@ TEMPLATE_SIREN_Algerie = Template(file={'cn': './assets/cn/template/TEMPLATE_SIR
TEMPLATE_SIREN_DD = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_DD.png', 'en': './assets/en/template/TEMPLATE_SIREN_DD.png'}) TEMPLATE_SIREN_DD = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_DD.png', 'en': './assets/en/template/TEMPLATE_SIREN_DD.png'})
TEMPLATE_SIREN_LaGalissonniere = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_LaGalissonniere.png', 'en': './assets/en/template/TEMPLATE_SIREN_LaGalissonniere.png'}) TEMPLATE_SIREN_LaGalissonniere = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_LaGalissonniere.png', 'en': './assets/en/template/TEMPLATE_SIREN_LaGalissonniere.png'})
TEMPLATE_SIREN_Vauquelin = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Vauquelin.png', 'en': './assets/en/template/TEMPLATE_SIREN_Vauquelin.png'}) TEMPLATE_SIREN_Vauquelin = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Vauquelin.png', 'en': './assets/en/template/TEMPLATE_SIREN_Vauquelin.png'})
TEMPLATE_SIREN_Z18 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Z18.png', 'en': './assets/cn/template/TEMPLATE_SIREN_Z18.png'})
TEMPLATE_SIREN_Z19 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Z19.png', 'en': './assets/cn/template/TEMPLATE_SIREN_Z19.png'})
TEMPLATE_SIREN_Z2 = Template(file={'cn': './assets/cn/template/TEMPLATE_SIREN_Z2.png', 'en': './assets/cn/template/TEMPLATE_SIREN_Z2.png'})
TEMPLATE_STAGE_CLEAR = Template(file={'cn': './assets/cn/template/TEMPLATE_STAGE_CLEAR.png', 'en': './assets/en/template/TEMPLATE_STAGE_CLEAR.png'}) TEMPLATE_STAGE_CLEAR = Template(file={'cn': './assets/cn/template/TEMPLATE_STAGE_CLEAR.png', 'en': './assets/en/template/TEMPLATE_STAGE_CLEAR.png'})
TEMPLATE_STAGE_PERCENT = Template(file={'cn': './assets/cn/template/TEMPLATE_STAGE_PERCENT.png', 'en': './assets/en/template/TEMPLATE_STAGE_PERCENT.png'}) TEMPLATE_STAGE_PERCENT = Template(file={'cn': './assets/cn/template/TEMPLATE_STAGE_PERCENT.png', 'en': './assets/en/template/TEMPLATE_STAGE_PERCENT.png'})