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