Add: 增加敌人类型识别
BIN
assets/template/TEMPLATE_ENEMY_CARRIER.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
assets/template/TEMPLATE_ENEMY_LIGHT.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
assets/template/TEMPLATE_ENEMY_MAIN.png
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
assets/template/TEMPLATE_ENEMY_TREASURE.png
Normal file
After Width: | Height: | Size: 4.1 KiB |
BIN
assets/template/TEMPLATE_SIREN_1.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
assets/template/TEMPLATE_SIREN_2.png
Normal file
After Width: | Height: | Size: 4.2 KiB |
BIN
assets/template/TEMPLATE_SIREN_3.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
@ -24,7 +24,7 @@ class Config:
|
||||
MAP_HAS_FLEET_STEP = True
|
||||
MAP_HAS_MOVABLE_ENEMY = True
|
||||
MAP_HAS_SIREN = True
|
||||
MAP_HAS_DYNAMIC_RED_BORDER = True
|
||||
MAP_HAS_DYNAMIC_RED_BORDER = False
|
||||
MAP_HAS_MAP_STORY = True
|
||||
MAP_SIREN_COUNT = 2
|
||||
|
||||
|
@ -24,7 +24,7 @@ class Config:
|
||||
MAP_HAS_FLEET_STEP = True
|
||||
MAP_HAS_MOVABLE_ENEMY = True
|
||||
MAP_HAS_SIREN = True
|
||||
MAP_HAS_DYNAMIC_RED_BORDER = True
|
||||
MAP_HAS_DYNAMIC_RED_BORDER = False
|
||||
MAP_HAS_MAP_STORY = True
|
||||
MAP_SIREN_COUNT = 2
|
||||
|
||||
|
@ -6,7 +6,7 @@ from module.map.grid_predictor import GridPredictor
|
||||
|
||||
|
||||
class Grid(GridPredictor, GridInfo):
|
||||
def __init__(self, location, image, corner):
|
||||
def __init__(self, location, image, corner, config):
|
||||
"""
|
||||
|
||||
Args:
|
||||
@ -18,7 +18,7 @@ class Grid(GridPredictor, GridInfo):
|
||||
(x2, y2) +-------------+ (x3, y3)
|
||||
"""
|
||||
self.location = location
|
||||
super().__init__(location, image, corner)
|
||||
super().__init__(location, image, corner, config)
|
||||
self.corner = corner.flatten()
|
||||
|
||||
@property
|
||||
|
@ -43,7 +43,7 @@ class GridInfo:
|
||||
is_siren = False # SI
|
||||
|
||||
enemy_scale = 0
|
||||
enemy_type = 'Enemy' # Light, Main, Carrier, Treasure, Enemy(unknown)
|
||||
enemy_type = None # Light, Main, Carrier, Treasure, Enemy(unknown)
|
||||
|
||||
is_cleared = False
|
||||
is_ambush_save = False
|
||||
@ -76,16 +76,15 @@ class GridInfo:
|
||||
dic = {
|
||||
'++': 'is_land',
|
||||
'BO': 'is_boss',
|
||||
'SI': 'is_siren'
|
||||
}
|
||||
for key, value in dic.items():
|
||||
if self.__getattribute__(value):
|
||||
return key
|
||||
|
||||
if self.is_siren:
|
||||
return ''.join([text[0] for text in self.enemy_type.split('_')]).upper()
|
||||
|
||||
if self.is_enemy:
|
||||
# if self.may_siren:
|
||||
# return 'SI'
|
||||
# else:
|
||||
return '%s%s' % (self.enemy_scale, self.enemy_type[0].upper())
|
||||
|
||||
dic = {
|
||||
@ -143,6 +142,7 @@ class GridInfo:
|
||||
flag &= not self.is_cleared
|
||||
if flag:
|
||||
self.__setattr__('is_' + item, True)
|
||||
self.enemy_type = info.enemy_type
|
||||
return True
|
||||
else:
|
||||
logger.info(f'Wrong Prediction. Grid: {self}, Attr: is_{item}')
|
||||
@ -184,7 +184,7 @@ class GridInfo:
|
||||
"""
|
||||
self.is_enemy = False
|
||||
self.enemy_scale = 0
|
||||
self.enemy_type = 'Enemy'
|
||||
self.enemy_type = None
|
||||
self.is_mystery = False
|
||||
self.is_boss = False
|
||||
self.is_ammo = False
|
||||
|
@ -3,6 +3,7 @@ from PIL import Image
|
||||
from skimage.color import rgb2hsv
|
||||
|
||||
from module.base.utils import color_similarity_2d
|
||||
from module.config.config import AzurLaneConfig
|
||||
from module.template.assets import *
|
||||
|
||||
|
||||
@ -10,14 +11,25 @@ class GridPredictor:
|
||||
ENEMY_SCALE_IMAGE_SIZE = (50, 50)
|
||||
ENEMY_PERSPECTIVE_IMAGE_SIZE = (50, 50)
|
||||
RED_BORDER_IGNORE_TOP = 10
|
||||
DIC_ENEMY_TYPE = {
|
||||
'Siren_1': TEMPLATE_SIREN_1,
|
||||
'Siren_2': TEMPLATE_SIREN_2,
|
||||
'Siren_3': TEMPLATE_SIREN_3,
|
||||
'Light': TEMPLATE_ENEMY_LIGHT,
|
||||
'Main': TEMPLATE_ENEMY_MAIN,
|
||||
'Carrier': TEMPLATE_ENEMY_CARRIER,
|
||||
'Treasure': TEMPLATE_ENEMY_TREASURE,
|
||||
}
|
||||
|
||||
def __init__(self, location, image, corner):
|
||||
def __init__(self, location, image, corner, config):
|
||||
"""
|
||||
Args:
|
||||
location:
|
||||
image:
|
||||
corner:
|
||||
config (AzurLaneConfig)
|
||||
"""
|
||||
self.config = config
|
||||
self.location = location
|
||||
self.image = image
|
||||
self.corner = corner.flatten()
|
||||
@ -41,20 +53,35 @@ class GridPredictor:
|
||||
|
||||
def predict(self):
|
||||
self.image_transform = self.image.transform(self.ENEMY_PERSPECTIVE_IMAGE_SIZE, Image.PERSPECTIVE, self._perspective)
|
||||
# self.image_hole = self.get_relative_image((-1, -1, 1, 1))
|
||||
self.is_enemy = self.predict_static_red_border()
|
||||
|
||||
self.enemy_scale = self.predict_enemy_scale()
|
||||
if self.enemy_scale > 0:
|
||||
self.is_enemy = True
|
||||
self.enemy_type = self.predict_enemy_type()
|
||||
|
||||
self.is_mystery = self.predict_mystery()
|
||||
if not self.is_enemy and not self.is_mystery:
|
||||
self.is_siren = self.predict_dynamic_red_border()
|
||||
self.is_fleet = self.predict_fleet()
|
||||
if self.is_fleet:
|
||||
self.is_current_fleet = self.predict_current_fleet()
|
||||
self.is_boss = self.predict_boss()
|
||||
# self.caught_by_siren = self.predict_siren_caught()
|
||||
|
||||
if self.config.MAP_HAS_DYNAMIC_RED_BORDER:
|
||||
if not self.is_enemy and not self.is_mystery:
|
||||
if self.predict_dynamic_red_border():
|
||||
self.enemy_type = 'Siren_unknown'
|
||||
# self.caught_by_siren = self.predict_siren_caught()
|
||||
|
||||
if self.enemy_type:
|
||||
self.is_enemy = True
|
||||
if self.enemy_scale:
|
||||
self.is_enemy = True
|
||||
if not self.is_enemy:
|
||||
self.is_enemy = self.predict_static_red_border()
|
||||
if self.is_enemy and not self.enemy_type:
|
||||
self.enemy_type = 'Enemy'
|
||||
if self.config.MAP_HAS_SIREN:
|
||||
if self.enemy_type is not None and self.enemy_type.startswith('Siren'):
|
||||
self.is_siren = True
|
||||
self.enemy_scale = 0
|
||||
|
||||
# self.image_perspective = color_similarity_2d(
|
||||
# self.image.transform(self.ENEMY_PERSPECTIVE_IMAGE_SIZE, Image.PERSPECTIVE, self._perspective)
|
||||
# , color=(255, 36, 82)
|
||||
@ -224,3 +251,14 @@ class GridPredictor:
|
||||
def predict_siren_caught(self):
|
||||
image = self.get_relative_image((-1, -1.5, 1, 0.5), output_shape=(120, 120))
|
||||
return TEMPLATE_CAUGHT_BY_SIREN.match(image, similarity=0.6)
|
||||
|
||||
def predict_enemy_type(self):
|
||||
image = self.get_relative_image((-1, -1, 1, 0), output_shape=(120, 60))
|
||||
for name, template in self.DIC_ENEMY_TYPE.items():
|
||||
if not self.config.MAP_HAS_SIREN and name.startswith('Siren'):
|
||||
continue
|
||||
if template.match(image):
|
||||
return name
|
||||
|
||||
return None
|
||||
|
||||
|
@ -82,7 +82,7 @@ class Grids(Perspective):
|
||||
area = np.append(cross[0], cross[3])
|
||||
|
||||
if area_in_area(area, self.config.DETECTING_AREA):
|
||||
grid = Grid(location=(x, y), image=self.image, corner=cross.points)
|
||||
grid = Grid(location=(x, y), image=self.image, corner=cross.points, config=self.config)
|
||||
yield grid
|
||||
|
||||
def show(self):
|
||||
@ -93,9 +93,6 @@ class Grids(Perspective):
|
||||
def predict(self):
|
||||
for grid in self:
|
||||
grid.predict()
|
||||
if not self.config.MAP_HAS_DYNAMIC_RED_BORDER:
|
||||
for grid in self:
|
||||
grid.is_siren = False
|
||||
|
||||
# for grid in self:
|
||||
# if grid.is_enemy and grid.enemy_scale == 0:
|
||||
|
@ -8,13 +8,20 @@ TEMPLATE_AMBUSH_EVADE_FAILED = Template(file='./assets/template/TEMPLATE_AMBUSH_
|
||||
TEMPLATE_AMBUSH_EVADE_SUCCESS = Template(file='./assets/template/TEMPLATE_AMBUSH_EVADE_SUCCESS.png')
|
||||
TEMPLATE_CAUGHT_BY_SIREN = Template(file='./assets/template/TEMPLATE_CAUGHT_BY_SIREN.png')
|
||||
TEMPLATE_ENEMY_BOSS = Template(file='./assets/template/TEMPLATE_ENEMY_BOSS.png')
|
||||
TEMPLATE_ENEMY_CARRIER = Template(file='./assets/template/TEMPLATE_ENEMY_CARRIER.png')
|
||||
TEMPLATE_ENEMY_L = Template(file='./assets/template/TEMPLATE_ENEMY_L.png')
|
||||
TEMPLATE_ENEMY_LIGHT = Template(file='./assets/template/TEMPLATE_ENEMY_LIGHT.png')
|
||||
TEMPLATE_ENEMY_M = Template(file='./assets/template/TEMPLATE_ENEMY_M.png')
|
||||
TEMPLATE_ENEMY_MAIN = Template(file='./assets/template/TEMPLATE_ENEMY_MAIN.png')
|
||||
TEMPLATE_ENEMY_S = Template(file='./assets/template/TEMPLATE_ENEMY_S.png')
|
||||
TEMPLATE_ENEMY_TREASURE = Template(file='./assets/template/TEMPLATE_ENEMY_TREASURE.png')
|
||||
TEMPLATE_FLEET_AMMO = Template(file='./assets/template/TEMPLATE_FLEET_AMMO.png')
|
||||
TEMPLATE_FORMATION_1 = Template(file='./assets/template/TEMPLATE_FORMATION_1.png')
|
||||
TEMPLATE_FORMATION_2 = Template(file='./assets/template/TEMPLATE_FORMATION_2.png')
|
||||
TEMPLATE_FORMATION_3 = Template(file='./assets/template/TEMPLATE_FORMATION_3.png')
|
||||
TEMPLATE_MAP_WALK_OUT_OF_STEP = Template(file='./assets/template/TEMPLATE_MAP_WALK_OUT_OF_STEP.png')
|
||||
TEMPLATE_SIREN_1 = Template(file='./assets/template/TEMPLATE_SIREN_1.png')
|
||||
TEMPLATE_SIREN_2 = Template(file='./assets/template/TEMPLATE_SIREN_2.png')
|
||||
TEMPLATE_SIREN_3 = Template(file='./assets/template/TEMPLATE_SIREN_3.png')
|
||||
TEMPLATE_STAGE_CLEAR = Template(file='./assets/template/TEMPLATE_STAGE_CLEAR.png')
|
||||
TEMPLATE_STAGE_PERCENT = Template(file='./assets/template/TEMPLATE_STAGE_PERCENT.png')
|
||||
|