# engine.LingYi.entitys.player

View Source

       1# -*- coding:utf-8 -*-
       2
       3from abc import ABCMeta
       4import re
       5from random import randint
       6
       7from .global_util import *
       8from . import commonfunction as cf
       9from .patrolmission import PatrolMission
      10from .strikemission import StrikeMission
      11from .supportmission import SupportMission
      12from .cargomission import CargoMission
      13from .minemission import MineMission
      14from .mineclearmission import MineClearMission
      15from .ferrymission import FerryMission
      16from .gameunit import GameUnit
      17
      18guid_pattern = re.compile("{ guid = '([a-z0-9-]+)', name = '([^{]+)' }")
      19name_pattern = re.compile("{ name = '([^=]+)', guid = '([a-z0-9-]+)' }")
      20guid_ptn = re.compile(r"guid = '([a-z0-9-]+)',")
      21
      22
      23class Player(GameUnit):
      24    """
      25    推演方类
      26    1、通过任务名获取任务对象
      27    2、获取实体单元对象
      28    3、获取情报信息
      29    4、获取当前天气
      30    5、获取某点（纬经度）高程
      31    6、添加一个或多个参考点
      32    7、移动参考点的位置
      33    8、删除参考点
      34    9、批量增加多个参考点
      35    10、分配多个单元到任务
      36    11、清除单元所有航路点
      37    12、创建巡逻任务
      38    13、增加巡逻任务的警戒区
      39    14、创建打击任务
      40    15、创建支援任务
      41    16、创建转场任务
      42    17、创建布雷任务
      43    18、创建扫雷任务
      44    19、创建货运任务
      45    20、删除任务
      46    21、给任务分配单元
      47    22、将若干单元取消分配任务
      48    23、将某单元取消分配任务
      49    24、删除禁航区或封锁区域
      50    25、添加禁航区
      51    26、添加封锁区
      52    27、添加禁航区或封锁区
      53    28、修改禁航区和封锁区
      54    29、将多个单元作为一个编队
      55    30、分离编组单元
      56    31、将单元移除出编队
      57    32、编队添加一个单元
      58    33、飞机单机出动
      59    34、飞机编组出动
      60    35、飞机准备/备战，飞机挂载武器
      61    36、船舶/潜艇单独出航
      62    37、船舶/潜艇编队出航
      63    38、船舶/潜艇中止出航
      64    39、保持所有单元阵位
      65    40、单元选择新基地/新港口
      66    41、实体返航
      67    42、批量自动攻击某目标
      68    43、开火条件检查
      69    44、情报标识重命名
      70    45、情报标识标记位置
      71    46、标识情报阵营
      72    47、断开若干情报标识
      73    48、修改单元名称
      74    49、战前规划时间，可设置飞机挂载
      75    50、战前规划时间，对战开始之前，设置本单元经纬度位置或高度或深度或航向
      76    51、智能体消息输出接口——纯文本
      77    52、智能体消息输出接口——重要情报（202507版本未实现）
      78    53、智能体消息输出接口——圆形区域显示（跟随单元）（202507版本未实现）
      79    54、智能体消息输出接口——箭头（202507版本未实现）
      80    55、智能体消息输出接口——多边形区域（202507版本未实现）
      81
      82    示例：
      83    air1_id = "sflsf0-gjlsf-sf"  # 飞机guid
      84    air1 = self.get_unit(air1_id)  # 获取飞机对象--进而调用飞机、单元接口，设置飞机条令等
      85    self.doctrine_fuel_state_rtb(FuelStateRTB.No)  # 设置推演方条令，燃油状态返航，operatorbase.py中接口
      86    mission_name = "first_patrol"
      87    patrol_area = [(16.1, -92.3), (16.1, -91.2), (14.9, -91.2), (14.9, -92.3)]  # 纬度、经度
      88    first_patrol = self.create_patrol_mission(mission_name, MissionPatrolType.AIR, patrol_area)  # 创建巡逻任务
      89    select_units_guid = ["air1-fsjlf2sfs", "air2-fsjlf27dg"]  # 飞机列表
      90    self.air_single_out(select_units_guid)  # 飞机起飞
      91    self.zone_add_no_navigate("no-navi1", patrol_area, [1,2])  # 设置飞机、舰船的禁航区
      92    score = self.TotalScore  # 获取此推演方得分
      93    """
      94    __metaclass__ = ABCMeta
      95
      96    def __init__(self, side_name):
      97        GameUnit.__init__(self, "", side_name, side_name, SelectorCategory.Side, ElementType.Side)
      98        self.deduce_remove_mission = None  # 用于删除任务后同步更新到deduce。elements中
      99        self.deduce_add_unit = None  # 全局新增单元或任务
     100        self.get_command_check = None  # 获取指令检查对象
     101        self.log = None  # 平台Log
     102        self.flag = 0
     103        # 智能体动态参数，训练时由配置config.py配置，客户端上推演使用调度功能动态配置
     104        self.client_info = {
     105            'unit': {},
     106            'point': {},
     107            'contact': {}
     108        }  # 智能体通过此属性获取配置的单元、情报或参考点
     109        # 智能体调度决策间隔
     110        self.agent_decision_time = 30  # 推演30秒决策一次（调用一次step）--可自行在智能体类初始化函数里赋值
     111        self.client_info_simple = {}  # 从前端获取的原始单元、情报或参考点
     112        self.agent_type = ""  # 强化学习或规则智能体描述
     113        self.is_rule_agent = True  # 是规则智能体，否则就是强化学习智能体
     114        self.situation_cache = {}, {}  # get_situation缓存
     115        self.last_situation_time = 0  # situation_cache缓存的推演时间
     116        self.simulate_timestamp = 0  # 推演时间戳
     117        self.client_i = 0
     118        self.random_point_name = "%s%d%s" % (chr(65 + randint(0, 25)), randint(0, 9), chr(65 + randint(0, 25)))
     119        self._init()
     120
     121    def _init(self):
     122        # 每局会被调用，注意不要存储需要不变的属性
     123        self.reference_point_index_increment = 1  # 创建参考点的自增命名序号
     124
     125        self.units_of_name = {}
     126        self.situation_cache = {}, {}  # 缓存重置
     127        self.missions_obj = {}  # key:mission name, value: Mission任务对象
     128        self.groups = {}  # key:group guid, value: Group编队对象
     129        self.aircrafts = {}  # key:aircraft guid, value: Aircraft飞机对象
     130        self.ships = {}  # key:ship guid, value: Ship舰船对象
     131        self.submarines = {}  # key:submarine guid, value: Submarine潜艇对象
     132        self.satellites = {}  # key:satellite guid, value: Satellite卫星对象
     133        self.facilitys = {}  # key:facility guid, value: Facility地面装备对象
     134        self.weapons = {}  # key:weapon guid, value: Weapon武器（导弹）对象
     135
     136        self.simulate_time = ""  # 当前推演时间
     137        self.time_elapse = 0  # 当前推演已过时间
     138        self.scenario_duration = 0  # 想定时长（单位：秒）
     139
     140        # THSideInfo、THGeoPoint等结构定义请查看entitys/struct.proto文件
     141        # 结构THSideInfo中属性：（运行过程中变化的数据发送）
     142        self.Postures = {}  # 立场---结构：dict:<string, int32>，key:推演方guid, value: 含义如下：
     143        """
     144        立场值类型含义：
     145        0：中立
     146        1: 友方
     147        2: 非友方
     148        3: 敌方
     149        4: 未知
     150        """
     151        self.CollectiveResponsibility = False  # 分配集体责任
     152        self.MapCenter = {}  # 推演方地图中心点--结构：THGeoPoint
     153        self.CameraAlt = 0.0  # 相机高度
     154        self.AwarenessLevel = 0  # 意识水平
     155        """
     156        0:  Novice,//新手
     157        1:	Cadet,//学员
     158        2:	Regular,//一般
     159        3:	Veteran,//老手
     160        4:	Ace//高手
     161        """
     162        self.ProficiencyLevel = 0  # 熟练程度。参考上面值定义
     163        self.ScoringDisaster = 0  # 评分设置(完败)
     164        self.ScoringTriumph = 0  # 评分设置(完胜)
     165        self.IsAIOnly = False  # 是否电脑控制
     166        self.CATC = False  # 可以自动跟踪平民
     167        self.Briefing = ""  # 简报
     168
     169        # THSide,THDoctrine,THRefPoint等结构定义请查看entitys/struct.proto文件
     170        # 结构THSide中属性： 席位基础数据（触发式变化）
     171        self.Doctrine = {}  # 条例---结构：THDoctrine
     172        self.ReferencePoints = {}  # 参考点---结构：dict:<string, THRefPoint>，key:参考点guid
     173        self.SpecialActions = {}  # 特殊动作---结构：dict:<string, THSpecialAction>，key:特殊动作guid
     174        self.ExclusionZones = {}  # 封锁区---结构：dict:<string, THExclusionZone>，key:封锁区guid
     175        self.NoNavZones = {}  # 禁航区---结构：dict:<string, THNoNavZone>，key:禁航区guid
     176        self.AirCorridorZones = {}  # 空中走廊---结构：dict:<string, THAirCorridorZone>，key:空中走廊guid
     177
     178        # 结构THSideReal中属性： 席位实时变化数据（低频变化[暂定每秒一帧]-----实时变化）
     179        self.ContactAutoIncrement = 0
     180        self.WeaponSalvos = {}  # 齐射信息---结构：dict:<string, THWeaponSalvo>，key:齐射guid
     181        self.TotalScore = 0  # 比分
     182        self.Contacts = {}  # 情报---结构：dict:<string, THContact>，key:情报guid，另外添加Lon, Lat等THPosition中位置属性
     183
     184        # 20250703版态势协议以下三项已删除, 为兼容之前服务端，这里暂留
     185        # 结构THSideVitalChange中属性：  席位下数据关键变化（触发式变化-----不需对比差异，此处有值一定是更新数据，按需累加记录）
     186        self.LoggedMessage = []  # 事件日志信息--THLoggedMessage列表
     187        self.LastDetections = []  # 被探测到的最近信息记录--THLastDetection列表
     188        self.AAR = {}  # 损耗信息---结构：THAAR
     189
     190        # 推演方收到的事件，类型定义请查看envs/utils.py中10行左右，事件类型
     191        self.KeyMsg = {}  # 收到的关键事件--积累存储，含义如下：
     192        """
     193        key: 事件类型，查看envs/utils.py中WEAPON_FIRED_TYPE等事件类型定义
     194        value：WeaponFiredInfo等结构转json字典的列表, WeaponFiredInfo等请查看entitys/struct.proto文件
     195        """
     196        # start.py中配置need_all_side为True，则下面其他推演方信息被赋值
     197        # 智能体强化学习训练计算奖励或评估智能体效能等情况，本推演方可以获取其他推演方事件或实体单元信息，比赛时不可用
     198        self.current_players = {}  # key: 推演方名， value: Player对象，从Player对象中可获取所有实体、事件信息
     199        # 其他推演方，包含敌对、中立、友方，用于获取数据评估或强化学习计算奖励，不可操作其他方单元等
     200        self.friend_side_units = {}  # key: side name, value: unit dict
     201        self.simulate_timestamp = 0  # 推演时间戳
     202
     203    def step(self, time_elapse, situation):
     204        """
     205        子类实现
     206        进行对抗推演
     207        :param time_elapse:int, 推演仿真时间，单位：秒，取值0-推演总时间秒数
     208        :param situation: tuple,  units dict, contacts dict
     209        :return:
     210        """
     211        pass
     212
     213    def initial(self, situation):
     214        """
     215        重置智能体
     216        可每局推演初始化变量，可赛前规划，可以用于创建任务，修改任务，设置条令，设置作战单元雷达开关机等
     217        :param situation: tuple, units dict, contacts dict
     218        :return:
     219        """
     220        pass
     221
     222    def is_done(self):
     223        """
     224        智能体主动判断结束本局
     225        """
     226        return False
     227
     228    def deduction_end(self):
     229        """
     230        一局推演结束后，调用的函数，可用于保存模型等
     231        """
     232        pass
     233
     234    # ---------智能体框架调用接口：勿动------------------------------
     235
     236    def reset(self):
     237        self._init()
     238
     239    def update_units_of_names(self):
     240        self.units_of_name = {}
     241        for id, obj in self.groups.items():
     242            self.units_of_name[obj.Name] = obj
     243
     244        for id, obj in self.aircrafts.items():
     245            self.units_of_name[obj.Name] = obj
     246
     247        for id, obj in self.ships.items():
     248            self.units_of_name[obj.Name] = obj
     249
     250        for id, obj in self.submarines.items():
     251            self.units_of_name[obj.Name] = obj
     252
     253        for id, obj in self.satellites.items():
     254            self.units_of_name[obj.Name] = obj
     255
     256        for id, obj in self.facilitys.items():
     257            self.units_of_name[obj.Name] = obj
     258
     259        for id, obj in self.weapons.items():
     260            self.units_of_name[obj.Name] = obj
     261
     262    def update_constant_attribute(self, base_data_player):
     263        """
     264        本对象的整数、布尔、字符串、浮点数从数据智能体对象赋值
     265        每步态势更新都赋值
     266        """
     267        self.simulate_time = base_data_player.simulate_time  # 当前推演时间
     268        # self.scenario_duration = base_data_player.scenario_duration  # 想定时长（单位：秒）
     269        # self.CollectiveResponsibility = base_data_player.CollectiveResponsibility  # 分配集体责任
     270        # self.CameraAlt = base_data_player.CameraAlt  # 相机高度
     271        # self.AwarenessLevel = base_data_player.AwarenessLevel  # 意识水平
     272        # self.ProficiencyLevel = base_data_player.ProficiencyLevel  # 熟练程度。参考上面值定义
     273        # self.ScoringDisaster = base_data_player.ScoringDisaster  # 评分设置(完败)
     274        # self.ScoringTriumph = base_data_player.ScoringTriumph  # 评分设置(完胜)
     275        # self.IsAIOnly = base_data_player.IsAIOnly  # 是否电脑控制
     276        # self.CATC = base_data_player.CATC  # 可以自动跟踪平民
     277        # self.Briefing = base_data_player.Briefing  # 简报
     278        self.TotalScore = base_data_player.TotalScore
     279        self.time_elapse = base_data_player.time_elapse  # 当前推演已过时间
     280        self.simulate_timestamp = base_data_player.simulate_timestamp
     281
     282    def update_object_attribute(self, base_data_player):
     283        """
     284        本对象的字典、列表从数据智能体对象赋值
     285        初始态势赋值后，每步更新态势后，base_data_player的字典、列表赋值后，本对象的属性自动赋值
     286        """
     287        self.ID = base_data_player.ID  # SIDE ID
     288        self.units_of_name = base_data_player.units_of_name
     289        self.missions_obj = base_data_player.missions_obj  # key:mission name, value: Mission任务对象
     290        self.groups = base_data_player.groups  # key:group guid, value: Group编队对象
     291        self.aircrafts = base_data_player.aircrafts  # key:aircraft guid, value: Aircraft飞机对象
     292        self.ships = base_data_player.ships  # key:ship guid, value: Ship舰船对象
     293        self.submarines = base_data_player.submarines  # key:submarine guid, value: Submarine潜艇对象
     294        self.satellites = base_data_player.satellites  # key:satellite guid, value: Satellite卫星对象
     295        self.facilitys = base_data_player.facilitys  # key:facility guid, value: Facility地面装备对象
     296        self.weapons = base_data_player.weapons  # key:weapon guid, value: Weapon武器（导弹）对象
     297        self.Postures = base_data_player.Postures  # 立场---结构：dict:<string, int32>，key:推演方guid
     298        self.MapCenter = base_data_player.MapCenter  # 推演方地图中心点--结构：THGeoPoint
     299
     300        self.Doctrine = base_data_player.Doctrine  # 条例---结构：THDoctrine
     301        self.ReferencePoints = base_data_player.ReferencePoints  # 参考点---结构：dict:<string, THRefPoint>，key:参考点guid
     302        self.SpecialActions = base_data_player.SpecialActions  # 特殊动作---结构：dict:<string, THSpecialAction>，key:特殊动作guid
     303        self.ExclusionZones = base_data_player.ExclusionZones  # 封锁区---结构：dict:<string, THExclusionZone>，key:封锁区guid
     304        self.NoNavZones = base_data_player.NoNavZones  # 禁航区---结构：dict:<string, THNoNavZone>，key:禁航区guid
     305        self.AirCorridorZones = base_data_player.AirCorridorZones  # 空中走廊---结构：dict:<string, THAirCorridorZone>，key:空中走廊guid
     306
     307        self.WeaponSalvos = base_data_player.WeaponSalvos  # 齐射信息---结构：dict:<string, THWeaponSalvo>，key:齐射guid
     308        self.Contacts = base_data_player.Contacts  # 情报---结构：dict:<string, THContact>，key:情报guid，另外添加Lon, Lat等THPosition中位置属性
     309
     310        # 结构THSideVitalChange中属性：  席位下数据关键变化（触发式变化-----不需对比差异，此处有值一定是更新数据，按需累加记录）
     311        self.LoggedMessage = base_data_player.LoggedMessage  # 事件日志信息--THLoggedMessage列表
     312        self.LastDetections = base_data_player.LastDetections  # 被探测到的最近信息记录--THLastDetection列表
     313        self.AAR = base_data_player.AAR  # 损耗信息---结构：THAAR
     314
     315        # 推演方收到的事件，类型定义请查看envs/utils.py中10行左右，事件类型
     316        self.KeyMsg = base_data_player.KeyMsg  # 收到的关键事件--积累存储
     317        self.current_players = base_data_player.current_players  # 其他推演方，包含敌对、中立、友方
     318        self.friend_side_units = base_data_player.friend_side_units
     319
     320    def info_extract(self):
     321        if not isinstance(self.client_info, dict):
     322            self.client_info = {}
     323        if 'unit' not in self.client_info or not self.client_info["unit"]:
     324            self.client_info["unit"] = {}
     325        if "point" not in self.client_info or not self.client_info["point"]:
     326            self.client_info["point"] = {}
     327        if "contact" not in self.client_info or not self.client_info["contact"]:
     328            self.client_info["contact"] = {}
     329        if not (self.client_info["unit"] or self.client_info["point"] or self.client_info["contact"]):
     330            return
     331        if not (isinstance(self.client_info['unit'], list) or
     332                isinstance(self.client_info['point'], list) or
     333                isinstance(self.client_info['contact'], list)):
     334            return
     335        temp_unit_dict = {}
     336        for name in self.client_info['unit']:
     337            if name in self.units_of_name:
     338                unit_id = self.units_of_name[name].ID
     339                temp_unit_dict[unit_id] = {
     340                    'id': unit_id,
     341                    'name': name,
     342                    'situation_keys': []
     343                }
     344        temp_point_dict = {}
     345        for point in self.client_info['point']:
     346            for reference_points, point_info in self.ReferencePoints.items():
     347                if point_info['Name'] == point:
     348                    temp_point_dict[reference_points]: dict = {}
     349                    temp_point_dict[reference_points]['id'] = reference_points
     350                    temp_point_dict[reference_points]['name'] = point
     351                    temp_point_dict[reference_points]['situation_keys'] = []
     352        temp_contact_dict = {}
     353        for contact in self.client_info['contact']:
     354            for c_id, Cont in self.Contacts.items():
     355                if Cont['Name'] == contact:
     356                    temp_contact_dict[c_id]: dict = {}
     357                    temp_contact_dict[c_id]['id'] = c_id
     358                    temp_contact_dict[c_id]['name'] = contact
     359                    temp_contact_dict[c_id]['situation_keys'] = []
     360        self.client_info['unit'] = temp_unit_dict
     361        self.client_info['point'] = temp_point_dict
     362        self.client_info['contact'] = temp_contact_dict
     363
     364    def delete_element(self, del_guid, element_type, unit_name=""):
     365        """
     366        删除对象
     367        :return:
     368        """
     369        del_list = []
     370        try:
     371            if element_type == ElementType.Aircraft:
     372                del self.aircrafts[del_guid]
     373            elif element_type == ElementType.Ship:
     374                del self.ships[del_guid]
     375            elif element_type == ElementType.Submarine:
     376                del self.submarines[del_guid]
     377            elif element_type == ElementType.Satellite:
     378                del self.satellites[del_guid]
     379            elif element_type == ElementType.Facility:
     380                del self.facilitys[del_guid]
     381            elif (element_type == ElementType.SupportMission
     382                  or element_type == ElementType.StrikeMission
     383                  or element_type == ElementType.PatrolMission
     384                  or element_type == ElementType.FerryMission
     385                  or element_type == ElementType.MineMission
     386                  or element_type == ElementType.MineClearMission
     387                  or element_type == ElementType.CargoMission):
     388                if unit_name in self.missions_obj:
     389                    del self.missions_obj[unit_name]
     390            elif element_type == ElementType.Weapon:
     391                del self.weapons[del_guid]
     392            elif element_type == ElementType.Group:
     393                del self.groups[del_guid]
     394        except Exception as e:
     395            if self.log is not None:
     396                self.log.error("错误！删除推演方-%s-中元素，但不存在：%s" % (self.Name, str(e)))
     397            else:
     398                print("错误！删除推演方-%s-中元素，但不存在：%s" % (self.Name, str(e)))
     399        del_list.append(del_guid)
     400        return del_list
     401
     402    def set_agent_decision_time(self, time: int):
     403        """
     404        设置智能体调度时调用的决策间隔，决策间隔为仿真时间s
     405        输入：设置的决策间隔，单位s
     406        """
     407        self.agent_decision_time = time
     408
     409    def set_simulate_time(self, str_simulate_time):
     410        self.simulate_time = str_simulate_time
     411
     412    def set_scenario_duration(self, scenario_duration):
     413        self.scenario_duration = scenario_duration
     414
     415    def set_time_elapse(self, time_elapse):
     416        self.time_elapse = time_elapse
     417
     418    def get_situation(self):
     419        """
     420        获取当前态势
     421        :return: tuple, 例: {unit_id1:unit1_info, unit_id2:unit2_info}, {contact_id1:contact1_info, contact_id2:contact2_info}
     422        """
     423        if self.situation_cache[0] and self.time_elapse < self.last_situation_time + 0.05:
     424            # 最小区分态势推进50毫秒
     425            return self.situation_cache
     426        else:
     427            unit_info = {}
     428            for guid, unit in self.aircrafts.items():
     429                unit_info[guid] = unit.get_summary_info()
     430            for guid, unit in self.facilitys.items():
     431                unit_info[guid] = unit.get_summary_info()
     432            for guid, unit in self.ships.items():
     433                unit_info[guid] = unit.get_summary_info()
     434            for guid, unit in self.submarines.items():
     435                unit_info[guid] = unit.get_summary_info()
     436            for guid, unit in self.satellites.items():
     437                unit_info[guid] = unit.get_summary_info()
     438            for guid, unit in self.weapons.items():
     439                unit_info[guid] = unit.get_summary_info()
     440            for guid, unit in self.groups.items():
     441                unit_info[guid] = unit.get_summary_info()
     442            self.situation_cache = unit_info, self.Contacts
     443            self.last_situation_time = self.time_elapse
     444            return self.situation_cache
     445
     446    def get_zone_str(self, point_list):
     447        """
     448        获取任务点形成的lua脚步参数
     449        :param point_list: list, 参考点列表
     450        :return: str, lua脚本参数
     451        """
     452        if not point_list:
     453            return ""
     454
     455        point_names = []
     456        if isinstance(point_list[0], str):
     457            for name in point_list:
     458                point_names.append('"' + name + '"')
     459        else:
     460            # 创建参考点
     461            names = self.reference_point_add(point_list)
     462            for name in names:
     463                point_names.append('"' + name + '"')
     464        return 'Zone={' + ','.join(point_names) + '}'
     465
     466    def get_prosecution_zone(self, point_list):
     467        """
     468        获取任务点(警戒区)形成的lua脚步参数
     469        :param point_list: list, 参考点列表
     470        :return: str, lua脚步参数
     471        """
     472        if not point_list:
     473            return ""
     474
     475        point_names = []
     476        if isinstance(point_list[0], str):
     477            for name in point_list:
     478                point_names.append('"' + name + '"')
     479        else:
     480            # 创建参考点
     481            names = self.reference_point_add(point_list)
     482            for name in names:
     483                point_names.append('"' + name + '"')
     484        return 'prosecutionZone={' + ','.join(point_names) + '}'
     485
     486    def save_mission(self, mission_name, mission_return_str, mission_category):
     487        """
     488        保存任务到本方，方便以后调用
     489        :param mission_name: 任务名
     490        :param mission_return_str: 任务调用返回值
     491        :param mission_category: ElementType, 任务类型
     492        :return: Mission, Mission实例
     493        """
     494        new_mission = None
     495        mission_guid = cf.mission_guid_parser(mission_return_str)
     496        if mission_category == ElementType.PatrolMission:
     497            new_mission = PatrolMission(mission_guid, mission_name, self.Name)
     498        elif mission_category == ElementType.StrikeMission:
     499            new_mission = StrikeMission(mission_guid, mission_name, self.Name)
     500        elif mission_category == ElementType.SupportMission:
     501            new_mission = SupportMission(mission_guid, mission_name, self.Name)
     502        elif mission_category == ElementType.FerryMission:
     503            new_mission = FerryMission(mission_guid, mission_name, self.Name)
     504        elif mission_category == ElementType.CargoMission:
     505            new_mission = CargoMission(mission_guid, mission_name, self.Name)
     506        elif mission_category == ElementType.MineMission:
     507            new_mission = MineMission(mission_guid, mission_name, self.Name)
     508        elif mission_category == ElementType.MineClearMission:
     509            new_mission = MineClearMission(mission_guid, mission_name, self.Name)
     510        if new_mission is not None:
     511            self.missions_obj[mission_name] = new_mission
     512            self.deduce_add_unit(mission_guid, new_mission)
     513            new_mission._game_server = self._game_server
     514            if mission_category == ElementType.StrikeMission:
     515                new_mission.escort._game_server = self._game_server
     516        return new_mission
     517
     518    # ---------智能体可调用接口：------------------------------
     519
     520    def get_mission_by_name(self, mission_name):
     521        """
     522        1、通过任务名获取任务对象
     523        :param mission_name: str，任务名
     524        :return: 任务对象
     525        """
     526        if mission_name in self.missions_obj:
     527            return self.missions_obj[mission_name]
     528        else:
     529            return None
     530
     531    def get_unit(self, guid):
     532        """
     533        2、获取实体单元对象
     534        :param guid: str, 实体guid
     535        :return: Unit, 作战单元对象
     536        """
     537        if guid in self.aircrafts:
     538            return self.aircrafts[guid]
     539        if guid in self.ships:
     540            return self.ships[guid]
     541        if guid in self.submarines:
     542            return self.submarines[guid]
     543        if guid in self.satellites:
     544            return self.satellites[guid]
     545        if guid in self.facilitys:
     546            return self.facilitys[guid]
     547        if guid in self.weapons:
     548            return self.weapons[guid]
     549        if guid in self.groups:
     550            return self.groups[guid]
     551        return None
     552
     553    def get_contact(self, contact_guid):
     554        """
     555        3、获取情报信息
     556        :param contact_guid:  情报对象guid, 非实际单元guid
     557        :return: dict 如果存在此情报id, 否则返回None
     558        """
     559        if contact_guid in self.Contacts:
     560            return self.Contacts[contact_guid]
     561        else:
     562            return None
     563
     564    def get_weather(self):
     565        """
     566        4、获取当前天气
     567        :return: str, 当前前天数据
     568        """
     569        return self._game_server.api_get_weather(self)
     570
     571    def get_elevation(self, coord_point):
     572        """
     573        5、获取某点（纬经度）高程----勿智能体训练或调度时大规模调用，以防服务器过载！
     574        :param coord_point: tuple, (float, float) (lat, lon)
     575        :return: int, 地形高程数据
     576        """
     577        return self._game_server.api_get_elevation(self, coord_point)
     578
     579    def reference_point_add(self, points):
     580        """
     581        6、添加一个或多个参考点
     582        :param points: tuple, 或list,  参考点列表,例:(40.2, 49.6) 或 [(40, 39.0), (41, 39.0)]，其中纬度值在前，经度值在后
     583                                                或者 (40.2, 49.6, 'RP002') 或 [(40, 39.0, 'RP1'), (41, 39.0, 'RP2')]，已传入参考点命名
     584        :return: list, 按顺序添加成功的参考点名列表
     585        """
     586        return self._game_server.api_reference_point_add(self, points)
     587
     588    def reference_point_move(self, rp_name, new_coord):
     589        """
     590        7、移动参考点的位置
     591        :param rp_name: str, 参考点名称
     592        :param new_coord: tuple, 新的纬度、经度位置 (lat, lon)
     593        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     594        """
     595        return self._game_server.api_reference_point_move(self, rp_name, new_coord)
     596
     597    def reference_point_delete(self, rp_name):
     598        """
     599        8、删除参考点
     600        :param rp_name:  str, 参考点名称
     601        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     602        """
     603        self._game_server.api_reference_point_delete(self, rp_name)
     604
     605    def add_reference_point_list(self, points):
     606        """
     607        9、批量增加多个参考点
     608        :param points: list, 参考点列表，格式：[(50.2,149,'RP-1'),(51,149.6,'RP-2')] 纬度，经度和名称
     609                                    或不指定参考点名：[(50.2,149),(51,149.6)] 纬度，经度
     610        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     611        """
     612        return self._game_server.api_add_reference_point_list(self, points)
     613
     614    def assign_units_to_mission(self, unit_list, mission_name, is_escort=False):
     615        """
     616        10、分配多个单元到任务
     617        :param unit_list: list, 实体guid列表
     618        :param mission_name: str, 分配的任务名
     619        :param is_escort: bool, 是否打击任务的护航任务
     620        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     621        """
     622        return self._game_server.api_assign_units_to_mission(self, unit_list, mission_name, is_escort)
     623
     624    def clear_unit_course(self, guid):
     625        """
     626        11、清除单元所有航路点
     627        :param guid: str, 单元guid
     628        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     629        """
     630        self._game_server.api_clear_unit_course(self, guid)
     631
     632    def create_patrol_mission(self, name, mission_type, point_list):
     633        """
     634        12、创建巡逻任务, 例子：
     635            create_patrol_mission('空战巡逻中央区', MissionPatrolType.AIR, [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)])
     636        :param name: str, 任务名
     637        :param mission_type: MissionPatrolType, 任务类型
     638        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
     639                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
     640                            或者['RP1', 'RP2'，'RP3'，'RP4']，传入参考点名称要求提前创建好参考点
     641        :return: PatrolMission, 任务实体
     642        """
     643        return self._game_server.api_create_patrol_mission(self, name, mission_type, point_list)
     644
     645    def add_prosecution_zone(self, mission_name, point_list):
     646        """
     647        13、增加巡逻任务的警戒区
     648        :param mission_name: str, 任务名
     649        :param point_list: list, list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
     650                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
     651                            或者['RP1', 'RP2'，'RP3'，'RP4']，传入参考点名称要求提前创建好参考点
     652        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     653        """
     654        return self._game_server.api_add_prosecution_zone(self, mission_name, point_list)
     655
     656    def create_strike_mission(self, name, mission_type):
     657        """
     658        14、创建打击任务
     659        :param name: str, 任务名
     660        :param mission_type: MissionStrikeType, 打击任务类型，对空打击，对地打击等
     661        :return: StrikeMission, 任务实体
     662        """
     663        return self._game_server.api_create_strike_mission(self, name, mission_type)
     664
     665    def create_support_mission(self, name, point_list):
     666        """
     667        15、创建支援任务, 例子：
     668            create_support_mission('空中支援', [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)])
     669        :param name: str, 任务名
     670        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
     671                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
     672                            或者['RP1', 'RP2'，'RP3'，'RP        4']，传入参考点名称要求提前创建好参考点
     673        :return: SupportMission, 任务实体
     674        """
     675        return self._game_server.api_create_support_mission(self, name, point_list)
     676
     677    def create_ferry_mission(self, name, destination):
     678        """
     679        16、创建转场任务
     680        :param name: str, 任务名
     681        :param destination: str, 目的地guid
     682        :return: FerryMission, 任务实体
     683        """
     684        return self._game_server.api_create_ferry_mission(self, name, destination)
     685
     686    def create_mine_mission(self, name, point_list):
     687        """
     688        17、创建布雷任务, 例子：
     689            create_mine_mission('布雷2', [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)])
     690        :param name: str, 任务名
     691        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
     692                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
     693                            或者['RP1', 'RP2'，'RP3'，'RP        4']，传入参考点名称要求提前创建好参考点
     694        :return: MineMission, 任务实体
     695        """
     696        return self._game_server.api_create_mine_mission(self, name, point_list)
     697
     698    def create_mineclear_mission(self, name, point_list):
     699        """
     700        18、创建扫雷任务, 例子：
     701            create_mineclear_mission('绝对扫雷', [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)])
     702        :param name: str, 任务名
     703        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
     704                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
     705                            或者['RP1', 'RP2'，'RP3'，'RP        4']，传入参考点名称要求提前创建好参考点
     706        :return: MineClearMission, 任务实体
     707        """
     708        return self._game_server.api_create_mineclear_mission(self, name, point_list)
     709
     710    def create_cargo_mission(self, name, point_list):
     711        """
     712        19、创建货运任务
     713        :param name: str, 任务名
     714        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
     715                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
     716                            或者['RP1', 'RP2'，'RP3'，'RP        4']，传入参考点名称要求提前创建好参考点
     717        :return: CargoMission, 任务实体
     718        """
     719        return self._game_server.api_create_cargo_mission(self, name, point_list)
     720
     721    def delete_mission(self, mission_name):
     722        """
     723        20、删除任务
     724        :param mission_name: str, 任务名称
     725        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     726        """
     727        return self._game_server.api_delete_mission(self, mission_name)
     728
     729    def assign_unit_mission(self, unit_id, mission_name):
     730        """
     731        21、给任务分配单元
     732        :param unit_id: str, 单元guid
     733        :param mission_name: str, 拟分配的任务名
     734        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     735        """
     736        return self._game_server.api_assign_unit_mission(self, unit_id, mission_name)
     737
     738    def units_withdraw_from_mission(self, units):
     739        """
     740        22、将若干单元取消分配任务
     741        :param units: list, 取消任务的单元guid列表
     742        :return: None
     743        """
     744        self._game_server.api_units_withdraw_from_mission(self, units)
     745
     746    def del_unit_from_mission(self, unit_guid):
     747        """
     748        23、将某单元取消分配任务
     749        :param unit_guid: str, 单元guid
     750        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     751        """
     752        return self._game_server.api_del_unit_from_mission(self, unit_guid)
     753
     754    def zone_remove(self, zone_type, zone_guid):
     755        """
     756        24、删除禁航区或封锁区域
     757        :param zone_type: int, 1:封锁区，0：禁航区
     758        :param zone_guid: str, 区域的guid
     759        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     760        """
     761        return self._game_server.api_zone_remove(self, zone_type, zone_guid)
     762
     763    def zone_add_no_navigate(self, name, reference_points, affects=None):
     764        """
     765        25、添加禁航区
     766        :param name: str, 禁航区名
     767        :param reference_points:list, 参考点列表, 例:[(40, 139.0), (41, 139.0), (41, 140.0)], 先纬度，再经度；
     768                                        或指定参考点名：[(40, 139.0,'RP1'), (41, 139.0,'RP2'), (41, 140.0,'RP3')],先纬度，再经度
     769        :param affects: list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用
     770                            1:飞机；2:水面舰艇; 3:潜艇；4:地面单元
     771        :return:str, zone guid
     772        """
     773        if affects is None:
     774            affects = [1, 2, 3, 4]
     775        return self.zone_add(reference_points, 0, name, affects)
     776
     777    def zone_add_exclusion(self, name, reference_points, affects=None):
     778        """
     779        26、添加封锁区
     780        :param name: str, 封锁区名
     781        :param reference_points:list, 参考点列表， 例:[(40, 139.0), (41, 139.0), (41, 140.0)], 先纬度，再经度
     782                                    或指定参考点名：[(40, 139.0,'RP2'), (41, 139.0,'RP3'), (41, 140.0,'RP4')],先纬度，再经度,再参考点名
     783        :param affects: list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用
     784                            1:飞机；2:水面舰艇; 3:潜艇；4:地面单元
     785        :return:str, zone guid
     786        """
     787        if affects is None:
     788            affects = [1, 2, 3, 4]
     789        return self.zone_add(reference_points, 1, name, affects)
     790
     791    def zone_add(self, reference_points, zone_type, zone_name, affects=None):
     792        """
     793        27、添加禁航区或封锁区
     794        :param reference_points:  list, 区域点列表
     795        :param zone_type: int, 1: 封锁区   0:禁航区
     796        :param zone_name:  区域名
     797        :param affects: list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用
     798                            1:飞机；2:水面舰艇; 3:潜艇；4:地面单元
     799        :return: str, zone guid
     800        """
     801        zone_guid = self._game_server.api_zone_add(self, reference_points, zone_type, zone_name, affects)
     802        return cf.zone_guid_parser(zone_guid)
     803
     804    def zone_set(self, zone_type, zone_name, **kwargs):
     805        """
     806        28、修改禁航区和封锁区
     807        :param zone_type: int, 1: 封锁区   0:禁航区
     808        :param zone_name: 禁航区和封锁区的名
     809        :param kwargs:  关键字参数  Area：list, 参考点列表， 例:[(40, 139.0), (41, 139.0), (41, 140.0)], 先纬度，再经度
     810                                    或指定参考点名：[(40, 139.0,'RP2'), (41, 139.0,'RP3'), (41, 140.0,'RP4')],先纬度，再经度,再参考点名
     811                                    或使用已建立参考点，则用参考点名列表，例: ['RP1', 'RP2', 'RP3']
     812                        Rename: str  新名字
     813                        Isactive： bool 是否启用
     814                        Affects： list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用;
     815                                    [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用
     816                                    1:飞机；2:水面舰艇; 3:潜艇；4:地面单元
     817                        Locked：bool 是否区域已锁定(只有禁航区才需要设置)
     818                        MarkAs： int 2=非友方，3=敌方（封锁区才有的设置）
     819        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     820        """
     821        return self._game_server.api_zone_set(self, zone_type, zone_name, **kwargs)
     822
     823    def group_add(self, list_unit_guid, group_name=""):
     824        """
     825        29、将多个单元作为一个编队
     826        :param list_unit_guid: list, 例：['2abc947e-8352-4639-9184-641706730018',
     827                                            '640a7c08-a17a-4fba-b055-07b568f22df5']
     828        :param group_name: str, 编队名
     829        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     830        """
     831        return self._game_server.api_group_add(self, list_unit_guid, group_name)
     832
     833    def group_detach(self, list_unit_guid):
     834        """
     835        30、分离编组单元
     836        :param list_unit_guid: list, 例：['2abc947e-8352-4639-9184-641706730018','640a7c08-a17a-4fba-b055-07b568f22df5']
     837        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     838        """
     839        return self._game_server.api_group_detach(self, list_unit_guid)
     840
     841    def group_remove_unit(self, unit_guid):
     842        """
     843        31、将单元移除出编队
     844        :param unit_guid: 作战单元guid
     845        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     846        """
     847        return self._game_server.api_group_remove_unit(self, unit_guid)
     848
     849    def group_add_unit(self, group_guid, unit_guid):
     850        """
     851        32、编队添加一个单元
     852        :param group_guid: 编队guid
     853        :param unit_guid: 作战单元guid
     854        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     855        """
     856        return self._game_server.api_group_add_unit(self, group_guid, unit_guid)
     857
     858    def air_single_out(self, air_guid_list):
     859        """
     860        33、飞机单机出动
     861        :param air_guid_list: list, 飞机的guid列表，  例子：['58ba-4013-92f5-2ewds','58ba-4013-92f5-2efa0']
     862        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     863        """
     864        return self._game_server.api_air_single_out(self, air_guid_list)
     865
     866    def air_group_out(self, air_guid_list):
     867        """
     868        34、飞机编组出动
     869        :param air_guid_list:  list, 飞机的guid列表，  例子：['4013-92f5-2effc','4013-92f5-d2fa0']
     870        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     871        """
     872        return self._game_server.api_air_group_out(self, air_guid_list)
     873
     874    def aircraft_action_ready(self, mode, guid_list, loadout_id, qt_enabled):
     875        """
     876        35、飞机准备/备战，飞机挂载武器;
     877        :param mode: 1: 准备就绪; 2: 准备就绪（不包括可选武器）
     878        :param guid_list: list, 飞机guid列表
     879        :param loadout_id: int, 挂载方案ID
     880        :param qt_enabled: bool, 是否快速出动, 如快速出动需提前确认此挂载是否快速出动
     881        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     882        """
     883        return self._game_server.api_aircraft_action_ready(self, mode, guid_list, loadout_id, qt_enabled)
     884
     885    def ship_action_alone(self, guid_list):
     886        """
     887        36、船舶/潜艇单独出航
     888        :param guid_list: list, 舰船guid列表
     889        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     890        """
     891        return self._game_server.api_ship_action_alone(self, guid_list)
     892
     893    def ship_action_group(self, guid_list):
     894        """
     895        37、船舶/潜艇编队出航
     896        :param guid_list: list, 舰船guid列表
     897        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     898        """
     899        return self._game_server.api_ship_action_group(self, guid_list)
     900
     901    def ship_action_stop(self, guid_list):
     902        """
     903        38、船舶/潜艇中止出航
     904        :param guid_list: list, 舰船guid列表
     905        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     906        """
     907        return self._game_server.api_ship_action_stop(self, guid_list)
     908
     909    def hold_position_all_unit(self, is_hold):
     910        """
     911        39、保持所有单元阵位，所有单元停止机动，留在原地
     912        :param is_hold: bool
     913        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     914        """
     915        return self._game_server.api_hold_position_all_unit(self, is_hold)
     916
     917    def unit_select_new_base(self, unit_guid, base_guid):
     918        """
     919        40、单元选择新基地/新港口
     920        :param unit_guid: 单元的guid
     921        :param base_guid: 新基地的guid
     922        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     923        """
     924        return self._game_server.api_unit_select_new_base(self, unit_guid, base_guid)
     925
     926    def unit_return_to_base(self, unit_guid):
     927        """
     928        41、实体返航
     929        :param unit_guid: 单元的guid
     930        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     931        """
     932        return self._game_server.api_unit_return_to_base(self, unit_guid)
     933
     934    def attack_contact_by_list(self, attack_list):
     935        """
     936        42、批量自动攻击某目标
     937        :param attack_list, 攻击信息列表，每条信息包含一个元组, [(attack_id, target_id, weapon_id, weapon_count)]
     938                                                            攻击单元guid, 目标guid, 武器型号id, 武器数量
     939                例：[('guid1-2fljs', 'target1-fjslfjl2', 0, 0),     weapon_id=0代表自动打击，系统自动选择武器打击目标
     940                    ('guid1-3fljs', 'target3f-fjslfjd', 2880, 2)]  weapon_id=2880，手动攻击，指定打击的武器和数量
     941        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     942        """
     943        return self._game_server.api_attack_contact_by_list(self, attack_list)
     944
     945    def check_weapon_fire_condition(self, units_contacts):
     946        """
     947        43、开火条件检查, 返回检查开火条件结果； 耗时, 谨慎调用, 请勿每天文时间10秒调用超过3次！！！
     948        :param units_contacts:list, or tuple, example:  [(unit1, target1),(unit2, target2)] or (unit1, target1)
     949        :return: dict, 例子：
     950            {"1796":{"AmmoTotal":5,"AmmoDist":0,"AutoFire":"不能自动开火，目标超出武器射程",
     951            "Status":"自由开火","Authorize":"每次齐射发射所有武器. 最大射程武器发射. 飞机-第四代战斗机/攻击[敏捷性/通用：4.0～4.9]（F-14、F-15、F-16、MiG-29、Su-27）",
     952            "ManualFire":{"目标超出武器射程":5}},
     953            "1896":{"AmmoTotal":2,"AmmoDist":0,"AutoFire":"不能自动开火，目标超出武器射程","Status":"自由开火",
     954            "Authorize":"1x rnd 每次齐射. 最大射程武器发射. 飞机-第四代战斗机/攻击[敏捷性/通用：4.0～4.9]（F-14、F-15、F-16、MiG-29、Su-27）",
     955            "ManualFire":{"目标超出武器射程":2}},
     956            "2056":{"AmmoTotal":6,"AmmoDist":0,"AutoFire":"OK","Status":"自由开火",
     957            "Authorize":"1x rnd 每次齐射. 15海里 最大射程. 飞机-第四代战斗机/攻击[敏捷性/通用：4.0～4.9]（F-14、F-15、F-16、MiG-29、Su-27）",
     958            "ManualFire":{"OK":6}}}
     959        """
     960        return self._game_server.api_check_weapon_fire_condition(self, units_contacts)
     961
     962    def contact_rename(self, contact_id, new_name):
     963        """
     964        44、情报标识重命名
     965        :param contact_id: str, contact id
     966        :param new_name: str, new name
     967        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     968        """
     969        return self._game_server.api_contact_rename(self, contact_id, new_name)
     970
     971    def contact_mark_position(self, contact_id):
     972        """
     973        45、情报标识标记位置
     974        :param contact_id:str, contact id
     975        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     976        """
     977        return self._game_server.api_contact_mark_position(self, contact_id)
     978
     979    def contact_mark_posture(self, contact_id, posture):
     980        """
     981        46、标识情报阵营
     982        :param contact_id: str, 情报id
     983        :param posture: 枚举ContactStance, global_util.py中定义
     984        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     985        """
     986        return self._game_server.api_contact_mark_posture(self, contact_id, posture)
     987
     988    def contact_drop_target(self, contact_id):
     989        """
     990        47、断开若干情报标识
     991        :param contact_id: str, 情报id; 或list, 情报id列表
     992        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     993        """
     994        return self._game_server.api_contact_drop_target(self, contact_id)
     995
     996    def unit_newname(self, guid, newname):
     997        """
     998        48、修改单元名称
     999        :param guid:str, 单元guid
    1000        :param newname:str, 单元名
    1001        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    1002        """
    1003        return self._game_server.api_unit_newname(self, guid, newname)
    1004
    1005    def set_aircraft_loadout_plan_time(self, unit_id, loadoutID):
    1006        """
    1007        49、战前规划时间，可设置飞机挂载，不限制机场或航母弹药，准备时间为0，即可马上准备好
    1008        :param unit_id: str, 单元id或单元名称
    1009        :param loadoutID: int  武器挂载方案ID
    1010        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    1011        """
    1012        return self._game_server.api_set_loadout_plan_time(self.get_command_check(unit_id), loadoutID)
    1013
    1014    def unit_new_position(self, unit_guid, lon_lat=None, alt=None, depth=None, heading=None):
    1015        """
    1016        50、战前规划时间，对战开始之前，设置本单元经纬度位置或高度或深度或航向
    1017        飞机、舰船、潜艇可以移动到距初始位置最大距离（20千米）内任意位置（符合地形-例：船在海中，飞机不可在山内）
    1018        正式推演对战之后，本接口会调用失效并给出提示！
    1019        :param unit_guid: str, 本推演方单元guid
    1020        :param lon_lat: tuple, 经度、纬度的元组，(float,float) 需要移动单元到的目的地经度纬度
    1021                                东经0到180，西经-180到0；北纬0到90，南纬-90到0
    1022        :param alt: float, 单元的目标高度（仅用于飞机），米
    1023        :param depth: float, 单元的目标深度（仅用于潜艇），米，正数即可
    1024        :param heading: float, 单元的目标航向，0到360度，正北为0，顺时针增大到360
    1025        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    1026        """
    1027        return self._game_server.unit_new_position(self.get_command_check(unit_guid), long_lat=lon_lat,
    1028                                                   altitude=alt, new_depth=depth, new_heading=heading)
    1029
    1030    def agent_message_text(self, text):
    1031        """
    1032        51、客户端应用智能体中，智能体消息输出接口——纯文本
    1033        :param text: str, 纯文本消息
    1034        :return: str, 返回信息
    1035        """
    1036        return self._game_server.agent_message_ouput(data_type=0, message={}, text=text, timestamp=self.simulate_timestamp)
    1037
    1038    def agent_message_intelligence(self, level, contact_id, text):
    1039        """
    1040        52、客户端应用智能体中，智能体消息输出接口——重要情报（202507版本未实现）
    1041        :param level: int
    1042            level重要情报层级：
    1043                1：一级情报，核心情报信息，显示为红色
    1044                2：二级情报，重要情报信息，显示为橙色
    1045                3：三级情报，一般情报信息，显示为白色
    1046        :param contact_id: str, 情报ID
    1047        :param text: str, 纯文本消息
    1048        :return: str, 返回信息
    1049        """
    1050        message = {
    1051            'level': level,
    1052            'contact_id': contact_id
    1053        }
    1054        return self._game_server.agent_message_ouput(data_type=1, message=message, text=text, timestamp=self.simulate_timestamp)
    1055
    1056    def agent_message_unit_range(self, unit_id, dbrange, color_type, line_type, text):
    1057        """
    1058        53、客户端应用智能体中，智能体消息输出接口——圆形区域显示（跟随单元）（202507版本未实现）
    1059        :param unit_id: str, 圆形区域跟随的单元id，可以跟随己方单元或者是敌方单元
    1060        :param dbrange: float, 显示区域半径，千米
    1061        :param color_type: int: 1：白色 2：橙色 3：红色 4：蓝色 5：紫色 6：黄色 7：绿色
    1062        :param line_type: int, 0：实线 1：虚线
    1063        :param text: str, 纯文本消息
    1064        :return: str, 返回信息
    1065        """
    1066        message = {
    1067            'unit_id': unit_id,
    1068            'dbrange': dbrange,
    1069            'color_type': color_type,
    1070            'line_type': line_type
    1071        }
    1072        return self._game_server.agent_message_ouput(data_type=2, message=message, text=text, timestamp=self.simulate_timestamp)
    1073
    1074    def agent_message_arrow(self, arrow_name, color_type, line_type, points_list, text):
    1075        """
    1076        54、客户端应用智能体中，智能体消息输出接口——箭头（202507版本未实现）
    1077        :param arrow_name: str, 箭头名称
    1078        :param color_type: int, 1：白色 2：橙色 3：红色 4：蓝色 5：紫色 6：黄色 7：绿色
    1079        :param line_type: int: 0：实线 1：虚线
    1080        :param points_list: list, 形成箭头的点，[(lon1,lat1),(lon2,lat2)...] ,列表最后一行经纬度为箭头指向
    1081        :param text: str, 纯文本消息
    1082        :return: str, 返回信息
    1083        """
    1084        message = {
    1085            'arrow_name': arrow_name,
    1086            'color_type': color_type,
    1087            'line_type': line_type,
    1088            'points_list': points_list
    1089        }
    1090        return self._game_server.agent_message_ouput(data_type=3, message=message, text=text, timestamp=self.simulate_timestamp)
    1091
    1092    def agent_message_area(self, area_name, points_list, text):
    1093        """
    1094        55、客户端应用智能体中，智能体消息输出接口——多边形区域（202507版本未实现）
    1095        :param area_name: str, 箭头名称
    1096        :param points_list: list, 区域点[(lon1,lat1),(lon2,lat2)...]
    1097        :param text: str, 纯文本消息
    1098        :return: str, 返回信息
    1099        """
    1100        message = {
    1101            'area_name': area_name,
    1102            'points_list': points_list
    1103        }
    1104        return self._game_server.agent_message_ouput(data_type=4, message=message, text=text, timestamp=self.simulate_timestamp)

