From 95813f20fcfbaeb37d4b3231149421eed3b7a998 Mon Sep 17 00:00:00 2001 From: DarkPhoenix Date: Tue, 18 Jan 2011 13:41:41 +0300 Subject: [PATCH] Make ammo picker context menu aware of mixed damage missiles --- gui/builtinContextMenus/moduleAmmoPicker.py | 49 ++++++++++++++++----- 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/gui/builtinContextMenus/moduleAmmoPicker.py b/gui/builtinContextMenus/moduleAmmoPicker.py index 5e1423ebc..7d36f4c47 100644 --- a/gui/builtinContextMenus/moduleAmmoPicker.py +++ b/gui/builtinContextMenus/moduleAmmoPicker.py @@ -39,23 +39,52 @@ class ModuleAmmoPicker(ContextMenu): def activate(self, context, selection, i): pass + DAMAGE_TYPES = ("em", "explosive", "kinetic", "thermal") def turretSorter(self, charge): damage = 0 range = self.module.getModifiedItemAttr("maxRange") * charge.getAttribute("weaponRangeMultiplier") falloff = self.module.getModifiedItemAttr("falloff") * (charge.getAttribute("fallofMultiplier") or 1) - for type in ("em", "explosive", "kinetic", "thermal"): + for type in self.DAMAGE_TYPES: d = charge.getAttribute("%sDamage" % type) if d > 0: damage += d - return (- range - falloff / 2, charge.name.rsplit()[-2:], damage, charge.name) + # Take optimal and half falloff as range factor + rangeFactor = range + falloff / 2 - MISSILE_ORDER = ["em", "thermal", "kinetic", "explosive"] + return (- rangeFactor, charge.name.rsplit()[-2:], damage, charge.name) + + MISSILE_ORDER = ("em", "thermal", "kinetic", "explosive", "mixed") def missileSorter(self, charge): - for i, type in enumerate(self.MISSILE_ORDER): - damage = charge.getAttribute("%sDamage" % type) - if damage > 0: - return (i, damage, charge.name) + # Get charge damage type and total damage + chargeDamageType, totalDamage = self.damageInfo(charge) + # Find its position in sort list + position = self.MISSILE_ORDER.index(chargeDamageType) + return (position, totalDamage, charge.name) + + def damageInfo(self, charge): + # Set up data storage for missile damage stuff + damageMap = {} + totalDamage = 0 + # Fill them with the data about charge + for damageType in self.DAMAGE_TYPES: + currentDamage = charge.getAttribute("{0}Damage".format(damageType)) + damageMap[damageType] = currentDamage + totalDamage += currentDamage + # Detect type of ammo + chargeDamageType = None + for damageType in damageMap: + # If all damage belongs to certain type purely, set appropriate + # ammoType + if damageMap[damageType] == totalDamage: + chargeDamageType = damageType + break + # Else consider ammo as mixed damage + if chargeDamageType is None: + chargeDamageType = "mixed" + + return chargeDamageType, totalDamage + def numericConverter(self, string): return int(string) if string.isdigit() else string @@ -130,11 +159,7 @@ class ModuleAmmoPicker(ContextMenu): type = None sub = None for charge in self.charges: - currType = None - for t in ("em", "explosive", "kinetic", "thermal"): - if charge.getAttribute("%sDamage" % t) > 0: - currType = t - break + currType = self.damageInfo(charge)[0] if currType != type or type is None: if sub is not None: