stackingNurfedAttribute.py (4391B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\dogma\attributes\stackingNurfedAttribute.py 2 from math import exp 3 from dogma.attributes import Attribute 4 from dogma.const import dgmUnnerfedCategories, dgmOperators, dgmNurfableOperations 5 from dogma.const import dgmOperatorIDtoIndex, dgmOperatorPrecedence 6 from dogma.dogmaLogging import LogWarn, LogTraceback 7 from functools import reduce 8 MAX_NURF_SEQUENCE_LENGTH = 8 9 NurfDenominators = [ exp((i / 2.67) ** 2.0) for i in xrange(MAX_NURF_SEQUENCE_LENGTH) ] 10 import itertools 11 import operator 12 import bisect 13 14 def StackingOperator(valueDenomTuple): 15 return (valueDenomTuple[0] - 1.0) * (1.0 / valueDenomTuple[1]) + 1.0 16 17 18 class StackingNurfedAttribute(Attribute): 19 __slots__ = ['unNurfedMods', 'nurfedMods', 'nurfedModsFactor'] 20 21 def __init__(self, attribID, baseValue, dogmaItem, dogmaLM, staticAttr): 22 self.unNurfedMods = None 23 self.nurfedMods = None 24 self.nurfedModsFactor = 0 25 super(StackingNurfedAttribute, self).__init__(attribID, baseValue, dogmaItem, dogmaLM, staticAttr) 26 27 def _initIncomingUnNurfedModifiers(self): 28 self.unNurfedMods = self._makeEmptyIncomingModifiers() 29 30 def _initIncomingNurfedModifiers(self): 31 self.nurfedMods = self._makeEmptyIncomingModifiers() 32 33 def AddIncomingModifier(self, op, attribute): 34 if self._ShouldNotNurf(op, attribute): 35 if self.unNurfedMods is None: 36 self._initIncomingUnNurfedModifiers() 37 self.unNurfedMods[dgmOperatorIDtoIndex[op]].add(attribute) 38 else: 39 if self.nurfedMods is None: 40 self._initIncomingNurfedModifiers() 41 self.nurfedMods[dgmOperatorIDtoIndex[op]].add(attribute) 42 super(StackingNurfedAttribute, self).AddIncomingModifier(op, attribute) 43 44 def RemoveIncomingModifier(self, op, attribute): 45 try: 46 doNotNurf = self._ShouldNotNurf(op, attribute) 47 if doNotNurf: 48 self.unNurfedMods[dgmOperatorIDtoIndex[op]].remove(attribute) 49 if not any(self.unNurfedMods): 50 self.unNurfedMods = None 51 else: 52 self.nurfedMods[dgmOperatorIDtoIndex[op]].remove(attribute) 53 if not any(self.nurfedMods): 54 self.nurfedMods = None 55 except: 56 pass 57 58 super(StackingNurfedAttribute, self).RemoveIncomingModifier(op, attribute) 59 60 def _ShouldNotNurf(self, op, attribute): 61 if op not in dgmNurfableOperations: 62 return True 63 try: 64 if attribute.item is not None: 65 if attribute.item.invItem.categoryID in dgmUnnerfedCategories: 66 return True 67 except ReferenceError: 68 LogWarn("_ShouldNotNurf: 'Orphan' Attribute detected (its dogmaItem has gone!):", attribute) 69 LogWarn('TraceReferrers is BEING SUPPRESSED in case it overloads the node! (Sorry)') 70 LogTraceback('Orphan Attribute! (via _ShouldNotNurf)') 71 72 if hasattr(attribute, 'forceUnnurfed') and attribute.forceUnnurfed: 73 return True 74 return False 75 76 def _ApplyModifierOperationsToVal(self, val): 77 unnurfedMods = self.unNurfedMods if self.unNurfedMods else self._makeEmptyIncomingModifiers() 78 nurfedMods = self.nurfedMods if self.nurfedMods else self._makeEmptyIncomingModifiers() 79 for idx, (unnurfedMods, nurfedMods) in enumerate(zip(unnurfedMods, nurfedMods)): 80 dogmaOperator = dgmOperators[dgmOperatorPrecedence[idx]] 81 for modAttrib in unnurfedMods: 82 val = dogmaOperator(val, modAttrib.GetValue()) 83 84 if len(nurfedMods) <= 0: 85 for modAttrib in nurfedMods: 86 val = dogmaOperator(val, modAttrib.GetValue()) 87 88 else: 89 factors = sorted([ dogmaOperator(1, modAttrib.GetValue()) for modAttrib in nurfedMods ]) 90 splitPoint = bisect.bisect(factors, 1.0) 91 self.nurfedModsFactor = reduce(operator.mul, itertools.imap(StackingOperator, itertools.chain(itertools.izip(factors[:splitPoint], NurfDenominators), itertools.izip(reversed(factors[splitPoint:]), NurfDenominators)))) 92 val *= self.nurfedModsFactor 93 94 return val 95 96 def GetNurfedModsFactor(self): 97 self.Update() 98 return self.nurfedModsFactor