Пример #1
0
 def getVolleyParameters(self, spoolOptions=None, targetResists=None, ignoreState=False):
     if self.isEmpty or (self.state < FittingModuleState.ACTIVE and not ignoreState):
         return {0: DmgTypes(0, 0, 0, 0)}
     if self.__baseVolley is None:
         self.__baseVolley = {}
         dmgGetter = self.getModifiedChargeAttr if self.charge else self.getModifiedItemAttr
         dmgMult = self.getModifiedItemAttr("damageMultiplier", 1)
         dmgDelay = self.getModifiedItemAttr("damageDelayDuration", 0) or self.getModifiedItemAttr("doomsdayWarningDuration", 0)
         dmgDuration = self.getModifiedItemAttr("doomsdayDamageDuration", 0)
         dmgSubcycle = self.getModifiedItemAttr("doomsdayDamageCycleTime", 0)
         if dmgDuration != 0 and dmgSubcycle != 0:
             subcycles = math.floor(floatUnerr(dmgDuration / dmgSubcycle))
         else:
             subcycles = 1
         for i in range(subcycles):
             self.__baseVolley[dmgDelay + dmgSubcycle * i] = DmgTypes(
                 em=(dmgGetter("emDamage", 0)) * dmgMult,
                 thermal=(dmgGetter("thermalDamage", 0)) * dmgMult,
                 kinetic=(dmgGetter("kineticDamage", 0)) * dmgMult,
                 explosive=(dmgGetter("explosiveDamage", 0)) * dmgMult)
     spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self)
     spoolBoost = calculateSpoolup(
         self.getModifiedItemAttr("damageMultiplierBonusMax", 0),
         self.getModifiedItemAttr("damageMultiplierBonusPerCycle", 0),
         self.rawCycleTime / 1000, spoolType, spoolAmount)[0]
     spoolMultiplier = 1 + spoolBoost
     adjustedVolley = {}
     for volleyTime, volleyValue in self.__baseVolley.items():
         adjustedVolley[volleyTime] = DmgTypes(
             em=volleyValue.em * spoolMultiplier * (1 - getattr(targetResists, "emAmount", 0)),
             thermal=volleyValue.thermal * spoolMultiplier * (1 - getattr(targetResists, "thermalAmount", 0)),
             kinetic=volleyValue.kinetic * spoolMultiplier * (1 - getattr(targetResists, "kineticAmount", 0)),
             explosive=volleyValue.explosive * spoolMultiplier * (1 - getattr(targetResists, "explosiveAmount", 0)))
     return adjustedVolley
def handler(fit, container, context, **kwargs):
    if "projected" in context:
        repAmountBase = container.getModifiedItemAttr("armorDamageAmount")
        cycleTime = container.getModifiedItemAttr("duration") / 1000.0
        repSpoolMax = container.getModifiedItemAttr("repairMultiplierBonusMax")
        repSpoolPerCycle = container.getModifiedItemAttr(
            "repairMultiplierBonusPerCycle")
        # TODO: fetch spoolup option
        defaultSpoolValue = 1
        spoolType, spoolAmount = resolveSpoolOptions(
            SpoolOptions(SpoolType.SCALE, defaultSpoolValue, False), container)
        rps = repAmountBase * (
            1 + calculateSpoolup(repSpoolMax, repSpoolPerCycle, cycleTime,
                                 spoolType, spoolAmount)[0]) / cycleTime
        rpsPreSpool = repAmountBase * (
            1 + calculateSpoolup(repSpoolMax, repSpoolPerCycle, cycleTime,
                                 SpoolType.SCALE, 0)[0]) / cycleTime
        rpsFullSpool = repAmountBase * (
            1 + calculateSpoolup(repSpoolMax, repSpoolPerCycle, cycleTime,
                                 SpoolType.SCALE, 1)[0]) / cycleTime
        fit.extraAttributes.increase("armorRepair", rps, **kwargs)
        fit.extraAttributes.increase("armorRepairPreSpool", rpsPreSpool,
                                     **kwargs)
        fit.extraAttributes.increase("armorRepairFullSpool", rpsFullSpool,
                                     **kwargs)
