NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

data.py (14462B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\dogma\data.py
      2 import math
      3 import re
      4 import logging
      5 from collections import defaultdict, namedtuple
      6 import evetypes
      7 from caching.memoize import Memoize
      8 from dogma.const import attributeDataTypeTypeDamage, attributeMass, attributeCapacity, attributeVolume, attributeRadius
      9 from dogma.identity import get_safe_dogma_identity
     10 from fsdBuiltData.common.base import BuiltDataLoader
     11 logger = logging.getLogger(__name__)
     12 try:
     13     import typeDogmaLoader
     14 except ImportError:
     15     typeDogmaLoader = None
     16     logger.debug('typeDogmaLoader not available')
     17 
     18 try:
     19     import dogmaAttributesLoader
     20 except ImportError:
     21     dogmaAttributesLoader = None
     22     logger.debug('dogmaAttributesLoader not available')
     23 
     24 try:
     25     import dogmaAttributeCategoriesLoader
     26 except ImportError:
     27     dogmaAttributeCategoriesLoader = None
     28     logger.debug('dogmaAttributeCategoriesLoader not available')
     29 
     30 try:
     31     import dogmaEffectsLoader
     32 except ImportError:
     33     dogmaEffectsLoader = None
     34     logger.debug('dogmaEffectsLoader not available')
     35 
     36 charge_group_regex = re.compile('chargeGroup\\d{1,2}')
     37 module_ship_group_regex = re.compile('moduleShipGroup\\d{1,2}')
     38 DogmaTypeAttribute = namedtuple('DogmaTypeAttribute', ['attributeID', 'value'])
     39 
     40 class DogmaAttributeCategories(BuiltDataLoader):
     41     __resBuiltFile__ = 'res:/staticdata/dogmaAttributeCategories.fsdbinary'
     42     __serverAutobuildBuiltFile__ = 'eve/autobuild/staticData/server/dogmaAttributeCategories.fsdbinary'
     43     __clientAutobuildBuiltFile__ = 'eve/autobuild/staticdata/client/dogmaAttributeCategories.fsdbinary'
     44     __loader__ = dogmaAttributeCategoriesLoader
     45 
     46 
     47 class DogmaAttributes(BuiltDataLoader):
     48     __resBuiltFile__ = 'res:/staticdata/dogmaAttributes.fsdbinary'
     49     __serverAutobuildBuiltFile__ = 'eve/autobuild/staticData/server/dogmaAttributes.fsdbinary'
     50     __clientAutobuildBuiltFile__ = 'eve/autobuild/staticdata/client/dogmaAttributes.fsdbinary'
     51     __dataemporiumDatasetName__ = 'staticdata:/dogma/dogmaAttributes'
     52     __loader__ = dogmaAttributesLoader
     53 
     54 
     55 class TypeDogma(BuiltDataLoader):
     56     __resBuiltFile__ = 'res:/staticdata/typeDogma.fsdbinary'
     57     __serverAutobuildBuiltFile__ = 'eve/autobuild/staticData/server/typeDogma.fsdbinary'
     58     __clientAutobuildBuiltFile__ = 'eve/autobuild/staticdata/client/typeDogma.fsdbinary'
     59     __dataemporiumDatasetName__ = 'staticdata:/dogma/typeDogma'
     60     __loader__ = typeDogmaLoader
     61 
     62 
     63 class DogmaEffects(BuiltDataLoader):
     64     __resBuiltFile__ = 'res:/staticdata/dogmaEffects.fsdbinary'
     65     __serverAutobuildBuiltFile__ = 'eve/autobuild/staticData/server/dogmaEffects.fsdbinary'
     66     __clientAutobuildBuiltFile__ = 'eve/autobuild/staticdata/client/dogmaEffects.fsdbinary'
     67     __dataemporiumDatasetName__ = 'staticdata:/dogma/dogmaEffects'
     68     __loader__ = dogmaEffectsLoader
     69 
     70 
     71 def _get_dogma_attributes():
     72     return DogmaAttributes.GetData()
     73 
     74 
     75 def _get_type_dogma():
     76     return TypeDogma.GetData()
     77 
     78 
     79 def get_type_dogma(type_id):
     80     type_id = get_safe_dogma_identity(type_id)
     81     return _get_type_dogma().get(type_id)
     82 
     83 
     84 def refresh_dogma():
     85     for name, func in globals().iteritems():
     86         if callable(func) and hasattr(func, 'clear_memoized'):
     87             logger.debug('clearing memoize cache for dogma function %s', name)
     88             func.clear_memoized()
     89 
     90 
     91 def _get_effects():
     92     return DogmaEffects.GetData()
     93 
     94 
     95 def _get_attribute_categories():
     96     return DogmaAttributeCategories.GetData()
     97 
     98 
     99 def get_all_attributes():
    100     return _get_dogma_attributes().values()
    101 
    102 
    103 def get_all_attribute_ids():
    104     return _get_dogma_attributes().keys()
    105 
    106 
    107 @Memoize
    108 def get_all_attributes_by_name():
    109     return {attribute.name:attribute for attribute in _get_dogma_attributes().itervalues()}
    110 
    111 
    112 def get_all_attributes_by_id():
    113     return _get_dogma_attributes()
    114 
    115 
    116 @Memoize
    117 def get_attribute_names_by_id():
    118     return {attribute.attributeID:attribute.name for attribute in _get_dogma_attributes().itervalues()}
    119 
    120 
    121 @Memoize
    122 def get_attribute_ids_by_name():
    123     return {attribute.name:attribute.attributeID for attribute in _get_dogma_attributes().itervalues()}
    124 
    125 
    126 @Memoize
    127 def get_attributes_sorted_by_name():
    128     return tuple(sorted(get_all_attributes(), key=lambda x: x.name))
    129 
    130 
    131 @Memoize
    132 def get_attribute_list_by_data_type():
    133     attribute_list_by_category_id = {}
    134     for attribute in _get_dogma_attributes().itervalues():
    135         if attribute.dataType not in attribute_list_by_category_id:
    136             attribute_list_by_category_id[attribute.dataType] = [attribute]
    137         else:
    138             attribute_list_by_category_id[attribute.dataType].append(attribute)
    139 
    140     return attribute_list_by_category_id
    141 
    142 
    143 @Memoize
    144 def get_attribute_list_by_charge_recharge_time_id():
    145     attribute_list_by_charge_recharge_time_id = {}
    146     for attribute in _get_dogma_attributes().itervalues():
    147         if not getattr(attribute, 'chargeRechargeTimeID', False):
    148             continue
    149         if attribute.chargeRechargeTimeID not in attribute_list_by_charge_recharge_time_id:
    150             attribute_list_by_charge_recharge_time_id[attribute.chargeRechargeTimeID] = [attribute]
    151         else:
    152             attribute_list_by_charge_recharge_time_id[attribute.chargeRechargeTimeID].append(attribute)
    153 
    154     return attribute_list_by_charge_recharge_time_id
    155 
    156 
    157 @Memoize
    158 def get_charge_group_attributes():
    159     return tuple((a for a in _get_dogma_attributes().itervalues() if charge_group_regex.match(a.name) is not None))
    160 
    161 
    162 @Memoize
    163 def get_charge_group_attribute_ids():
    164     return frozenset((a.attributeID for a in get_charge_group_attributes()))
    165 
    166 
    167 @Memoize
    168 def get_module_ship_group_attributes():
    169     return tuple((a for a in _get_dogma_attributes().itervalues() if module_ship_group_regex.match(a.name) is not None))
    170 
    171 
    172 @Memoize
    173 def get_module_ship_group_attribute_ids():
    174     return frozenset((a.attributeID for a in get_module_ship_group_attributes()))
    175 
    176 
    177 def get_attribute(attribute_id):
    178     attribute_id = get_safe_dogma_identity(attribute_id)
    179     return _get_dogma_attributes()[attribute_id]
    180 
    181 
    182 def get_attribute_with_default(attribute_id, default_value = None):
    183     if is_attribute(attribute_id):
    184         return get_attribute(attribute_id)
    185     else:
    186         return default_value
    187 
    188 
    189 def is_attribute(attribute_id):
    190     return attribute_id in _get_dogma_attributes()
    191 
    192 
    193 def get_attribute_data_type(attribute_id):
    194     return get_attribute(attribute_id).dataType
    195 
    196 
    197 def get_attribute_name(attribute_id):
    198     return get_attribute(attribute_id).name
    199 
    200 
    201 def get_attribute_default_value(attribute_id):
    202     return get_attribute(attribute_id).defaultValue
    203 
    204 
    205 def get_attribute_icon_id(attribute_id):
    206     return get_attribute(attribute_id).iconID
    207 
    208 
    209 def get_attribute_display_name(attribute_id):
    210     import localization
    211     attribute = get_attribute(attribute_id)
    212     if attribute.displayNameID:
    213         return localization.GetByMessageID(attribute.displayNameID)
    214     else:
    215         return ''
    216 
    217 
    218 def get_attribute_tooltip_title(attribute_id):
    219     import localization
    220     attribute = get_attribute(attribute_id)
    221     description_id = getattr(attribute, 'tooltipTitleID', None)
    222     if description_id:
    223         return localization.GetByMessageID(description_id)
    224     else:
    225         return ''
    226 
    227 
    228 def get_attribute_tooltip_description(attribute_id):
    229     import localization
    230     attribute = get_attribute(attribute_id)
    231     description_id = getattr(attribute, 'tooltipDescriptionID', None)
    232     if description_id:
    233         return localization.GetByMessageID(description_id)
    234     else:
    235         return ''
    236 
    237 
    238 def get_attribute_unit_id(attribute_id):
    239     return get_attribute(attribute_id).unitID
    240 
    241 
    242 @Memoize
    243 def get_type_attributes(type_id):
    244     type_dogma = get_type_dogma(type_id)
    245     if type_dogma:
    246         attributes = [ attribute for attribute in type_dogma.dogmaAttributes ]
    247     else:
    248         attributes = []
    249     attributes.extend([DogmaTypeAttribute(attributeID=attributeMass, value=evetypes.GetMass(type_id)),
    250      DogmaTypeAttribute(attributeID=attributeCapacity, value=evetypes.GetCapacity(type_id)),
    251      DogmaTypeAttribute(attributeID=attributeVolume, value=evetypes.GetVolume(type_id)),
    252      DogmaTypeAttribute(attributeID=attributeRadius, value=evetypes.GetRadius(type_id))])
    253     return attributes
    254 
    255 
    256 @Memoize
    257 def get_type_attributes_raw(type_id):
    258     type_dogma = get_type_dogma(type_id)
    259     if type_dogma:
    260         attributes = [ attribute for attribute in type_dogma.dogmaAttributes ]
    261     else:
    262         attributes = []
    263     return attributes
    264 
    265 
    266 def get_type_attribute(type_id, attribute_id, default_value = None):
    267     attribute = get_type_attributes_by_id(type_id).get(attribute_id)
    268     if attribute:
    269         return attribute.value
    270     else:
    271         return default_value
    272 
    273 
    274 def get_type_attribute_or_default(type_id, attribute_id):
    275     attribute = get_type_attribute(type_id, attribute_id)
    276     if attribute is None:
    277         return get_attribute_default_value(attribute_id)
    278     else:
    279         return attribute
    280 
    281 
    282 @Memoize
    283 def get_type_attributes_by_id(type_id):
    284     return {type_attribute.attributeID:type_attribute for type_attribute in get_type_attributes(type_id)}
    285 
    286 
    287 def get_type_attribute_values_by_id(type_id):
    288     type_attributes = get_type_attributes_by_id(type_id)
    289     return {attribute_id:attribute.value for attribute_id, attribute in type_attributes.iteritems()}
    290 
    291 
    292 def get_type_and_value_by_attribute_id(attribute_id):
    293     type_and_value_by_attribute_id = {}
    294     for type_id, attributes in iter_type_id_and_attributes():
    295         for attribute in attributes:
    296             if attribute.attributeID == attribute_id:
    297                 type_and_value_by_attribute_id[type_id] = attribute.value
    298                 break
    299 
    300     return type_and_value_by_attribute_id
    301 
    302 
    303 def has_type_attributes(type_id):
    304     attributes = get_type_attributes(type_id)
    305     return len(attributes) > 0
    306 
    307 
    308 @Memoize
    309 def get_type_id_set_by_attribute_id():
    310     type_id_set_by_attribute_id = defaultdict(set)
    311     for type_id, attributes in iter_type_id_and_attributes():
    312         for attribute in attributes:
    313             type_id_set_by_attribute_id[attribute.attributeID].add(type_id)
    314 
    315     return type_id_set_by_attribute_id
    316 
    317 
    318 def iter_type_id_and_attributes():
    319     for type_id in _get_type_dogma().iterkeys():
    320         yield (type_id, get_type_attributes(type_id))
    321 
    322 
    323 def get_all_effects():
    324     return _get_effects().values()
    325 
    326 
    327 @Memoize
    328 def get_all_effects_by_name():
    329     return {effect.effectName:effect for effect in _get_effects().itervalues()}
    330 
    331 
    332 @Memoize
    333 def get_all_effects_by_id():
    334     return {effect.effectID:effect for effect in _get_effects().itervalues()}
    335 
    336 
    337 @Memoize
    338 def get_all_effect_ids():
    339     return tuple(_get_effects().keys())
    340 
    341 
    342 def is_effect(effect_id):
    343     return effect_id in _get_effects()
    344 
    345 
    346 def get_effect(effect_id):
    347     effect_id = get_safe_dogma_identity(effect_id)
    348     return _get_effects()[effect_id]
    349 
    350 
    351 def get_effect_with_default(effect_id, default_value = None):
    352     try:
    353         return get_effect(effect_id)
    354     except KeyError:
    355         return default_value
    356 
    357 
    358 def get_effect_display_name(effect_id):
    359     import localization
    360     effect = get_effect(effect_id)
    361     if effect.displayNameID:
    362         return localization.GetByMessageID(get_effect(effect_id).displayNameID)
    363     else:
    364         return ''
    365 
    366 
    367 def get_effect_description(effect_id):
    368     import localization
    369     effect = get_effect(effect_id)
    370     if effect.descriptionID:
    371         return localization.GetByMessageID(get_effect(effect_id).descriptionID)
    372     else:
    373         return ''
    374 
    375 
    376 def get_effect_name(effect_id):
    377     return get_effect(effect_id).effectName
    378 
    379 
    380 def get_effect_category(effect_id):
    381     return get_effect(effect_id).effectCategory
    382 
    383 
    384 def is_effect_warp_safe(effect_id):
    385     return get_effect(effect_id).isWarpSafe
    386 
    387 
    388 def is_effect_offensive(effect_id):
    389     return get_effect(effect_id).isOffensive
    390 
    391 
    392 @Memoize
    393 def get_all_type_effects():
    394     return {type_id:type_dogma.dogmaEffects for type_id, type_dogma in _get_type_dogma().iteritems()}
    395 
    396 
    397 def get_type_effects(type_id):
    398     type_dogma = get_type_dogma(type_id)
    399     if type_dogma:
    400         return type_dogma.dogmaEffects
    401     return []
    402 
    403 
    404 def get_type_effect_ids(type_id):
    405     return [ effect.effectID for effect in get_type_effects(type_id) ]
    406 
    407 
    408 def get_type_effects_by_id(type_id):
    409     return {effect.effectID:effect for effect in get_type_effects(type_id)}
    410 
    411 
    412 def has_type_effects(type_id):
    413     effects = get_type_effects(type_id)
    414     return len(effects) > 0
    415 
    416 
    417 @Memoize
    418 def get_all_type_effect_effects():
    419     return tuple((type_dogma.dogmaEffects for type_dogma in _get_type_dogma().itervalues()))
    420 
    421 
    422 @Memoize
    423 def get_all_type_ids_and_effects():
    424     return tuple(((type_id, type_dogma.dogmaEffects) for type_id, type_dogma in _get_type_dogma().iteritems()))
    425 
    426 
    427 def get_attribute_categories_ids():
    428     return [ x for x in _get_attribute_categories().iterkeys() ]
    429 
    430 
    431 def get_attribute_category(category_id):
    432     category_id = get_safe_dogma_identity(category_id)
    433     return _get_attribute_categories().get(category_id, None)
    434 
    435 
    436 def get_all_attribute_categories():
    437     return {key:val for key, val in _get_attribute_categories().iteritems()}
    438 
    439 
    440 @Memoize
    441 def get_effects_indexed_by_type_id_and_effect_id():
    442     effects_dict_by_type_id = {}
    443     for type_id, effects in get_all_type_ids_and_effects():
    444         effects_by_id = {}
    445         for effect in effects:
    446             effects_by_id[effect.effectID] = effect
    447 
    448         effects_dict_by_type_id[type_id] = effects_by_id
    449 
    450     return effects_dict_by_type_id
    451 
    452 
    453 @Memoize
    454 def get_effects_indexed_by_effect_id_and_type_id():
    455     effects_dict_by_effect_id = {}
    456     for type_id, effects in get_all_type_ids_and_effects():
    457         for effect in effects:
    458             if effect.effectID not in effects_dict_by_effect_id:
    459                 effects_dict_by_effect_id[effect.effectID] = {}
    460             effects_dict_by_effect_id[effect.effectID][type_id] = effect
    461 
    462     return effects_dict_by_effect_id
    463 
    464 
    465 @Memoize
    466 def get_charge_recharge_time_attributes_by_id():
    467     return {attribute.attributeID:attribute for attribute in get_all_attributes() if attribute.chargeRechargeTimeID and attribute.dataType != attributeDataTypeTypeDamage}
    468 
    469 
    470 def get_attributes_by_charge_recharge_time_id():
    471     attributes_by_charge_recharge_time_id = defaultdict(list)
    472     for attribute in get_all_attributes():
    473         if attribute.chargeRechargeTimeID and attribute.dataType != attributeDataTypeTypeDamage:
    474             attributes_by_charge_recharge_time_id[attribute.chargeRechargeTimeID].append(attribute)
    475 
    476     return attributes_by_charge_recharge_time_id