1
0
mirror of https://gitee.com/sui-feng-cb/AzurLaneAutoScript1 synced 2026-03-30 09:43:51 +08:00
This commit is contained in:
SevCrane
2024-06-05 23:20:28 +08:00
commit 5e482958f6
7329 changed files with 240086 additions and 0 deletions

View File

@@ -0,0 +1,72 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('10-1')
MAP.shape = 'G6'
MAP.camera_data = ['D3']
MAP.camera_data_spawn_point = ['D1', 'D4']
MAP.map_data = """
SP -- ++ -- ME ME --
-- -- ++ Me ME ME ME
-- Me ME ME ++ ++ MB
-- ME Me ME ME ++ MB
-- -- ++ -- Me ME ME
SP -- ++ ++ -- -- ++
"""
MAP.weight_data = """
50 50 50 50 50 40 50
50 50 50 30 30 50 40
50 40 30 30 30 50 05
50 25 20 20 30 50 05
50 50 50 15 10 10 05
50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 4},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, \
A2, B2, C2, D2, E2, F2, G2, \
A3, B3, C3, D3, E3, F3, G3, \
A4, B4, C4, D4, E4, F4, G4, \
A5, B5, C5, D5, E5, F5, G5, \
A6, B6, C6, D6, E6, F6, G6, \
= MAP.flatten()
road_main = RoadGrids([B4, C4, D4, E5, F5, G5])
class Config:
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.fleet_2_push_forward()
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_6(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,89 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('10-2')
MAP.shape = 'H6'
MAP.camera_data = ['D2', 'E3', 'E4']
MAP.camera_data_spawn_point = ['E4']
MAP.map_data = """
Me -- ME ME -- ++ ME MB
-- ++ ++ -- ME ++ ME ME
-- SP ++ ++ __ ME Me ++
-- SP ++ ++ -- ME Me ++
-- ++ ++ -- ME ++ ME ME
-- Me ME ME -- ++ ME MB
"""
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
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 4},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
= MAP.flatten()
road_main = RoadGrids([B6, C6, D6, E5, F4, G2, [G1, H2], G3, G4, G5, [H5, G6]])
class Config:
DETECTION_BACKEND = 'homography'
HOMO_STORAGE = ((7, 6), [(471.806, 82.471), (1249.283, 82.471), (420.72, 615.64), (1435.387, 615.64)])
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 30
EDGE_LINES_HOUGHLINES_THRESHOLD = 30
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.3
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (150, 255 - 24),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 24, 255),
'prominence': 10,
'distance': 50,
'width': (0, 10),
'wlen': 1000,
}
MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom'
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.fleet_2_push_forward()
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_6(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,88 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('10-3')
MAP.shape = 'I6'
MAP.camera_data = ['D2', 'E3', 'F4']
MAP.camera_data_spawn_point = ['E3']
MAP.map_data = """
Me -- ME -- ME MB ++ -- MM
-- ++ ++ ++ ME MB ++ -- --
-- Me -- ME ME ME __ ME --
-- -- ++ ++ MB ME ME Me ++
-- -- SP SP ++ ++ ++ ME MB
++ -- -- -- Me -- ME ME ME
"""
MAP.weight_data = """
90 90 90 90 40 10 90 90 90
90 90 90 90 30 10 90 90 90
90 90 90 90 20 05 20 90 90
90 90 90 90 10 15 20 30 90
90 90 90 90 90 90 90 40 40
90 90 90 90 80 70 60 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 4},
{'battle': 1, 'enemy': 2, 'mystery': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
= MAP.flatten()
road_main = RoadGrids([E6, G6, H6, E5, H4, G4, F4, F3])
class Config:
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 35
EDGE_LINES_HOUGHLINES_THRESHOLD = 35
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.2
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (150, 255 - 24),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 24, 255),
'prominence': 10,
'distance': 50,
'width': (0, 10),
'wlen': 1000,
}
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.fleet_2_push_forward()
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
self.clear_all_mystery()
return self.battle_default()
def battle_6(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,89 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('10-4')
MAP.shape = 'I6'
MAP.camera_data = ['D2', 'F4']
MAP.camera_data_spawn_point = ['D4']
MAP.map_data = """
MB ME ME -- ++ MB -- ++ ++
ME ME ++ ME ++ -- Me -- ++
-- __ ME Me ME ++ ME ME --
++ ++ ++ -- ME -- Me ++ ME
SP -- -- Me -- ++ __ ME --
SP -- -- -- Me ++ ME -- MB
"""
MAP.weight_data = """
10 30 30 10 10 10 10 10 10
5 30 10 30 10 10 5 10 10
10 10 5 4 30 10 5 30 10
10 10 10 10 10 10 5 10 30
10 10 10 10 10 10 10 30 10
10 10 10 10 30 10 5 10 10
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 4},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
= MAP.flatten()
step_on = SelectedGrids([E4, D3, G4, C3])
road_main = RoadGrids([D5, E4, D3, C3, A2, G4, H5, G3, G2])
roadblocks_d4 = RoadGrids([[D5, E6], E4, D3])
class Config:
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (150, 255 - 24),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 24, 255),
'prominence': 10,
'distance': 50,
'width': (0, 10),
'wlen': 1000,
}
MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom'
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_2_step_on(step_on, roadblocks=[roadblocks_d4]):
return True
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_6(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_potential_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,71 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('11-1')
MAP.shape = 'H6'
MAP.camera_data = ['D3', 'E4']
MAP.camera_data_spawn_point = ['D4']
MAP.map_data = """
-- -- ME -- ME -- -- MB
MB ME __ ME -- ++ ++ --
++ Me -- ++ ME MB ++ ME
-- -- ++ ++ __ ME ME --
SP -- -- -- Me ME -- ++
++ SP -- -- ++ -- MB ++
"""
MAP.weight_data = """
90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
= MAP.flatten()
road_main = RoadGrids([B2, B3, E5, F4, G4, H3])
class Config:
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 30
EDGE_LINES_HOUGHLINES_THRESHOLD = 30
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.2
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_6(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,89 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('11-2')
MAP.shape = 'K6'
MAP.camera_data = ['F4', 'G3', 'H4']
MAP.camera_data_spawn_point = ['D4']
MAP.map_data = """
++ ++ ++ -- -- ++ -- ME -- Me --
-- -- -- Me -- __ Me ++ ++ ME --
SP -- ++ -- -- ME ME MM ++ -- ME
SP -- ++ -- ME -- ++ ME -- MB MB
-- ++ ++ ++ __ ME ME -- ++ ++ ++
-- -- ME -- -- ++ -- ME -- -- MB
"""
MAP.weight_data = """
90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 10 05 90 90
90 90 90 90 90 25 20 15 90 90 90
90 90 90 40 35 30 90 90 90 90 90
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \
= MAP.flatten()
road_main = RoadGrids([C6, F5, G5, H4, H6])
class Config:
DETECTION_BACKEND = 'homography'
HOMO_STORAGE = ((6, 6), [(579.064, 82.271), (1248.248, 82.271), (562.795, 616.581), (1438.283, 616.581)])
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 30
EDGE_LINES_HOUGHLINES_THRESHOLD = 30
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.2
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (150, 255 - 24),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 24, 255),
'prominence': 10,
'distance': 50,
'wlen': 1000,
}
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.fleet_2_push_forward()
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_6(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()
def handle_boss_appear_refocus(self, preset=(-3, -2)):
return super().handle_boss_appear_refocus(preset)

View File

@@ -0,0 +1,84 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('11-3')
MAP.shape = 'I7'
MAP.camera_data = ['D3', 'F5']
MAP.camera_data_spawn_point = ['D5']
MAP.map_data = """
++ -- -- ME -- Me ++ ++ ++
__ ME ME -- Me -- ME -- __
-- -- ME -- -- ME -- ME --
MB ++ ++ -- ++ ++ ++ -- ME
++ ++ ++ MB -- ME __ ME --
SP -- -- Me -- ME ++ ME --
SP -- -- -- ++ -- ME -- MB
"""
MAP.weight_data = """
90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90
90 90 90 90 90 90 90 90 90
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, \
= MAP.flatten()
road_main = RoadGrids([C2, D6, F6, G7])
class Config:
DETECTION_BACKEND = 'homography'
HOMO_STORAGE = ((5, 4), [(133.207, 81.356), (696.903, 81.356), (44.566, 406.051), (705.278, 406.051)])
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 30
EDGE_LINES_HOUGHLINES_THRESHOLD = 30
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.2
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (150, 255 - 24),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 24, 255),
'prominence': 10,
'distance': 50,
'width': (0, 10),
'wlen': 1000,
}
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_6(self):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,93 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('11-4')
MAP.shape = 'J8'
MAP.camera_data = ['D2', 'D6', 'G2', 'G6']
MAP.camera_data_spawn_point = ['D2', 'G2']
MAP.map_data = """
MB MB ++ -- -- -- ++ MB -- --
-- -- ++ ME -- Me ++ -- -- ME
ME __ ME -- ++ -- __ -- ME --
-- ++ -- -- SP SP -- Me -- --
MB -- ME -- -- -- -- ++ ++ ++
++ ++ ++ -- Me -- Me __ -- ME
-- -- ME __ -- ++ -- ++ ME --
MB -- -- ME -- ++ -- ME -- MB
"""
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 10 10 10
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \
= MAP.flatten()
step_on = SelectedGrids([C3])
road_boss = RoadGrids([C3, H4, [C5, C7], G6, G8])
class Config:
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 35
EDGE_LINES_HOUGHLINES_THRESHOLD = 35
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.3
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (150, 255 - 24),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 24, 255),
'prominence': 10,
'distance': 50,
'width': (0, 10),
'wlen': 1000,
}
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_2_step_on(step_on, roadblocks=[road_boss]):
return True
if self.clear_roadblocks([road_boss]):
return True
if self.clear_potential_roadblocks([road_boss]):
return True
return self.battle_default()
def battle_6(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
return self.clear_roadblocks([road_boss])
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,89 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'H6'
MAP.camera_data = ['D2', 'D4', 'E2', 'E4']
MAP.camera_data_spawn_point = ['D4', 'E4']
MAP.map_data = """
ME -- ME Me -- -- ++ ++
++ ME -- ++ ME ME ME ME
++ __ Me ++ ++ __ Me --
-- ME -- ME ME ME -- Me
ME ++ ++ SP SP -- ++ MB
ME -- Me ME -- Me ++ MB
"""
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 50 50
50 50 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 = [
{'battle': 0, 'enemy': 2},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
= MAP.flatten()
road_main = RoadGrids([F4, H4])
class Config:
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 30
EDGE_LINES_HOUGHLINES_THRESHOLD = 30
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.2
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 49),
'width': (1.5, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 49, 255),
'prominence': 10,
'distance': 50,
'wlen': 1000
}
HOMO_EDGE_COLOR_RANGE = (0, 49)
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
MAP_SWIPE_MULTIPLY = (0.977, 0.995)
MAP_SWIPE_MULTIPLY_MINITOUCH = (0.945, 0.962)
MAP_SWIPE_MULTIPLY_MAATOUCH = (0.917, 0.934)
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.fleet_2_push_forward()
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_6(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,68 @@
from campaign.campaign_main.campaign_12_1 import Config
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'I7'
MAP.camera_data = ['D2', 'D5', 'F2', 'F5']
MAP.camera_data_spawn_point = ['D2', 'D5']
MAP.map_data = """
++ MB ME ME ++ -- ME Me --
++ -- Me -- Me -- Me -- ++
MB ME ++ ME SP ME -- ME ++
MB __ ME -- SP ++ ++ __ Me
++ -- -- Me ME -- ME -- ME
-- ME ME ++ -- -- Me ME --
ME -- Me -- ME ME -- ++ ++
"""
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 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 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 = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, \
= MAP.flatten()
road_main = RoadGrids([[C4, D5], B3])
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_6(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,80 @@
from campaign.campaign_main.campaign_12_1 import Config as ConfigBase
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'I7'
MAP.camera_data = ['D2', 'D5', 'F2', 'F5']
MAP.camera_data_spawn_point = ['D2', 'D5']
MAP.map_data = """
++ MB ME ME ++ -- ME Me --
++ -- Me -- Me -- Me -- ++
MB ME ++ ME SP ME -- ME ++
MB __ ME -- SP ++ ++ __ Me
++ -- -- Me ME -- ME -- ME
-- ME ME ++ -- -- Me ME --
ME -- Me -- ME ME -- ++ ++
"""
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 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 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 = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, \
= MAP.flatten()
class Config(ConfigBase):
ENABLE_AUTO_SEARCH = False
class Campaign(CampaignBase):
MAP = MAP
s3_enemy_count = 0
def check_s3_enemy(self):
if self.battle_count == 0:
self.s3_enemy_count = 0
elif self.battle_count >= 5:
self.withdraw()
current = self.map.select(is_enemy=True, enemy_scale=2) \
.add(self.map.select(is_enemy=True, enemy_scale=1)) \
.count
logger.attr('S2_enemy', current)
if self.s3_enemy_count >= self.config.C122MediumLeveling_LargeEnemyTolerance and current == 0:
self.withdraw()
def battle_0(self):
self.check_s3_enemy()
if self.clear_enemy(scale=(2,), genre=['light', 'main', 'treasure', 'enemy', 'carrier']):
return True
if self.clear_enemy(scale=(1,)):
return True
if self.clear_enemy(scale=(3,), genre=['light', 'carrier', 'enemy', 'treasure', 'main']):
self.s3_enemy_count += 1
return True
return self.battle_default()

View File

@@ -0,0 +1,68 @@
from campaign.campaign_main.campaign_12_1 import Config
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'J7'
MAP.camera_data = ['D2', 'D5', 'G2', 'G5']
MAP.camera_data_spawn_point = ['G5', 'D5']
MAP.map_data = """
MB ++ ++ ++ ME MB -- Me -- ME
MB -- ME -- -- ME -- -- ++ MB
-- ME __ ++ Me -- ME ++ ++ --
MB -- ME -- -- ME -- __ Me ME
-- ME -- ME Me -- Me -- ME ++
++ -- ME Me -- ++ Me -- -- ++
++ ME -- ME SP SP -- ME -- ME
"""
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 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 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 = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \
= MAP.flatten()
road_main = RoadGrids([H1, J1])
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_6(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,75 @@
from campaign.campaign_main.campaign_12_1 import Config
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('12-4')
MAP.shape = 'K8'
MAP.camera_data = ['D2', 'D6', 'H2', 'H6']
MAP.camera_data_spawn_point = ['D6']
MAP.map_data = """
MB MB ME -- ME ++ ++ ++ MB MB ++
ME ++ -- ME -- MA ++ ++ ME Me ++
-- ME __ Me Me -- Me Me -- Me --
++ -- ME ++ ++ Me ME __ ++ ++ ME
++ ME ME -- ME ME -- ME -- ++ --
++ __ Me Me -- Me ME ++ __ -- ME
ME -- Me -- Me -- Me -- -- ME --
-- -- -- ME SP SP ++ ++ ++ ME --
"""
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
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
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 = [
{'battle': 0, 'enemy': 2},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \
= MAP.flatten()
road_main = RoadGrids([[H3, B6, C5]])
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.battle_count >= 3:
self.pick_up_ammo()
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_6(self):
self.pick_up_ammo()
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,93 @@
from campaign.campaign_main.campaign_12_1 import Config as ConfigBase
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('12-4')
MAP.shape = 'K8'
MAP.camera_data = ['D2', 'D6', 'H2', 'H6']
MAP.camera_data_spawn_point = ['D6']
MAP.map_data = """
MB MB ME -- ME ++ ++ ++ MB MB ++
ME ++ -- ME -- MA ++ ++ ME Me ++
-- ME __ Me Me -- Me Me -- Me --
++ -- ME ++ ++ Me ME __ ++ ++ ME
++ ME ME -- ME ME -- ME -- ++ --
++ __ Me Me -- Me ME ++ __ -- ME
ME -- Me -- Me -- Me -- -- ME --
-- -- -- ME SP SP ++ ++ ++ ME --
"""
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
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
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 = [
{'battle': 0, 'enemy': 2},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \
= MAP.flatten()
class Config(ConfigBase):
ENABLE_AUTO_SEARCH = False
class Campaign(CampaignBase):
MAP = MAP
s3_enemy_count = 0
non_s3_enemy_count = 0
def check_s3_enemy(self):
if self.battle_count == 0:
self.s3_enemy_count = 0
self.non_s3_enemy_count = 0
current = self.map.select(is_enemy=True, enemy_scale=3).count
logger.attr('S3_enemy', current)
if self.battle_count == self.config.C124LargeLeveling_NonLargeEnterTolerance \
and self.config.C124LargeLeveling_NonLargeRetreatTolerance < 10:
if self.s3_enemy_count + current == 0:
self.withdraw()
elif self.battle_count > self.config.C124LargeLeveling_NonLargeEnterTolerance:
if self.non_s3_enemy_count >= self.config.C124LargeLeveling_NonLargeRetreatTolerance and current == 0:
self.withdraw()
def battle_0(self):
self.check_s3_enemy()
if self.battle_count >= self.config.C124LargeLeveling_PickupAmmo:
self.pick_up_ammo()
if self.clear_enemy(scale=(3,), genre=['light', 'carrier', 'enemy', 'treasure', 'main']):
self.s3_enemy_count += 1
self.non_s3_enemy_count = 0
return True
if self.clear_enemy(scale=[2, 1]):
self.non_s3_enemy_count += 1
return True
if not self.map.select(is_enemy=True, may_boss=False):
logger.info('No more enemies.')
self.withdraw()
return self.battle_default()

View File

@@ -0,0 +1,124 @@
from module.campaign.campaign_base import CampaignBase
from module.combat.assets import *
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
class Campaign(CampaignBase):
# MAP = MAP
def battle_default(self):
if not self.map.select(enemy_scale=3, enemy_genre='Light'):
self.withdraw()
def handle_combat_weapon_release(self):
if self.appear_then_click(READY_AIR_RAID, interval=5):
return True
return False
def handle_battle_status(self, save_get_items=False):
"""
Args:
save_get_items (bool):
Returns:
bool:
"""
if self.is_combat_executing():
return False
if self.appear_then_click(BATTLE_STATUS_S, screenshot=save_get_items, genre='status', interval=self.battle_status_click_interval):
if not save_get_items:
self.device.sleep((0.25, 0.5))
return True
if self.appear_then_click(BATTLE_STATUS_A, screenshot=save_get_items, genre='status', interval=self.battle_status_click_interval):
logger.warning('Battle status: A')
if not save_get_items:
self.device.sleep((0.25, 0.5))
return True
if self.appear_then_click(BATTLE_STATUS_B, screenshot=save_get_items, genre='status', interval=self.battle_status_click_interval):
logger.warning('Battle Status B')
if not save_get_items:
self.device.sleep((0.25, 0.5))
return True
if self.appear_then_click(BATTLE_STATUS_C, screenshot=save_get_items, genre='status', interval=self.battle_status_click_interval):
if not save_get_items:
self.device.sleep((0.25, 0.5))
return True
if self.appear_then_click(BATTLE_STATUS_D, screenshot=save_get_items, genre='status', interval=self.battle_status_click_interval):
logger.warning('Battle Status D')
if not save_get_items:
self.device.sleep((0.25, 0.5))
return True
return False
def handle_get_items(self, save_get_items=False):
"""
Args:
save_get_items (bool):
Returns:
bool:
"""
if self.appear_then_click(GET_ITEMS_1, screenshot=save_get_items, genre='get_items', offset=5,
interval=self.battle_status_click_interval):
self.interval_reset(BATTLE_STATUS_S)
self.interval_reset(BATTLE_STATUS_A)
self.interval_reset(BATTLE_STATUS_B)
self.interval_reset(BATTLE_STATUS_C)
self.interval_reset(BATTLE_STATUS_D)
return True
if self.appear_then_click(GET_ITEMS_2, screenshot=save_get_items, genre='get_items', offset=5,
interval=self.battle_status_click_interval):
self.interval_reset(BATTLE_STATUS_S)
self.interval_reset(BATTLE_STATUS_A)
self.interval_reset(BATTLE_STATUS_B)
self.interval_reset(BATTLE_STATUS_C)
self.interval_reset(BATTLE_STATUS_D)
return True
return False
def handle_exp_info(self):
"""
Returns:
bool:
"""
if self.is_combat_executing():
return False
if self.appear_then_click(EXP_INFO_S):
self.device.sleep((0.25, 0.5))
return True
if self.appear_then_click(EXP_INFO_A):
self.device.sleep((0.25, 0.5))
return True
if self.appear_then_click(EXP_INFO_B):
self.device.sleep((0.25, 0.5))
return True
if self.appear_then_click(EXP_INFO_C):
self.device.sleep((0.25, 0.5))
return True
if self.appear_then_click(EXP_INFO_D):
self.device.sleep((0.25, 0.5))
return True
if self.appear_then_click(OPTS_INFO_D, offset=(20, 20)):
self.device.sleep((0.25, 0.5))
return True
return False
def combat(self, balance_hp=None, emotion_reduce=None, func=None, call_submarine_at_boss=None, save_get_items=None,
expected_end=None, fleet_index=1):
self.battle_status_click_interval = 7 if save_get_items else 0
super().combat(balance_hp=False, expected_end='no_searching', auto_mode='hide_in_bottom_left', save_get_items=False)
from module.config.config import AzurLaneConfig
az = Campaign(AzurLaneConfig('alas'))
for n in range(10000):
logger.hr(f'count: {n}')
az.map_offensive()
az.combat()

View File

@@ -0,0 +1,80 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('13-1')
MAP.shape = 'H6'
MAP.camera_data = ['D2', 'D4', 'E2', 'E4']
MAP.camera_data_spawn_point = ['D4']
MAP.map_data = """
ME -- ME Me ++ ++ ME MB
++ ME -- ME -- ++ ME --
++ __ Me ME -- -- Me --
ME ME ++ ME ME -- __ --
ME -- SP SP -- -- ++ --
ME -- Me ME Me Me ++ MB
"""
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 50 50
50 50 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 = [
{'battle': 0, 'enemy': 2},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
= MAP.flatten()
class Config:
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 49),
'width': (1.5, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 49, 255),
'prominence': 10,
'distance': 50,
'wlen': 1000
}
HOMO_EDGE_COLOR_RANGE = (0, 49)
MAP_SWIPE_MULTIPLY = (0.994, 1.013)
MAP_SWIPE_MULTIPLY_MINITOUCH = (0.961, 0.979)
MAP_SWIPE_MULTIPLY_MAATOUCH = (0.933, 0.950)
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_filter_enemy('1L > 1M > 2L > 2M > 3L > 2E > 3E > 2C > 3C > 3M', preserve=1):
return True
return self.battle_default()
def battle_5(self):
if self.clear_filter_enemy('1L > 1M > 2L > 2M > 3L > 2E > 3E > 2C > 3C > 3M', preserve=0):
return True
return self.battle_default()
def battle_6(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,69 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
from .campaign_13_1 import Config as ConfigBase
MAP = CampaignMap('13-2')
MAP.shape = 'I7'
MAP.camera_data = ['D2', 'D5', 'F2', 'F5']
MAP.camera_data_spawn_point = ['D2', 'D5']
MAP.map_data = """
++ Me ME ME ++ Me ME Me --
++ -- -- -- -- -- ++ ++ ++
MB -- SP ++ ++ -- ME ME ME
MB -- SP -- ++ -- -- __ Me
ME __ -- -- ME -- ME -- --
ME ME ME ++ ME -- Me ME MB
ME -- Me Me ME ME Me ++ ++
"""
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 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 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 = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, \
= MAP.flatten()
class Config(ConfigBase):
pass
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_filter_enemy('1L > 1M > 2L > 2M > 3L > 2E > 3E > 2C > 3C > 3M', preserve=1):
return True
return self.battle_default()
def battle_5(self):
if self.clear_filter_enemy('1L > 1M > 2L > 2M > 3L > 2E > 3E > 2C > 3C > 3M', preserve=0):
return True
return self.battle_default()
def battle_6(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,73 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
from .campaign_13_1 import Config as ConfigBase
MAP = CampaignMap('13-3')
MAP.shape = 'J7'
MAP.camera_data = ['D2', 'D5', 'G2', 'G5']
MAP.camera_data_spawn_point = ['G5', 'D5']
MAP.map_data = """
++ ++ ++ ME ME MB -- Me ++ --
MB Me ME ME -- ME -- -- ++ MB
MB -- -- -- Me ++ ME __ -- --
MB __ -- ++ ++ ME -- -- Me ME
ME ME -- ++ ++ -- Me -- ME ++
++ -- ME Me SP SP Me -- -- ME
++ ME -- ME -- -- -- ME -- ME
"""
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 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 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 = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 3},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \
= MAP.flatten()
class Config(ConfigBase):
pass
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_siren():
return True
if self.clear_filter_enemy('1L > 1M > 2L > 2M > 3L > 2E > 3E > 2C > 3C > 3M', preserve=1):
return True
return self.battle_default()
def battle_5(self):
if self.clear_siren():
return True
if self.clear_filter_enemy('1L > 1M > 2L > 2M > 3L > 2E > 3E > 2C > 3C > 3M', preserve=0):
return True
return self.battle_default()
def battle_6(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,92 @@
from module.campaign.campaign_base import CampaignBase
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
from .campaign_13_1 import Config as ConfigBase
MAP = CampaignMap('13-4')
MAP.shape = 'K8'
MAP.camera_data = ['D2', 'D4', 'D6', 'H2', 'H4', 'H6']
MAP.camera_data_spawn_point = ['D2', 'D6']
MAP.map_data = """
MB ME ME -- ME ++ ++ ++ MB MB ++
MB __ ME ME ME -- __ MA -- Me ++
ME -- -- Me Me -- Me Me -- Me ME
++ SP -- ME ++ Me -- -- -- -- ME
++ SP ME -- ME -- -- ME ++ ++ --
++ -- -- -- Me -- ME Me ++ ++ ME
ME ME Me -- -- -- Me -- -- ME --
-- ME Me ME -- -- ++ ++ -- ME --
"""
MAP.weight_data = """
50 50 90 90 90 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
90 50 50 50 50 50 50 50 50 90 50
90 90 50 50 50 50 50 50 50 90 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 3},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 2},
{'battle': 4, 'enemy': 1},
{'battle': 5, 'enemy': 1},
{'battle': 6},
{'battle': 7, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \
= MAP.flatten()
class Config(ConfigBase):
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (150, 255 - 24),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 24, 255),
'prominence': 10,
'distance': 50,
'width': (0, 10),
'wlen': 1000,
}
# step_on = SelectedGrids([A7, B1, B7, C7, D2, D3, G7, J2, K4, K6])
# road_main = RoadGrids([A7, B1, B7, C7, D2, D3, [G7, J2], K4, K6])
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_filter_enemy('1L > 1M > 2L > 2M > 3L > 2E > 3E > 2C > 3C > 3M', preserve=0):
return True
return self.battle_default()
def battle_3(self):
self.pick_up_ammo()
if self.clear_filter_enemy('1L > 1M > 2L > 2M > 3L > 2E > 3E > 2C > 3C > 3M', preserve=0):
return True
return self.battle_default()
def battle_7(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,84 @@
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
from .campaign_14_base import CampaignBase
from .campaign_14_base import Config as ConfigBase
MAP = CampaignMap('14-1')
MAP.shape = 'H7'
MAP.camera_data = ['D2', 'D5', 'E2', 'E5']
MAP.camera_data_spawn_point = ['E5']
MAP.map_data = """
MB ++ ++ ME Me -- ME ME
MB ME ++ ME __ ME -- --
-- ME Me -- -- -- ME ++
-- __ -- Me ME ME Me ++
-- ++ MM -- ME Me -- --
-- ME ME -- -- -- Me ME
MB ME -- ++ ++ SP SP ME
"""
MAP.weight_data = """
50 50 50 70 60 60 60 60
50 50 50 60 60 60 60 60
50 50 50 60 60 60 60 60
50 50 50 50 60 60 60 60
50 50 50 50 50 50 60 60
50 50 50 50 50 50 50 60
50 50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
A7, B7, C7, D7, E7, F7, G7, H7, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
# MAP_SIREN_TEMPLATE = ['0']
# MOVABLE_ENEMY_TURN = (2,)
# MAP_HAS_SIREN = True
# MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = False
MAP_HAS_AMBUSH = True
# MAP_HAS_MYSTERY = True
# ===== End of generated config =====
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.pick_up_light_house(E3)
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_5(self):
self.pick_up_light_house(E3)
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_6(self):
self.fleet_boss.pick_up_flare(C5)
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,93 @@
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
from .campaign_14_base import CampaignBase
from .campaign_14_base import Config as ConfigBase
MAP = CampaignMap('14-2')
MAP.shape = 'I8'
MAP.camera_data = ['D2', 'D6', 'F2', 'F6']
MAP.camera_data_spawn_point = ['F2']
MAP.map_data = """
MB MB ++ -- ME -- ME ++ ++
-- ME ++ ME -- Me -- SP SP
-- -- Me Me Me -- -- ME ME
ME __ -- Me -- ME -- -- ME
MM ME -- -- Me -- -- ME ++
++ ++ ++ -- ++ -- ME ME ME
Me MB ME __ -- -- Me MM ME
ME -- -- -- ME ME ++ ++ ME
"""
MAP.weight_data = """
50 50 50 60 60 60 50 50 50
50 50 50 60 60 50 50 50 50
50 50 50 60 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 60 70
50 50 50 50 50 50 50 60 80
50 50 50 50 50 50 50 50 90
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, \
= MAP.flatten()
road_H7 = RoadGrids([[G6, G7, H6], [G6, G7, H7]])
road_A5 = RoadGrids([[A4, B5]])
class Config(ConfigBase):
# ===== Start of generated config =====
# MAP_SIREN_TEMPLATE = ['0']
# MOVABLE_ENEMY_TURN = (2,)
# MAP_HAS_SIREN = True
# MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = False
MAP_HAS_AMBUSH = True
# MAP_HAS_MYSTERY = True
# ===== End of generated config =====
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
# 14-2 do not have light house
if not self.picked_flare and H7.is_accessible and A5.is_accessible:
self.fleet_boss.pick_up_flare(H7)
self.fleet_boss.pick_up_flare(A5)
self.fleet_boss.goto(D6)
self.fleet_1.switch_to()
if self.clear_roadblocks([road_A5, road_H7], weakest=True):
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_5(self):
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_6(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,96 @@
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
from .campaign_14_base import CampaignBase
from .campaign_14_base import Config as ConfigBase
MAP = CampaignMap('14-3')
MAP.shape = 'J8'
MAP.camera_data = ['D2', 'D6', 'G2', 'G6']
MAP.camera_data_spawn_point = ['G2']
MAP.map_data = """
ME ++ ++ ++ -- ME ++ ++ ME ME
-- Me ME -- ME -- ++ ++ ME --
MB -- ME ME -- -- SP SP ME Me
-- __ -- ++ -- ME Me -- ME --
MB -- Me MM -- ME -- Me ++ ++
ME -- Me ME -- Me ME ME ME ++
++ -- ME __ ME Me ++ Me ME --
MB -- MB MB -- ++ ++ -- ME --
"""
MAP.weight_data = """
50 50 40 40 40 50 50 50 50 50
50 50 40 40 40 50 50 50 50 50
50 50 40 40 50 50 50 50 50 50
50 50 40 40 50 50 50 50 50 50
50 50 40 40 50 50 50 50 50 50
50 50 40 40 50 50 50 50 50 50
50 50 40 40 40 50 50 50 50 50
50 50 40 40 40 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 4},
{'battle': 1, 'enemy': 3},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
MAP.spawn_data_loop = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 3},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
# MAP_SIREN_TEMPLATE = ['0']
# MOVABLE_ENEMY_TURN = (2,)
# MAP_HAS_SIREN = True
# MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = False
MAP_HAS_AMBUSH = True
# MAP_HAS_MYSTERY = True
# ===== End of generated config =====
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.pick_up_light_house(J7)
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_5(self):
self.pick_up_light_house(J7)
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_6(self):
self.fleet_boss.pick_up_flare(D5)
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,151 @@
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
from .campaign_14_base import CampaignBase
from .campaign_14_base import Config as ConfigBase
MAP = CampaignMap('14-4')
MAP.shape = 'K9'
MAP.camera_data = ['D2', 'D5', 'D7', 'H2', 'H5', 'H7']
MAP.camera_data_spawn_point = ['H2']
MAP.map_covered = ['A4']
MAP.map_data = """
ME -- ++ ++ -- ME ME ME ++ ++ ++
-- ME ME ME ME ME ME -- SP SP --
MB -- __ -- -- -- -- -- ME -- --
MB ME -- Me Me -- Me ++ ++ -- ME
MM -- Me ME -- Me -- MA ++ -- ME
++ ME ME -- ++ -- ME -- ME -- --
++ -- ME Me Me ME -- -- -- -- ++
-- -- -- -- -- __ -- ME ME -- ME
-- -- ++ MB MB ++ ++ MM ME ME ME
"""
MAP.weight_data = """
40 40 40 40 50 50 50 50 50 50 50
40 40 40 40 50 50 50 50 50 50 50
40 40 40 40 50 50 50 50 50 50 50
40 40 40 40 50 50 50 50 50 50 50
40 40 40 40 50 50 50 50 50 50 50
40 40 40 40 50 50 50 50 50 50 50
40 40 40 40 50 50 50 50 50 50 50
50 10 50 50 50 50 50 40 40 50 50
50 50 50 50 50 50 50 50 50 40 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 3},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 2},
{'battle': 4, 'enemy': 1},
{'battle': 5, 'enemy': 1},
{'battle': 6},
{'battle': 7, 'boss': 1},
]
MAP.spawn_data_loop = [
{'battle': 0, 'enemy': 2},
{'battle': 1, 'enemy': 3},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 2},
{'battle': 4, 'enemy': 1},
{'battle': 5, 'enemy': 1},
{'battle': 6},
{'battle': 7, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \
A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \
= MAP.flatten()
# 14-4 has special enemy spawn mechanism
# After entering map or each battle, enemies spawn on these nodes:
# ['C2', 'D3', 'D4', 'H8', 'I7'], and 'B8' must spawns an enemy
# ['A1', 'B2', 'B6', 'C7']
# ['F5', 'G4', 'G6', 'I8', 'J9']
# ['F2', 'G1', 'H2', 'K4', 'K5']
# ['C5', 'C6', 'D5']
# ['E8', 'G8']
OVERRIDE = CampaignMap('14-4')
OVERRIDE.map_data = """
ME -- -- -- -- -- ME -- -- -- --
-- ME ME -- -- ME -- ME -- -- --
-- -- -- ME -- -- -- -- -- -- --
-- -- -- ME -- -- ME -- -- -- ME
-- -- ME ME -- ME -- -- -- -- ME
-- ME ME -- -- -- ME -- -- -- --
-- -- ME -- -- -- -- -- ME -- --
-- ME -- -- ME -- ME ME ME -- --
-- -- -- -- -- -- -- -- -- ME --
"""
road_A8 = RoadGrids([B8])
road_H9 = RoadGrids([[H8, I8, J9], ])
class Config(ConfigBase):
# ===== Start of generated config =====
# MAP_SIREN_TEMPLATE = ['0']
# MOVABLE_ENEMY_TURN = (2,)
# MAP_HAS_SIREN = True
# MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = False
MAP_HAS_AMBUSH = True
# MAP_HAS_MYSTERY = True
# ===== End of generated config =====
MAP_WALK_USE_CURRENT_FLEET = True
class Campaign(CampaignBase):
MAP = MAP
def map_data_init(self, map_):
super().map_data_init(map_)
for override_grid in OVERRIDE:
# Set may_enemy, but keep may_ambush
self.map[override_grid.location].may_enemy = override_grid.may_enemy
def battle_0(self):
self.pick_up_light_house(A9)
if self.clear_roadblocks([road_A8, road_H9], weakest=False):
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_3(self):
self.pick_up_light_house(A9)
self.pick_up_ammo()
self.pick_up_flare(H9)
if self.clear_roadblocks([road_A8, road_H9], weakest=False):
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_6(self):
self.pick_up_light_house(A9)
self.pick_up_ammo()
self.pick_up_flare(H9)
if self.clear_roadblocks([road_A8, road_H9], weakest=False):
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_7(self):
self.fleet_boss.pick_up_flare(A5)
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,74 @@
from module.campaign.campaign_base import CampaignBase as CampaignBase_
from module.logger import logger
class Config:
HOMO_EDGE_COLOR_RANGE = (0, 12)
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
MAP_SWIPE_MULTIPLY = (1.006, 1.025)
MAP_SWIPE_MULTIPLY_MINITOUCH = (0.973, 0.991)
MAP_SWIPE_MULTIPLY_MAATOUCH = (0.944, 0.961)
# Disabled because having errors
MAP_SWIPE_PREDICT_WITH_SEA_GRIDS = False
# Ambushes can be avoid by having more DDs.
MAP_WALK_OPTIMIZE = False
class CampaignBase(CampaignBase_):
ENEMY_FILTER = '1T > 1L > 1E > 1M > 2T > 2L > 2E > 2M > 3T > 3L > 3E > 3M'
picked_light_house = []
picked_flare = []
def map_data_init(self, map_):
super().map_data_init(map_)
self.picked_light_house = []
self.picked_flare = []
def handle_mystery_items(self, button=None, drop=None):
"""
Handle get flares, but not counted as mystery.
"""
super().handle_mystery_items(button=button, drop=None)
return False
def pick_up_flare(self, grid):
"""
Args:
grid (GridInfo):
Returns:
bool: False
"""
grid.is_flare = True
if grid in self.picked_flare:
logger.info(f'Flares {grid} already picked up')
elif grid.is_accessible:
logger.info(f'Pick up flares on {grid}')
# get_items shows after flares picked up.
self.goto(grid)
self.picked_flare.append(grid)
else:
logger.info(f'Flares {grid} not accessible, will check in next battle')
return False
def pick_up_light_house(self, grid):
"""
Args:
grid (GridInfo):
Returns:
bool: False
"""
if grid in self.picked_light_house:
logger.info(f'Light house {grid} already picked up')
elif grid.is_accessible:
logger.info(f'Pick up light house on {grid}')
self.goto(grid)
self.picked_light_house.append(grid)
self.ensure_no_info_bar()
else:
logger.info(f'Light house {grid} not accessible, will check in next battle')
return False

View File

@@ -0,0 +1,104 @@
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from .campaign_15_base import CampaignBase
from .campaign_15_base import Config as ConfigBase
MAP = CampaignMap('15-1')
MAP.shape = 'H7'
MAP.camera_data = ['C2', 'C5', 'E2', 'E5']
MAP.camera_data_spawn_point = ['C5']
MAP.camera_sight = (-2, -1, 3, 2)
MAP.map_data = """
Me Me ME ++ ME MB ++ ++
ME ME Me ME Me -- MB ++
++ Me ME -- Me -- -- MB
++ ME -- -- -- __ Me --
-- ME -- ME ME Me -- ME
ME -- -- ME ++ -- ME --
-- SP SP -- Me -- ME --
"""
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 50 50
50 50 50 50 50 50 50 50
50 50 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 = [
{'battle': 0, 'enemy': 5},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3},
{'battle': 4},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
A7, B7, C7, D7, E7, F7, G7, H7, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
# MAP_SIREN_TEMPLATE = ['0']
# MOVABLE_ENEMY_TURN = (2,)
# MAP_HAS_SIREN = True
# MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = False
MAP_HAS_AMBUSH = True
# MAP_HAS_MYSTERY = True
# ===== End of generated config =====
MAP_WALK_USE_CURRENT_FLEET = True
class Campaign(CampaignBase):
MAP = MAP
def battle_function(self):
if self.config.MAP_CLEAR_ALL_THIS_TIME \
and self.battle_count == 0 and not self.map_is_clear_mode:
func = self.FUNCTION_NAME_BASE + str(self.battle_count)
logger.info(f'Using function: {func}')
func = self.__getattribute__(func)
result = func()
return result
return super().battle_function()
def battle_0(self):
if not self.map_is_clear_mode and self.map_has_mob_move:
self.mob_move(B3, C3)
if B1.is_accessible:
self.clear_chosen_enemy(B1)
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_1(self):
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_5(self):
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_6(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,106 @@
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from .campaign_15_base import CampaignBase
from .campaign_15_base import Config as ConfigBase
MAP = CampaignMap('15-2')
MAP.shape = 'I8'
MAP.camera_data = ['C2', 'C6', 'F2', 'F6']
MAP.camera_data_spawn_point = ['F2']
MAP.camera_sight = (-2, -1, 3, 2)
MAP.map_data = """
ME -- ME ME Me -- ++ ++ ++
ME -- -- ++ ME ME ME SP SP
-- ME ME Me -- -- -- -- --
-- -- -- -- -- ME ME Me --
ME -- ++ ME Me -- ME ME --
Me -- ME __ ME ++ ++ ++ Me
++ MB -- ME ME ++ Me MB --
++ MB ME -- ME Me -- -- ME
"""
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 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50
50 50 50 50 50 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 = [
{'battle': 0, 'enemy': 6},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3},
{'battle': 4},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
# MAP_SIREN_TEMPLATE = ['0']
# MOVABLE_ENEMY_TURN = (2,)
# MAP_HAS_SIREN = True
# MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = False
MAP_HAS_AMBUSH = True
# MAP_HAS_MYSTERY = True
# ===== End of generated config =====
class Campaign(CampaignBase):
MAP = MAP
def battle_function(self):
if self.config.MAP_CLEAR_ALL_THIS_TIME \
and self.battle_count == 0 and not self.map_is_clear_mode:
func = self.FUNCTION_NAME_BASE + str(self.battle_count)
logger.info(f'Using function: {func}')
func = self.__getattribute__(func)
result = func()
return result
return super().battle_function()
def battle_0(self):
if not self.map_is_clear_mode and self.map_has_mob_move:
self.mob_move(I6, I7)
self.mob_move(I7, H7)
if G7.is_accessible:
self.clear_chosen_enemy(G7)
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_1(self):
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_5(self):
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_6(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,119 @@
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from .campaign_15_base import CampaignBase, W15GridInfo
from .campaign_15_base import Config as ConfigBase
MAP = CampaignMap('15-3')
MAP.grid_class = W15GridInfo
MAP.shape = 'J8'
MAP.camera_data = ['C2', 'C6', 'G2', 'G6']
MAP.camera_data_spawn_point = ['G6']
MAP.camera_sight = (-2, -1, 3, 2)
MAP.map_data = """
Me -- ++ ME ME ME -- ME -- ME
-- ME ++ Me -- Me ME Me ME --
ME Me ME ME Me -- ++ MB -- ME
++ -- -- ME ME Me ++ ++ __ ME
Me ME -- ++ Me -- ME MS -- Me
ME ME -- -- ME ME ME -- -- ME
Me -- __ -- -- ME -- -- ++ ++
++ ++ ++ Me -- -- SP SP ++ ++
"""
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 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 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 = [
{'battle': 0, 'enemy': 5},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1, 'siren': 1},
{'battle': 4, 'enemy': 2},
{'battle': 5},
{'battle': 6, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
# MAP_SIREN_TEMPLATE = ['BOSS']
# MOVABLE_ENEMY_TURN = (2,)
# MAP_HAS_SIREN = True
# MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = False
MAP_HAS_AMBUSH = True
# MAP_HAS_MYSTERY = True
# ===== End of generated config =====
class Campaign(CampaignBase):
MAP = MAP
def battle_function(self):
if not self.config.MAP_CLEAR_ALL_THIS_TIME:
return super().battle_function()
if self.battle_count == 3 \
or (self.battle_count == 0 and not self.map_is_clear_mode):
func = self.FUNCTION_NAME_BASE + str(self.battle_count)
logger.info(f'Using function: {func}')
func = self.__getattribute__(func)
result = func()
return result
return super().battle_function()
def battle_0(self):
if not self.map_is_clear_mode and self.map_has_mob_move:
self.mob_move(B3, B4)
if A1.is_accessible:
self.clear_chosen_enemy(A1)
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_1(self):
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_3(self):
self.clear_chosen_enemy(H5, expected='siren')
return True
def battle_4(self):
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=1):
return True
return self.battle_default()
def battle_5(self):
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_6(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,151 @@
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import SelectedGrids, RoadGrids
from .campaign_15_base import CampaignBase, W15GridInfo
from .campaign_15_base import Config as ConfigBase
MAP = CampaignMap('15-4')
MAP.grid_class = W15GridInfo
MAP.shape = 'K9'
MAP.camera_data = ['C2', 'C5', 'C7', 'F2', 'F5', 'F7', 'H2', 'H5', 'H7']
MAP.camera_data_spawn_point = ['H2']
MAP.camera_sight = (-2, -1, 3, 2)
MAP.map_data = """
Me -- ME ME Me -- ME ++ ++ ME ME
ME -- -- -- -- ME -- ++ ++ -- ME
++ -- -- MS -- -- ME SP SP ME Me
++ ME -- ++ ++ -- -- -- -- ME --
-- Me ME MA ++ ME -- MS -- -- ME
ME ME ME -- -- -- -- ++ ME -- Me
ME -- __ -- ME ME -- ME ME -- ++
-- -- ++ -- Me -- ME ME ME Me ME
MB Me -- ME ME Me ++ ++ ++ -- Me
"""
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
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
50 50 50 50 50 50 50 50 50 50 50
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 = [
{'battle': 0, 'enemy': 8},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1, 'siren': 1},
{'battle': 4, 'enemy': 2},
{'battle': 5},
{'battle': 6, 'siren': 1},
{'battle': 7, 'enemy': 1},
{'battle': 8, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, J1, K1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, J3, K3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, J4, K4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, J5, K5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, J6, K6, \
A7, B7, C7, D7, E7, F7, G7, H7, I7, J7, K7, \
A8, B8, C8, D8, E8, F8, G8, H8, I8, J8, K8, \
A9, B9, C9, D9, E9, F9, G9, H9, I9, J9, K9, \
= MAP.flatten()
class Config(ConfigBase):
# ===== Start of generated config =====
# MAP_SIREN_TEMPLATE = ['BOSS']
# MOVABLE_ENEMY_TURN = (2,)
# MAP_HAS_SIREN = True
# MAP_HAS_MOVABLE_ENEMY = True
MAP_HAS_MAP_STORY = False
MAP_HAS_FLEET_STEP = False
MAP_HAS_AMBUSH = True
# MAP_HAS_MYSTERY = True
# ===== End of generated config =====
MAP_SWIPE_MULTIPLY = (1.055, 1.075)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.020, 1.039)
MAP_SWIPE_MULTIPLY_MAATOUCH = (0.990, 1.008)
class Campaign(CampaignBase):
MAP = MAP
def battle_function(self):
if not self.config.MAP_CLEAR_ALL_THIS_TIME:
return super().battle_function()
if self.battle_count in [3, 6] \
or (self.battle_count in [0, 1] and not self.map_is_clear_mode):
func = self.FUNCTION_NAME_BASE + str(self.battle_count)
logger.info(f'Using function: {func}')
func = self.__getattribute__(func)
result = func()
return result
return super().battle_function()
def battle_0(self):
if not self.map_is_clear_mode and self.map_has_mob_move:
self.mob_move(J8, K8)
if K9.is_accessible:
self.clear_chosen_enemy(K9)
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_1(self):
if not self.map_is_clear_mode:
if A1.is_accessible:
self.clear_chosen_enemy(A1)
return True
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_2(self):
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_3(self):
if not self.map_is_clear_mode:
self.fleet_boss.clear_chosen_enemy(H5, expected='siren')
self.fleet_1.switch_to()
return True
else:
self.pick_up_ammo()
self.clear_chosen_enemy(H5, expected='siren')
return True
def battle_4(self):
self.pick_up_ammo()
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_6(self):
self.clear_chosen_enemy(D3, expected='siren')
return True
def battle_7(self):
if self.clear_filter_enemy(self.ENEMY_FILTER, preserve=0):
return True
return self.battle_default()
def battle_8(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,218 @@
from module.base.mask import Mask
from module.base.timer import Timer
from module.campaign.campaign_base import CampaignBase as CampaignBase_
from module.handler.assets import STRATEGY_OPENED
from module.logger import logger
from module.map.map_grids import SelectedGrids
from module.map.utils import location_ensure
from module.map_detection.grid import GridInfo
from module.map_detection.utils_assets import ASSETS
MASK_MAP_UI_W15 = Mask(file='./assets/mask/MASK_MAP_UI_W15.png')
class Config:
# Ambushes can be avoid by having more DDs.
MAP_WALK_OPTIMIZE = False
MAP_HAS_MYSTERY = False
MAP_ENEMY_TEMPLATE = ['Light', 'Main', 'Carrier', 'CarrierSpecial']
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (80, 255 - 33),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
MAP_SWIPE_MULTIPLY = (0.993, 1.011)
MAP_SWIPE_MULTIPLY_MINITOUCH = (0.960, 0.978)
MAP_SWIPE_MULTIPLY_MAATOUCH = (0.932, 0.949)
class W15GridInfo(GridInfo):
def merge(self, info, mode='normal'):
# Consider boss as siren
if info.is_boss:
if not self.is_land and self.may_siren:
self.is_siren = True
self.enemy_scale = 0
self.enemy_genre = ''
return True
return super().merge(info, mode=mode)
class CampaignBase(CampaignBase_):
ENEMY_FILTER = '1T > 1L > 1E > 1M > 2T > 2L > 2E > 2M > 3T > 3L > 3E > 3M'
def map_data_init(self, map_):
super().map_data_init(map_)
# Patch ui_mask, get rid of supporting fleet
_ = ASSETS.ui_mask
ASSETS.ui_mask = MASK_MAP_UI_W15.image
map_has_mob_move = True
def strategy_set_execute(self, formation_index=None, sub_view=None, sub_hunt=None):
super().strategy_set_execute(
formation_index=formation_index,
sub_view=sub_view,
sub_hunt=sub_hunt,
)
self.map_has_mob_move = (self.strategy_get_mob_move_remain() > 0)
logger.attr("Map has mob move", self.map_has_mob_move)
def _map_swipe(self, vector, box=(239, 159, 1175, 628)):
# Left border to 239, avoid swiping on support fleet
return super()._map_swipe(vector, box=box)
def mob_movable(self, location, target):
"""
Check if mob is movable from location to target.
This requires that:
1. both location and target are grids in the map (not exceeding the boundaries)
2. Manhattan distance between location and target is 1.
3. location is a mob fleet
4. target is a sea grid
Args:
location (tuple): Location of mob.
target (tuple): Destination.
Returns:
bool: if movable.
"""
location = location_ensure(location)
target = location_ensure(target)
movable = True
try:
logger.info(f'location: {self.map[location]}, target: {self.map[target]}')
except KeyError as e:
logger.exception(f'Given coordinates are outside the map.')
raise e
if abs(location[0] - target[0]) + abs(location[1] - target[1]) != 1:
logger.error(f'{self.map[target]} is not adjacent from {self.map[location]}.')
movable = False
if not self.map[location].is_enemy:
logger.error(f'{self.map[location]} is not a mob fleet.')
movable = False
if not self.map[target].is_sea:
logger.error(f'{self.map[target]} is not a sea grid.')
movable = False
if not movable:
logger.error(f'Cannot move from {self.map[location]} to {self.map[target]}.')
return movable
def _mob_move(self, location, target):
"""
Move mob from location to target, and confirm if successfully moved.
Args:
location (tuple, str, GridInfo): Location of mob.
target (tuple, str, GridInfo): Destination.
Returns:
bool: If mob moved.
Pages:
in: MOB_MOVE_CANCEL
out: STRATEGY_OPENED
"""
location = location_ensure(location)
target = location_ensure(target)
view_target = SelectedGrids([self.map[location], self.map[target]]) \
.sort_by_camera_distance(self.camera)[1]
self.in_sight(view_target)
origin_grid = self.convert_global_to_local(location)
origin_grid.__str__ = location
target_grid = self.convert_global_to_local(target)
target_grid.__str__ = target
logger.info('Select mob to move')
skip_first_screenshot = True
interval = Timer(2, count=4)
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if self.is_in_strategy_mob_move():
self.view.update(image=self.device.image)
if origin_grid.predict_mob_move_icon():
break
# Click
if interval.reached() and self.is_in_strategy_mob_move():
self.device.click(origin_grid)
interval.reset()
continue
logger.info('Select target grid')
skip_first_screenshot = True
interval = Timer(2, count=4)
while 1:
if skip_first_screenshot:
skip_first_screenshot = False
else:
self.device.screenshot()
# End
if self.appear(STRATEGY_OPENED, offset=(120, 120)):
break
# Click
if interval.reached() and self.is_in_strategy_mob_move():
self.device.click(target_grid)
interval.reset()
continue
if self.handle_popup_confirm('MOB_MOVE'):
continue
def _mob_move_info_change(self, location, target):
location = location_ensure(location)
target = location_ensure(target)
self.map[target].enemy_scale = self.map[location].enemy_scale
self.map[location].enemy_scale = 0
self.map[target].enemy_genre = self.map[location].enemy_genre
self.map[location].enemy_genre = None
self.map[target].is_boss = self.map[location].is_boss
self.map[location].is_boss = False
self.map[target].is_enemy = True
self.map[location].is_enemy = False
def mob_move(self, location, target):
"""
Open strategy, move mob fleet from location to target, close strategy.
Args:
location (tuple, str, GridInfo): Location of mob.
target (tuple, str, GridInfo): Destination.
Returns:
bool: If mob moved
Pages:
in: IN_MAP
out: IN_MAP
"""
if not self.mob_movable(location, target):
return False
self.strategy_open()
remain = self.strategy_get_mob_move_remain()
if remain == 0:
logger.warning(f'No remain mob move trials, will abandon moving')
self.strategy_close()
return False
self.strategy_mob_move_enter()
self._mob_move(location, target)
self.strategy_close(skip_first_screenshot=False)
self._mob_move_info_change(location, target)
self.find_path_initial()
self.map.show()

View File

@@ -0,0 +1,52 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'G1'
MAP.camera_data = ['D1']
MAP.camera_data_spawn_point = ['D1']
MAP.map_data = """
SP -- -- -- -- ME MB
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 1},
{'battle': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, \
= MAP.flatten()
class Config:
FLEET_2 = 0
SUBMARINE = 0
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 49),
'width': (1.5, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 49, 255),
'prominence': 10,
'distance': 50,
'wlen': 1000
}
HOMO_EDGE_COLOR_RANGE = (0, 49)
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
EDGE_LINES_HOUGHLINES_THRESHOLD = 40
HOMO_EDGE_HOUGHLINES_THRESHOLD = 80
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
return self.battle_default()
def battle_1(self):
return self.clear_boss()
def handle_boss_appear_refocus(self, preset=(-3, 0)):
return super().handle_boss_appear_refocus(preset)

View File

@@ -0,0 +1,37 @@
import numpy as np
from module.campaign.campaign_base import CampaignBase
from module.exception import CampaignEnd, ScriptEnd
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
from .campaign_1_1 import MAP
from .campaign_1_1 import Config as ConfigBase
A1, B1, C1, D1, E1, F1, G1, \
= MAP.flatten()
class Config(ConfigBase):
ENABLE_FAST_FORWARD = False
ENABLE_AUTO_SEARCH = False
AMBUSH_EVADE = False
class Campaign(CampaignBase):
MAP = MAP
affinity_battle = 0
def battle_default(self):
while self.affinity_battle < self.config.C11AffinityFarming_RunCount:
logger.attr('Affinity_battle', f'{self.affinity_battle}/{self.config.C11AffinityFarming_RunCount}')
self.goto(C1)
self.affinity_battle += 1
self.goto(D1 if np.random.uniform() < 0.7 else B1)
# End
try:
self.withdraw()
except CampaignEnd:
raise ScriptEnd('Reach condition: Affinity farming battle count')

View File

@@ -0,0 +1,36 @@
from campaign.campaign_main.campaign_1_1 import Config
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'E3'
MAP.camera_data = ['C1']
MAP.camera_data_spawn_point = ['C1']
MAP.map_data = """
SP -- ME Me MB
-- ++ -- -- ++
-- -- ME MM ++
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 1, 'mystery': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'boss': 1},
]
A1, B1, C1, D1, E1, \
A2, B2, C2, D2, E2, \
A3, B3, C3, D3, E3, \
= MAP.flatten()
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.clear_all_mystery()
return self.battle_default()
def battle_2(self):
self.clear_all_mystery()
return self.clear_boss()

View File

@@ -0,0 +1,36 @@
from campaign.campaign_main.campaign_1_1 import Config
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'F3'
MAP.camera_data = ['C1']
MAP.camera_data_spawn_point = ['C1']
MAP.map_data = """
++ ++ ++ -- MB --
-- ME -- ME -- --
SP -- ++ -- -- MM
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 1, 'mystery': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, \
A2, B2, C2, D2, E2, F2, \
A3, B3, C3, D3, E3, F3, \
= MAP.flatten()
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.clear_all_mystery()
return self.battle_default()
def battle_2(self):
self.clear_all_mystery()
return self.clear_boss()

View File

@@ -0,0 +1,35 @@
from campaign.campaign_main.campaign_1_1 import Config
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'G3'
MAP.camera_data = ['D1']
MAP.camera_data_spawn_point = ['D1']
MAP.map_data = """
SP -- ME -- ++ ++ ++
++ ++ ME -- MA ++ ++
++ ++ ++ ME -- ME MB
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2},
{'battle': 1, 'enemy': 1},
{'battle': 2},
{'battle': 3, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, \
A2, B2, C2, D2, E2, F2, G2, \
A3, B3, C3, D3, E3, F3, G3, \
= MAP.flatten()
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
return self.battle_default()
def battle_3(self):
return self.clear_boss()

View File

@@ -0,0 +1,73 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'F4'
MAP.camera_data = ['C2']
MAP.camera_data_spawn_point = ['C1']
MAP.map_data = """
-- SP ME -- ME --
SP -- ++ ++ ME MM
++ -- ME -- ME ME
++ ++ ++ MB -- ++
"""
MAP.weight_data = """
40 40 40 40 40 40
30 30 30 30 30 30
20 20 20 20 20 30
10 10 10 10 10 10
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'mystery': 1},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, \
A2, B2, C2, D2, E2, F2, \
A3, B3, C3, D3, E3, F3, \
A4, B4, C4, D4, E4, F4, \
= MAP.flatten()
class Config:
FLEET_BOSS = 1
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 49),
'width': (1.5, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 49, 255),
'prominence': 10,
'distance': 50,
'wlen': 1000
}
HOMO_EDGE_COLOR_RANGE = (0, 49)
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.clear_all_mystery()
return self.battle_default()
def battle_2(self):
self.clear_all_mystery()
if not self.check_accessibility(D4, fleet='boss'):
return self.battle_default()
return self.fleet_boss.clear_boss()
def handle_boss_appear_refocus(self, preset=(0, -2)):
return super().handle_boss_appear_refocus(preset)