Пример #3
0
 def getVolley(self,
               spoolOptions=None,
               targetResists=None,
               ignoreState=False):
     if self.isEmpty or (self.state < FittingModuleState.ACTIVE
                         and not ignoreState):
         return DmgTypes(0, 0, 0, 0)
     if self.__baseVolley is None:
         dmgGetter = self.getModifiedChargeAttr if self.charge else self.getModifiedItemAttr
         dmgMult = self.getModifiedItemAttr("damageMultiplier", 1)
         self.__baseVolley = DmgTypes(
             em=(dmgGetter("emDamage", 0)) * dmgMult,
             thermal=(dmgGetter("thermalDamage", 0)) * dmgMult,
             kinetic=(dmgGetter("kineticDamage", 0)) * dmgMult,
             explosive=(dmgGetter("explosiveDamage", 0)) * dmgMult)
     spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self)
     spoolBoost = calculateSpoolup(
         self.getModifiedItemAttr("damageMultiplierBonusMax", 0),
         self.getModifiedItemAttr("damageMultiplierBonusPerCycle", 0),
         self.rawCycleTime / 1000, spoolType, spoolAmount)[0]
     spoolMultiplier = 1 + spoolBoost
     volley = DmgTypes(em=self.__baseVolley.em * spoolMultiplier *
                       (1 - getattr(targetResists, "emAmount", 0)),
                       thermal=self.__baseVolley.thermal * spoolMultiplier *
                       (1 - getattr(targetResists, "thermalAmount", 0)),
                       kinetic=self.__baseVolley.kinetic * spoolMultiplier *
                       (1 - getattr(targetResists, "kineticAmount", 0)),
                       explosive=self.__baseVolley.explosive *
                       spoolMultiplier *
                       (1 - getattr(targetResists, "explosiveAmount", 0)))
     return volley
Пример #4
0
 def getSpoolData(self, spoolOptions=None):
     weaponMultMax = self.getModifiedItemAttr("damageMultiplierBonusMax", 0)
     weaponMultPerCycle = self.getModifiedItemAttr("damageMultiplierBonusPerCycle", 0)
     if weaponMultMax and weaponMultPerCycle:
         spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self)
         _, spoolCycles, spoolTime = calculateSpoolup(
             weaponMultMax, weaponMultPerCycle,
             self.rawCycleTime / 1000, spoolType, spoolAmount)
         return spoolCycles, spoolTime
     rrMultMax = self.getModifiedItemAttr("repairMultiplierBonusMax", 0)
     rrMultPerCycle = self.getModifiedItemAttr("repairMultiplierBonusPerCycle", 0)
     if rrMultMax and rrMultPerCycle:
         spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self)
         _, spoolCycles, spoolTime = calculateSpoolup(
             rrMultMax, rrMultPerCycle,
             self.rawCycleTime / 1000, spoolType, spoolAmount)
         return spoolCycles, spoolTime
     return 0, 0
Пример #5
0
 def getSpoolData(self, spoolOptions=None):
     weaponMultMax = self.getModifiedItemAttr("damageMultiplierBonusMax", 0)
     weaponMultPerCycle = self.getModifiedItemAttr("damageMultiplierBonusPerCycle", 0)
     if weaponMultMax and weaponMultPerCycle:
         spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self)
         _, spoolCycles, spoolTime = calculateSpoolup(
             weaponMultMax, weaponMultPerCycle,
             self.rawCycleTime / 1000, spoolType, spoolAmount)
         return spoolCycles, spoolTime
     rrMultMax = self.getModifiedItemAttr("repairMultiplierBonusMax", 0)
     rrMultPerCycle = self.getModifiedItemAttr("repairMultiplierBonusPerCycle", 0)
     if rrMultMax and rrMultPerCycle:
         spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self)
         _, spoolCycles, spoolTime = calculateSpoolup(
             rrMultMax, rrMultPerCycle,
             self.rawCycleTime / 1000, spoolType, spoolAmount)
         return spoolCycles, spoolTime
     return 0, 0