guid_pattern = re.compile("{ guid = '([a-z0-9-]+)', name = '([^{]+)' }")
name_pattern = re.compile("{ name = '([^=]+)', guid = '([a-z0-9-]+)' }")
guid_ptn = re.compile("guid = '([a-z0-9-]+)',")
class Player(engine.LingYi.entitys.gameunit.GameUnit): View Source

      24class Player(GameUnit):
      25    """
      26    推演方类
      27    1、通过任务名获取任务对象
      28    2、获取实体单元对象
      29    3、获取情报信息
      30    4、获取当前天气
      31    5、获取某点（纬经度）高程
      32    6、添加一个或多个参考点
      33    7、移动参考点的位置
      34    8、删除参考点
      35    9、批量增加多个参考点
      36    10、分配多个单元到任务
      37    11、清除单元所有航路点
      38    12、创建巡逻任务
      39    13、增加巡逻任务的警戒区
      40    14、创建打击任务
      41    15、创建支援任务
      42    16、创建转场任务
      43    17、创建布雷任务
      44    18、创建扫雷任务
      45    19、创建货运任务
      46    20、删除任务
      47    21、给任务分配单元
      48    22、将若干单元取消分配任务
      49    23、将某单元取消分配任务
      50    24、删除禁航区或封锁区域
      51    25、添加禁航区
      52    26、添加封锁区
      53    27、添加禁航区或封锁区
      54    28、修改禁航区和封锁区
      55    29、将多个单元作为一个编队
      56    30、分离编组单元
      57    31、将单元移除出编队
      58    32、编队添加一个单元
      59    33、飞机单机出动
      60    34、飞机编组出动
      61    35、飞机准备/备战，飞机挂载武器
      62    36、船舶/潜艇单独出航
      63    37、船舶/潜艇编队出航
      64    38、船舶/潜艇中止出航
      65    39、保持所有单元阵位
      66    40、单元选择新基地/新港口
      67    41、实体返航
      68    42、批量自动攻击某目标
      69    43、开火条件检查
      70    44、情报标识重命名
      71    45、情报标识标记位置
      72    46、标识情报阵营
      73    47、断开若干情报标识
      74    48、修改单元名称
      75    49、战前规划时间，可设置飞机挂载
      76    50、战前规划时间，对战开始之前，设置本单元经纬度位置或高度或深度或航向
      77    51、智能体消息输出接口——纯文本
      78    52、智能体消息输出接口——重要情报（202507版本未实现）
      79    53、智能体消息输出接口——圆形区域显示（跟随单元）（202507版本未实现）
      80    54、智能体消息输出接口——箭头（202507版本未实现）
      81    55、智能体消息输出接口——多边形区域（202507版本未实现）
      82
      83    示例：
      84    air1_id = "sflsf0-gjlsf-sf"  # 飞机guid
      85    air1 = self.get_unit(air1_id)  # 获取飞机对象--进而调用飞机、单元接口，设置飞机条令等
      86    self.doctrine_fuel_state_rtb(FuelStateRTB.No)  # 设置推演方条令，燃油状态返航，operatorbase.py中接口
      87    mission_name = "first_patrol"
      88    patrol_area = [(16.1, -92.3), (16.1, -91.2), (14.9, -91.2), (14.9, -92.3)]  # 纬度、经度
      89    first_patrol = self.create_patrol_mission(mission_name, MissionPatrolType.AIR, patrol_area)  # 创建巡逻任务
      90    select_units_guid = ["air1-fsjlf2sfs", "air2-fsjlf27dg"]  # 飞机列表
      91    self.air_single_out(select_units_guid)  # 飞机起飞
      92    self.zone_add_no_navigate("no-navi1", patrol_area, [1,2])  # 设置飞机、舰船的禁航区
      93    score = self.TotalScore  # 获取此推演方得分
      94    """
      95    __metaclass__ = ABCMeta
      96
      97    def __init__(self, side_name):
      98        GameUnit.__init__(self, "", side_name, side_name, SelectorCategory.Side, ElementType.Side)
      99        self.deduce_remove_mission = None  # 用于删除任务后同步更新到deduce。elements中
     100        self.deduce_add_unit = None  # 全局新增单元或任务
     101        self.get_command_check = None  # 获取指令检查对象
     102        self.log = None  # 平台Log
     103        self.flag = 0
     104        # 智能体动态参数，训练时由配置config.py配置，客户端上推演使用调度功能动态配置
     105        self.client_info = {
     106            'unit': {},
     107            'point': {},
     108            'contact': {}
     109        }  # 智能体通过此属性获取配置的单元、情报或参考点
     110        # 智能体调度决策间隔
     111        self.agent_decision_time = 30  # 推演30秒决策一次（调用一次step）--可自行在智能体类初始化函数里赋值
     112        self.client_info_simple = {}  # 从前端获取的原始单元、情报或参考点
     113        self.agent_type = ""  # 强化学习或规则智能体描述
     114        self.is_rule_agent = True  # 是规则智能体，否则就是强化学习智能体
     115        self.situation_cache = {}, {}  # get_situation缓存
     116        self.last_situation_time = 0  # situation_cache缓存的推演时间
     117        self.simulate_timestamp = 0  # 推演时间戳
     118        self.client_i = 0
     119        self.random_point_name = "%s%d%s" % (chr(65 + randint(0, 25)), randint(0, 9), chr(65 + randint(0, 25)))
     120        self._init()
     121
     122    def _init(self):
     123        # 每局会被调用，注意不要存储需要不变的属性
     124        self.reference_point_index_increment = 1  # 创建参考点的自增命名序号
     125
     126        self.units_of_name = {}
     127        self.situation_cache = {}, {}  # 缓存重置
     128        self.missions_obj = {}  # key:mission name, value: Mission任务对象
     129        self.groups = {}  # key:group guid, value: Group编队对象
     130        self.aircrafts = {}  # key:aircraft guid, value: Aircraft飞机对象
     131        self.ships = {}  # key:ship guid, value: Ship舰船对象
     132        self.submarines = {}  # key:submarine guid, value: Submarine潜艇对象
     133        self.satellites = {}  # key:satellite guid, value: Satellite卫星对象
     134        self.facilitys = {}  # key:facility guid, value: Facility地面装备对象
     135        self.weapons = {}  # key:weapon guid, value: Weapon武器（导弹）对象
     136
     137        self.simulate_time = ""  # 当前推演时间
     138        self.time_elapse = 0  # 当前推演已过时间
     139        self.scenario_duration = 0  # 想定时长（单位：秒）
     140
     141        # THSideInfo、THGeoPoint等结构定义请查看entitys/struct.proto文件
     142        # 结构THSideInfo中属性：（运行过程中变化的数据发送）
     143        self.Postures = {}  # 立场---结构：dict:<string, int32>，key:推演方guid, value: 含义如下：
     144        """
     145        立场值类型含义：
     146        0：中立
     147        1: 友方
     148        2: 非友方
     149        3: 敌方
     150        4: 未知
     151        """
     152        self.CollectiveResponsibility = False  # 分配集体责任
     153        self.MapCenter = {}  # 推演方地图中心点--结构：THGeoPoint
     154        self.CameraAlt = 0.0  # 相机高度
     155        self.AwarenessLevel = 0  # 意识水平
     156        """
     157        0:  Novice,//新手
     158        1:	Cadet,//学员
     159        2:	Regular,//一般
     160        3:	Veteran,//老手
     161        4:	Ace//高手
     162        """
     163        self.ProficiencyLevel = 0  # 熟练程度。参考上面值定义
     164        self.ScoringDisaster = 0  # 评分设置(完败)
     165        self.ScoringTriumph = 0  # 评分设置(完胜)
     166        self.IsAIOnly = False  # 是否电脑控制
     167        self.CATC = False  # 可以自动跟踪平民
     168        self.Briefing = ""  # 简报
     169
     170        # THSide,THDoctrine,THRefPoint等结构定义请查看entitys/struct.proto文件
     171        # 结构THSide中属性： 席位基础数据（触发式变化）
     172        self.Doctrine = {}  # 条例---结构：THDoctrine
     173        self.ReferencePoints = {}  # 参考点---结构：dict:<string, THRefPoint>，key:参考点guid
     174        self.SpecialActions = {}  # 特殊动作---结构：dict:<string, THSpecialAction>，key:特殊动作guid
     175        self.ExclusionZones = {}  # 封锁区---结构：dict:<string, THExclusionZone>，key:封锁区guid
     176        self.NoNavZones = {}  # 禁航区---结构：dict:<string, THNoNavZone>，key:禁航区guid
     177        self.AirCorridorZones = {}  # 空中走廊---结构：dict:<string, THAirCorridorZone>，key:空中走廊guid
     178
     179        # 结构THSideReal中属性： 席位实时变化数据（低频变化[暂定每秒一帧]-----实时变化）
     180        self.ContactAutoIncrement = 0
     181        self.WeaponSalvos = {}  # 齐射信息---结构：dict:<string, THWeaponSalvo>，key:齐射guid
     182        self.TotalScore = 0  # 比分
     183        self.Contacts = {}  # 情报---结构：dict:<string, THContact>，key:情报guid，另外添加Lon, Lat等THPosition中位置属性
     184
     185        # 20250703版态势协议以下三项已删除, 为兼容之前服务端，这里暂留
     186        # 结构THSideVitalChange中属性：  席位下数据关键变化（触发式变化-----不需对比差异，此处有值一定是更新数据，按需累加记录）
     187        self.LoggedMessage = []  # 事件日志信息--THLoggedMessage列表
     188        self.LastDetections = []  # 被探测到的最近信息记录--THLastDetection列表
     189        self.AAR = {}  # 损耗信息---结构：THAAR
     190
     191        # 推演方收到的事件，类型定义请查看envs/utils.py中10行左右，事件类型
     192        self.KeyMsg = {}  # 收到的关键事件--积累存储，含义如下：
     193        """
     194        key: 事件类型，查看envs/utils.py中WEAPON_FIRED_TYPE等事件类型定义
     195        value：WeaponFiredInfo等结构转json字典的列表, WeaponFiredInfo等请查看entitys/struct.proto文件
     196        """
     197        # start.py中配置need_all_side为True，则下面其他推演方信息被赋值
     198        # 智能体强化学习训练计算奖励或评估智能体效能等情况，本推演方可以获取其他推演方事件或实体单元信息，比赛时不可用
     199        self.current_players = {}  # key: 推演方名， value: Player对象，从Player对象中可获取所有实体、事件信息
     200        # 其他推演方，包含敌对、中立、友方，用于获取数据评估或强化学习计算奖励，不可操作其他方单元等
     201        self.friend_side_units = {}  # key: side name, value: unit dict
     202        self.simulate_timestamp = 0  # 推演时间戳
     203
     204    def step(self, time_elapse, situation):
     205        """
     206        子类实现
     207        进行对抗推演
     208        :param time_elapse:int, 推演仿真时间，单位：秒，取值0-推演总时间秒数
     209        :param situation: tuple,  units dict, contacts dict
     210        :return:
     211        """
     212        pass
     213
     214    def initial(self, situation):
     215        """
     216        重置智能体
     217        可每局推演初始化变量，可赛前规划，可以用于创建任务，修改任务，设置条令，设置作战单元雷达开关机等
     218        :param situation: tuple, units dict, contacts dict
     219        :return:
     220        """
     221        pass
     222
     223    def is_done(self):
     224        """
     225        智能体主动判断结束本局
     226        """
     227        return False
     228
     229    def deduction_end(self):
     230        """
     231        一局推演结束后，调用的函数，可用于保存模型等
     232        """
     233        pass
     234
     235    # ---------智能体框架调用接口：勿动------------------------------
     236
     237    def reset(self):
     238        self._init()
     239
     240    def update_units_of_names(self):
     241        self.units_of_name = {}
     242        for id, obj in self.groups.items():
     243            self.units_of_name[obj.Name] = obj
     244
     245        for id, obj in self.aircrafts.items():
     246            self.units_of_name[obj.Name] = obj
     247
     248        for id, obj in self.ships.items():
     249            self.units_of_name[obj.Name] = obj
     250
     251        for id, obj in self.submarines.items():
     252            self.units_of_name[obj.Name] = obj
     253
     254        for id, obj in self.satellites.items():
     255            self.units_of_name[obj.Name] = obj
     256
     257        for id, obj in self.facilitys.items():
     258            self.units_of_name[obj.Name] = obj
     259
     260        for id, obj in self.weapons.items():
     261            self.units_of_name[obj.Name] = obj
     262
     263    def update_constant_attribute(self, base_data_player):
     264        """
     265        本对象的整数、布尔、字符串、浮点数从数据智能体对象赋值
     266        每步态势更新都赋值
     267        """
     268        self.simulate_time = base_data_player.simulate_time  # 当前推演时间
     269        # self.scenario_duration = base_data_player.scenario_duration  # 想定时长（单位：秒）
     270        # self.CollectiveResponsibility = base_data_player.CollectiveResponsibility  # 分配集体责任
     271        # self.CameraAlt = base_data_player.CameraAlt  # 相机高度
     272        # self.AwarenessLevel = base_data_player.AwarenessLevel  # 意识水平
     273        # self.ProficiencyLevel = base_data_player.ProficiencyLevel  # 熟练程度。参考上面值定义
     274        # self.ScoringDisaster = base_data_player.ScoringDisaster  # 评分设置(完败)
     275        # self.ScoringTriumph = base_data_player.ScoringTriumph  # 评分设置(完胜)
     276        # self.IsAIOnly = base_data_player.IsAIOnly  # 是否电脑控制
     277        # self.CATC = base_data_player.CATC  # 可以自动跟踪平民
     278        # self.Briefing = base_data_player.Briefing  # 简报
     279        self.TotalScore = base_data_player.TotalScore
     280        self.time_elapse = base_data_player.time_elapse  # 当前推演已过时间
     281        self.simulate_timestamp = base_data_player.simulate_timestamp
     282
     283    def update_object_attribute(self, base_data_player):
     284        """
     285        本对象的字典、列表从数据智能体对象赋值
     286        初始态势赋值后，每步更新态势后，base_data_player的字典、列表赋值后，本对象的属性自动赋值
     287        """
     288        self.ID = base_data_player.ID  # SIDE ID
     289        self.units_of_name = base_data_player.units_of_name
     290        self.missions_obj = base_data_player.missions_obj  # key:mission name, value: Mission任务对象
     291        self.groups = base_data_player.groups  # key:group guid, value: Group编队对象
     292        self.aircrafts = base_data_player.aircrafts  # key:aircraft guid, value: Aircraft飞机对象
     293        self.ships = base_data_player.ships  # key:ship guid, value: Ship舰船对象
     294        self.submarines = base_data_player.submarines  # key:submarine guid, value: Submarine潜艇对象
     295        self.satellites = base_data_player.satellites  # key:satellite guid, value: Satellite卫星对象
     296        self.facilitys = base_data_player.facilitys  # key:facility guid, value: Facility地面装备对象
     297        self.weapons = base_data_player.weapons  # key:weapon guid, value: Weapon武器（导弹）对象
     298        self.Postures = base_data_player.Postures  # 立场---结构：dict:<string, int32>，key:推演方guid
     299        self.MapCenter = base_data_player.MapCenter  # 推演方地图中心点--结构：THGeoPoint
     300
     301        self.Doctrine = base_data_player.Doctrine  # 条例---结构：THDoctrine
     302        self.ReferencePoints = base_data_player.ReferencePoints  # 参考点---结构：dict:<string, THRefPoint>，key:参考点guid
     303        self.SpecialActions = base_data_player.SpecialActions  # 特殊动作---结构：dict:<string, THSpecialAction>，key:特殊动作guid
     304        self.ExclusionZones = base_data_player.ExclusionZones  # 封锁区---结构：dict:<string, THExclusionZone>，key:封锁区guid
     305        self.NoNavZones = base_data_player.NoNavZones  # 禁航区---结构：dict:<string, THNoNavZone>，key:禁航区guid
     306        self.AirCorridorZones = base_data_player.AirCorridorZones  # 空中走廊---结构：dict:<string, THAirCorridorZone>，key:空中走廊guid
     307
     308        self.WeaponSalvos = base_data_player.WeaponSalvos  # 齐射信息---结构：dict:<string, THWeaponSalvo>，key:齐射guid
     309        self.Contacts = base_data_player.Contacts  # 情报---结构：dict:<string, THContact>，key:情报guid，另外添加Lon, Lat等THPosition中位置属性
     310
     311        # 结构THSideVitalChange中属性：  席位下数据关键变化（触发式变化-----不需对比差异，此处有值一定是更新数据，按需累加记录）
     312        self.LoggedMessage = base_data_player.LoggedMessage  # 事件日志信息--THLoggedMessage列表
     313        self.LastDetections = base_data_player.LastDetections  # 被探测到的最近信息记录--THLastDetection列表
     314        self.AAR = base_data_player.AAR  # 损耗信息---结构：THAAR
     315
     316        # 推演方收到的事件，类型定义请查看envs/utils.py中10行左右，事件类型
     317        self.KeyMsg = base_data_player.KeyMsg  # 收到的关键事件--积累存储
     318        self.current_players = base_data_player.current_players  # 其他推演方，包含敌对、中立、友方
     319        self.friend_side_units = base_data_player.friend_side_units
     320
     321    def info_extract(self):
     322        if not isinstance(self.client_info, dict):
     323            self.client_info = {}
     324        if 'unit' not in self.client_info or not self.client_info["unit"]:
     325            self.client_info["unit"] = {}
     326        if "point" not in self.client_info or not self.client_info["point"]:
     327            self.client_info["point"] = {}
     328        if "contact" not in self.client_info or not self.client_info["contact"]:
     329            self.client_info["contact"] = {}
     330        if not (self.client_info["unit"] or self.client_info["point"] or self.client_info["contact"]):
     331            return
     332        if not (isinstance(self.client_info['unit'], list) or
     333                isinstance(self.client_info['point'], list) or
     334                isinstance(self.client_info['contact'], list)):
     335            return
     336        temp_unit_dict = {}
     337        for name in self.client_info['unit']:
     338            if name in self.units_of_name:
     339                unit_id = self.units_of_name[name].ID
     340                temp_unit_dict[unit_id] = {
     341                    'id': unit_id,
     342                    'name': name,
     343                    'situation_keys': []
     344                }
     345        temp_point_dict = {}
     346        for point in self.client_info['point']:
     347            for reference_points, point_info in self.ReferencePoints.items():
     348                if point_info['Name'] == point:
     349                    temp_point_dict[reference_points]: dict = {}
     350                    temp_point_dict[reference_points]['id'] = reference_points
     351                    temp_point_dict[reference_points]['name'] = point
     352                    temp_point_dict[reference_points]['situation_keys'] = []
     353        temp_contact_dict = {}
     354        for contact in self.client_info['contact']:
     355            for c_id, Cont in self.Contacts.items():
     356                if Cont['Name'] == contact:
     357                    temp_contact_dict[c_id]: dict = {}
     358                    temp_contact_dict[c_id]['id'] = c_id
     359                    temp_contact_dict[c_id]['name'] = contact
     360                    temp_contact_dict[c_id]['situation_keys'] = []
     361        self.client_info['unit'] = temp_unit_dict
     362        self.client_info['point'] = temp_point_dict
     363        self.client_info['contact'] = temp_contact_dict
     364
     365    def delete_element(self, del_guid, element_type, unit_name=""):
     366        """
     367        删除对象
     368        :return:
     369        """
     370        del_list = []
     371        try:
     372            if element_type == ElementType.Aircraft:
     373                del self.aircrafts[del_guid]
     374            elif element_type == ElementType.Ship:
     375                del self.ships[del_guid]
     376            elif element_type == ElementType.Submarine:
     377                del self.submarines[del_guid]
     378            elif element_type == ElementType.Satellite:
     379                del self.satellites[del_guid]
     380            elif element_type == ElementType.Facility:
     381                del self.facilitys[del_guid]
     382            elif (element_type == ElementType.SupportMission
     383                  or element_type == ElementType.StrikeMission
     384                  or element_type == ElementType.PatrolMission
     385                  or element_type == ElementType.FerryMission
     386                  or element_type == ElementType.MineMission
     387                  or element_type == ElementType.MineClearMission
     388                  or element_type == ElementType.CargoMission):
     389                if unit_name in self.missions_obj:
     390                    del self.missions_obj[unit_name]
     391            elif element_type == ElementType.Weapon:
     392                del self.weapons[del_guid]
     393            elif element_type == ElementType.Group:
     394                del self.groups[del_guid]
     395        except Exception as e:
     396            if self.log is not None:
     397                self.log.error("错误！删除推演方-%s-中元素，但不存在：%s" % (self.Name, str(e)))
     398            else:
     399                print("错误！删除推演方-%s-中元素，但不存在：%s" % (self.Name, str(e)))
     400        del_list.append(del_guid)
     401        return del_list
     402
     403    def set_agent_decision_time(self, time: int):
     404        """
     405        设置智能体调度时调用的决策间隔，决策间隔为仿真时间s
     406        输入：设置的决策间隔，单位s
     407        """
     408        self.agent_decision_time = time
     409
     410    def set_simulate_time(self, str_simulate_time):
     411        self.simulate_time = str_simulate_time
     412
     413    def set_scenario_duration(self, scenario_duration):
     414        self.scenario_duration = scenario_duration
     415
     416    def set_time_elapse(self, time_elapse):
     417        self.time_elapse = time_elapse
     418
     419    def get_situation(self):
     420        """
     421        获取当前态势
     422        :return: tuple, 例: {unit_id1:unit1_info, unit_id2:unit2_info}, {contact_id1:contact1_info, contact_id2:contact2_info}
     423        """
     424        if self.situation_cache[0] and self.time_elapse < self.last_situation_time + 0.05:
     425            # 最小区分态势推进50毫秒
     426            return self.situation_cache
     427        else:
     428            unit_info = {}
     429            for guid, unit in self.aircrafts.items():
     430                unit_info[guid] = unit.get_summary_info()
     431            for guid, unit in self.facilitys.items():
     432                unit_info[guid] = unit.get_summary_info()
     433            for guid, unit in self.ships.items():
     434                unit_info[guid] = unit.get_summary_info()
     435            for guid, unit in self.submarines.items():
     436                unit_info[guid] = unit.get_summary_info()
     437            for guid, unit in self.satellites.items():
     438                unit_info[guid] = unit.get_summary_info()
     439            for guid, unit in self.weapons.items():
     440                unit_info[guid] = unit.get_summary_info()
     441            for guid, unit in self.groups.items():
     442                unit_info[guid] = unit.get_summary_info()
     443            self.situation_cache = unit_info, self.Contacts
     444            self.last_situation_time = self.time_elapse
     445            return self.situation_cache
     446
     447    def get_zone_str(self, point_list):
     448        """
     449        获取任务点形成的lua脚步参数
     450        :param point_list: list, 参考点列表
     451        :return: str, lua脚本参数
     452        """
     453        if not point_list:
     454            return ""
     455
     456        point_names = []
     457        if isinstance(point_list[0], str):
     458            for name in point_list:
     459                point_names.append('"' + name + '"')
     460        else:
     461            # 创建参考点
     462            names = self.reference_point_add(point_list)
     463            for name in names:
     464                point_names.append('"' + name + '"')
     465        return 'Zone={' + ','.join(point_names) + '}'
     466
     467    def get_prosecution_zone(self, point_list):
     468        """
     469        获取任务点(警戒区)形成的lua脚步参数
     470        :param point_list: list, 参考点列表
     471        :return: str, lua脚步参数
     472        """
     473        if not point_list:
     474            return ""
     475
     476        point_names = []
     477        if isinstance(point_list[0], str):
     478            for name in point_list:
     479                point_names.append('"' + name + '"')
     480        else:
     481            # 创建参考点
     482            names = self.reference_point_add(point_list)
     483            for name in names:
     484                point_names.append('"' + name + '"')
     485        return 'prosecutionZone={' + ','.join(point_names) + '}'
     486
     487    def save_mission(self, mission_name, mission_return_str, mission_category):
     488        """
     489        保存任务到本方，方便以后调用
     490        :param mission_name: 任务名
     491        :param mission_return_str: 任务调用返回值
     492        :param mission_category: ElementType, 任务类型
     493        :return: Mission, Mission实例
     494        """
     495        new_mission = None
     496        mission_guid = cf.mission_guid_parser(mission_return_str)
     497        if mission_category == ElementType.PatrolMission:
     498            new_mission = PatrolMission(mission_guid, mission_name, self.Name)
     499        elif mission_category == ElementType.StrikeMission:
     500            new_mission = StrikeMission(mission_guid, mission_name, self.Name)
     501        elif mission_category == ElementType.SupportMission:
     502            new_mission = SupportMission(mission_guid, mission_name, self.Name)
     503        elif mission_category == ElementType.FerryMission:
     504            new_mission = FerryMission(mission_guid, mission_name, self.Name)
     505        elif mission_category == ElementType.CargoMission:
     506            new_mission = CargoMission(mission_guid, mission_name, self.Name)
     507        elif mission_category == ElementType.MineMission:
     508            new_mission = MineMission(mission_guid, mission_name, self.Name)
     509        elif mission_category == ElementType.MineClearMission:
     510            new_mission = MineClearMission(mission_guid, mission_name, self.Name)
     511        if new_mission is not None:
     512            self.missions_obj[mission_name] = new_mission
     513            self.deduce_add_unit(mission_guid, new_mission)
     514            new_mission._game_server = self._game_server
     515            if mission_category == ElementType.StrikeMission:
     516                new_mission.escort._game_server = self._game_server
     517        return new_mission
     518
     519    # ---------智能体可调用接口：------------------------------
     520
     521    def get_mission_by_name(self, mission_name):
     522        """
     523        1、通过任务名获取任务对象
     524        :param mission_name: str，任务名
     525        :return: 任务对象
     526        """
     527        if mission_name in self.missions_obj:
     528            return self.missions_obj[mission_name]
     529        else:
     530            return None
     531
     532    def get_unit(self, guid):
     533        """
     534        2、获取实体单元对象
     535        :param guid: str, 实体guid
     536        :return: Unit, 作战单元对象
     537        """
     538        if guid in self.aircrafts:
     539            return self.aircrafts[guid]
     540        if guid in self.ships:
     541            return self.ships[guid]
     542        if guid in self.submarines:
     543            return self.submarines[guid]
     544        if guid in self.satellites:
     545            return self.satellites[guid]
     546        if guid in self.facilitys:
     547            return self.facilitys[guid]
     548        if guid in self.weapons:
     549            return self.weapons[guid]
     550        if guid in self.groups:
     551            return self.groups[guid]
     552        return None
     553
     554    def get_contact(self, contact_guid):
     555        """
     556        3、获取情报信息
     557        :param contact_guid:  情报对象guid, 非实际单元guid
     558        :return: dict 如果存在此情报id, 否则返回None
     559        """
     560        if contact_guid in self.Contacts:
     561            return self.Contacts[contact_guid]
     562        else:
     563            return None
     564
     565    def get_weather(self):
     566        """
     567        4、获取当前天气
     568        :return: str, 当前前天数据
     569        """
     570        return self._game_server.api_get_weather(self)
     571
     572    def get_elevation(self, coord_point):
     573        """
     574        5、获取某点（纬经度）高程----勿智能体训练或调度时大规模调用，以防服务器过载！
     575        :param coord_point: tuple, (float, float) (lat, lon)
     576        :return: int, 地形高程数据
     577        """
     578        return self._game_server.api_get_elevation(self, coord_point)
     579
     580    def reference_point_add(self, points):
     581        """
     582        6、添加一个或多个参考点
     583        :param points: tuple, 或list,  参考点列表,例:(40.2, 49.6) 或 [(40, 39.0), (41, 39.0)]，其中纬度值在前，经度值在后
     584                                                或者 (40.2, 49.6, 'RP002') 或 [(40, 39.0, 'RP1'), (41, 39.0, 'RP2')]，已传入参考点命名
     585        :return: list, 按顺序添加成功的参考点名列表
     586        """
     587        return self._game_server.api_reference_point_add(self, points)
     588
     589    def reference_point_move(self, rp_name, new_coord):
     590        """
     591        7、移动参考点的位置
     592        :param rp_name: str, 参考点名称
     593        :param new_coord: tuple, 新的纬度、经度位置 (lat, lon)
     594        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     595        """
     596        return self._game_server.api_reference_point_move(self, rp_name, new_coord)
     597
     598    def reference_point_delete(self, rp_name):
     599        """
     600        8、删除参考点
     601        :param rp_name:  str, 参考点名称
     602        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     603        """
     604        self._game_server.api_reference_point_delete(self, rp_name)
     605
     606    def add_reference_point_list(self, points):
     607        """
     608        9、批量增加多个参考点
     609        :param points: list, 参考点列表，格式：[(50.2,149,'RP-1'),(51,149.6,'RP-2')] 纬度，经度和名称
     610                                    或不指定参考点名：[(50.2,149),(51,149.6)] 纬度，经度
     611        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     612        """
     613        return self._game_server.api_add_reference_point_list(self, points)
     614
     615    def assign_units_to_mission(self, unit_list, mission_name, is_escort=False):
     616        """
     617        10、分配多个单元到任务
     618        :param unit_list: list, 实体guid列表
     619        :param mission_name: str, 分配的任务名
     620        :param is_escort: bool, 是否打击任务的护航任务
     621        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     622        """
     623        return self._game_server.api_assign_units_to_mission(self, unit_list, mission_name, is_escort)
     624
     625    def clear_unit_course(self, guid):
     626        """
     627        11、清除单元所有航路点
     628        :param guid: str, 单元guid
     629        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     630        """
     631        self._game_server.api_clear_unit_course(self, guid)
     632
     633    def create_patrol_mission(self, name, mission_type, point_list):
     634        """
     635        12、创建巡逻任务, 例子：
     636            create_patrol_mission('空战巡逻中央区', MissionPatrolType.AIR, [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)])
     637        :param name: str, 任务名
     638        :param mission_type: MissionPatrolType, 任务类型
     639        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
     640                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
     641                            或者['RP1', 'RP2'，'RP3'，'RP4']，传入参考点名称要求提前创建好参考点
     642        :return: PatrolMission, 任务实体
     643        """
     644        return self._game_server.api_create_patrol_mission(self, name, mission_type, point_list)
     645
     646    def add_prosecution_zone(self, mission_name, point_list):
     647        """
     648        13、增加巡逻任务的警戒区
     649        :param mission_name: str, 任务名
     650        :param point_list: list, list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
     651                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
     652                            或者['RP1', 'RP2'，'RP3'，'RP4']，传入参考点名称要求提前创建好参考点
     653        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     654        """
     655        return self._game_server.api_add_prosecution_zone(self, mission_name, point_list)
     656
     657    def create_strike_mission(self, name, mission_type):
     658        """
     659        14、创建打击任务
     660        :param name: str, 任务名
     661        :param mission_type: MissionStrikeType, 打击任务类型，对空打击，对地打击等
     662        :return: StrikeMission, 任务实体
     663        """
     664        return self._game_server.api_create_strike_mission(self, name, mission_type)
     665
     666    def create_support_mission(self, name, point_list):
     667        """
     668        15、创建支援任务, 例子：
     669            create_support_mission('空中支援', [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)])
     670        :param name: str, 任务名
     671        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
     672                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
     673                            或者['RP1', 'RP2'，'RP3'，'RP        4']，传入参考点名称要求提前创建好参考点
     674        :return: SupportMission, 任务实体
     675        """
     676        return self._game_server.api_create_support_mission(self, name, point_list)
     677
     678    def create_ferry_mission(self, name, destination):
     679        """
     680        16、创建转场任务
     681        :param name: str, 任务名
     682        :param destination: str, 目的地guid
     683        :return: FerryMission, 任务实体
     684        """
     685        return self._game_server.api_create_ferry_mission(self, name, destination)
     686
     687    def create_mine_mission(self, name, point_list):
     688        """
     689        17、创建布雷任务, 例子：
     690            create_mine_mission('布雷2', [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)])
     691        :param name: str, 任务名
     692        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
     693                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
     694                            或者['RP1', 'RP2'，'RP3'，'RP        4']，传入参考点名称要求提前创建好参考点
     695        :return: MineMission, 任务实体
     696        """
     697        return self._game_server.api_create_mine_mission(self, name, point_list)
     698
     699    def create_mineclear_mission(self, name, point_list):
     700        """
     701        18、创建扫雷任务, 例子：
     702            create_mineclear_mission('绝对扫雷', [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)])
     703        :param name: str, 任务名
     704        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
     705                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
     706                            或者['RP1', 'RP2'，'RP3'，'RP        4']，传入参考点名称要求提前创建好参考点
     707        :return: MineClearMission, 任务实体
     708        """
     709        return self._game_server.api_create_mineclear_mission(self, name, point_list)
     710
     711    def create_cargo_mission(self, name, point_list):
     712        """
     713        19、创建货运任务
     714        :param name: str, 任务名
     715        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
     716                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
     717                            或者['RP1', 'RP2'，'RP3'，'RP        4']，传入参考点名称要求提前创建好参考点
     718        :return: CargoMission, 任务实体
     719        """
     720        return self._game_server.api_create_cargo_mission(self, name, point_list)
     721
     722    def delete_mission(self, mission_name):
     723        """
     724        20、删除任务
     725        :param mission_name: str, 任务名称
     726        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     727        """
     728        return self._game_server.api_delete_mission(self, mission_name)
     729
     730    def assign_unit_mission(self, unit_id, mission_name):
     731        """
     732        21、给任务分配单元
     733        :param unit_id: str, 单元guid
     734        :param mission_name: str, 拟分配的任务名
     735        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     736        """
     737        return self._game_server.api_assign_unit_mission(self, unit_id, mission_name)
     738
     739    def units_withdraw_from_mission(self, units):
     740        """
     741        22、将若干单元取消分配任务
     742        :param units: list, 取消任务的单元guid列表
     743        :return: None
     744        """
     745        self._game_server.api_units_withdraw_from_mission(self, units)
     746
     747    def del_unit_from_mission(self, unit_guid):
     748        """
     749        23、将某单元取消分配任务
     750        :param unit_guid: str, 单元guid
     751        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     752        """
     753        return self._game_server.api_del_unit_from_mission(self, unit_guid)
     754
     755    def zone_remove(self, zone_type, zone_guid):
     756        """
     757        24、删除禁航区或封锁区域
     758        :param zone_type: int, 1:封锁区，0：禁航区
     759        :param zone_guid: str, 区域的guid
     760        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     761        """
     762        return self._game_server.api_zone_remove(self, zone_type, zone_guid)
     763
     764    def zone_add_no_navigate(self, name, reference_points, affects=None):
     765        """
     766        25、添加禁航区
     767        :param name: str, 禁航区名
     768        :param reference_points:list, 参考点列表, 例:[(40, 139.0), (41, 139.0), (41, 140.0)], 先纬度，再经度；
     769                                        或指定参考点名：[(40, 139.0,'RP1'), (41, 139.0,'RP2'), (41, 140.0,'RP3')],先纬度，再经度
     770        :param affects: list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用
     771                            1:飞机；2:水面舰艇; 3:潜艇；4:地面单元
     772        :return:str, zone guid
     773        """
     774        if affects is None:
     775            affects = [1, 2, 3, 4]
     776        return self.zone_add(reference_points, 0, name, affects)
     777
     778    def zone_add_exclusion(self, name, reference_points, affects=None):
     779        """
     780        26、添加封锁区
     781        :param name: str, 封锁区名
     782        :param reference_points:list, 参考点列表， 例:[(40, 139.0), (41, 139.0), (41, 140.0)], 先纬度，再经度
     783                                    或指定参考点名：[(40, 139.0,'RP2'), (41, 139.0,'RP3'), (41, 140.0,'RP4')],先纬度，再经度,再参考点名
     784        :param affects: list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用
     785                            1:飞机；2:水面舰艇; 3:潜艇；4:地面单元
     786        :return:str, zone guid
     787        """
     788        if affects is None:
     789            affects = [1, 2, 3, 4]
     790        return self.zone_add(reference_points, 1, name, affects)
     791
     792    def zone_add(self, reference_points, zone_type, zone_name, affects=None):
     793        """
     794        27、添加禁航区或封锁区
     795        :param reference_points:  list, 区域点列表
     796        :param zone_type: int, 1: 封锁区   0:禁航区
     797        :param zone_name:  区域名
     798        :param affects: list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用
     799                            1:飞机；2:水面舰艇; 3:潜艇；4:地面单元
     800        :return: str, zone guid
     801        """
     802        zone_guid = self._game_server.api_zone_add(self, reference_points, zone_type, zone_name, affects)
     803        return cf.zone_guid_parser(zone_guid)
     804
     805    def zone_set(self, zone_type, zone_name, **kwargs):
     806        """
     807        28、修改禁航区和封锁区
     808        :param zone_type: int, 1: 封锁区   0:禁航区
     809        :param zone_name: 禁航区和封锁区的名
     810        :param kwargs:  关键字参数  Area：list, 参考点列表， 例:[(40, 139.0), (41, 139.0), (41, 140.0)], 先纬度，再经度
     811                                    或指定参考点名：[(40, 139.0,'RP2'), (41, 139.0,'RP3'), (41, 140.0,'RP4')],先纬度，再经度,再参考点名
     812                                    或使用已建立参考点，则用参考点名列表，例: ['RP1', 'RP2', 'RP3']
     813                        Rename: str  新名字
     814                        Isactive： bool 是否启用
     815                        Affects： list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用;
     816                                    [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用
     817                                    1:飞机；2:水面舰艇; 3:潜艇；4:地面单元
     818                        Locked：bool 是否区域已锁定(只有禁航区才需要设置)
     819                        MarkAs： int 2=非友方，3=敌方（封锁区才有的设置）
     820        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     821        """
     822        return self._game_server.api_zone_set(self, zone_type, zone_name, **kwargs)
     823
     824    def group_add(self, list_unit_guid, group_name=""):
     825        """
     826        29、将多个单元作为一个编队
     827        :param list_unit_guid: list, 例：['2abc947e-8352-4639-9184-641706730018',
     828                                            '640a7c08-a17a-4fba-b055-07b568f22df5']
     829        :param group_name: str, 编队名
     830        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     831        """
     832        return self._game_server.api_group_add(self, list_unit_guid, group_name)
     833
     834    def group_detach(self, list_unit_guid):
     835        """
     836        30、分离编组单元
     837        :param list_unit_guid: list, 例：['2abc947e-8352-4639-9184-641706730018','640a7c08-a17a-4fba-b055-07b568f22df5']
     838        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     839        """
     840        return self._game_server.api_group_detach(self, list_unit_guid)
     841
     842    def group_remove_unit(self, unit_guid):
     843        """
     844        31、将单元移除出编队
     845        :param unit_guid: 作战单元guid
     846        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     847        """
     848        return self._game_server.api_group_remove_unit(self, unit_guid)
     849
     850    def group_add_unit(self, group_guid, unit_guid):
     851        """
     852        32、编队添加一个单元
     853        :param group_guid: 编队guid
     854        :param unit_guid: 作战单元guid
     855        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     856        """
     857        return self._game_server.api_group_add_unit(self, group_guid, unit_guid)
     858
     859    def air_single_out(self, air_guid_list):
     860        """
     861        33、飞机单机出动
     862        :param air_guid_list: list, 飞机的guid列表，  例子：['58ba-4013-92f5-2ewds','58ba-4013-92f5-2efa0']
     863        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     864        """
     865        return self._game_server.api_air_single_out(self, air_guid_list)
     866
     867    def air_group_out(self, air_guid_list):
     868        """
     869        34、飞机编组出动
     870        :param air_guid_list:  list, 飞机的guid列表，  例子：['4013-92f5-2effc','4013-92f5-d2fa0']
     871        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     872        """
     873        return self._game_server.api_air_group_out(self, air_guid_list)
     874
     875    def aircraft_action_ready(self, mode, guid_list, loadout_id, qt_enabled):
     876        """
     877        35、飞机准备/备战，飞机挂载武器;
     878        :param mode: 1: 准备就绪; 2: 准备就绪（不包括可选武器）
     879        :param guid_list: list, 飞机guid列表
     880        :param loadout_id: int, 挂载方案ID
     881        :param qt_enabled: bool, 是否快速出动, 如快速出动需提前确认此挂载是否快速出动
     882        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     883        """
     884        return self._game_server.api_aircraft_action_ready(self, mode, guid_list, loadout_id, qt_enabled)
     885
     886    def ship_action_alone(self, guid_list):
     887        """
     888        36、船舶/潜艇单独出航
     889        :param guid_list: list, 舰船guid列表
     890        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     891        """
     892        return self._game_server.api_ship_action_alone(self, guid_list)
     893
     894    def ship_action_group(self, guid_list):
     895        """
     896        37、船舶/潜艇编队出航
     897        :param guid_list: list, 舰船guid列表
     898        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     899        """
     900        return self._game_server.api_ship_action_group(self, guid_list)
     901
     902    def ship_action_stop(self, guid_list):
     903        """
     904        38、船舶/潜艇中止出航
     905        :param guid_list: list, 舰船guid列表
     906        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     907        """
     908        return self._game_server.api_ship_action_stop(self, guid_list)
     909
     910    def hold_position_all_unit(self, is_hold):
     911        """
     912        39、保持所有单元阵位，所有单元停止机动，留在原地
     913        :param is_hold: bool
     914        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     915        """
     916        return self._game_server.api_hold_position_all_unit(self, is_hold)
     917
     918    def unit_select_new_base(self, unit_guid, base_guid):
     919        """
     920        40、单元选择新基地/新港口
     921        :param unit_guid: 单元的guid
     922        :param base_guid: 新基地的guid
     923        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     924        """
     925        return self._game_server.api_unit_select_new_base(self, unit_guid, base_guid)
     926
     927    def unit_return_to_base(self, unit_guid):
     928        """
     929        41、实体返航
     930        :param unit_guid: 单元的guid
     931        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     932        """
     933        return self._game_server.api_unit_return_to_base(self, unit_guid)
     934
     935    def attack_contact_by_list(self, attack_list):
     936        """
     937        42、批量自动攻击某目标
     938        :param attack_list, 攻击信息列表，每条信息包含一个元组, [(attack_id, target_id, weapon_id, weapon_count)]
     939                                                            攻击单元guid, 目标guid, 武器型号id, 武器数量
     940                例：[('guid1-2fljs', 'target1-fjslfjl2', 0, 0),     weapon_id=0代表自动打击，系统自动选择武器打击目标
     941                    ('guid1-3fljs', 'target3f-fjslfjd', 2880, 2)]  weapon_id=2880，手动攻击，指定打击的武器和数量
     942        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     943        """
     944        return self._game_server.api_attack_contact_by_list(self, attack_list)
     945
     946    def check_weapon_fire_condition(self, units_contacts):
     947        """
     948        43、开火条件检查, 返回检查开火条件结果； 耗时, 谨慎调用, 请勿每天文时间10秒调用超过3次！！！
     949        :param units_contacts:list, or tuple, example:  [(unit1, target1),(unit2, target2)] or (unit1, target1)
     950        :return: dict, 例子：
     951            {"1796":{"AmmoTotal":5,"AmmoDist":0,"AutoFire":"不能自动开火，目标超出武器射程",
     952            "Status":"自由开火","Authorize":"每次齐射发射所有武器. 最大射程武器发射. 飞机-第四代战斗机/攻击[敏捷性/通用：4.0～4.9]（F-14、F-15、F-16、MiG-29、Su-27）",
     953            "ManualFire":{"目标超出武器射程":5}},
     954            "1896":{"AmmoTotal":2,"AmmoDist":0,"AutoFire":"不能自动开火，目标超出武器射程","Status":"自由开火",
     955            "Authorize":"1x rnd 每次齐射. 最大射程武器发射. 飞机-第四代战斗机/攻击[敏捷性/通用：4.0～4.9]（F-14、F-15、F-16、MiG-29、Su-27）",
     956            "ManualFire":{"目标超出武器射程":2}},
     957            "2056":{"AmmoTotal":6,"AmmoDist":0,"AutoFire":"OK","Status":"自由开火",
     958            "Authorize":"1x rnd 每次齐射. 15海里 最大射程. 飞机-第四代战斗机/攻击[敏捷性/通用：4.0～4.9]（F-14、F-15、F-16、MiG-29、Su-27）",
     959            "ManualFire":{"OK":6}}}
     960        """
     961        return self._game_server.api_check_weapon_fire_condition(self, units_contacts)
     962
     963    def contact_rename(self, contact_id, new_name):
     964        """
     965        44、情报标识重命名
     966        :param contact_id: str, contact id
     967        :param new_name: str, new name
     968        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     969        """
     970        return self._game_server.api_contact_rename(self, contact_id, new_name)
     971
     972    def contact_mark_position(self, contact_id):
     973        """
     974        45、情报标识标记位置
     975        :param contact_id:str, contact id
     976        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     977        """
     978        return self._game_server.api_contact_mark_position(self, contact_id)
     979
     980    def contact_mark_posture(self, contact_id, posture):
     981        """
     982        46、标识情报阵营
     983        :param contact_id: str, 情报id
     984        :param posture: 枚举ContactStance, global_util.py中定义
     985        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     986        """
     987        return self._game_server.api_contact_mark_posture(self, contact_id, posture)
     988
     989    def contact_drop_target(self, contact_id):
     990        """
     991        47、断开若干情报标识
     992        :param contact_id: str, 情报id; 或list, 情报id列表
     993        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
     994        """
     995        return self._game_server.api_contact_drop_target(self, contact_id)
     996
     997    def unit_newname(self, guid, newname):
     998        """
     999        48、修改单元名称
    1000        :param guid:str, 单元guid
    1001        :param newname:str, 单元名
    1002        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    1003        """
    1004        return self._game_server.api_unit_newname(self, guid, newname)
    1005
    1006    def set_aircraft_loadout_plan_time(self, unit_id, loadoutID):
    1007        """
    1008        49、战前规划时间，可设置飞机挂载，不限制机场或航母弹药，准备时间为0，即可马上准备好
    1009        :param unit_id: str, 单元id或单元名称
    1010        :param loadoutID: int  武器挂载方案ID
    1011        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    1012        """
    1013        return self._game_server.api_set_loadout_plan_time(self.get_command_check(unit_id), loadoutID)
    1014
    1015    def unit_new_position(self, unit_guid, lon_lat=None, alt=None, depth=None, heading=None):
    1016        """
    1017        50、战前规划时间，对战开始之前，设置本单元经纬度位置或高度或深度或航向
    1018        飞机、舰船、潜艇可以移动到距初始位置最大距离（20千米）内任意位置（符合地形-例：船在海中，飞机不可在山内）
    1019        正式推演对战之后，本接口会调用失效并给出提示！
    1020        :param unit_guid: str, 本推演方单元guid
    1021        :param lon_lat: tuple, 经度、纬度的元组，(float,float) 需要移动单元到的目的地经度纬度
    1022                                东经0到180，西经-180到0；北纬0到90，南纬-90到0
    1023        :param alt: float, 单元的目标高度（仅用于飞机），米
    1024        :param depth: float, 单元的目标深度（仅用于潜艇），米，正数即可
    1025        :param heading: float, 单元的目标航向，0到360度，正北为0，顺时针增大到360
    1026        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    1027        """
    1028        return self._game_server.unit_new_position(self.get_command_check(unit_guid), long_lat=lon_lat,
    1029                                                   altitude=alt, new_depth=depth, new_heading=heading)
    1030
    1031    def agent_message_text(self, text):
    1032        """
    1033        51、客户端应用智能体中，智能体消息输出接口——纯文本
    1034        :param text: str, 纯文本消息
    1035        :return: str, 返回信息
    1036        """
    1037        return self._game_server.agent_message_ouput(data_type=0, message={}, text=text, timestamp=self.simulate_timestamp)
    1038
    1039    def agent_message_intelligence(self, level, contact_id, text):
    1040        """
    1041        52、客户端应用智能体中，智能体消息输出接口——重要情报（202507版本未实现）
    1042        :param level: int
    1043            level重要情报层级：
    1044                1：一级情报，核心情报信息，显示为红色
    1045                2：二级情报，重要情报信息，显示为橙色
    1046                3：三级情报，一般情报信息，显示为白色
    1047        :param contact_id: str, 情报ID
    1048        :param text: str, 纯文本消息
    1049        :return: str, 返回信息
    1050        """
    1051        message = {
    1052            'level': level,
    1053            'contact_id': contact_id
    1054        }
    1055        return self._game_server.agent_message_ouput(data_type=1, message=message, text=text, timestamp=self.simulate_timestamp)
    1056
    1057    def agent_message_unit_range(self, unit_id, dbrange, color_type, line_type, text):
    1058        """
    1059        53、客户端应用智能体中，智能体消息输出接口——圆形区域显示（跟随单元）（202507版本未实现）
    1060        :param unit_id: str, 圆形区域跟随的单元id，可以跟随己方单元或者是敌方单元
    1061        :param dbrange: float, 显示区域半径，千米
    1062        :param color_type: int: 1：白色 2：橙色 3：红色 4：蓝色 5：紫色 6：黄色 7：绿色
    1063        :param line_type: int, 0：实线 1：虚线
    1064        :param text: str, 纯文本消息
    1065        :return: str, 返回信息
    1066        """
    1067        message = {
    1068            'unit_id': unit_id,
    1069            'dbrange': dbrange,
    1070            'color_type': color_type,
    1071            'line_type': line_type
    1072        }
    1073        return self._game_server.agent_message_ouput(data_type=2, message=message, text=text, timestamp=self.simulate_timestamp)
    1074
    1075    def agent_message_arrow(self, arrow_name, color_type, line_type, points_list, text):
    1076        """
    1077        54、客户端应用智能体中，智能体消息输出接口——箭头（202507版本未实现）
    1078        :param arrow_name: str, 箭头名称
    1079        :param color_type: int, 1：白色 2：橙色 3：红色 4：蓝色 5：紫色 6：黄色 7：绿色
    1080        :param line_type: int: 0：实线 1：虚线
    1081        :param points_list: list, 形成箭头的点，[(lon1,lat1),(lon2,lat2)...] ,列表最后一行经纬度为箭头指向
    1082        :param text: str, 纯文本消息
    1083        :return: str, 返回信息
    1084        """
    1085        message = {
    1086            'arrow_name': arrow_name,
    1087            'color_type': color_type,
    1088            'line_type': line_type,
    1089            'points_list': points_list
    1090        }
    1091        return self._game_server.agent_message_ouput(data_type=3, message=message, text=text, timestamp=self.simulate_timestamp)
    1092
    1093    def agent_message_area(self, area_name, points_list, text):
    1094        """
    1095        55、客户端应用智能体中，智能体消息输出接口——多边形区域（202507版本未实现）
    1096        :param area_name: str, 箭头名称
    1097        :param points_list: list, 区域点[(lon1,lat1),(lon2,lat2)...]
    1098        :param text: str, 纯文本消息
    1099        :return: str, 返回信息
    1100        """
    1101        message = {
    1102            'area_name': area_name,
    1103            'points_list': points_list
    1104        }
    1105        return self._game_server.agent_message_ouput(data_type=4, message=message, text=text, timestamp=self.simulate_timestamp)