View File

@@ -0,0 +1,53 @@
from campaign.campaign_main.campaign_2_1 import Config
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'G5'
MAP.camera_data = ['D3']
MAP.camera_data_spawn_point = ['D3']
MAP.map_data = """
++ ++ ++ MB ++ ++ ++
++ ++ ++ ME MA ++ ++
-- ME -- ME -- -- ME
SP -- ME -- -- ME ME
-- ME -- -- SP ME MM
"""
MAP.weight_data = """
10 10 10 10 10 10 10
10 10 10 10 10 10 10
50 50 50 50 50 50 50
30 30 30 30 30 30 30
30 30 30 30 30 30 30
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'mystery': 1},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 2, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, \
A2, B2, C2, D2, E2, F2, G2, \
A3, B3, C3, D3, E3, F3, G3, \
A4, B4, C4, D4, E4, F4, G4, \
A5, B5, C5, D5, E5, F5, G5, \
= MAP.flatten()
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.clear_all_mystery()
return self.battle_default()
def battle_3(self):
self.clear_all_mystery()
if not self.check_accessibility(D1, fleet='boss'):
return self.battle_default()
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,53 @@
from campaign.campaign_main.campaign_2_1 import Config
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'F5'
MAP.camera_data = ['D3']
MAP.camera_data_spawn_point = ['D1', 'D3']
MAP.map_data = """
SP -- ME -- MB ++
-- ME -- ME ++ ++
-- -- ME -- -- ++
SP -- -- ME ME --
++ ++ ++ -- ME MM
"""
MAP.weight_data = """
10 10 11 10 10 10
50 50 10 12 10 10
20 20 20 20 20 20
20 20 20 20 30 30
30 30 30 30 30 30
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'mystery': 1},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 2, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, \
A2, B2, C2, D2, E2, F2, \
A3, B3, C3, D3, E3, F3, \
A4, B4, C4, D4, E4, F4, \
A5, B5, C5, D5, E5, F5, \
= MAP.flatten()
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.clear_all_mystery()
return self.battle_default()
def battle_3(self):
self.clear_all_mystery()
if not self.check_accessibility(E1, fleet='boss'):
return self.battle_default()
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,63 @@
from campaign.campaign_main.campaign_2_1 import Config as ConfigBase
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'G4'
MAP.camera_data = ['D2']
MAP.camera_data_spawn_point = ['D2']
MAP.map_data = """
-- ++ ++ ++ ME ME MB
SP -- ME -- -- ME --
-- -- ME -- ME ++ ++
-- ME -- SP -- MA ++
"""
MAP.weight_data = """
20 20 20 20 12 11 10
20 20 20 20 10 10 10
20 20 20 20 30 20 20
20 20 20 20 20 20 20
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 2, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, \
A2, B2, C2, D2, E2, F2, G2, \
A3, B3, C3, D3, E3, F3, G3, \
A4, B4, C4, D4, E4, F4, G4, \
= MAP.flatten()
road_main = RoadGrids([[F2, F1], [F2, E1]])
class Config(ConfigBase):
# Don't know why 2-4 is slimmer
# 2-1 is /_\ and 2-4 is like |_|
MID_DIFF_RANGE_H = (121 - 3, 121 + 3)
MID_DIFF_RANGE_V = (121 - 3, 121 + 3)
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
# Even adding these precautions, there is still possibility that F2 and E1 spawns at the same time.
# However adding these can reduce the other possibilities.
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_3(self):
if not self.check_accessibility(G1, fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.battle_default()
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,75 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'G4'
MAP.camera_data = ['D2']
MAP.camera_data_spawn_point = ['D1', 'D2']
MAP.map_data = """
SP -- ME -- ME MB --
-- ME -- ME -- ME MB
++ ++ ME -- ME -- --
++ ++ SP ME MM ++ ++
"""
MAP.weight_data = """
30 30 30 20 10 10 10
30 30 30 20 10 09 10
40 40 40 20 10 10 10
40 40 40 20 20 10 10
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'mystery': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 2, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, \
A2, B2, C2, D2, E2, F2, G2, \
A3, B3, C3, D3, E3, F3, G3, \
A4, B4, C4, D4, E4, F4, G4, \
= MAP.flatten()
class Config:
FLEET_BOSS = 1
MAP_MYSTERY_HAS_CARRIER = True
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
EDGE_LINES_HOUGHLINES_THRESHOLD = 75
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 49),
'width': (1.5, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 49, 255),
'prominence': 10,
'distance': 50,
'wlen': 1000
}
HOMO_EDGE_COLOR_RANGE = (0, 49)
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.fleet_2_push_forward()
if self.fleet_2_rescue(G2):
return True
self.clear_all_mystery()
return self.battle_default()
def battle_3(self):
self.clear_all_mystery()
if not self.check_accessibility(G2, fleet='boss'):
return self.fleet_boss.battle_default()
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,55 @@
from campaign.campaign_main.campaign_3_1 import Config
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'H4'
MAP.camera_data = ['E2']
MAP.camera_data_spawn_point = ['D1', 'D2']
MAP.map_data = """
SP -- -- ME -- ME ME MB
++ ++ ME -- ME ++ ++ ++
-- ++ -- ME -- MA ++ ++
SP ME -- -- ME MM -- ++
"""
MAP.weight_data = """
50 50 50 30 30 20 10 09
50 50 40 40 30 20 10 10
50 50 50 40 40 50 20 20
50 50 50 50 35 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'mystery': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 2, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
= MAP.flatten()
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.fleet_2_push_forward()
if self.fleet_2_rescue(H1):
return True
self.clear_all_mystery()
return self.battle_default()
def battle_3(self):
self.clear_all_mystery()
if not self.check_accessibility(H1, fleet='boss'):
return self.battle_default()
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,62 @@
from campaign.campaign_main.campaign_3_1 import Config as ConfigBase
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'F5'
MAP.camera_data = ['D3']
MAP.camera_data_spawn_point = ['D3']
MAP.map_data = """
++ ++ ME MM ++ ++
++ ++ -- ME -- SP
-- ++ ME -- ME --
MB ME -- ME -- --
-- ME ME SP ME SP
"""
MAP.weight_data = """
50 50 30 30 50 50
50 50 30 30 50 50
50 50 20 30 50 50
09 10 11 20 50 50
10 10 11 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'mystery': 1},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, \
A2, B2, C2, D2, E2, F2, \
A3, B3, C3, D3, E3, F3, \
A4, B4, C4, D4, E4, F4, \
A5, B5, C5, D5, E5, F5, \
= MAP.flatten()
class Config(ConfigBase):
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.fleet_2_push_forward()
if self.fleet_2_rescue(A4):
return True
self.clear_all_mystery()
return self.battle_default()
def battle_3(self):
self.clear_all_mystery()
if not self.check_accessibility(A4, fleet='boss'):
return self.battle_default()
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,77 @@
from campaign.campaign_main.campaign_3_1 import Config as Config31
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'H4'
MAP.camera_data = ['E2']
MAP.camera_data_spawn_point = ['D1', 'D2']
# WIKI的图是错的: https://wiki.biligame.com/blhx/3-4
# A3有岛, 假图害人
MAP.map_data = """
SP -- -- ME -- ++ ++ ++
SP ME -- ME -- MA ++ ++
++ -- ME __ ME ME -- MB
SP ME -- ME -- -- ME MB
"""
MAP.weight_data = """
40 40 40 40 40 40 40 40
40 40 40 30 30 30 30 30
40 40 30 30 20 10 10 09
40 40 30 20 20 10 10 09
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
= MAP.flatten()
class Config(Config31):
MAP_MYSTERY_HAS_CARRIER = False
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 75),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 40, 255),
'prominence': 10,
'distance': 50,
'wlen': 1000
}
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.fleet_2_push_forward()
if self.fleet_2_rescue(H3):
return True
return self.battle_default()
def battle_3(self):
if not self.check_accessibility(H3, fleet='boss'):
return self.battle_default()
return self.fleet_boss.clear_boss()
# def handle_boss_appear_refocus(self):
# for data in self.map.spawn_data:
# if data.get('battle') == self.battle_count and data.get('boss', 0):
# self.map_swipe((-3, -1))
#
# return super().handle_boss_appear_refocus()

View File

@@ -0,0 +1,80 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'F6'
MAP.camera_data = ['C2', 'C4']
MAP.camera_data_spawn_point = ['C2']
MAP.map_data = """
ME -- SP -- -- SP
-- -- -- -- -- ME
ME ME ++ ++ ME SP
-- -- MB ++ -- ME
ME -- ME MM ME --
-- MB ++ ++ ++ ++
"""
MAP.weight_data = """
50 50 50 50 50 50
50 10 10 10 10 20
20 10 10 10 10 20
20 10 10 10 10 20
50 10 10 10 10 20
50 10 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'mystery': 1},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, \
A2, B2, C2, D2, E2, F2, \
A3, B3, C3, D3, E3, F3, \
A4, B4, C4, D4, E4, F4, \
A5, B5, C5, D5, E5, F5, \
A6, B6, C6, D6, E6, F6, \
= MAP.flatten()
class Config:
FLEET_BOSS = 1
MAP_MYSTERY_HAS_CARRIER = True
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 33),
'width': (1.5, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 33, 255),
'prominence': 10,
'distance': 50,
'wlen': 1000
}
HOMO_EDGE_COLOR_RANGE = (0, 33)
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
class Campaign(CampaignBase):
MAP = MAP
MAP_AMBUSH_OVERLAY_TRANSPARENCY_THRESHOLD = 0.3
MAP_AIR_RAID_OVERLAY_TRANSPARENCY_THRESHOLD = 0.25
MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD = 0.65
def battle_0(self):
self.clear_all_mystery()
return self.battle_default()
def battle_3(self):
self.clear_all_mystery()
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
return self.battle_default()
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,63 @@
from campaign.campaign_main.campaign_4_1 import Config
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'F6'
MAP.camera_data = ['D2', 'D4']
MAP.camera_data_spawn_point = ['D2']
# WIKI的图有错: https://wiki.biligame.com/blhx/4-2
# D5是敌人刷新点, 假图害人
MAP.map_data = """
++ ++ ++ ME SP --
SP -- -- -- ME --
-- -- ME ME -- ME
SP -- -- -- -- MB
++ ++ ME ME -- ME
++ ++ -- MB ME MM
"""
MAP.weight_data = """
50 50 50 50 50 50
50 50 50 50 50 50
50 50 50 50 50 50
50 50 50 10 10 10
50 50 20 10 10 20
50 50 20 10 10 20
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3, 'mystery': 1},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, \
A2, B2, C2, D2, E2, F2, \
A3, B3, C3, D3, E3, F3, \
A4, B4, C4, D4, E4, F4, \
A5, B5, C5, D5, E5, F5, \
A6, B6, C6, D6, E6, F6, \
= MAP.flatten()
class Campaign(CampaignBase):
MAP = MAP
MAP_AMBUSH_OVERLAY_TRANSPARENCY_THRESHOLD = 0.3
MAP_AIR_RAID_OVERLAY_TRANSPARENCY_THRESHOLD = 0.25
MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD = 0.65
def battle_0(self):
self.clear_all_mystery()
return self.battle_default()
def battle_3(self):
self.clear_all_mystery()
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
return self.battle_default()
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,62 @@
from campaign.campaign_main.campaign_4_1 import Config as Config41
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'G4'
MAP.camera_data = ['D2']
MAP.camera_data_spawn_point = ['D1']
MAP.map_data = """
SP ME -- ME -- SP MB
-- -- ME -- ME -- ME
++ ++ ME -- -- MB MM
++ ++ MB -- ME -- ME
"""
MAP.weight_data = """
50 50 50 50 50 10 10
50 50 50 50 50 10 20
50 50 20 10 10 10 10
50 50 10 10 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3, 'mystery': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, \
A2, B2, C2, D2, E2, F2, G2, \
A3, B3, C3, D3, E3, F3, G3, \
A4, B4, C4, D4, E4, F4, G4, \
= MAP.flatten()
class Config(Config41):
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
EDGE_LINES_HOUGHLINES_THRESHOLD = 40
class Campaign(CampaignBase):
MAP = MAP
MAP_AMBUSH_OVERLAY_TRANSPARENCY_THRESHOLD = 0.3
MAP_AIR_RAID_OVERLAY_TRANSPARENCY_THRESHOLD = 0.25
MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD = 0.65
def battle_0(self):
self.clear_all_mystery()
return self.battle_default()
def battle_3(self):
self.clear_all_mystery()
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
return self.battle_default()
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,72 @@
from campaign.campaign_main.campaign_4_1 import Config as Config41
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'H6'
MAP.camera_data = ['D2', 'D4']
MAP.camera_data_spawn_point = ['E2', 'E4']
MAP.map_data = """
++ ++ MB ME SP -- ++ ++
++ ++ ME __ ME ME ++ ++
++ ++ -- ME -- -- -- SP
++ ++ -- ME ++ ME -- --
++ ++ ME -- ++ -- ME --
MB ME -- ME -- ME -- SP
"""
MAP.weight_data = """
50 50 10 20 50 50 50 50
50 50 10 20 50 50 50 50
50 50 10 20 50 50 50 50
50 50 10 20 50 50 50 50
50 50 10 20 50 50 50 50
10 10 10 20 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 2, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
= MAP.flatten()
road_main = RoadGrids([B6, [C4, D6], [C5, D4], [D3, C2], [C2, D1]])
class Config(Config41):
MAP_MYSTERY_HAS_CARRIER = False
class Campaign(CampaignBase):
MAP = MAP
MAP_AMBUSH_OVERLAY_TRANSPARENCY_THRESHOLD = 0.3
MAP_AIR_RAID_OVERLAY_TRANSPARENCY_THRESHOLD = 0.25
MAP_ENEMY_SEARCHING_OVERLAY_TRANSPARENCY_THRESHOLD = 0.65
def battle_0(self):
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_4(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,77 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'H6'
MAP.camera_data = ['D2', 'D4']
MAP.camera_data_spawn_point = ['D2', 'D4']
MAP.map_data = """
MB MM ME ++ ++ ++ ++ ++
SP -- -- -- ME -- -- MB
-- -- ME ME -- -- SP ME
-- ME -- ME -- ME ME MB
SP -- ME -- -- -- ++ ++
MB ME -- ME -- MA ++ ++
"""
MAP.weight_data = """
10 10 50 50 50 50 50 50
10 10 10 10 10 10 10 10
10 20 20 20 10 10 10 10
10 20 20 20 10 50 10 10
10 10 10 10 10 50 50 50
10 20 20 20 20 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3, 'mystery': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
= MAP.flatten()
class Config:
FLEET_BOSS = 1
MAP_MYSTERY_HAS_CARRIER = True
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 49),
'width': (1.5, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 49, 255),
'prominence': 10,
'distance': 50,
'wlen': 1000
}
HOMO_EDGE_COLOR_RANGE = (0, 49)
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.clear_all_mystery()
return self.battle_default()
def battle_4(self):
self.clear_all_mystery()
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
return self.battle_default()
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,56 @@
from campaign.campaign_main.campaign_5_1 import Config
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'H5'
MAP.camera_data = ['D3', 'E3']
MAP.camera_data_spawn_point = ['D2', 'D3']
MAP.map_data = """
++ ++ ++ -- MB -- ME SP
SP -- ME -- ++ ++ -- ME
-- ME -- -- MB ++ MB --
-- -- ME -- ME -- -- ME
ME -- SP ME -- ME ME MM
"""
MAP.weight_data = """
50 50 50 10 10 20 20 30
50 50 30 10 10 10 20 30
50 30 30 10 10 10 10 30
50 50 30 10 10 10 10 20
50 50 50 30 30 30 20 20
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 2, 'mystery': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
= MAP.flatten()
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.clear_all_mystery()
return self.battle_default()
def battle_4(self):
self.clear_all_mystery()
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
return self.battle_default()
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,60 @@
from campaign.campaign_main.campaign_5_1 import Config as ConfigBase
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'G5'
MAP.camera_data = ['D2', 'D3']
MAP.camera_data_spawn_point = ['D2', 'D3']
MAP.map_data = """
++ MB ME SP ME MB ME
++ ME -- ME -- -- --
++ ME ++ MM ME -- ME
++ -- -- ME MB ME --
SP ME -- -- ME -- SP
"""
MAP.weight_data = """
50 10 20 20 20 10 50
50 10 10 10 10 10 50
50 50 50 10 10 50 50
50 20 20 10 10 50 50
50 50 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3, 'mystery': 1},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, \
A2, B2, C2, D2, E2, F2, G2, \
A3, B3, C3, D3, E3, F3, G3, \
A4, B4, C4, D4, E4, F4, G4, \
A5, B5, C5, D5, E5, F5, G5, \
= MAP.flatten()
class Config(ConfigBase):
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.clear_all_mystery()
return self.battle_default()
def battle_4(self):
self.clear_all_mystery()
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
return self.battle_default()
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,70 @@
from campaign.campaign_main.campaign_5_1 import Config as Config51
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'H5'
MAP.camera_data = ['D3', 'E3']
MAP.camera_data_spawn_point = ['D2', 'E3']
MAP.map_data = """
++ ++ ++ SP MB ME -- MB
SP -- ME -- ME -- ME SP
-- -- -- ++ ++ ME __ ME
ME MB ME MA ++ -- ME --
++ ++ ME -- MB ME -- MB
"""
MAP.weight_data = """
50 50 50 50 10 20 30 30
50 50 10 10 10 10 30 30
50 50 10 10 10 10 30 25
50 10 10 10 10 10 30 30
50 50 50 10 10 10 30 30
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 2},
{'battle': 4, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
= MAP.flatten()
road_center = RoadGrids([C2, [E2, F1], C4, F5, [F3, G2, H3], [F3, G4, H3]])
road_ring = RoadGrids([[E2, F1], [F1, G2, H3], [F5, G4, H3], [F3, G2, H3], [F3, G4, H3]])
class Config(Config51):
MAP_MYSTERY_HAS_CARRIER = False
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
EDGE_LINES_HOUGHLINES_THRESHOLD = 40
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_roadblocks([road_center]):
return True
if self.clear_potential_roadblocks([road_ring]):
return True
return self.battle_default()
def battle_4(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_center]):
return True
if self.clear_potential_roadblocks([road_ring]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,82 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'H5'
MAP.camera_data = ['D3', 'E2']
MAP.camera_data_spawn_point = ['D2']
MAP.map_data = """
ME MB SP ME -- -- ME MM
-- ME -- ME -- ME SP ME
SP -- ME MM ME -- MM --
++ ++ ME -- -- ME ME ME
++ ++ MM ME MB ++ -- MB
"""
MAP.weight_data = """
50 10 10 50 50 50 20 20
50 50 10 10 50 50 20 20
50 50 50 10 10 10 10 30
50 50 20 10 10 50 10 10
50 50 20 20 10 50 10 10
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 1},
{'battle': 2, 'enemy': 2, 'mystery': 1},
{'battle': 3, 'enemy': 2},
{'battle': 4, 'enemy': 1, 'mystery': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
= MAP.flatten()
step_on = SelectedGrids([E3, C3, G4, D2])
road_boss = RoadGrids([C1, C2, [C3, D2], D4, E4, [E3, F4], F3, G3, H3, [G4, H4]])
road_mystery = RoadGrids([[C4, D5], D4, G2, [G1, H2]])
class Config:
FLEET_BOSS = 1
MAP_MYSTERY_HAS_CARRIER = True
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
# EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
# W6 has 3 enemies in a row, avoid detecting as map edge
HOMO_EDGE_HOUGHLINES_THRESHOLD = 240
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_2_step_on(step_on, roadblocks=[road_boss]):
return True
if self.clear_roadblocks([road_boss]):
return True
if self.clear_roadblocks([road_mystery]):
return True
self.clear_all_mystery()
if self.clear_potential_roadblocks([road_boss]):
return True
if self.clear_potential_roadblocks([road_mystery]):
return True
return self.battle_default()
def battle_4(self):
self.clear_all_mystery()
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
return self.clear_roadblocks([road_boss])
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,77 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'H6'
MAP.camera_data = ['D3', 'D4', 'E4']
MAP.camera_data_spawn_point = ['D2']
MAP.map_data = """
-- -- ME -- ME ++ ++ ++
SP -- -- ME ME ME SP --
-- ME -- ++ ++ -- ME --
-- MM ME MA ++ ME MM ME
ME ++ ++ -- MB -- ++ MB
-- MB -- ++ ++ ME MB ME
"""
MAP.weight_data = """
50 50 50 50 50 50 50 50
50 50 40 40 40 40 50 50
50 50 40 40 40 40 40 40
10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 10
10 10 10 10 10 10 10 20
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1, 'mystery': 1},
{'battle': 3, 'enemy': 2},
{'battle': 4, 'enemy': 1, 'mystery': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
= MAP.flatten()
step_on = SelectedGrids([C4, F4, A5, H4, F6])
road_boss = RoadGrids([B6, A6, A5, A4, B4, C4, D4, D5, E5, F5, F6, F4, G4, H4])
class Config:
FLEET_BOSS = 1
MAP_MYSTERY_HAS_CARRIER = True
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
# EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_2_step_on(step_on, roadblocks=[road_boss]):
return True
if self.clear_roadblocks([road_boss]):
return True
self.clear_all_mystery()
return self.battle_default()
def battle_4(self):
self.clear_all_mystery()
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
return self.clear_roadblocks([road_boss])
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,90 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'H5'
MAP.camera_data = ['D3', 'E2']
MAP.camera_data_spawn_point = ['D3', 'E2']
# WIKI的图有错: https://wiki.biligame.com/blhx/6-3
# G3是出生点, 假图害人
MAP.map_data = """
MB -- ME SP -- ME ME MM
ME -- -- ++ ++ -- ME --
-- -- ME MB ++ ME SP MB
SP -- ME -- ME -- ME ME
++ ME -- ME SP ME -- MM
"""
MAP.weight_data = """
10 10 50 50 50 50 50 10
50 10 10 10 10 50 50 10
50 50 10 10 10 20 10 10
50 50 10 10 10 10 10 30
50 50 20 20 20 20 10 10
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 4},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2, 'mystery': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1, 'mystery': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
= MAP.flatten()
step_on = SelectedGrids([E4, G2, C3, C4, F3])
road_boss = RoadGrids([
A1, [B1, A2], B2, [C2, B3], [B3, C3], [B4, C3], [C3, C4], [C4, D3], D4, # A1 - D4
[G3, H4], [G3, G4], G3, [F3, G4], F4, [E4, F5], [E4, E5], [E4, D5] # H3 - D4
])
road_in_map = RoadGrids([
A1, [B1, A2], B2, [C2, B3], [B3, C3], [B4, C3], [C3, C4], [C4, D3], D4, # A1 - D4
[G3, H4], [G3, G4], G3, [F3, G4], F4, [E4, F5], [E4, E5], [E4, D5], # H3 - D4
D1, C1, [B1, C2], # D1 - C2
E1, F1, [G1, F2], [G2, F2], [F3, G2] # E1 - G3
])
road_mystery = RoadGrids([[F5, G4], [H4, G5], H2])
class Config:
FLEET_BOSS = 1
MAP_MYSTERY_HAS_CARRIER = True
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
# EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_2_step_on(step_on, roadblocks=[road_in_map]):
return True
if self.clear_roadblocks([road_boss]):
return True
if self.clear_roadblocks([road_mystery]):
return True
self.clear_all_mystery()
if self.clear_potential_roadblocks([road_boss]):
return True
if self.clear_potential_roadblocks([road_mystery]):
return True
return self.battle_default()
def battle_4(self):
self.clear_all_mystery()
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
return self.clear_roadblocks([road_boss])
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,82 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'H6'
MAP.camera_data = ['D2', 'D4', 'E2', 'E4']
MAP.camera_data_spawn_point = ['D2', 'D4']
MAP.map_data = """
-- ME MB MB -- ME ++ ++
MB SP ME -- ME MM MA ++
-- ++ ME -- -- ME SP ME
ME __ -- ME ME __ ME MB
-- ME -- MB ++ ME -- ME
MB ME -- SP -- ME -- --
"""
MAP.weight_data = """
50 40 40 40 50 50 50 50
40 40 20 20 20 20 50 50
10 50 10 10 10 10 10 20
10 10 10 10 30 30 30 40
10 20 20 40 40 50 50 50
30 40 30 50 50 50 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 4},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1, 'mystery': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
= MAP.flatten()
step_on = SelectedGrids([C2, C3, D4, F3, G4])
road_boss = RoadGrids([
[A5, B6], [A4, B5, B6], C4, C5, [C3, D4], D3, # A6 - D3
[C5, D3], # D5 - D3
[B1, B2], [B1, C2], [C1, C2], [C2, D1], [C2, D2], # A2 - D3
[H3, G4], [G3, G4], [F3, G4], [F3, F4], [F2, F3, E4], [E2, F3, E4], E3 # H4 - D3
])
class Config:
FLEET_BOSS = 1
MAP_MYSTERY_HAS_CARRIER = True
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_2_step_on(step_on, roadblocks=[road_boss]):
return True
if self.clear_roadblocks([road_boss]):
return True
self.clear_all_mystery()
if self.clear_potential_roadblocks([road_boss]):
return True
return self.battle_default()
def battle_5(self):
self.clear_all_mystery()
if self.config.FLEET_BOSS == 1:
self.pick_up_ammo()
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
return self.clear_roadblocks([road_boss])
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,58 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap()
MAP.shape = 'H3'
MAP.camera_data = ['C1', 'E1']
MAP.camera_data_spawn_point = ['C1']
MAP.map_data = """
-- ME ME MM ME -- ++ ++
SP ME ++ ++ ME ME ++ ++
SP -- ++ ++ -- ME ME MB
"""
MAP.weight_data = """
40 30 21 20 17 15 50 50
40 40 50 50 16 13 50 50
40 40 50 50 14 12 11 10
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1, 'mystery': 1},
{'battle': 4},
{'battle': 5, 'boss': 1},
]
class Config:
SUBMARINE = 0
FLEET_BOSS = 2
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
MID_DIFF_RANGE_H = (140 - 3, 140 + 3)
MID_DIFF_RANGE_V = (143 - 3, 143 + 3)
class Campaign(CampaignBase):
MAP = MAP
MAP_AMBUSH_OVERLAY_TRANSPARENCY_THRESHOLD = 0.45
MAP_AIR_RAID_OVERLAY_TRANSPARENCY_THRESHOLD = 0.45
def battle_0(self):
self.clear_all_mystery()
self.fleet_2_push_forward()
return self.battle_default()
def battle_5(self):
self.clear_all_mystery()
return self.fleet_boss.brute_clear_boss()
def handle_boss_appear_refocus(self, preset=(-3, -2)):
return super().handle_boss_appear_refocus(preset)

