Refactor how remote resistance works. We now check the resistance ID directly from the effect, and fall back to the remoteResistanceID attribute. See #1139

This commit is contained in:
blitzmann
2017-05-02 22:19:58 -04:00
parent 50965244c0
commit 622efb624d
17 changed files with 79 additions and 58 deletions

View File

@@ -34,7 +34,8 @@ effects_table = Table("dgmeffects", gamedata_meta,
Column("description", String),
Column("published", Boolean),
Column("isAssistance", Boolean),
Column("isOffensive", Boolean))
Column("isOffensive", Boolean),
Column("resistanceID", Integer))
mapper(Effect, effects_table,
properties={

View File

@@ -5,14 +5,14 @@
type = "projected", "active"
def handler(fit, module, context):
def handler(fit, module, context, *args, **kwargs):
if "projected" in context:
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"trackingSpeed", module.getModifiedItemAttr("trackingSpeedBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"maxRange", module.getModifiedItemAttr("maxRangeBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"falloff", module.getModifiedItemAttr("falloffBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -5,12 +5,12 @@
type = "projected", "active"
def handler(fit, module, context):
def handler(fit, module, context, *args, **kwargs):
if "projected" not in context:
return
fit.ship.boostItemAttr("maxTargetRange", module.getModifiedItemAttr("maxTargetRangeBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)
fit.ship.boostItemAttr("scanResolution", module.getModifiedItemAttr("scanResolutionBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -5,12 +5,12 @@
type = "projected", "active"
def handler(fit, module, context):
def handler(fit, module, context, *args, **kwargs):
if "projected" not in context:
return
fit.ship.boostItemAttr("maxTargetRange", module.getModifiedItemAttr("maxTargetRangeBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)
fit.ship.boostItemAttr("scanResolution", module.getModifiedItemAttr("scanResolutionBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -5,7 +5,7 @@
type = "projected", "active"
def handler(fit, container, context):
def handler(fit, container, context, *args, **kwargs):
if "projected" in context:
fit.ship.boostItemAttr("signatureRadius", container.getModifiedItemAttr("signatureRadiusBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -5,7 +5,7 @@
type = "projected", "active"
def handler(fit, container, context):
def handler(fit, container, context, *args, **kwargs):
if "projected" in context:
fit.ship.boostItemAttr("signatureRadius", container.getModifiedItemAttr("signatureRadiusBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -5,8 +5,8 @@
type = "active", "projected"
def handler(fit, module, context):
def handler(fit, module, context, *args, **kwargs):
if "projected" not in context:
return
fit.ship.boostItemAttr("maxVelocity", module.getModifiedItemAttr("speedFactor"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -6,8 +6,8 @@
type = "active", "projected"
def handler(fit, module, context):
def handler(fit, module, context, *args, **kwargs):
if "projected" not in context:
return
fit.ship.boostItemAttr("maxVelocity", module.getModifiedItemAttr("speedFactor"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -5,7 +5,7 @@
type = "active", "projected"
def handler(fit, module, context):
def handler(fit, module, context, *args, **kwargs):
if "projected" in context:
for srcAttr, tgtAttr in (
("aoeCloudSizeBonus", "aoeCloudSize"),
@@ -15,4 +15,4 @@ def handler(fit, module, context):
):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
tgtAttr, module.getModifiedItemAttr(srcAttr),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -5,14 +5,14 @@
type = "projected", "active"
def handler(fit, module, context):
def handler(fit, module, context, *args, **kwargs):
if "projected" in context:
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"trackingSpeed", module.getModifiedItemAttr("trackingSpeedBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"maxRange", module.getModifiedItemAttr("maxRangeBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"falloff", module.getModifiedItemAttr("falloffBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -3,12 +3,12 @@
type = "projected", "active"
def handler(fit, module, context):
def handler(fit, module, context, *args, **kwargs):
if "projected" not in context:
return
fit.ship.boostItemAttr("maxTargetRange", module.getModifiedItemAttr("maxTargetRangeBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)
fit.ship.boostItemAttr("scanResolution", module.getModifiedItemAttr("scanResolutionBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -2,8 +2,8 @@
type = "active", "projected"
def handler(fit, module, context):
def handler(fit, module, context, *args, **kwargs):
if "projected" not in context:
return
fit.ship.boostItemAttr("maxVelocity", module.getModifiedItemAttr("speedFactor"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -2,7 +2,7 @@
type = "projected", "active"
def handler(fit, container, context):
def handler(fit, container, context, *args, **kwargs):
if "projected" in context:
fit.ship.boostItemAttr("signatureRadius", container.getModifiedItemAttr("signatureRadiusBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -3,7 +3,7 @@
type = "active", "projected"
def handler(fit, module, context):
def handler(fit, module, context, *args, **kwargs):
if "projected" in context:
for srcAttr, tgtAttr in (
("aoeCloudSizeBonus", "aoeCloudSize"),
@@ -13,14 +13,14 @@ def handler(fit, module, context):
):
fit.modules.filteredChargeBoost(lambda mod: mod.charge.requiresSkill("Missile Launcher Operation"),
tgtAttr, module.getModifiedItemAttr(srcAttr),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"trackingSpeed", module.getModifiedItemAttr("trackingSpeedBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"maxRange", module.getModifiedItemAttr("maxRangeBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)
fit.modules.filteredItemBoost(lambda mod: mod.item.requiresSkill("Gunnery"),
"falloff", module.getModifiedItemAttr("falloffBonus"),
stackingPenalties=True, remoteResists=True)
stackingPenalties=True, *args, **kwargs)

View File

@@ -325,7 +325,7 @@ class ModifiedAttributeDict(collections.MutableMapping):
self.__placehold(attributeName)
self.__afflict(attributeName, "+", increase, increase != 0)
def multiply(self, attributeName, multiplier, stackingPenalties=False, penaltyGroup="default", skill=None):
def multiply(self, attributeName, multiplier, stackingPenalties=False, penaltyGroup="default", skill=None, resist=True, *args, **kwargs):
"""Multiply value of given attribute by given factor"""
if multiplier is None: # See GH issue 397
return
@@ -349,28 +349,44 @@ class ModifiedAttributeDict(collections.MutableMapping):
self.__multipliers[attributeName] *= multiplier
self.__placehold(attributeName)
self.__afflict(attributeName, "%s*" % ("s" if stackingPenalties else ""), multiplier, multiplier != 1)
def boost(self, attributeName, boostFactor, skill=None, remoteResists=False, *args, **kwargs):
afflictPenal = ""
if stackingPenalties:
afflictPenal += "s"
if resist:
afflictPenal += "r"
self.__afflict(attributeName, "%s*" % (afflictPenal), multiplier, multiplier != 1)
def boost(self, attributeName, boostFactor, skill=None, *args, **kwargs):
"""Boost value by some percentage"""
if skill:
boostFactor *= self.__handleSkill(skill)
if remoteResists:
# @todo: this is such a disgusting hack. Look into sending these checks to the module class before the
# effect is applied.
mod = self.fit.getModifier()
remoteResistID = mod.getModifiedItemAttr("remoteResistanceID") or None
attrInfo = getAttributeInfo(int(remoteResistID))
resist = None
# Goddammit CCP, make up you mind where you want this information >.< See #1139
if 'effect' in kwargs:
remoteResistID = kwargs['effect'].resistanceID
# If it doesn't exist on the effect, check the modifying modules attributes. If it's there, set it on the
# effect for this session so that we don't have to look here again (won't always work when it's None, but
# will catch most)
if not remoteResistID:
mod = self.fit.getModifier()
kwargs['effect'].resistanceID = int(mod.getModifiedItemAttr("remoteResistanceID")) or None
remoteResistID = kwargs['effect'].resistanceID
attrInfo = getAttributeInfo(remoteResistID)
# Get the attribute of the resist
resist = self.fit.ship.itemModifiedAttributes[attrInfo.attributeName] or None
if remoteResistID and resist:
if resist:
boostFactor *= resist
# We just transform percentage boost into multiplication factor
self.multiply(attributeName, 1 + boostFactor / 100.0, *args, **kwargs)
self.multiply(attributeName, 1 + boostFactor / 100.0, resist=(True if resist else False), *args, **kwargs)
def force(self, attributeName, value):
"""Force value to attribute and prohibit any changes to it"""

BIN
eve.db

Binary file not shown.

View File

@@ -1141,11 +1141,13 @@ class ItemAffectedBy(wx.Panel):
if projected:
displayStr += " (projected)"
if attrModifier == "s*":
attrModifier = "*"
penalized = "(penalized)"
else:
penalized = ""
penalized = ""
if '*' in attrModifier:
if 's' in attrModifier:
penalized += "(penalized)"
if 'r' in attrModifier:
penalized += "(resisted)"
attrModifier = "*"
# this is the Module node, the attribute will be attached to this
display = "%s %s %.2f %s" % (displayStr, attrModifier, attrAmount, penalized)
@@ -1271,11 +1273,13 @@ class ItemAffectedBy(wx.Panel):
else:
attrIcon = self.imageList.Add(BitmapLoader.getBitmap("7_15", "icons"))
if attrModifier == "s*":
attrModifier = "*"
penalized = "(penalized)"
else:
penalized = ""
penalized = ""
if '*' in attrModifier:
if 's' in attrModifier:
penalized += "(penalized)"
if 'r' in attrModifier:
penalized += "(resisted)"
attrModifier = "*"
attributes.append((attrName, (displayName if displayName != "" else attrName), attrModifier,
attrAmount, penalized, attrIcon))