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

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