View File

@@ -0,0 +1,90 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('7-2')
MAP.shape = 'H5'
MAP.camera_data = ['D2', 'D3']
MAP.camera_data_spawn_point = ['D2', 'D3']
MAP.map_data = """
ME ++ ME -- ME ME -- SP
MM ++ ++ MM -- -- ME --
ME -- ME MB ME -- ME MM
-- ME -- MM -- ME ++ ++
SP -- ME ME -- ME ++ ++
"""
MAP.weight_data = """
40 30 30 30 30 30 30 30
20 20 20 10 20 20 20 20
10 10 10 10 10 10 10 10
20 20 20 10 20 20 20 20
30 30 30 30 30 30 30 30
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2, 'mystery': 1},
{'battle': 2, 'enemy': 2, 'mystery': 1},
{'battle': 3, 'enemy': 1, 'mystery': 2},
{'battle': 4, 'enemy': 1},
{'battle': 5, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5 = MAP.flatten()
ROAD_MAIN = RoadGrids([A3, [C3, B4, C5], [F1, G2, G3]])
GRIDS_FOR_FASTER = SelectedGrids([A3, C3, E3, G3])
FLEET_2_STEP_ON = SelectedGrids([A3, G3, C3, E3])
class Config:
SUBMARINE = 0
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_2_step_on(FLEET_2_STEP_ON, roadblocks=[ROAD_MAIN]):
return True
ignore = None
if self.fleet_at(A3, fleet=2) and A1.enemy_scale != 3 and not self.fleet_at(A1, fleet=1):
ignore = SelectedGrids([A2])
if self.fleet_at(G3, fleet=2):
ignore = SelectedGrids([H3])
self.clear_all_mystery(nearby=False, ignore=ignore)
if self.clear_roadblocks([ROAD_MAIN], strongest=True):
return True
if self.clear_enemy(scale=(3,)):
return True
if self.clear_potential_roadblocks([ROAD_MAIN], strongest=True):
return True
if self.clear_enemy(strongest=True):
return True
return self.battle_default()
def battle_5(self):
ignore = None
if self.fleet_at(A3, fleet=2):
ignore = SelectedGrids([A2])
if self.fleet_at(G3, fleet=2):
ignore = SelectedGrids([H3])
self.clear_all_mystery(nearby=False, ignore=ignore)
if self.clear_roadblocks([ROAD_MAIN]):
return True
if self.fleet_at(A3, fleet=2) and A2.is_mystery:
self.fleet_2.clear_chosen_mystery(A2)
if self.fleet_at(G3, fleet=2) and H3.is_mystery:
self.fleet_2.clear_chosen_mystery(H3)
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,86 @@
from campaign.campaign_main.campaign_7_2 import MAP
from campaign.campaign_main.campaign_7_2 import Config as ConfigBase
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
# MAP.in_map_swipe_preset_data = (-1, 0)
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5 = MAP.flatten()
ROAD_MAIN = RoadGrids([A3, [C3, B4, C5], [F1, G2, G3]])
GRIDS_FOR_FASTER = SelectedGrids([A3, C3, E3, G3])
FLEET_2_STEP_ON = SelectedGrids([A3, G3, C3, E3])
class Config(ConfigBase):
ENABLE_AUTO_SEARCH = False
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.config.C72MysteryFarming_StepOnA3:
if self.fleet_2_step_on(FLEET_2_STEP_ON, roadblocks=[ROAD_MAIN]):
return True
ignore = None
if self.fleet_at(A3, fleet=2) and A1.enemy_scale != 3 and not self.fleet_at(A1, fleet=1):
ignore = SelectedGrids([A2])
if self.fleet_at(G3, fleet=2):
ignore = SelectedGrids([H3])
self.clear_all_mystery(nearby=False, ignore=ignore)
else:
self.clear_all_mystery(nearby=False)
if self.clear_roadblocks([ROAD_MAIN], strongest=True):
return True
if self.clear_potential_roadblocks([ROAD_MAIN], strongest=True):
return True
if self.clear_enemy(scale=(3,)):
return True
if self.clear_grids_for_faster(GRIDS_FOR_FASTER, scale=(2,)):
return True
if self.clear_enemy(scale=(2,)):
return True
if self.clear_grids_for_faster(GRIDS_FOR_FASTER):
return True
return self.battle_default()
def battle_3(self):
if self.config.C72MysteryFarming_StepOnA3:
ignore = None
if self.fleet_at(A3, fleet=2):
ignore = SelectedGrids([A2])
if self.fleet_at(G3, fleet=2):
ignore = SelectedGrids([H3])
self.clear_all_mystery(nearby=False, ignore=ignore)
if self.fleet_at(A3, fleet=2) and A2.is_mystery:
self.fleet_2.clear_chosen_mystery(A2)
if self.fleet_at(G3, fleet=2) and H3.is_mystery:
self.fleet_2.clear_chosen_mystery(H3)
else:
self.clear_all_mystery(nearby=False)
if self.map.select(is_mystery=True, is_accessible=False):
logger.info('Roadblock blocks mystery.')
if self.fleet_1.clear_roadblocks([ROAD_MAIN]):
return True
if not self.map.select(is_mystery=True):
self.withdraw()
@property
def _map_battle(self):
return 3

View File

@@ -0,0 +1,95 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('7-3')
MAP.shape = 'H6'
MAP.camera_data = ['D2', 'D4', 'E2', 'E4']
MAP.camera_data_spawn_point = ['E4']
MAP.map_data = """
MB ME -- -- ME -- ME MB
ME MM ++ ME -- ME MM ME
-- ME -- SP -- ++ ++ ++
ME -- ME -- SP -- ++ ++
MM ++ ++ ++ MM ME ++ MB
ME ME MB ++ ME -- ME ME
"""
MAP.weight_data = """
10 40 30 30 20 20 20 10
30 30 10 30 20 30 30 40
30 20 10 10 10 10 10 10
20 20 30 10 10 10 10 10
30 10 10 10 10 20 10 10
30 40 10 10 20 20 30 40
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2, 'mystery': 1},
{'battle': 2, 'enemy': 2, 'mystery': 1},
{'battle': 3, 'enemy': 2, 'mystery': 1},
{'battle': 4, 'enemy': 1, 'mystery': 1},
{'battle': 5, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
= MAP.flatten()
# road_a1 = RoadGrids([[A2, B1], [A2, B3], [B3, A4], [A4, B3, D2, E1], [C4, B3, D2, E1]])
road_a1 = RoadGrids([[A2, B1], [A2, B3], [B3, A4], [B3, C4]]) \
.combine(RoadGrids([A2, [E1, D2]]))
road_c6 = RoadGrids([B6, A6, A4, [B3, C4]])
road_h1 = RoadGrids([[H2, G1], [G1, F2], [F2, E1]])
road_h5 = RoadGrids([H6, G6, [E6, F5]])
roads = [road_a1, road_c6, road_h1, road_h5]
fleet_2_step_on = SelectedGrids([A4, B3, E1, F5])
class Config:
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
# EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_2_step_on(fleet_2_step_on, roadblocks=roads):
return True
self.clear_all_mystery()
if self.clear_roadblocks(roads):
return True
if self.clear_potential_roadblocks(roads):
return True
return self.battle_default()
def battle_5(self):
self.clear_all_mystery()
boss = self.map.select(is_boss=True)
if boss:
boss = boss[0]
if boss == A1:
road_boss = [road_a1]
elif boss == C6:
road_boss = [road_c6]
elif boss == H1:
road_boss = [road_h1]
elif boss == H5:
road_boss = [road_h5]
else:
logger.warning(f'Unexpected boss grid: {boss}')
road_boss = roads
if not self.check_accessibility(boss, fleet='boss'):
return self.clear_roadblocks(road_boss)
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,91 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('7-4')
MAP.shape = 'H6'
MAP.camera_data = ['C2', 'C4', 'E2', 'E4']
MAP.camera_data_spawn_point = ['D2', 'D4']
MAP.map_data = """
MB ME ME -- ++ ++ ++ MB
ME __ -- ME SP -- SP --
-- ++ ME -- -- ME -- ME
ME ++ ++ ++ ME -- ME --
SP -- MA ++ ME ++ __ ME
MM -- MM ME -- ME MB --
"""
MAP.weight_data = """
10 20 50 10 10 10 10 10
04 10 10 07 10 10 10 10
10 10 05 10 10 40 10 20
04 50 50 50 30 10 06 10
50 50 50 50 30 10 10 20
50 50 50 50 30 30 10 30
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 3, 'mystery': 1},
{'battle': 3, 'enemy': 2, 'mystery': 1},
{'battle': 4, 'enemy': 2},
{'battle': 5, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
= MAP.flatten()
road_a1 = RoadGrids([A2 , [C3, D2]])
road_g6 = RoadGrids([G4])
roads = [road_a1, road_g6]
fleet_2_step_on = SelectedGrids([A4, A2, G4, D2, C3])
road_a5 = RoadGrids([A4, A2, [C3, D2]]) \
.combine(RoadGrids([G4]))
class Config:
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
# EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_2_step_on(fleet_2_step_on, roadblocks=[road_a5]):
return True
self.clear_all_mystery()
if self.clear_roadblocks(roads):
return True
if self.clear_potential_roadblocks(roads):
return True
return self.battle_default()
def battle_3(self):
if self.fleet_2_step_on(fleet_2_step_on, roadblocks=[road_a5]):
return True
self.clear_all_mystery()
if self.fleet_boss_index == 1:
self.pick_up_ammo()
if self.clear_roadblocks(roads):
return True
if self.clear_potential_roadblocks(roads):
return True
return self.battle_default()
def battle_5(self):
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,65 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('8-1')
MAP.shape = 'I3'
MAP.camera_data = ['D1', 'F1']
MAP.camera_data_spawn_point = ['D1', 'F1']
MAP.map_data = """
SP -- ++ ++ ME -- ME MB ++
SP -- ++ ++ ME -- ME -- ME
-- ME ME -- ME ++ ME ME MB
"""
MAP.weight_data = """
50 50 50 50 50 50 21 30 50
50 50 50 50 25 24 20 12 11
50 45 40 31 30 50 22 10 20
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
= MAP.flatten()
class Config:
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 35
EDGE_LINES_HOUGHLINES_THRESHOLD = 35
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.3
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (120, 255 - 49),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 49, 255),
'prominence': 10,
'distance': 50,
'width': (0, 10),
'wlen': 1000,
}
HOMO_EDGE_COLOR_RANGE = (0, 49)
MAP_SWIPE_MULTIPLY = (1.127, 1.148)
MAP_SWIPE_MULTIPLY_MINITOUCH = (1.090, 1.110)
MAP_SWIPE_MULTIPLY_MAATOUCH = (1.058, 1.077)
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
self.fleet_2_push_forward()
return self.battle_default()
def battle_4(self):
return self.brute_clear_boss()