Пример #6
0
 def getRepAmountParameters(self, spoolOptions=None, ignoreState=False):
     if self.isEmpty or (self.state < FittingModuleState.ACTIVE
                         and not ignoreState):
         return {}
     remoteModuleGroups = {
         "Remote Armor Repairer": "Armor",
         "Ancillary Remote Armor Repairer": "Armor",
         "Mutadaptive Remote Armor Repairer": "Armor",
         "Remote Hull Repairer": "Hull",
         "Remote Shield Booster": "Shield",
         "Ancillary Remote Shield Booster": "Shield",
         "Remote Capacitor Transmitter": "Capacitor"
     }
     rrType = remoteModuleGroups.get(self.item.group.name)
     if rrType is None:
         return {}
     if self.__baseRRAmount is None:
         self.__baseRRAmount = {}
         shieldAmount = 0
         armorAmount = 0
         hullAmount = 0
         capacitorAmount = 0
         if rrType == "Hull":
             hullAmount += self.getModifiedItemAttr("structureDamageAmount",
                                                    0)
         elif rrType == "Armor":
             if self.item.group.name == "Ancillary Remote Armor Repairer" and self.charge:
                 mult = self.getModifiedItemAttr(
                     "chargedArmorDamageMultiplier", 1)
             else:
                 mult = 1
             armorAmount += self.getModifiedItemAttr(
                 "armorDamageAmount", 0) * mult
         elif rrType == "Shield":
             shieldAmount += self.getModifiedItemAttr("shieldBonus", 0)
         elif rrType == "Capacitor":
             capacitorAmount += self.getModifiedItemAttr(
                 "powerTransferAmount", 0)
         rrDelay = 0 if rrType == "Shield" else self.rawCycleTime
         self.__baseRRAmount[rrDelay] = RRTypes(shield=shieldAmount,
                                                armor=armorAmount,
                                                hull=hullAmount,
                                                capacitor=capacitorAmount)
     spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self)
     spoolBoost = calculateSpoolup(
         self.getModifiedItemAttr("repairMultiplierBonusMax", 0),
         self.getModifiedItemAttr("repairMultiplierBonusPerCycle", 0),
         self.rawCycleTime / 1000, spoolType, spoolAmount)[0]
     spoolMultiplier = 1 + spoolBoost
     adjustedRRAmount = {}
     for rrTime, rrAmount in self.__baseRRAmount.items():
         if spoolMultiplier == 1:
             adjustedRRAmount[rrTime] = rrAmount
         else:
             adjustedRRAmount[rrTime] = rrAmount * spoolMultiplier
     return adjustedRRAmount
Пример #7
0
 def getVolleyParameters(self,
                         spoolOptions=None,
                         targetProfile=None,
                         ignoreState=False):
     if self.isEmpty or (self.state < FittingModuleState.ACTIVE
                         and not ignoreState):
         return {0: DmgTypes(0, 0, 0, 0)}
     if self.__baseVolley is None:
         self.__baseVolley = {}
         dmgGetter = self.getModifiedChargeAttr if self.charge else self.getModifiedItemAttr
         dmgMult = self.getModifiedItemAttr("damageMultiplier", 1)
         # Some delay attributes have non-0 default value, so we have to pick according to effects
         if {
                 'superWeaponAmarr', 'superWeaponCaldari',
                 'superWeaponGallente', 'superWeaponMinmatar',
                 'lightningWeapon'
         }.intersection(self.item.effects):
             dmgDelay = self.getModifiedItemAttr("damageDelayDuration", 0)
         elif {'doomsdayBeamDOT', 'doomsdaySlash',
               'doomsdayConeDOT'}.intersection(self.item.effects):
             dmgDelay = self.getModifiedItemAttr("doomsdayWarningDuration",
                                                 0)
         else:
             dmgDelay = 0
         dmgDuration = self.getModifiedItemAttr("doomsdayDamageDuration", 0)
         dmgSubcycle = self.getModifiedItemAttr("doomsdayDamageCycleTime",
                                                0)
         # Reaper DD can damage each target only once
         if dmgDuration != 0 and dmgSubcycle != 0 and 'doomsdaySlash' not in self.item.effects:
             subcycles = math.floor(floatUnerr(dmgDuration / dmgSubcycle))
         else:
             subcycles = 1
         for i in range(subcycles):
             self.__baseVolley[dmgDelay + dmgSubcycle * i] = DmgTypes(
                 em=(dmgGetter("emDamage", 0)) * dmgMult,
                 thermal=(dmgGetter("thermalDamage", 0)) * dmgMult,
                 kinetic=(dmgGetter("kineticDamage", 0)) * dmgMult,
                 explosive=(dmgGetter("explosiveDamage", 0)) * dmgMult)
     spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self)
     spoolBoost = calculateSpoolup(
         self.getModifiedItemAttr("damageMultiplierBonusMax", 0),
         self.getModifiedItemAttr("damageMultiplierBonusPerCycle", 0),
         self.rawCycleTime / 1000, spoolType, spoolAmount)[0]
     spoolMultiplier = 1 + spoolBoost
     adjustedVolley = {}
     for volleyTime, volleyValue in self.__baseVolley.items():
         adjustedVolley[volleyTime] = DmgTypes(
             em=volleyValue.em * spoolMultiplier *
             (1 - getattr(targetProfile, "emAmount", 0)),
             thermal=volleyValue.thermal * spoolMultiplier *
             (1 - getattr(targetProfile, "thermalAmount", 0)),
             kinetic=volleyValue.kinetic * spoolMultiplier *
             (1 - getattr(targetProfile, "kineticAmount", 0)),
             explosive=volleyValue.explosive * spoolMultiplier *
             (1 - getattr(targetProfile, "explosiveAmount", 0)))
     return adjustedVolley
