mirror of
https://github.com/LmeSzinc/StarRailCopilot.git
synced 2024-11-23 17:11:42 +00:00
8ce405f28a
- 增加处理踩问号是会刷物资船的情况 - 增加对物资船的缺失预测 - 收完菜后出击, 会重新检查舰队 因为离开出击界面后, 出击舰队会重置为游戏默认的 - 修复了部分偏红的过场图, 会被认作索敌的问题
188 lines
5.8 KiB
Python
188 lines
5.8 KiB
Python
from module.base.utils import location2node
|
|
from module.logger import logger
|
|
|
|
|
|
class GridInfo:
|
|
"""
|
|
Class that gather basic information of a grid in map_v1.
|
|
|
|
Visit 碧蓝航线WIKI(Chinese Simplified) http://wiki.joyme.com/blhx, to get basic info of a map_v1. For example,
|
|
visit http://wiki.joyme.com/blhx/7-2, to know more about campaign 7-2, which includes boss point, enemy spawn point.
|
|
|
|
A grid contains these unchangeable properties which can known from WIKI.
|
|
| print_name | property_name | description |
|
|
|------------|----------------|-------------------------|
|
|
| ++ | is_land | fleet can't go to land |
|
|
| -- | is_sea | sea |
|
|
| __ | | submarine spawn point |
|
|
| SP | is_spawn_point | fleet may spawns here |
|
|
| ME | may_enemy | enemy may spawns here |
|
|
| MB | may_boss | boss may spawns here |
|
|
| MM | may_mystery | mystery may spawns here |
|
|
| MA | may_ammo | fleet can get ammo here |
|
|
| MS | may_siren | Siren/Elite enemy spawn |
|
|
"""
|
|
|
|
# is_sea --
|
|
is_land = False # ++
|
|
is_spawn_point = False # SP
|
|
|
|
may_enemy = False # ME
|
|
may_boss = False # MB
|
|
may_mystery = False # MM
|
|
may_ammo = False # MA
|
|
may_siren = False # MS
|
|
|
|
is_enemy = False # example: 0L 1M 2C 3T 3E
|
|
is_boss = False # BO
|
|
is_mystery = False # MY
|
|
is_ammo = False # AM
|
|
is_fleet = False # FL
|
|
is_current_fleet = False
|
|
is_submarine = False # SS
|
|
is_siren = False # SI
|
|
|
|
enemy_scale = 0
|
|
enemy_type = 'Enemy' # Light, Main, Carrier, Treasure, Enemy(unknown)
|
|
|
|
is_cleared = False
|
|
is_ambush_save = False
|
|
cost = 9999
|
|
connection = None
|
|
weight = 1
|
|
|
|
location = None
|
|
|
|
def decode(self, text):
|
|
dic = {
|
|
'++': 'is_land',
|
|
'SP': 'is_spawn_point',
|
|
'ME': 'may_enemy',
|
|
'MB': 'may_boss',
|
|
'MM': 'may_mystery',
|
|
'MA': 'may_ammo',
|
|
'MS': 'may_siren',
|
|
}
|
|
if text in dic:
|
|
self.__setattr__(dic[text], True)
|
|
if self.may_enemy or self.may_boss or self.may_mystery or self.may_mystery:
|
|
self.is_ambush_save = True
|
|
if self.may_siren:
|
|
self.may_enemy = True
|
|
if self.may_boss:
|
|
self.may_enemy = True
|
|
|
|
def encode(self):
|
|
dic = {
|
|
'++': 'is_land',
|
|
'BO': 'is_boss',
|
|
'SI': 'is_siren'
|
|
}
|
|
for key, value in dic.items():
|
|
if self.__getattribute__(value):
|
|
return key
|
|
|
|
if self.is_enemy:
|
|
# if self.may_siren:
|
|
# return 'SI'
|
|
# else:
|
|
return '%s%s' % (self.enemy_scale, self.enemy_type[0].upper())
|
|
|
|
dic = {
|
|
'FL': 'is_current_fleet',
|
|
'Fl': 'is_fleet',
|
|
'MY': 'is_mystery',
|
|
'AM': 'is_ammo',
|
|
'==': 'is_cleared'
|
|
}
|
|
for key, value in dic.items():
|
|
if self.__getattribute__(value):
|
|
return key
|
|
|
|
return '--'
|
|
|
|
def __str__(self):
|
|
return location2node(self.location)
|
|
|
|
@property
|
|
def str(self):
|
|
return self.encode()
|
|
|
|
@property
|
|
def is_sea(self):
|
|
return False if self.is_land or self.is_enemy or self.is_mystery or self.is_boss else True
|
|
|
|
@property
|
|
def may_carrier(self):
|
|
return self.is_sea and not self.may_enemy
|
|
|
|
@property
|
|
def is_accessible(self):
|
|
return self.cost < 9999
|
|
|
|
@property
|
|
def is_nearby(self):
|
|
return self.cost < 20
|
|
|
|
def update(self, info, is_carrier_scan=False):
|
|
"""
|
|
Args:
|
|
info (GridInfo):
|
|
is_carrier_scan (bool): Is a scan for mystery: enemy_searching, which ignore may_enemy spawn point.
|
|
"""
|
|
# failure = 0
|
|
for item in ['boss', 'siren']:
|
|
if info.__getattribute__('is_' + item):
|
|
if self.__getattribute__('may_' + item) and not self.is_cleared \
|
|
and not info.is_fleet and not self.is_fleet:
|
|
self.__setattr__('is_' + item, True)
|
|
return True
|
|
else:
|
|
logger.info(f'Wrong Prediction. Grid: {self}, Attr: {item}')
|
|
# failure += 1
|
|
|
|
if info.is_enemy:
|
|
flag = not info.is_fleet and not self.is_fleet
|
|
if not is_carrier_scan:
|
|
flag = flag and self.may_enemy and not self.is_cleared
|
|
if flag:
|
|
self.is_enemy = True
|
|
self.enemy_scale = info.enemy_scale
|
|
self.enemy_type = info.enemy_type
|
|
if self.may_siren:
|
|
self.is_siren = True
|
|
return True
|
|
else:
|
|
logger.info(f'Wrong Prediction. Grid: {self}, Attr: is_enemy')
|
|
|
|
for item in ['mystery', 'ammo']:
|
|
if info.__getattribute__('is_' + item):
|
|
if self.__getattribute__('may_' + item):
|
|
self.__setattr__('is_' + item, True)
|
|
return True
|
|
else:
|
|
logger.info(f'Wrong Prediction. Grid: {self}, Attr: {item}')
|
|
# failure += 1
|
|
|
|
self.is_fleet = info.is_fleet
|
|
if info.is_current_fleet:
|
|
self.is_current_fleet = True
|
|
return False
|
|
|
|
def wipe_out(self):
|
|
self.is_enemy = False
|
|
self.enemy_scale = 0
|
|
self.enemy_type = 'Enemy'
|
|
self.is_mystery = False
|
|
self.is_boss = False
|
|
self.is_ammo = False
|
|
self.is_siren = False
|
|
|
|
def reset(self):
|
|
self.wipe_out()
|
|
self.is_fleet = False
|
|
self.is_current_fleet = False
|
|
self.is_submarine = False
|
|
|
|
self.is_cleared = False
|