推演方类
1、通过任务名获取任务对象
2、获取实体单元对象
3、获取情报信息
4、获取当前天气
5、获取某点（纬经度）高程
6、添加一个或多个参考点
7、移动参考点的位置
8、删除参考点
9、批量增加多个参考点
10、分配多个单元到任务
11、清除单元所有航路点
12、创建巡逻任务
13、增加巡逻任务的警戒区
14、创建打击任务
15、创建支援任务
16、创建转场任务
17、创建布雷任务
18、创建扫雷任务
19、创建货运任务
20、删除任务
21、给任务分配单元
22、将若干单元取消分配任务
23、将某单元取消分配任务
24、删除禁航区或封锁区域
25、添加禁航区
26、添加封锁区
27、添加禁航区或封锁区
28、修改禁航区和封锁区
29、将多个单元作为一个编队
30、分离编组单元
31、将单元移除出编队
32、编队添加一个单元
33、飞机单机出动
34、飞机编组出动
35、飞机准备/备战，飞机挂载武器
36、船舶/潜艇单独出航
37、船舶/潜艇编队出航
38、船舶/潜艇中止出航
39、保持所有单元阵位
40、单元选择新基地/新港口
41、实体返航
42、批量自动攻击某目标
43、开火条件检查
44、情报标识重命名
45、情报标识标记位置
46、标识情报阵营
47、断开若干情报标识
48、修改单元名称
49、战前规划时间，可设置飞机挂载
50、战前规划时间，对战开始之前，设置本单元经纬度位置或高度或深度或航向
51、智能体消息输出接口——纯文本
52、智能体消息输出接口——重要情报（202507版本未实现）
53、智能体消息输出接口——圆形区域显示（跟随单元）（202507版本未实现）
54、智能体消息输出接口——箭头（202507版本未实现）
55、智能体消息输出接口——多边形区域（202507版本未实现）