Пример #8
0
    def getRemoteReps(self, spoolOptions=None, ignoreState=False):
        if self.isEmpty or (self.state < FittingModuleState.ACTIVE
                            and not ignoreState):
            return None, 0

        def getBaseRemoteReps(module):
            remoteModuleGroups = {
                "Remote Armor Repairer": "Armor",
                "Ancillary Remote Armor Repairer": "Armor",
                "Mutadaptive Remote Armor Repairer": "Armor",
                "Remote Hull Repairer": "Hull",
                "Remote Shield Booster": "Shield",
                "Ancillary Remote Shield Booster": "Shield",
                "Remote Capacitor Transmitter": "Capacitor"
            }
            rrType = remoteModuleGroups.get(module.item.group.name, None)
            if not rrType:
                return None, 0
            if rrType == "Hull":
                rrAmount = module.getModifiedItemAttr("structureDamageAmount",
                                                      0)
            elif rrType == "Armor":
                rrAmount = module.getModifiedItemAttr("armorDamageAmount", 0)
            elif rrType == "Shield":
                rrAmount = module.getModifiedItemAttr("shieldBonus", 0)
            elif rrType == "Capacitor":
                rrAmount = module.getModifiedItemAttr("powerTransferAmount", 0)
            else:
                return None, 0

            return rrType, rrAmount

        if self.__baseRemoteReps is None:
            self.__baseRemoteReps = getBaseRemoteReps(self)

        rrType, rrAmount = self.__baseRemoteReps

        if rrAmount:
            cycleParams = self.getCycleParameters()
            if cycleParams is None:
                return None, 0
            rrAmount *= 1 / (cycleParams.averageTime / 1000)
            if self.item.group.name == "Ancillary Remote Armor Repairer" and self.charge:
                rrAmount *= self.getModifiedItemAttr(
                    "chargedArmorDamageMultiplier", 1)

        if rrType and rrAmount and self.item.group.name == "Mutadaptive Remote Armor Repairer":
            spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self)
            spoolBoost = calculateSpoolup(
                self.getModifiedItemAttr("repairMultiplierBonusMax", 0),
                self.getModifiedItemAttr("repairMultiplierBonusPerCycle", 0),
                self.rawCycleTime / 1000, spoolType, spoolAmount)[0]
            rrAmount *= (1 + spoolBoost)

        return rrType, rrAmount
Пример #9
0
    def getRemoteReps(self, spoolOptions=None, ignoreState=False):
        if self.isEmpty or (self.state < FittingModuleState.ACTIVE and not ignoreState):
            return None, 0

        def getBaseRemoteReps(module):
            remoteModuleGroups = {
                "Remote Armor Repairer": "Armor",
                "Ancillary Remote Armor Repairer": "Armor",
                "Mutadaptive Remote Armor Repairer": "Armor",
                "Remote Hull Repairer": "Hull",
                "Remote Shield Booster": "Shield",
                "Ancillary Remote Shield Booster": "Shield",
                "Remote Capacitor Transmitter": "Capacitor"}
            rrType = remoteModuleGroups.get(module.item.group.name, None)
            if not rrType:
                return None, 0
            if rrType == "Hull":
                rrAmount = module.getModifiedItemAttr("structureDamageAmount", 0)
            elif rrType == "Armor":
                rrAmount = module.getModifiedItemAttr("armorDamageAmount", 0)
            elif rrType == "Shield":
                rrAmount = module.getModifiedItemAttr("shieldBonus", 0)
            elif rrType == "Capacitor":
                rrAmount = module.getModifiedItemAttr("powerTransferAmount", 0)
            else:
                return None, 0
            if rrAmount:
                cycleParams = self.getCycleParameters()
                if cycleParams is None:
                    return None, 0
                rrAmount *= 1 / (cycleParams.averageTime / 1000)
                if module.item.group.name == "Ancillary Remote Armor Repairer" and module.charge:
                    rrAmount *= module.getModifiedItemAttr("chargedArmorDamageMultiplier", 1)

            return rrType, rrAmount

        if self.__baseRemoteReps is None:
            self.__baseRemoteReps = getBaseRemoteReps(self)

        rrType, rrAmount = self.__baseRemoteReps

        if rrType and rrAmount and self.item.group.name == "Mutadaptive Remote Armor Repairer":
            spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self)
            spoolBoost = calculateSpoolup(
                self.getModifiedItemAttr("repairMultiplierBonusMax", 0),
                self.getModifiedItemAttr("repairMultiplierBonusPerCycle", 0),
                self.rawCycleTime / 1000, spoolType, spoolAmount)[0]
            rrAmount *= (1 + spoolBoost)

        return rrType, rrAmount