View File

@@ -0,0 +1,73 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
from .campaign_8_1 import Config as ConfigBase
MAP = CampaignMap('8-3')
MAP.shape = 'H5'
MAP.camera_data = ['D2', 'D3', 'E3']
MAP.camera_data_spawn_point = ['E3']
MAP.map_data = """
MB ME -- ++ ++ ME -- MB
ME ME ME -- ++ ME ME --
-- ME -- ME ME -- ME ME
ME ++ ++ -- ME ++ ++ ME
MM ++ ++ ME ME SP -- SP
"""
MAP.weight_data = """
50 35 20 90 90 40 50 50
30 40 25 90 90 25 30 50
20 20 20 10 10 20 20 35
50 90 90 60 60 90 90 90
90 90 90 70 80 90 90 90
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2, 'mystery': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
= MAP.flatten()
road_A1 = RoadGrids([[A2, B1], [B1, B2, B3], [A2, B2, C2], [B3, C2], D3])
road_H1 = RoadGrids([[F1, G2, H3], [F1, G2, G3], [F2, G2, H3], [F2, G3], E3])
road_MY = RoadGrids([A4, [A2, B3]])
road_middle = RoadGrids([E5, [D5, E4], D3]) \
.combine(RoadGrids([H4, H3, [F1, G2, G3], [F2, G3], E3]))
step_on = SelectedGrids([D3, E3])
class Config(ConfigBase):
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_2_step_on(step_on, roadblocks=[road_middle]):
return True
self.clear_all_mystery()
if self.clear_roadblocks([road_A1, road_H1]):
return True
if self.mystery_count < 1 and self.clear_roadblocks([road_MY]):
return True
if self.clear_potential_roadblocks([road_A1, road_H1]):
return True
if self.clear_first_roadblocks([road_A1, road_H1]):
return True
return self.battle_default()
def battle_4(self):
return self.brute_clear_boss()

View File

@@ -0,0 +1,80 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
from .campaign_8_1 import Config as ConfigBase
MAP = CampaignMap('8-3')
MAP.shape = 'H6'
MAP.camera_data = ['D3', 'D4', 'E3', 'E4']
MAP.map_data = """
MB -- ME ME ME ME -- MB
-- ME MM ++ ++ __ ME --
ME ++ ++ SP -- ME -- ME
ME MA ++ -- SP ++ ME ME
MM ME __ ME ++ ++ ME --
MB -- ME ME ME ME -- MB
"""
MAP.weight_data = """
50 50 40 90 90 30 50 50
50 50 50 90 90 20 40 50
40 90 90 10 10 10 20 20
30 90 90 10 10 90 40 30
20 20 20 10 90 90 40 50
50 30 30 80 80 80 50 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2, 'mystery': 1},
{'battle': 2, 'enemy': 2, 'mystery': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
= MAP.flatten()
road_middle = RoadGrids([D5, F3])
step_on = SelectedGrids([D5, F3])
# There's one enemy spawn along with boss, so have to make sure there are multiple roads are cleared.
# Here use separate roads instead of RoadGrids.combine().
road_H1 = RoadGrids([F3, [F1, G2, H3]])
road_A6 = RoadGrids([D5, [B5, C6]])
road_A1_left = RoadGrids([A4, A3])
road_A1_upper = RoadGrids([F1, E1, D1, C1])
road_H6_bottom = RoadGrids([D6, E6, F6])
road_H6_right = RoadGrids([[H3, G4], [G4, H4], [H4, G5]])
road_MY = RoadGrids([[B2, C1]])
class Config(ConfigBase):
pass
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_2_step_on(step_on, roadblocks=[road_middle]):
return True
self.clear_all_mystery()
if self.clear_roadblocks([road_A6, road_H1, road_A1_left, road_A1_upper, road_H6_bottom, road_H6_right]):
return True
if self.clear_potential_roadblocks([road_A6, road_H1, road_A1_left, road_A1_upper, road_H6_bottom, road_H6_right]):
return True
if self.clear_roadblocks([road_MY]):
return True
if self.clear_first_roadblocks([road_A6, road_H1, road_A1_left, road_A1_upper, road_H6_bottom, road_H6_right]):
return True
return self.battle_default()
def battle_4(self):
return self.brute_clear_boss()

View File

@@ -0,0 +1,78 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
from .campaign_8_1 import Config as ConfigBase
MAP = CampaignMap('8-4')
MAP.shape = 'H7'
MAP.camera_data = ['D3', 'E3', 'E5']
MAP.camera_data_spawn_point = ['C1']
MAP.map_data = """
++ SP -- -- ME -- ME --
SP -- -- ME -- ++ ++ --
-- -- ME ++ ++ MM ME ME
++ ++ -- ++ ++ ME ME --
MA ++ ME -- ME __ ME ++
ME ME __ ME ++ ++ -- ME
-- ME ME MM ME -- ME MB
"""
MAP.weight_data = """
50 50 50 90 90 90 90 90
50 50 50 90 90 90 90 90
50 50 45 90 90 50 50 90
90 90 40 90 90 30 31 90
50 90 30 30 20 14 12 90
30 27 35 25 90 90 20 10
30 28 26 20 13 15 10 50
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2, 'mystery': 1},
{'battle': 3, 'enemy': 1, 'mystery': 1},
{'battle': 4, 'enemy': 2, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
A7, B7, C7, D7, E7, F7, G7, H7, \
= MAP.flatten()
road_D7 = RoadGrids([G7, E7]).combine(RoadGrids([G5, E5, [C5, D6], [D6, C7]]))
road_F3 = RoadGrids([G5, [F4, G4], [F4, G3]])
road_main = RoadGrids([[G7, H6]])
class Config(ConfigBase):
pass
class Campaign(CampaignBase):
MAP = MAP
# Need to increase this threshold a little bit, because of mis-detection on dark background
MAP_AMBUSH_OVERLAY_TRANSPARENCY_THRESHOLD = 0.45
MAP_AIR_RAID_OVERLAY_TRANSPARENCY_THRESHOLD = 0.45 # Usually (0.50, 0.53)
def battle_0(self):
self.fleet_2_push_forward()
self.clear_all_mystery()
if self.clear_roadblocks([road_D7, road_F3, road_main]):
return True
if self.clear_potential_roadblocks([road_D7, road_F3, road_main]):
return True
if self.clear_first_roadblocks([road_D7, road_F3, road_main]):
return True
return self.battle_default()
def battle_4(self):
self.clear_all_mystery()
return self.brute_clear_boss()

View File

@@ -0,0 +1,38 @@
from .campaign_8_4 import Campaign as CampaignBase
from .campaign_8_4 import Config as ConfigBase
from .campaign_8_4 import *
class Config(ConfigBase):
ENABLE_AUTO_SEARCH = False
class Campaign(CampaignBase):
def battle_0(self):
self.fleet_2_push_forward()
self.clear_all_mystery()
if self.map.select(is_mystery=True, is_accessible_1=False, is_accessible_2=True):
self.fleet_2.clear_all_mystery()
self.fleet_2_push_forward()
if self.clear_roadblocks([road_D7, road_F3, road_main], strongest=True):
return True
if self.clear_potential_roadblocks([road_D7, road_F3, road_main], scale=(3,)):
return True
if self.clear_enemy(scale=(3,)):
return True
if self.clear_potential_roadblocks([road_D7, road_F3, road_main], strongest=True):
return True
if self.clear_first_roadblocks([road_D7, road_F3, road_main]):
return True
return self.battle_default()
def battle_4(self):
self.clear_all_mystery()
if self.map.select(is_mystery=True, is_accessible_1=False, is_accessible_2=True):
self.fleet_2.clear_all_mystery()
self.fleet_2_push_forward()
return self.brute_clear_boss()

View File

@@ -0,0 +1,72 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('9-2')
MAP.shape = 'H5'
MAP.camera_data = ['E3']
MAP.camera_data_spawn_point = ['C1', 'C3']
MAP.map_data = """
SP -- ++ ++ ++ Me -- MB
++ -- ++ ++ ++ ME ++ ++
-- ME -- ME ME Me ++ ++
-- -- ++ -- ME ++ ME MB
SP SP ++ ME -- Me ME ME
"""
MAP.weight_data = """
90 90 90 90 90 30 30 30
90 90 90 90 90 30 90 90
90 80 70 60 50 30 90 90
90 90 90 90 50 90 30 30
90 90 90 90 40 40 30 30
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 1},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
= MAP.flatten()
# Might have wrong prediction on D5
MAP.ignore_prediction(D5, enemy_scale=1, enemy_genre='Enemy')
road_main = RoadGrids([B3, D3, [D5, E4], F5, G5, [G4, H5], H4, E3, F3, F2, F1])
step_on = SelectedGrids([F3, E4])
class Config:
SUBMARINE = 0
HOMO_STORAGE = ((9, 5), [(214.274, 100.482), (1300.358, 100.482), (79.666, 584.209), (1505.19, 584.209)])
MAP_ENSURE_EDGE_INSIGHT_CORNER = 'bottom'
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_2_step_on(step_on, roadblocks=[road_main]):
return True
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_5(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,106 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('9-2')
MAP.shape = 'I5'
MAP.camera_data = ['D3', 'E3']
MAP.camera_data_spawn_point = ['D3']
MAP.map_data = """
++ ++ ME -- MB ME -- Me --
MM ++ ME ME MB ME ++ ME --
ME -- Me ++ ++ ++ ++ Me ++
-- ++ -- -- ++ SP -- ME --
-- ME -- SP ++ SP -- -- --
"""
MAP.weight_data = """
10 10 30 10 10 10 10 10 10
10 10 20 30 10 30 10 10 10
30 10 20 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
10 30 10 10 10 10 10 10 10
"""
MAP.spawn_data = [
{'battle': 0, 'enemy': 3},
{'battle': 1, 'enemy': 2, 'mystery': 1},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
= MAP.flatten()
road_main = RoadGrids([C3, C2, [C1, D2], F1, H1, H2, H3, H4])
class Config:
SUBMARINE = 0
MAP_HAS_MYSTERY = True
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (150, 255 - 24),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 24, 255),
'prominence': 10,
'distance': 50,
'width': (0, 10),
'wlen': 1000,
}
HOMO_EDGE_HOUGHLINES_THRESHOLD = 210
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.fleet_at(D5, fleet=2):
self.map.weight_data = """
10 10 30 10 10 20 30 40 10
10 10 10 10 10 30 10 50 10
30 10 10 10 10 10 10 60 10
10 10 10 10 10 10 10 70 10
10 30 10 10 10 10 10 10 10
"""
if self.fleet_at(F4, fleet=2):
self.map.weight_data = """
10 10 30 10 10 10 10 10 10
10 10 20 30 10 30 10 10 10
30 10 20 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
10 30 10 10 10 10 10 10 10
"""
if self.fleet_at(F5, fleet=2):
self.map.weight_data = """
10 10 30 10 10 10 10 10 10
10 10 20 30 10 30 10 10 10
30 10 20 10 10 10 10 10 10
10 10 10 10 10 10 10 10 10
10 30 10 10 10 10 10 10 10
"""
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_5(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,82 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('9-3')
MAP.shape = 'H6'
MAP.camera_data = ['D3', 'E4']
MAP.camera_data_spawn_point = ['E4']
MAP.map_data = """
MB -- ME -- ME -- ++ MB
ME ++ ++ ++ MB ME ++ --
Me __ -- SP ++ ME ME --
-- -- ME ++ SP -- __ Me
++ -- Me MB ++ ++ ++ --
++ ++ -- ME -- ME ME MB
"""
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 20 10
10 10 20 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},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 1},
{'battle': 5, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, \
A2, B2, C2, D2, E2, F2, G2, H2, \
A3, B3, C3, D3, E3, F3, G3, H3, \
A4, B4, C4, D4, E4, F4, G4, H4, \
A5, B5, C5, D5, E5, F5, G5, H5, \
A6, B6, C6, D6, E6, F6, G6, H6, \
= MAP.flatten()
road_main = RoadGrids([A2, A3, C5, D6, F2, F3, F6, G6, H4])
class Config:
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (150, 255 - 24),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 24, 255),
'prominence': 10,
'distance': 50,
'width': (0, 10),
'wlen': 1000,
}
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_5(self):
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()