示例：
air1_id = "sflsf0-gjlsf-sf" # 飞机guid
air1 = self.get_unit(air1_id) # 获取飞机对象--进而调用飞机、单元接口，设置飞机条令等
self.doctrine_fuel_state_rtb(FuelStateRTB.No) # 设置推演方条令，燃油状态返航，operatorbase.py中接口
mission_name = "first_patrol"
patrol_area = [(16.1, -92.3), (16.1, -91.2), (14.9, -91.2), (14.9, -92.3)] # 纬度、经度
first_patrol = self.create_patrol_mission(mission_name, MissionPatrolType.AIR, patrol_area) # 创建巡逻任务
select_units_guid = ["air1-fsjlf2sfs", "air2-fsjlf27dg"] # 飞机列表
self.air_single_out(select_units_guid) # 飞机起飞
self.zone_add_no_navigate("no-navi1", patrol_area, [1,2]) # 设置飞机、舰船的禁航区
score = self.TotalScore # 获取此推演方得分

Player(side_name) View Source

     97    def __init__(self, side_name):
     98        GameUnit.__init__(self, "", side_name, side_name, SelectorCategory.Side, ElementType.Side)
     99        self.deduce_remove_mission = None  # 用于删除任务后同步更新到deduce。elements中
    100        self.deduce_add_unit = None  # 全局新增单元或任务
    101        self.get_command_check = None  # 获取指令检查对象
    102        self.log = None  # 平台Log
    103        self.flag = 0
    104        # 智能体动态参数，训练时由配置config.py配置，客户端上推演使用调度功能动态配置
    105        self.client_info = {
    106            'unit': {},
    107            'point': {},
    108            'contact': {}
    109        }  # 智能体通过此属性获取配置的单元、情报或参考点
    110        # 智能体调度决策间隔
    111        self.agent_decision_time = 30  # 推演30秒决策一次（调用一次step）--可自行在智能体类初始化函数里赋值
    112        self.client_info_simple = {}  # 从前端获取的原始单元、情报或参考点
    113        self.agent_type = ""  # 强化学习或规则智能体描述
    114        self.is_rule_agent = True  # 是规则智能体，否则就是强化学习智能体
    115        self.situation_cache = {}, {}  # get_situation缓存
    116        self.last_situation_time = 0  # situation_cache缓存的推演时间
    117        self.simulate_timestamp = 0  # 推演时间戳
    118        self.client_i = 0
    119        self.random_point_name = "%s%d%s" % (chr(65 + randint(0, 25)), randint(0, 9), chr(65 + randint(0, 25)))
    120        self._init()