Пример #10
0
 def getVolleyParameters(self,
                         spoolOptions=None,
                         targetResists=None,
                         ignoreState=False):
     if self.isEmpty or (self.state < FittingModuleState.ACTIVE
                         and not ignoreState):
         return {0: DmgTypes(0, 0, 0, 0)}
     if self.__baseVolley is None:
         self.__baseVolley = {}
         dmgGetter = self.getModifiedChargeAttr if self.charge else self.getModifiedItemAttr
         dmgMult = self.getModifiedItemAttr("damageMultiplier", 1)
         dmgDelay = self.getModifiedItemAttr(
             "damageDelayDuration", 0) or self.getModifiedItemAttr(
                 "doomsdayWarningDuration", 0)
         dmgDuration = self.getModifiedItemAttr("doomsdayDamageDuration", 0)
         dmgSubcycle = self.getModifiedItemAttr("doomsdayDamageCycleTime",
                                                0)
         if dmgDuration != 0 and dmgSubcycle != 0:
             subcycles = math.floor(floatUnerr(dmgDuration / dmgSubcycle))
         else:
             subcycles = 1
         for i in range(subcycles):
             self.__baseVolley[dmgDelay + dmgSubcycle * i] = DmgTypes(
                 em=(dmgGetter("emDamage", 0)) * dmgMult,
                 thermal=(dmgGetter("thermalDamage", 0)) * dmgMult,
                 kinetic=(dmgGetter("kineticDamage", 0)) * dmgMult,
                 explosive=(dmgGetter("explosiveDamage", 0)) * dmgMult)
     spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self)
     spoolBoost = calculateSpoolup(
         self.getModifiedItemAttr("damageMultiplierBonusMax", 0),
         self.getModifiedItemAttr("damageMultiplierBonusPerCycle", 0),
         self.rawCycleTime / 1000, spoolType, spoolAmount)[0]
     spoolMultiplier = 1 + spoolBoost
     adjustedVolley = {}
     for volleyTime, volleyValue in self.__baseVolley.items():
         adjustedVolley[volleyTime] = DmgTypes(
             em=volleyValue.em * spoolMultiplier *
             (1 - getattr(targetResists, "emAmount", 0)),
             thermal=volleyValue.thermal * spoolMultiplier *
             (1 - getattr(targetResists, "thermalAmount", 0)),
             kinetic=volleyValue.kinetic * spoolMultiplier *
             (1 - getattr(targetResists, "kineticAmount", 0)),
             explosive=volleyValue.explosive * spoolMultiplier *
             (1 - getattr(targetResists, "explosiveAmount", 0)))
     return adjustedVolley
Пример #11
0
 def getVolley(self, spoolOptions=None, targetResists=None, ignoreState=False):
     if self.isEmpty or (self.state < FittingModuleState.ACTIVE and not ignoreState):
         return DmgTypes(0, 0, 0, 0)
     if self.__baseVolley is None:
         dmgGetter = self.getModifiedChargeAttr if self.charge else self.getModifiedItemAttr
         dmgMult = self.getModifiedItemAttr("damageMultiplier", 1)
         self.__baseVolley = DmgTypes(
             em=(dmgGetter("emDamage", 0)) * dmgMult,
             thermal=(dmgGetter("thermalDamage", 0)) * dmgMult,
             kinetic=(dmgGetter("kineticDamage", 0)) * dmgMult,
             explosive=(dmgGetter("explosiveDamage", 0)) * dmgMult)
     spoolType, spoolAmount = resolveSpoolOptions(spoolOptions, self)
     spoolBoost = calculateSpoolup(
         self.getModifiedItemAttr("damageMultiplierBonusMax", 0),
         self.getModifiedItemAttr("damageMultiplierBonusPerCycle", 0),
         self.rawCycleTime / 1000, spoolType, spoolAmount)[0]
     spoolMultiplier = 1 + spoolBoost
     volley = DmgTypes(
         em=self.__baseVolley.em * spoolMultiplier * (1 - getattr(targetResists, "emAmount", 0)),
         thermal=self.__baseVolley.thermal * spoolMultiplier * (1 - getattr(targetResists, "thermalAmount", 0)),
         kinetic=self.__baseVolley.kinetic * spoolMultiplier * (1 - getattr(targetResists, "kineticAmount", 0)),
         explosive=self.__baseVolley.explosive * spoolMultiplier * (1 - getattr(targetResists, "explosiveAmount", 0)))
     return volley