View File

@@ -0,0 +1,85 @@
from module.campaign.campaign_base import CampaignBase
from module.logger import logger
from module.map.map_base import CampaignMap
from module.map.map_grids import RoadGrids, SelectedGrids
MAP = CampaignMap('9-4')
MAP.shape = 'I6'
MAP.camera_data = ['D3', 'F3', 'F4']
MAP.camera_data_spawn_point = ['D4']
MAP.map_data = """
MB -- ME -- ++ ++ ++ -- MB
-- ++ __ ME -- ME Me ME --
Me -- ME -- ME -- __ ++ --
ME -- ++ ++ -- -- Me __ ME
SP -- MA ++ ME -- ++ ME --
SP -- -- ME -- ME ++ -- MB
"""
MAP.weight_data = """
10 10 20 10 10 10 10 10 10
10 10 10 20 10 10 10 10 10
10 10 20 10 20 10 10 10 10
20 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},
{'battle': 1, 'enemy': 2},
{'battle': 2, 'enemy': 2},
{'battle': 3, 'enemy': 1},
{'battle': 4, 'enemy': 2},
{'battle': 5, 'boss': 1},
]
A1, B1, C1, D1, E1, F1, G1, H1, I1, \
A2, B2, C2, D2, E2, F2, G2, H2, I2, \
A3, B3, C3, D3, E3, F3, G3, H3, I3, \
A4, B4, C4, D4, E4, F4, G4, H4, I4, \
A5, B5, C5, D5, E5, F5, G5, H5, I5, \
A6, B6, C6, D6, E6, F6, G6, H6, I6, \
= MAP.flatten()
road_main = RoadGrids([A3, D6, [E5, F6], G4, I4])
class Config:
INTERNAL_LINES_HOUGHLINES_THRESHOLD = 40
EDGE_LINES_HOUGHLINES_THRESHOLD = 40
COINCIDENT_POINT_ENCOURAGE_DISTANCE = 1.5
INTERNAL_LINES_FIND_PEAKS_PARAMETERS = {
'height': (150, 255 - 24),
'width': (0.9, 10),
'prominence': 10,
'distance': 35,
}
EDGE_LINES_FIND_PEAKS_PARAMETERS = {
'height': (255 - 24, 255),
'prominence': 10,
'distance': 50,
'width': (0, 10),
'wlen': 1000,
}
class Campaign(CampaignBase):
MAP = MAP
def battle_0(self):
if self.clear_roadblocks([road_main]):
return True
if self.clear_potential_roadblocks([road_main]):
return True
return self.battle_default()
def battle_5(self):
if self.config.FLEET_BOSS == 1:
self.pick_up_ammo()
boss = self.map.select(is_boss=True)
if boss:
if not self.check_accessibility(boss[0], fleet='boss'):
if self.clear_roadblocks([road_main]):
return True
return self.fleet_boss.clear_boss()