deduce_remove_mission
deduce_add_unit
get_command_check
log
flag
client_info
agent_decision_time
client_info_simple
agent_type
is_rule_agent
situation_cache
last_situation_time
simulate_timestamp
client_i
random_point_name
def step(self, time_elapse, situation): View Source

    204    def step(self, time_elapse, situation):
    205        """
    206        子类实现
    207        进行对抗推演
    208        :param time_elapse:int, 推演仿真时间，单位：秒，取值0-推演总时间秒数
    209        :param situation: tuple,  units dict, contacts dict
    210        :return:
    211        """
    212        pass

子类实现 进行对抗推演 :param time_elapse:int, 推演仿真时间，单位：秒，取值0-推演总时间秒数 :param situation: tuple, units dict, contacts dict :return:

def initial(self, situation): View Source

    214    def initial(self, situation):
    215        """
    216        重置智能体
    217        可每局推演初始化变量，可赛前规划，可以用于创建任务，修改任务，设置条令，设置作战单元雷达开关机等
    218        :param situation: tuple, units dict, contacts dict
    219        :return:
    220        """
    221        pass

重置智能体 可每局推演初始化变量，可赛前规划，可以用于创建任务，修改任务，设置条令，设置作战单元雷达开关机等 :param situation: tuple, units dict, contacts dict :return:

def is_done(self): View Source

    223    def is_done(self):
    224        """
    225        智能体主动判断结束本局
    226        """
    227        return False

智能体主动判断结束本局

def deduction_end(self): View Source

    229    def deduction_end(self):
    230        """
    231        一局推演结束后，调用的函数，可用于保存模型等
    232        """
    233        pass

一局推演结束后，调用的函数，可用于保存模型等

def reset(self): View Source

    237    def reset(self):
    238        self._init()

def update_units_of_names(self): View Source

    240    def update_units_of_names(self):
    241        self.units_of_name = {}
    242        for id, obj in self.groups.items():
    243            self.units_of_name[obj.Name] = obj
    244
    245        for id, obj in self.aircrafts.items():
    246            self.units_of_name[obj.Name] = obj
    247
    248        for id, obj in self.ships.items():
    249            self.units_of_name[obj.Name] = obj
    250
    251        for id, obj in self.submarines.items():
    252            self.units_of_name[obj.Name] = obj
    253
    254        for id, obj in self.satellites.items():
    255            self.units_of_name[obj.Name] = obj
    256
    257        for id, obj in self.facilitys.items():
    258            self.units_of_name[obj.Name] = obj
    259
    260        for id, obj in self.weapons.items():
    261            self.units_of_name[obj.Name] = obj

def update_constant_attribute(self, base_data_player): View Source

    263    def update_constant_attribute(self, base_data_player):
    264        """
    265        本对象的整数、布尔、字符串、浮点数从数据智能体对象赋值
    266        每步态势更新都赋值
    267        """
    268        self.simulate_time = base_data_player.simulate_time  # 当前推演时间
    269        # self.scenario_duration = base_data_player.scenario_duration  # 想定时长（单位：秒）
    270        # self.CollectiveResponsibility = base_data_player.CollectiveResponsibility  # 分配集体责任
    271        # self.CameraAlt = base_data_player.CameraAlt  # 相机高度
    272        # self.AwarenessLevel = base_data_player.AwarenessLevel  # 意识水平
    273        # self.ProficiencyLevel = base_data_player.ProficiencyLevel  # 熟练程度。参考上面值定义
    274        # self.ScoringDisaster = base_data_player.ScoringDisaster  # 评分设置(完败)
    275        # self.ScoringTriumph = base_data_player.ScoringTriumph  # 评分设置(完胜)
    276        # self.IsAIOnly = base_data_player.IsAIOnly  # 是否电脑控制
    277        # self.CATC = base_data_player.CATC  # 可以自动跟踪平民
    278        # self.Briefing = base_data_player.Briefing  # 简报
    279        self.TotalScore = base_data_player.TotalScore
    280        self.time_elapse = base_data_player.time_elapse  # 当前推演已过时间
    281        self.simulate_timestamp = base_data_player.simulate_timestamp

本对象的整数、布尔、字符串、浮点数从数据智能体对象赋值 每步态势更新都赋值

def update_object_attribute(self, base_data_player): View Source

    283    def update_object_attribute(self, base_data_player):
    284        """
    285        本对象的字典、列表从数据智能体对象赋值
    286        初始态势赋值后，每步更新态势后，base_data_player的字典、列表赋值后，本对象的属性自动赋值
    287        """
    288        self.ID = base_data_player.ID  # SIDE ID
    289        self.units_of_name = base_data_player.units_of_name
    290        self.missions_obj = base_data_player.missions_obj  # key:mission name, value: Mission任务对象
    291        self.groups = base_data_player.groups  # key:group guid, value: Group编队对象
    292        self.aircrafts = base_data_player.aircrafts  # key:aircraft guid, value: Aircraft飞机对象
    293        self.ships = base_data_player.ships  # key:ship guid, value: Ship舰船对象
    294        self.submarines = base_data_player.submarines  # key:submarine guid, value: Submarine潜艇对象
    295        self.satellites = base_data_player.satellites  # key:satellite guid, value: Satellite卫星对象
    296        self.facilitys = base_data_player.facilitys  # key:facility guid, value: Facility地面装备对象
    297        self.weapons = base_data_player.weapons  # key:weapon guid, value: Weapon武器（导弹）对象
    298        self.Postures = base_data_player.Postures  # 立场---结构：dict:<string, int32>，key:推演方guid
    299        self.MapCenter = base_data_player.MapCenter  # 推演方地图中心点--结构：THGeoPoint
    300
    301        self.Doctrine = base_data_player.Doctrine  # 条例---结构：THDoctrine
    302        self.ReferencePoints = base_data_player.ReferencePoints  # 参考点---结构：dict:<string, THRefPoint>，key:参考点guid
    303        self.SpecialActions = base_data_player.SpecialActions  # 特殊动作---结构：dict:<string, THSpecialAction>，key:特殊动作guid
    304        self.ExclusionZones = base_data_player.ExclusionZones  # 封锁区---结构：dict:<string, THExclusionZone>，key:封锁区guid
    305        self.NoNavZones = base_data_player.NoNavZones  # 禁航区---结构：dict:<string, THNoNavZone>，key:禁航区guid
    306        self.AirCorridorZones = base_data_player.AirCorridorZones  # 空中走廊---结构：dict:<string, THAirCorridorZone>，key:空中走廊guid
    307
    308        self.WeaponSalvos = base_data_player.WeaponSalvos  # 齐射信息---结构：dict:<string, THWeaponSalvo>，key:齐射guid
    309        self.Contacts = base_data_player.Contacts  # 情报---结构：dict:<string, THContact>，key:情报guid，另外添加Lon, Lat等THPosition中位置属性
    310
    311        # 结构THSideVitalChange中属性：  席位下数据关键变化（触发式变化-----不需对比差异，此处有值一定是更新数据，按需累加记录）
    312        self.LoggedMessage = base_data_player.LoggedMessage  # 事件日志信息--THLoggedMessage列表
    313        self.LastDetections = base_data_player.LastDetections  # 被探测到的最近信息记录--THLastDetection列表
    314        self.AAR = base_data_player.AAR  # 损耗信息---结构：THAAR
    315
    316        # 推演方收到的事件，类型定义请查看envs/utils.py中10行左右，事件类型
    317        self.KeyMsg = base_data_player.KeyMsg  # 收到的关键事件--积累存储
    318        self.current_players = base_data_player.current_players  # 其他推演方，包含敌对、中立、友方
    319        self.friend_side_units = base_data_player.friend_side_units

本对象的字典、列表从数据智能体对象赋值 初始态势赋值后，每步更新态势后，base_data_player的字典、列表赋值后，本对象的属性自动赋值

def info_extract(self): View Source

    321    def info_extract(self):
    322        if not isinstance(self.client_info, dict):
    323            self.client_info = {}
    324        if 'unit' not in self.client_info or not self.client_info["unit"]:
    325            self.client_info["unit"] = {}
    326        if "point" not in self.client_info or not self.client_info["point"]:
    327            self.client_info["point"] = {}
    328        if "contact" not in self.client_info or not self.client_info["contact"]:
    329            self.client_info["contact"] = {}
    330        if not (self.client_info["unit"] or self.client_info["point"] or self.client_info["contact"]):
    331            return
    332        if not (isinstance(self.client_info['unit'], list) or
    333                isinstance(self.client_info['point'], list) or
    334                isinstance(self.client_info['contact'], list)):
    335            return
    336        temp_unit_dict = {}
    337        for name in self.client_info['unit']:
    338            if name in self.units_of_name:
    339                unit_id = self.units_of_name[name].ID
    340                temp_unit_dict[unit_id] = {
    341                    'id': unit_id,
    342                    'name': name,
    343                    'situation_keys': []
    344                }
    345        temp_point_dict = {}
    346        for point in self.client_info['point']:
    347            for reference_points, point_info in self.ReferencePoints.items():
    348                if point_info['Name'] == point:
    349                    temp_point_dict[reference_points]: dict = {}
    350                    temp_point_dict[reference_points]['id'] = reference_points
    351                    temp_point_dict[reference_points]['name'] = point
    352                    temp_point_dict[reference_points]['situation_keys'] = []
    353        temp_contact_dict = {}
    354        for contact in self.client_info['contact']:
    355            for c_id, Cont in self.Contacts.items():
    356                if Cont['Name'] == contact:
    357                    temp_contact_dict[c_id]: dict = {}
    358                    temp_contact_dict[c_id]['id'] = c_id
    359                    temp_contact_dict[c_id]['name'] = contact
    360                    temp_contact_dict[c_id]['situation_keys'] = []
    361        self.client_info['unit'] = temp_unit_dict
    362        self.client_info['point'] = temp_point_dict
    363        self.client_info['contact'] = temp_contact_dict

def delete_element(self, del_guid, element_type, unit_name=''): View Source

    365    def delete_element(self, del_guid, element_type, unit_name=""):
    366        """
    367        删除对象
    368        :return:
    369        """
    370        del_list = []
    371        try:
    372            if element_type == ElementType.Aircraft:
    373                del self.aircrafts[del_guid]
    374            elif element_type == ElementType.Ship:
    375                del self.ships[del_guid]
    376            elif element_type == ElementType.Submarine:
    377                del self.submarines[del_guid]
    378            elif element_type == ElementType.Satellite:
    379                del self.satellites[del_guid]
    380            elif element_type == ElementType.Facility:
    381                del self.facilitys[del_guid]
    382            elif (element_type == ElementType.SupportMission
    383                  or element_type == ElementType.StrikeMission
    384                  or element_type == ElementType.PatrolMission
    385                  or element_type == ElementType.FerryMission
    386                  or element_type == ElementType.MineMission
    387                  or element_type == ElementType.MineClearMission
    388                  or element_type == ElementType.CargoMission):
    389                if unit_name in self.missions_obj:
    390                    del self.missions_obj[unit_name]
    391            elif element_type == ElementType.Weapon:
    392                del self.weapons[del_guid]
    393            elif element_type == ElementType.Group:
    394                del self.groups[del_guid]
    395        except Exception as e:
    396            if self.log is not None:
    397                self.log.error("错误！删除推演方-%s-中元素，但不存在：%s" % (self.Name, str(e)))
    398            else:
    399                print("错误！删除推演方-%s-中元素，但不存在：%s" % (self.Name, str(e)))
    400        del_list.append(del_guid)
    401        return del_list

删除对象 :return:

def set_agent_decision_time(self, time: int): View Source

    403    def set_agent_decision_time(self, time: int):
    404        """
    405        设置智能体调度时调用的决策间隔，决策间隔为仿真时间s
    406        输入：设置的决策间隔，单位s
    407        """
    408        self.agent_decision_time = time

设置智能体调度时调用的决策间隔，决策间隔为仿真时间s 输入：设置的决策间隔，单位s

def set_simulate_time(self, str_simulate_time): View Source

    410    def set_simulate_time(self, str_simulate_time):
    411        self.simulate_time = str_simulate_time

def set_scenario_duration(self, scenario_duration): View Source

    413    def set_scenario_duration(self, scenario_duration):
    414        self.scenario_duration = scenario_duration

def set_time_elapse(self, time_elapse): View Source

    416    def set_time_elapse(self, time_elapse):
    417        self.time_elapse = time_elapse

def get_situation(self): View Source

    419    def get_situation(self):
    420        """
    421        获取当前态势
    422        :return: tuple, 例: {unit_id1:unit1_info, unit_id2:unit2_info}, {contact_id1:contact1_info, contact_id2:contact2_info}
    423        """
    424        if self.situation_cache[0] and self.time_elapse < self.last_situation_time + 0.05:
    425            # 最小区分态势推进50毫秒
    426            return self.situation_cache
    427        else:
    428            unit_info = {}
    429            for guid, unit in self.aircrafts.items():
    430                unit_info[guid] = unit.get_summary_info()
    431            for guid, unit in self.facilitys.items():
    432                unit_info[guid] = unit.get_summary_info()
    433            for guid, unit in self.ships.items():
    434                unit_info[guid] = unit.get_summary_info()
    435            for guid, unit in self.submarines.items():
    436                unit_info[guid] = unit.get_summary_info()
    437            for guid, unit in self.satellites.items():
    438                unit_info[guid] = unit.get_summary_info()
    439            for guid, unit in self.weapons.items():
    440                unit_info[guid] = unit.get_summary_info()
    441            for guid, unit in self.groups.items():
    442                unit_info[guid] = unit.get_summary_info()
    443            self.situation_cache = unit_info, self.Contacts
    444            self.last_situation_time = self.time_elapse
    445            return self.situation_cache

获取当前态势 :return: tuple, 例: {unit_id1:unit1_info, unit_id2:unit2_info}, {contact_id1:contact1_info, contact_id2:contact2_info}

def get_zone_str(self, point_list): View Source

    447    def get_zone_str(self, point_list):
    448        """
    449        获取任务点形成的lua脚步参数
    450        :param point_list: list, 参考点列表
    451        :return: str, lua脚本参数
    452        """
    453        if not point_list:
    454            return ""
    455
    456        point_names = []
    457        if isinstance(point_list[0], str):
    458            for name in point_list:
    459                point_names.append('"' + name + '"')
    460        else:
    461            # 创建参考点
    462            names = self.reference_point_add(point_list)
    463            for name in names:
    464                point_names.append('"' + name + '"')
    465        return 'Zone={' + ','.join(point_names) + '}'

获取任务点形成的lua脚步参数 :param point_list: list, 参考点列表 :return: str, lua脚本参数

def get_prosecution_zone(self, point_list): View Source

    467    def get_prosecution_zone(self, point_list):
    468        """
    469        获取任务点(警戒区)形成的lua脚步参数
    470        :param point_list: list, 参考点列表
    471        :return: str, lua脚步参数
    472        """
    473        if not point_list:
    474            return ""
    475
    476        point_names = []
    477        if isinstance(point_list[0], str):
    478            for name in point_list:
    479                point_names.append('"' + name + '"')
    480        else:
    481            # 创建参考点
    482            names = self.reference_point_add(point_list)
    483            for name in names:
    484                point_names.append('"' + name + '"')
    485        return 'prosecutionZone={' + ','.join(point_names) + '}'

获取任务点(警戒区)形成的lua脚步参数 :param point_list: list, 参考点列表 :return: str, lua脚步参数

def save_mission(self, mission_name, mission_return_str, mission_category): View Source

    487    def save_mission(self, mission_name, mission_return_str, mission_category):
    488        """
    489        保存任务到本方，方便以后调用
    490        :param mission_name: 任务名
    491        :param mission_return_str: 任务调用返回值
    492        :param mission_category: ElementType, 任务类型
    493        :return: Mission, Mission实例
    494        """
    495        new_mission = None
    496        mission_guid = cf.mission_guid_parser(mission_return_str)
    497        if mission_category == ElementType.PatrolMission:
    498            new_mission = PatrolMission(mission_guid, mission_name, self.Name)
    499        elif mission_category == ElementType.StrikeMission:
    500            new_mission = StrikeMission(mission_guid, mission_name, self.Name)
    501        elif mission_category == ElementType.SupportMission:
    502            new_mission = SupportMission(mission_guid, mission_name, self.Name)
    503        elif mission_category == ElementType.FerryMission:
    504            new_mission = FerryMission(mission_guid, mission_name, self.Name)
    505        elif mission_category == ElementType.CargoMission:
    506            new_mission = CargoMission(mission_guid, mission_name, self.Name)
    507        elif mission_category == ElementType.MineMission:
    508            new_mission = MineMission(mission_guid, mission_name, self.Name)
    509        elif mission_category == ElementType.MineClearMission:
    510            new_mission = MineClearMission(mission_guid, mission_name, self.Name)
    511        if new_mission is not None:
    512            self.missions_obj[mission_name] = new_mission
    513            self.deduce_add_unit(mission_guid, new_mission)
    514            new_mission._game_server = self._game_server
    515            if mission_category == ElementType.StrikeMission:
    516                new_mission.escort._game_server = self._game_server
    517        return new_mission

保存任务到本方，方便以后调用 :param mission_name: 任务名 :param mission_return_str: 任务调用返回值 :param mission_category: ElementType, 任务类型 :return: Mission, Mission实例

def get_mission_by_name(self, mission_name): View Source

    521    def get_mission_by_name(self, mission_name):
    522        """
    523        1、通过任务名获取任务对象
    524        :param mission_name: str，任务名
    525        :return: 任务对象
    526        """
    527        if mission_name in self.missions_obj:
    528            return self.missions_obj[mission_name]
    529        else:
    530            return None

1、通过任务名获取任务对象 :param mission_name: str，任务名 :return: 任务对象

def get_unit(self, guid): View Source

    532    def get_unit(self, guid):
    533        """
    534        2、获取实体单元对象
    535        :param guid: str, 实体guid
    536        :return: Unit, 作战单元对象
    537        """
    538        if guid in self.aircrafts:
    539            return self.aircrafts[guid]
    540        if guid in self.ships:
    541            return self.ships[guid]
    542        if guid in self.submarines:
    543            return self.submarines[guid]
    544        if guid in self.satellites:
    545            return self.satellites[guid]
    546        if guid in self.facilitys:
    547            return self.facilitys[guid]
    548        if guid in self.weapons:
    549            return self.weapons[guid]
    550        if guid in self.groups:
    551            return self.groups[guid]
    552        return None

2、获取实体单元对象 :param guid: str, 实体guid :return: Unit, 作战单元对象

def get_contact(self, contact_guid): View Source

    554    def get_contact(self, contact_guid):
    555        """
    556        3、获取情报信息
    557        :param contact_guid:  情报对象guid, 非实际单元guid
    558        :return: dict 如果存在此情报id, 否则返回None
    559        """
    560        if contact_guid in self.Contacts:
    561            return self.Contacts[contact_guid]
    562        else:
    563            return None

3、获取情报信息 :param contact_guid: 情报对象guid, 非实际单元guid :return: dict 如果存在此情报id, 否则返回None

def get_weather(self): View Source

    565    def get_weather(self):
    566        """
    567        4、获取当前天气
    568        :return: str, 当前前天数据
    569        """
    570        return self._game_server.api_get_weather(self)

4、获取当前天气 :return: str, 当前前天数据

def get_elevation(self, coord_point): View Source

    572    def get_elevation(self, coord_point):
    573        """
    574        5、获取某点（纬经度）高程----勿智能体训练或调度时大规模调用，以防服务器过载！
    575        :param coord_point: tuple, (float, float) (lat, lon)
    576        :return: int, 地形高程数据
    577        """
    578        return self._game_server.api_get_elevation(self, coord_point)

5、获取某点（纬经度）高程----勿智能体训练或调度时大规模调用，以防服务器过载！ :param coord_point: tuple, (float, float) (lat, lon) :return: int, 地形高程数据

def reference_point_add(self, points): View Source

    580    def reference_point_add(self, points):
    581        """
    582        6、添加一个或多个参考点
    583        :param points: tuple, 或list,  参考点列表,例:(40.2, 49.6) 或 [(40, 39.0), (41, 39.0)]，其中纬度值在前，经度值在后
    584                                                或者 (40.2, 49.6, 'RP002') 或 [(40, 39.0, 'RP1'), (41, 39.0, 'RP2')]，已传入参考点命名
    585        :return: list, 按顺序添加成功的参考点名列表
    586        """
    587        return self._game_server.api_reference_point_add(self, points)

6、添加一个或多个参考点 :param points: tuple, 或list, 参考点列表,例:(40.2, 49.6) 或 [(40, 39.0), (41, 39.0)]，其中纬度值在前，经度值在后 或者 (40.2, 49.6, 'RP002') 或 [(40, 39.0, 'RP1'), (41, 39.0, 'RP2')]，已传入参考点命名 :return: list, 按顺序添加成功的参考点名列表

def reference_point_move(self, rp_name, new_coord): View Source

    589    def reference_point_move(self, rp_name, new_coord):
    590        """
    591        7、移动参考点的位置
    592        :param rp_name: str, 参考点名称
    593        :param new_coord: tuple, 新的纬度、经度位置 (lat, lon)
    594        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    595        """
    596        return self._game_server.api_reference_point_move(self, rp_name, new_coord)

7、移动参考点的位置 :param rp_name: str, 参考点名称 :param new_coord: tuple, 新的纬度、经度位置 (lat, lon) :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def reference_point_delete(self, rp_name): View Source

    598    def reference_point_delete(self, rp_name):
    599        """
    600        8、删除参考点
    601        :param rp_name:  str, 参考点名称
    602        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    603        """
    604        self._game_server.api_reference_point_delete(self, rp_name)

8、删除参考点 :param rp_name: str, 参考点名称 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def add_reference_point_list(self, points): View Source

    606    def add_reference_point_list(self, points):
    607        """
    608        9、批量增加多个参考点
    609        :param points: list, 参考点列表，格式：[(50.2,149,'RP-1'),(51,149.6,'RP-2')] 纬度，经度和名称
    610                                    或不指定参考点名：[(50.2,149),(51,149.6)] 纬度，经度
    611        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    612        """
    613        return self._game_server.api_add_reference_point_list(self, points)

9、批量增加多个参考点 :param points: list, 参考点列表，格式：[(50.2,149,'RP-1'),(51,149.6,'RP-2')] 纬度，经度和名称 或不指定参考点名：[(50.2,149),(51,149.6)] 纬度，经度 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def assign_units_to_mission(self, unit_list, mission_name, is_escort=False): View Source

    615    def assign_units_to_mission(self, unit_list, mission_name, is_escort=False):
    616        """
    617        10、分配多个单元到任务
    618        :param unit_list: list, 实体guid列表
    619        :param mission_name: str, 分配的任务名
    620        :param is_escort: bool, 是否打击任务的护航任务
    621        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    622        """
    623        return self._game_server.api_assign_units_to_mission(self, unit_list, mission_name, is_escort)

10、分配多个单元到任务 :param unit_list: list, 实体guid列表 :param mission_name: str, 分配的任务名 :param is_escort: bool, 是否打击任务的护航任务 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def clear_unit_course(self, guid): View Source

    625    def clear_unit_course(self, guid):
    626        """
    627        11、清除单元所有航路点
    628        :param guid: str, 单元guid
    629        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    630        """
    631        self._game_server.api_clear_unit_course(self, guid)

11、清除单元所有航路点 :param guid: str, 单元guid :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def create_patrol_mission(self, name, mission_type, point_list): View Source

    633    def create_patrol_mission(self, name, mission_type, point_list):
    634        """
    635        12、创建巡逻任务, 例子：
    636            create_patrol_mission('空战巡逻中央区', MissionPatrolType.AIR, [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)])
    637        :param name: str, 任务名
    638        :param mission_type: MissionPatrolType, 任务类型
    639        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
    640                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
    641                            或者['RP1', 'RP2'，'RP3'，'RP4']，传入参考点名称要求提前创建好参考点
    642        :return: PatrolMission, 任务实体
    643        """
    644        return self._game_server.api_create_patrol_mission(self, name, mission_type, point_list)

12、创建巡逻任务, 例子： create_patrol_mission('空战巡逻中央区', MissionPatrolType.AIR, [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]) :param name: str, 任务名 :param mission_type: MissionPatrolType, 任务类型 :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0 或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')] 或者['RP1', 'RP2'，'RP3'，'RP4']，传入参考点名称要求提前创建好参考点 :return: PatrolMission, 任务实体

def add_prosecution_zone(self, mission_name, point_list): View Source

    646    def add_prosecution_zone(self, mission_name, point_list):
    647        """
    648        13、增加巡逻任务的警戒区
    649        :param mission_name: str, 任务名
    650        :param point_list: list, list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
    651                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
    652                            或者['RP1', 'RP2'，'RP3'，'RP4']，传入参考点名称要求提前创建好参考点
    653        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    654        """
    655        return self._game_server.api_add_prosecution_zone(self, mission_name, point_list)

13、增加巡逻任务的警戒区 :param mission_name: str, 任务名 :param point_list: list, list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0 或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')] 或者['RP1', 'RP2'，'RP3'，'RP4']，传入参考点名称要求提前创建好参考点 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def create_strike_mission(self, name, mission_type): View Source

    657    def create_strike_mission(self, name, mission_type):
    658        """
    659        14、创建打击任务
    660        :param name: str, 任务名
    661        :param mission_type: MissionStrikeType, 打击任务类型，对空打击，对地打击等
    662        :return: StrikeMission, 任务实体
    663        """
    664        return self._game_server.api_create_strike_mission(self, name, mission_type)

14、创建打击任务 :param name: str, 任务名 :param mission_type: MissionStrikeType, 打击任务类型，对空打击，对地打击等 :return: StrikeMission, 任务实体

def create_support_mission(self, name, point_list): View Source

    666    def create_support_mission(self, name, point_list):
    667        """
    668        15、创建支援任务, 例子：
    669            create_support_mission('空中支援', [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)])
    670        :param name: str, 任务名
    671        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
    672                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
    673                            或者['RP1', 'RP2'，'RP3'，'RP        4']，传入参考点名称要求提前创建好参考点
    674        :return: SupportMission, 任务实体
    675        """
    676        return self._game_server.api_create_support_mission(self, name, point_list)

15、创建支援任务, 例子： create_support_mission('空中支援', [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]) :param name: str, 任务名 :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0 或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')] 或者['RP1', 'RP2'，'RP3'，'RP 4']，传入参考点名称要求提前创建好参考点 :return: SupportMission, 任务实体

def create_ferry_mission(self, name, destination): View Source

    678    def create_ferry_mission(self, name, destination):
    679        """
    680        16、创建转场任务
    681        :param name: str, 任务名
    682        :param destination: str, 目的地guid
    683        :return: FerryMission, 任务实体
    684        """
    685        return self._game_server.api_create_ferry_mission(self, name, destination)

16、创建转场任务 :param name: str, 任务名 :param destination: str, 目的地guid :return: FerryMission, 任务实体

def create_mine_mission(self, name, point_list): View Source

    687    def create_mine_mission(self, name, point_list):
    688        """
    689        17、创建布雷任务, 例子：
    690            create_mine_mission('布雷2', [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)])
    691        :param name: str, 任务名
    692        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
    693                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
    694                            或者['RP1', 'RP2'，'RP3'，'RP        4']，传入参考点名称要求提前创建好参考点
    695        :return: MineMission, 任务实体
    696        """
    697        return self._game_server.api_create_mine_mission(self, name, point_list)

17、创建布雷任务, 例子： create_mine_mission('布雷2', [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]) :param name: str, 任务名 :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0 或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')] 或者['RP1', 'RP2'，'RP3'，'RP 4']，传入参考点名称要求提前创建好参考点 :return: MineMission, 任务实体

def create_mineclear_mission(self, name, point_list): View Source

    699    def create_mineclear_mission(self, name, point_list):
    700        """
    701        18、创建扫雷任务, 例子：
    702            create_mineclear_mission('绝对扫雷', [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)])
    703        :param name: str, 任务名
    704        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
    705                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
    706                            或者['RP1', 'RP2'，'RP3'，'RP        4']，传入参考点名称要求提前创建好参考点
    707        :return: MineClearMission, 任务实体
    708        """
    709        return self._game_server.api_create_mineclear_mission(self, name, point_list)

18、创建扫雷任务, 例子： create_mineclear_mission('绝对扫雷', [(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]) :param name: str, 任务名 :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0 或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')] 或者['RP1', 'RP2'，'RP3'，'RP 4']，传入参考点名称要求提前创建好参考点 :return: MineClearMission, 任务实体

def create_cargo_mission(self, name, point_list): View Source

    711    def create_cargo_mission(self, name, point_list):
    712        """
    713        19、创建货运任务
    714        :param name: str, 任务名
    715        :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0
    716                            或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')]
    717                            或者['RP1', 'RP2'，'RP3'，'RP        4']，传入参考点名称要求提前创建好参考点
    718        :return: CargoMission, 任务实体
    719        """
    720        return self._game_server.api_create_cargo_mission(self, name, point_list)

19、创建货运任务 :param name: str, 任务名 :param point_list: list, 参考点列表,例:[(40, 39.0), (41, 39.0), (41, 40.0), (40, 40.0)]，其中纬度值在前，经度值在后，(40, 39.0)中,latitude = 40, longitude = 39.0 或者[(40, 39.0, 'RP1'), (41, 39.0, 'RP2'), (41, 40.0, 'RP3'), (40, 40.0, 'RP4')] 或者['RP1', 'RP2'，'RP3'，'RP 4']，传入参考点名称要求提前创建好参考点 :return: CargoMission, 任务实体

def delete_mission(self, mission_name): View Source

    722    def delete_mission(self, mission_name):
    723        """
    724        20、删除任务
    725        :param mission_name: str, 任务名称
    726        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    727        """
    728        return self._game_server.api_delete_mission(self, mission_name)

20、删除任务 :param mission_name: str, 任务名称 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def assign_unit_mission(self, unit_id, mission_name): View Source

    730    def assign_unit_mission(self, unit_id, mission_name):
    731        """
    732        21、给任务分配单元
    733        :param unit_id: str, 单元guid
    734        :param mission_name: str, 拟分配的任务名
    735        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    736        """
    737        return self._game_server.api_assign_unit_mission(self, unit_id, mission_name)

21、给任务分配单元 :param unit_id: str, 单元guid :param mission_name: str, 拟分配的任务名 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def units_withdraw_from_mission(self, units): View Source

    739    def units_withdraw_from_mission(self, units):
    740        """
    741        22、将若干单元取消分配任务
    742        :param units: list, 取消任务的单元guid列表
    743        :return: None
    744        """
    745        self._game_server.api_units_withdraw_from_mission(self, units)

22、将若干单元取消分配任务 :param units: list, 取消任务的单元guid列表 :return: None

def del_unit_from_mission(self, unit_guid): View Source

    747    def del_unit_from_mission(self, unit_guid):
    748        """
    749        23、将某单元取消分配任务
    750        :param unit_guid: str, 单元guid
    751        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    752        """
    753        return self._game_server.api_del_unit_from_mission(self, unit_guid)

23、将某单元取消分配任务 :param unit_guid: str, 单元guid :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def zone_remove(self, zone_type, zone_guid): View Source

    755    def zone_remove(self, zone_type, zone_guid):
    756        """
    757        24、删除禁航区或封锁区域
    758        :param zone_type: int, 1:封锁区，0：禁航区
    759        :param zone_guid: str, 区域的guid
    760        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    761        """
    762        return self._game_server.api_zone_remove(self, zone_type, zone_guid)

24、删除禁航区或封锁区域 :param zone_type: int, 1:封锁区，0：禁航区 :param zone_guid: str, 区域的guid :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def zone_add_no_navigate(self, name, reference_points, affects=None): View Source

    764    def zone_add_no_navigate(self, name, reference_points, affects=None):
    765        """
    766        25、添加禁航区
    767        :param name: str, 禁航区名
    768        :param reference_points:list, 参考点列表, 例:[(40, 139.0), (41, 139.0), (41, 140.0)], 先纬度，再经度；
    769                                        或指定参考点名：[(40, 139.0,'RP1'), (41, 139.0,'RP2'), (41, 140.0,'RP3')],先纬度，再经度
    770        :param affects: list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用
    771                            1:飞机；2:水面舰艇; 3:潜艇；4:地面单元
    772        :return:str, zone guid
    773        """
    774        if affects is None:
    775            affects = [1, 2, 3, 4]
    776        return self.zone_add(reference_points, 0, name, affects)

25、添加禁航区 :param name: str, 禁航区名 :param reference_points:list, 参考点列表, 例:[(40, 139.0), (41, 139.0), (41, 140.0)], 先纬度，再经度； 或指定参考点名：[(40, 139.0,'RP1'), (41, 139.0,'RP2'), (41, 140.0,'RP3')],先纬度，再经度 :param affects: list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用 1:飞机；2:水面舰艇; 3:潜艇；4:地面单元 :return:str, zone guid

def zone_add_exclusion(self, name, reference_points, affects=None): View Source

    778    def zone_add_exclusion(self, name, reference_points, affects=None):
    779        """
    780        26、添加封锁区
    781        :param name: str, 封锁区名
    782        :param reference_points:list, 参考点列表， 例:[(40, 139.0), (41, 139.0), (41, 140.0)], 先纬度，再经度
    783                                    或指定参考点名：[(40, 139.0,'RP2'), (41, 139.0,'RP3'), (41, 140.0,'RP4')],先纬度，再经度,再参考点名
    784        :param affects: list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用
    785                            1:飞机；2:水面舰艇; 3:潜艇；4:地面单元
    786        :return:str, zone guid
    787        """
    788        if affects is None:
    789            affects = [1, 2, 3, 4]
    790        return self.zone_add(reference_points, 1, name, affects)

26、添加封锁区 :param name: str, 封锁区名 :param reference_points:list, 参考点列表， 例:[(40, 139.0), (41, 139.0), (41, 140.0)], 先纬度，再经度 或指定参考点名：[(40, 139.0,'RP2'), (41, 139.0,'RP3'), (41, 140.0,'RP4')],先纬度，再经度,再参考点名 :param affects: list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用 1:飞机；2:水面舰艇; 3:潜艇；4:地面单元 :return:str, zone guid

def zone_add(self, reference_points, zone_type, zone_name, affects=None): View Source

    792    def zone_add(self, reference_points, zone_type, zone_name, affects=None):
    793        """
    794        27、添加禁航区或封锁区
    795        :param reference_points:  list, 区域点列表
    796        :param zone_type: int, 1: 封锁区   0:禁航区
    797        :param zone_name:  区域名
    798        :param affects: list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用
    799                            1:飞机；2:水面舰艇; 3:潜艇；4:地面单元
    800        :return: str, zone guid
    801        """
    802        zone_guid = self._game_server.api_zone_add(self, reference_points, zone_type, zone_name, affects)
    803        return cf.zone_guid_parser(zone_guid)

27、添加禁航区或封锁区 :param reference_points: list, 区域点列表 :param zone_type: int, 1: 封锁区 0:禁航区 :param zone_name: 区域名 :param affects: list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用 1:飞机；2:水面舰艇; 3:潜艇；4:地面单元 :return: str, zone guid

def zone_set(self, zone_type, zone_name, **kwargs): View Source

    805    def zone_set(self, zone_type, zone_name, **kwargs):
    806        """
    807        28、修改禁航区和封锁区
    808        :param zone_type: int, 1: 封锁区   0:禁航区
    809        :param zone_name: 禁航区和封锁区的名
    810        :param kwargs:  关键字参数  Area：list, 参考点列表， 例:[(40, 139.0), (41, 139.0), (41, 140.0)], 先纬度，再经度
    811                                    或指定参考点名：[(40, 139.0,'RP2'), (41, 139.0,'RP3'), (41, 140.0,'RP4')],先纬度，再经度,再参考点名
    812                                    或使用已建立参考点，则用参考点名列表，例: ['RP1', 'RP2', 'RP3']
    813                        Rename: str  新名字
    814                        Isactive： bool 是否启用
    815                        Affects： list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用;
    816                                    [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用
    817                                    1:飞机；2:水面舰艇; 3:潜艇；4:地面单元
    818                        Locked：bool 是否区域已锁定(只有禁航区才需要设置)
    819                        MarkAs： int 2=非友方，3=敌方（封锁区才有的设置）
    820        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    821        """
    822        return self._game_server.api_zone_set(self, zone_type, zone_name, **kwargs)

28、修改禁航区和封锁区 :param zone_type: int, 1: 封锁区 0:禁航区 :param zone_name: 禁航区和封锁区的名 :param kwargs: 关键字参数 Area：list, 参考点列表， 例:[(40, 139.0), (41, 139.0), (41, 140.0)], 先纬度，再经度 或指定参考点名：[(40, 139.0,'RP2'), (41, 139.0,'RP3'), (41, 140.0,'RP4')],先纬度，再经度,再参考点名 或使用已建立参考点，则用参考点名列表，例: ['RP1', 'RP2', 'RP3'] Rename: str 新名字 Isactive： bool 是否启用 Affects： list, 应用的装备类型，例:[1]:仅飞机适用; [1,2]:仅飞机、水面舰艇适用; [1,2,3,4]:飞机、水面舰艇,潜艇,地面单元适用 1:飞机；2:水面舰艇; 3:潜艇；4:地面单元 Locked：bool 是否区域已锁定(只有禁航区才需要设置) MarkAs： int 2=非友方，3=敌方（封锁区才有的设置） :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def group_add(self, list_unit_guid, group_name=''): View Source

    824    def group_add(self, list_unit_guid, group_name=""):
    825        """
    826        29、将多个单元作为一个编队
    827        :param list_unit_guid: list, 例：['2abc947e-8352-4639-9184-641706730018',
    828                                            '640a7c08-a17a-4fba-b055-07b568f22df5']
    829        :param group_name: str, 编队名
    830        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    831        """
    832        return self._game_server.api_group_add(self, list_unit_guid, group_name)

29、将多个单元作为一个编队 :param list_unit_guid: list, 例：['2abc947e-8352-4639-9184-641706730018', '640a7c08-a17a-4fba-b055-07b568f22df5'] :param group_name: str, 编队名 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def group_detach(self, list_unit_guid): View Source

    834    def group_detach(self, list_unit_guid):
    835        """
    836        30、分离编组单元
    837        :param list_unit_guid: list, 例：['2abc947e-8352-4639-9184-641706730018','640a7c08-a17a-4fba-b055-07b568f22df5']
    838        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    839        """
    840        return self._game_server.api_group_detach(self, list_unit_guid)

30、分离编组单元 :param list_unit_guid: list, 例：['2abc947e-8352-4639-9184-641706730018','640a7c08-a17a-4fba-b055-07b568f22df5'] :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def group_remove_unit(self, unit_guid): View Source

    842    def group_remove_unit(self, unit_guid):
    843        """
    844        31、将单元移除出编队
    845        :param unit_guid: 作战单元guid
    846        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    847        """
    848        return self._game_server.api_group_remove_unit(self, unit_guid)

31、将单元移除出编队 :param unit_guid: 作战单元guid :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def group_add_unit(self, group_guid, unit_guid): View Source

    850    def group_add_unit(self, group_guid, unit_guid):
    851        """
    852        32、编队添加一个单元
    853        :param group_guid: 编队guid
    854        :param unit_guid: 作战单元guid
    855        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    856        """
    857        return self._game_server.api_group_add_unit(self, group_guid, unit_guid)

32、编队添加一个单元 :param group_guid: 编队guid :param unit_guid: 作战单元guid :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def air_single_out(self, air_guid_list): View Source

    859    def air_single_out(self, air_guid_list):
    860        """
    861        33、飞机单机出动
    862        :param air_guid_list: list, 飞机的guid列表，  例子：['58ba-4013-92f5-2ewds','58ba-4013-92f5-2efa0']
    863        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    864        """
    865        return self._game_server.api_air_single_out(self, air_guid_list)

33、飞机单机出动 :param air_guid_list: list, 飞机的guid列表， 例子：['58ba-4013-92f5-2ewds','58ba-4013-92f5-2efa0'] :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def air_group_out(self, air_guid_list): View Source

    867    def air_group_out(self, air_guid_list):
    868        """
    869        34、飞机编组出动
    870        :param air_guid_list:  list, 飞机的guid列表，  例子：['4013-92f5-2effc','4013-92f5-d2fa0']
    871        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    872        """
    873        return self._game_server.api_air_group_out(self, air_guid_list)

34、飞机编组出动 :param air_guid_list: list, 飞机的guid列表， 例子：['4013-92f5-2effc','4013-92f5-d2fa0'] :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def aircraft_action_ready(self, mode, guid_list, loadout_id, qt_enabled): View Source

    875    def aircraft_action_ready(self, mode, guid_list, loadout_id, qt_enabled):
    876        """
    877        35、飞机准备/备战，飞机挂载武器;
    878        :param mode: 1: 准备就绪; 2: 准备就绪（不包括可选武器）
    879        :param guid_list: list, 飞机guid列表
    880        :param loadout_id: int, 挂载方案ID
    881        :param qt_enabled: bool, 是否快速出动, 如快速出动需提前确认此挂载是否快速出动
    882        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    883        """
    884        return self._game_server.api_aircraft_action_ready(self, mode, guid_list, loadout_id, qt_enabled)

35、飞机准备/备战，飞机挂载武器; :param mode: 1: 准备就绪; 2: 准备就绪（不包括可选武器） :param guid_list: list, 飞机guid列表 :param loadout_id: int, 挂载方案ID :param qt_enabled: bool, 是否快速出动, 如快速出动需提前确认此挂载是否快速出动 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def ship_action_alone(self, guid_list): View Source

    886    def ship_action_alone(self, guid_list):
    887        """
    888        36、船舶/潜艇单独出航
    889        :param guid_list: list, 舰船guid列表
    890        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    891        """
    892        return self._game_server.api_ship_action_alone(self, guid_list)

36、船舶/潜艇单独出航 :param guid_list: list, 舰船guid列表 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def ship_action_group(self, guid_list): View Source

    894    def ship_action_group(self, guid_list):
    895        """
    896        37、船舶/潜艇编队出航
    897        :param guid_list: list, 舰船guid列表
    898        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    899        """
    900        return self._game_server.api_ship_action_group(self, guid_list)

37、船舶/潜艇编队出航 :param guid_list: list, 舰船guid列表 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def ship_action_stop(self, guid_list): View Source

    902    def ship_action_stop(self, guid_list):
    903        """
    904        38、船舶/潜艇中止出航
    905        :param guid_list: list, 舰船guid列表
    906        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    907        """
    908        return self._game_server.api_ship_action_stop(self, guid_list)

38、船舶/潜艇中止出航 :param guid_list: list, 舰船guid列表 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def hold_position_all_unit(self, is_hold): View Source

    910    def hold_position_all_unit(self, is_hold):
    911        """
    912        39、保持所有单元阵位，所有单元停止机动，留在原地
    913        :param is_hold: bool
    914        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    915        """
    916        return self._game_server.api_hold_position_all_unit(self, is_hold)

39、保持所有单元阵位，所有单元停止机动，留在原地 :param is_hold: bool :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def unit_select_new_base(self, unit_guid, base_guid): View Source

    918    def unit_select_new_base(self, unit_guid, base_guid):
    919        """
    920        40、单元选择新基地/新港口
    921        :param unit_guid: 单元的guid
    922        :param base_guid: 新基地的guid
    923        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    924        """
    925        return self._game_server.api_unit_select_new_base(self, unit_guid, base_guid)

40、单元选择新基地/新港口 :param unit_guid: 单元的guid :param base_guid: 新基地的guid :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def unit_return_to_base(self, unit_guid): View Source

    927    def unit_return_to_base(self, unit_guid):
    928        """
    929        41、实体返航
    930        :param unit_guid: 单元的guid
    931        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    932        """
    933        return self._game_server.api_unit_return_to_base(self, unit_guid)

41、实体返航 :param unit_guid: 单元的guid :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def attack_contact_by_list(self, attack_list): View Source

    935    def attack_contact_by_list(self, attack_list):
    936        """
    937        42、批量自动攻击某目标
    938        :param attack_list, 攻击信息列表，每条信息包含一个元组, [(attack_id, target_id, weapon_id, weapon_count)]
    939                                                            攻击单元guid, 目标guid, 武器型号id, 武器数量
    940                例：[('guid1-2fljs', 'target1-fjslfjl2', 0, 0),     weapon_id=0代表自动打击，系统自动选择武器打击目标
    941                    ('guid1-3fljs', 'target3f-fjslfjd', 2880, 2)]  weapon_id=2880，手动攻击，指定打击的武器和数量
    942        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    943        """
    944        return self._game_server.api_attack_contact_by_list(self, attack_list)

42、批量自动攻击某目标 :param attack_list, 攻击信息列表，每条信息包含一个元组, [(attack_id, target_id, weapon_id, weapon_count)] 攻击单元guid, 目标guid, 武器型号id, 武器数量 例：[('guid1-2fljs', 'target1-fjslfjl2', 0, 0), weapon_id=0代表自动打击，系统自动选择武器打击目标 ('guid1-3fljs', 'target3f-fjslfjd', 2880, 2)] weapon_id=2880，手动攻击，指定打击的武器和数量 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def check_weapon_fire_condition(self, units_contacts): View Source

    946    def check_weapon_fire_condition(self, units_contacts):
    947        """
    948        43、开火条件检查, 返回检查开火条件结果； 耗时, 谨慎调用, 请勿每天文时间10秒调用超过3次！！！
    949        :param units_contacts:list, or tuple, example:  [(unit1, target1),(unit2, target2)] or (unit1, target1)
    950        :return: dict, 例子：
    951            {"1796":{"AmmoTotal":5,"AmmoDist":0,"AutoFire":"不能自动开火，目标超出武器射程",
    952            "Status":"自由开火","Authorize":"每次齐射发射所有武器. 最大射程武器发射. 飞机-第四代战斗机/攻击[敏捷性/通用：4.0～4.9]（F-14、F-15、F-16、MiG-29、Su-27）",
    953            "ManualFire":{"目标超出武器射程":5}},
    954            "1896":{"AmmoTotal":2,"AmmoDist":0,"AutoFire":"不能自动开火，目标超出武器射程","Status":"自由开火",
    955            "Authorize":"1x rnd 每次齐射. 最大射程武器发射. 飞机-第四代战斗机/攻击[敏捷性/通用：4.0～4.9]（F-14、F-15、F-16、MiG-29、Su-27）",
    956            "ManualFire":{"目标超出武器射程":2}},
    957            "2056":{"AmmoTotal":6,"AmmoDist":0,"AutoFire":"OK","Status":"自由开火",
    958            "Authorize":"1x rnd 每次齐射. 15海里 最大射程. 飞机-第四代战斗机/攻击[敏捷性/通用：4.0～4.9]（F-14、F-15、F-16、MiG-29、Su-27）",
    959            "ManualFire":{"OK":6}}}
    960        """
    961        return self._game_server.api_check_weapon_fire_condition(self, units_contacts)

43、开火条件检查, 返回检查开火条件结果； 耗时, 谨慎调用, 请勿每天文时间10秒调用超过3次！！！ :param units_contacts:list, or tuple, example: [(unit1, target1),(unit2, target2)] or (unit1, target1) :return: dict, 例子： {"1796":{"AmmoTotal":5,"AmmoDist":0,"AutoFire":"不能自动开火，目标超出武器射程", "Status":"自由开火","Authorize":"每次齐射发射所有武器. 最大射程武器发射. 飞机-第四代战斗机/攻击[敏捷性/通用：4.0～4.9]（F-14、F-15、F-16、MiG-29、Su-27）", "ManualFire":{"目标超出武器射程":5}}, "1896":{"AmmoTotal":2,"AmmoDist":0,"AutoFire":"不能自动开火，目标超出武器射程","Status":"自由开火", "Authorize":"1x rnd 每次齐射. 最大射程武器发射. 飞机-第四代战斗机/攻击[敏捷性/通用：4.0～4.9]（F-14、F-15、F-16、MiG-29、Su-27）", "ManualFire":{"目标超出武器射程":2}}, "2056":{"AmmoTotal":6,"AmmoDist":0,"AutoFire":"OK","Status":"自由开火", "Authorize":"1x rnd 每次齐射. 15海里 最大射程. 飞机-第四代战斗机/攻击[敏捷性/通用：4.0～4.9]（F-14、F-15、F-16、MiG-29、Su-27）", "ManualFire":{"OK":6}}}

def contact_rename(self, contact_id, new_name): View Source

    963    def contact_rename(self, contact_id, new_name):
    964        """
    965        44、情报标识重命名
    966        :param contact_id: str, contact id
    967        :param new_name: str, new name
    968        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    969        """
    970        return self._game_server.api_contact_rename(self, contact_id, new_name)

44、情报标识重命名 :param contact_id: str, contact id :param new_name: str, new name :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def contact_mark_position(self, contact_id): View Source

    972    def contact_mark_position(self, contact_id):
    973        """
    974        45、情报标识标记位置
    975        :param contact_id:str, contact id
    976        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    977        """
    978        return self._game_server.api_contact_mark_position(self, contact_id)

45、情报标识标记位置 :param contact_id:str, contact id :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def contact_mark_posture(self, contact_id, posture): View Source

    980    def contact_mark_posture(self, contact_id, posture):
    981        """
    982        46、标识情报阵营
    983        :param contact_id: str, 情报id
    984        :param posture: 枚举ContactStance, global_util.py中定义
    985        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    986        """
    987        return self._game_server.api_contact_mark_posture(self, contact_id, posture)

46、标识情报阵营 :param contact_id: str, 情报id :param posture: 枚举ContactStance, global_util.py中定义 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def contact_drop_target(self, contact_id): View Source

    989    def contact_drop_target(self, contact_id):
    990        """
    991        47、断开若干情报标识
    992        :param contact_id: str, 情报id; 或list, 情报id列表
    993        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    994        """
    995        return self._game_server.api_contact_drop_target(self, contact_id)

47、断开若干情报标识 :param contact_id: str, 情报id; 或list, 情报id列表 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def unit_newname(self, guid, newname): View Source

     997    def unit_newname(self, guid, newname):
     998        """
     999        48、修改单元名称
    1000        :param guid:str, 单元guid
    1001        :param newname:str, 单元名
    1002        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    1003        """
    1004        return self._game_server.api_unit_newname(self, guid, newname)

48、修改单元名称 :param guid:str, 单元guid :param newname:str, 单元名 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def set_aircraft_loadout_plan_time(self, unit_id, loadoutID): View Source

    1006    def set_aircraft_loadout_plan_time(self, unit_id, loadoutID):
    1007        """
    1008        49、战前规划时间，可设置飞机挂载，不限制机场或航母弹药，准备时间为0，即可马上准备好
    1009        :param unit_id: str, 单元id或单元名称
    1010        :param loadoutID: int  武器挂载方案ID
    1011        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    1012        """
    1013        return self._game_server.api_set_loadout_plan_time(self.get_command_check(unit_id), loadoutID)

49、战前规划时间，可设置飞机挂载，不限制机场或航母弹药，准备时间为0，即可马上准备好 :param unit_id: str, 单元id或单元名称 :param loadoutID: int 武器挂载方案ID :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def unit_new_position(self, unit_guid, lon_lat=None, alt=None, depth=None, heading=None): View Source

    1015    def unit_new_position(self, unit_guid, lon_lat=None, alt=None, depth=None, heading=None):
    1016        """
    1017        50、战前规划时间，对战开始之前，设置本单元经纬度位置或高度或深度或航向
    1018        飞机、舰船、潜艇可以移动到距初始位置最大距离（20千米）内任意位置（符合地形-例：船在海中，飞机不可在山内）
    1019        正式推演对战之后，本接口会调用失效并给出提示！
    1020        :param unit_guid: str, 本推演方单元guid
    1021        :param lon_lat: tuple, 经度、纬度的元组，(float,float) 需要移动单元到的目的地经度纬度
    1022                                东经0到180，西经-180到0；北纬0到90，南纬-90到0
    1023        :param alt: float, 单元的目标高度（仅用于飞机），米
    1024        :param depth: float, 单元的目标深度（仅用于潜艇），米，正数即可
    1025        :param heading: float, 单元的目标航向，0到360度，正北为0，顺时针增大到360
    1026        :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似
    1027        """
    1028        return self._game_server.unit_new_position(self.get_command_check(unit_guid), long_lat=lon_lat,
    1029                                                   altitude=alt, new_depth=depth, new_heading=heading)

50、战前规划时间，对战开始之前，设置本单元经纬度位置或高度或深度或航向 飞机、舰船、潜艇可以移动到距初始位置最大距离（20千米）内任意位置（符合地形-例：船在海中，飞机不可在山内） 正式推演对战之后，本接口会调用失效并给出提示！ :param unit_guid: str, 本推演方单元guid :param lon_lat: tuple, 经度、纬度的元组，(float,float) 需要移动单元到的目的地经度纬度 东经0到180，西经-180到0；北纬0到90，南纬-90到0 :param alt: float, 单元的目标高度（仅用于飞机），米 :param depth: float, 单元的目标深度（仅用于潜艇），米，正数即可 :param heading: float, 单元的目标航向，0到360度，正北为0，顺时针增大到360 :return: 指令执行结果, Reply对象, 和global_util.py中Reply类定义类似

def agent_message_text(self, text): View Source

    1031    def agent_message_text(self, text):
    1032        """
    1033        51、客户端应用智能体中，智能体消息输出接口——纯文本
    1034        :param text: str, 纯文本消息
    1035        :return: str, 返回信息
    1036        """
    1037        return self._game_server.agent_message_ouput(data_type=0, message={}, text=text, timestamp=self.simulate_timestamp)

51、客户端应用智能体中，智能体消息输出接口——纯文本 :param text: str, 纯文本消息 :return: str, 返回信息

def agent_message_intelligence(self, level, contact_id, text): View Source

    1039    def agent_message_intelligence(self, level, contact_id, text):
    1040        """
    1041        52、客户端应用智能体中，智能体消息输出接口——重要情报（202507版本未实现）
    1042        :param level: int
    1043            level重要情报层级：
    1044                1：一级情报，核心情报信息，显示为红色
    1045                2：二级情报，重要情报信息，显示为橙色
    1046                3：三级情报，一般情报信息，显示为白色
    1047        :param contact_id: str, 情报ID
    1048        :param text: str, 纯文本消息
    1049        :return: str, 返回信息
    1050        """
    1051        message = {
    1052            'level': level,
    1053            'contact_id': contact_id
    1054        }
    1055        return self._game_server.agent_message_ouput(data_type=1, message=message, text=text, timestamp=self.simulate_timestamp)

52、客户端应用智能体中，智能体消息输出接口——重要情报（202507版本未实现） :param level: int level重要情报层级： 1：一级情报，核心情报信息，显示为红色 2：二级情报，重要情报信息，显示为橙色 3：三级情报，一般情报信息，显示为白色 :param contact_id: str, 情报ID :param text: str, 纯文本消息 :return: str, 返回信息

def agent_message_unit_range(self, unit_id, dbrange, color_type, line_type, text): View Source

    1057    def agent_message_unit_range(self, unit_id, dbrange, color_type, line_type, text):
    1058        """
    1059        53、客户端应用智能体中，智能体消息输出接口——圆形区域显示（跟随单元）（202507版本未实现）
    1060        :param unit_id: str, 圆形区域跟随的单元id，可以跟随己方单元或者是敌方单元
    1061        :param dbrange: float, 显示区域半径，千米
    1062        :param color_type: int: 1：白色 2：橙色 3：红色 4：蓝色 5：紫色 6：黄色 7：绿色
    1063        :param line_type: int, 0：实线 1：虚线
    1064        :param text: str, 纯文本消息
    1065        :return: str, 返回信息
    1066        """
    1067        message = {
    1068            'unit_id': unit_id,
    1069            'dbrange': dbrange,
    1070            'color_type': color_type,
    1071            'line_type': line_type
    1072        }
    1073        return self._game_server.agent_message_ouput(data_type=2, message=message, text=text, timestamp=self.simulate_timestamp)

53、客户端应用智能体中，智能体消息输出接口——圆形区域显示（跟随单元）（202507版本未实现） :param unit_id: str, 圆形区域跟随的单元id，可以跟随己方单元或者是敌方单元 :param dbrange: float, 显示区域半径，千米 :param color_type: int: 1：白色 2：橙色 3：红色 4：蓝色 5：紫色 6：黄色 7：绿色 :param line_type: int, 0：实线 1：虚线 :param text: str, 纯文本消息 :return: str, 返回信息

def agent_message_arrow(self, arrow_name, color_type, line_type, points_list, text): View Source

    1075    def agent_message_arrow(self, arrow_name, color_type, line_type, points_list, text):
    1076        """
    1077        54、客户端应用智能体中，智能体消息输出接口——箭头（202507版本未实现）
    1078        :param arrow_name: str, 箭头名称
    1079        :param color_type: int, 1：白色 2：橙色 3：红色 4：蓝色 5：紫色 6：黄色 7：绿色
    1080        :param line_type: int: 0：实线 1：虚线
    1081        :param points_list: list, 形成箭头的点，[(lon1,lat1),(lon2,lat2)...] ,列表最后一行经纬度为箭头指向
    1082        :param text: str, 纯文本消息
    1083        :return: str, 返回信息
    1084        """
    1085        message = {
    1086            'arrow_name': arrow_name,
    1087            'color_type': color_type,
    1088            'line_type': line_type,
    1089            'points_list': points_list
    1090        }
    1091        return self._game_server.agent_message_ouput(data_type=3, message=message, text=text, timestamp=self.simulate_timestamp)

54、客户端应用智能体中，智能体消息输出接口——箭头（202507版本未实现） :param arrow_name: str, 箭头名称 :param color_type: int, 1：白色 2：橙色 3：红色 4：蓝色 5：紫色 6：黄色 7：绿色 :param line_type: int: 0：实线 1：虚线 :param points_list: list, 形成箭头的点，[(lon1,lat1),(lon2,lat2)...] ,列表最后一行经纬度为箭头指向 :param text: str, 纯文本消息 :return: str, 返回信息

def agent_message_area(self, area_name, points_list, text): View Source

    1093    def agent_message_area(self, area_name, points_list, text):
    1094        """
    1095        55、客户端应用智能体中，智能体消息输出接口——多边形区域（202507版本未实现）
    1096        :param area_name: str, 箭头名称
    1097        :param points_list: list, 区域点[(lon1,lat1),(lon2,lat2)...]
    1098        :param text: str, 纯文本消息
    1099        :return: str, 返回信息
    1100        """
    1101        message = {
    1102            'area_name': area_name,
    1103            'points_list': points_list
    1104        }
    1105        return self._game_server.agent_message_ouput(data_type=4, message=message, text=text, timestamp=self.simulate_timestamp)

55、客户端应用智能体中，智能体消息输出接口——多边形区域（202507版本未实现） :param area_name: str, 箭头名称 :param points_list: list, 区域点[(lon1,lat1),(lon2,lat2)...] :param text: str, 纯文本消息 :return: str, 返回信息

##### Inherited Members

engine.LingYi.entitys.gameunit.GameUnit
  secure_key2
  secure_key
  check_id_api
  get_key
  set_key
  clear_key
  delete_sub_object
engine.LingYi.entitys.operatorbase.DoctrineOperator
  Doctrine
  category
  category_str
  doctrine_switch_radar
  doctrine_switch_oecm
  doctrine_switch_sonar
  doctrine_SetEMCON_Inherit
  use_nuclear_weapons
  doctrine_weapon_control_status_air
  doctrine_weapon_control_status_surface
  doctrine_weapon_control_status_subsurface
  doctrine_weapon_control_status_land
  doctrine_ignore_plotted_course
  doctrine_engaging_ambiguous_targets
  doctrine_engage_opportunity_targets
  doctrine_ignore_emcon_under_attack
  torpedoes_kinematic_range
  doctrine_automatic_evasion
  doctrine_refuel
  doctrine_refuel_select
  doctrine_refuel_allied
  doctrine_air_operations_tempo
  doctrine_quick_turnaround
  doctrine_fuel_state_planned
  doctrine_fuel_state_rtb
  doctrine_weapon_state_planned
  doctrine_weapon_state_rtb
  doctrine_gun_strafing
  doctrine_jettison_ordnance
  doctrine_bvr_logic
  use_sams_in_anti_surface_mode
  doctrine_maintain_standoff
  doctrine_navigation_surface_mode
  avoid_contact
  dive_on_threat
  recharge_on_patrol
  recharge_on_attack
  use_aip
  dipping_sonar
  navigation_sub
  navigation_land
  set_weapon_release_authority
  wra_qty_salvo
  wra_shooter_salvo
  wra_firing_range
  wra_self_defence_distance
  withdraw_on_damage
  withdraw_on_fuel
  withdraw_on_attack
  withdraw_on_defence
  deploy_on_damage
  deploy_on_fuel
  deploy_on_attack
  deploy_on_defence
  get_doctrineWRA
engine.LingYi.entitys.element.Element
  ID
  Name
  Side
  ElementType