diff --git a/eos/saveddata/drone.py b/eos/saveddata/drone.py index 5dbfdfb5d..7c54b7920 100644 --- a/eos/saveddata/drone.py +++ b/eos/saveddata/drone.py @@ -364,3 +364,11 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): if self.item.groupID in fitDroneGroupLimits: return True return False + + def canDealDamage(self, ignoreState=False): + if self.item is None: + return False + for effect in self.item.effects.values(): + if effect.dealsDamage and (ignoreState or self.amountActive > 0): + return True + return False diff --git a/eos/saveddata/fighter.py b/eos/saveddata/fighter.py index 6e15eb66b..1b9e18867 100644 --- a/eos/saveddata/fighter.py +++ b/eos/saveddata/fighter.py @@ -441,3 +441,15 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut): return False return True + + def canDealDamage(self, ignoreState=False, ignoreAbilityState=False): + if self.item is None: + return False + if not self.active and not ignoreState: + return False + for ability in self.abilities: + if not ability.active and not ignoreAbilityState: + continue + if ability.effect.dealsDamage: + return True + return False diff --git a/gui/builtinContextMenus/graphFitAmmoPicker.py b/gui/builtinContextMenus/graphFitAmmoPicker.py index 6730d2499..ace569237 100644 --- a/gui/builtinContextMenus/graphFitAmmoPicker.py +++ b/gui/builtinContextMenus/graphFitAmmoPicker.py @@ -40,11 +40,11 @@ class AmmoPicker(wx.Dialog): super().__init__(parent, title='Choose Different Ammo', style=wx.DEFAULT_DIALOG_STYLE) mods = self.getMods(fit) + drones = self.getDrones(fit) + fighters = self.getFighters(fit) self.SetMinSize((346, 156)) - - def getMods(self, fit): sMkt = Market.getInstance() loadableCharges = {} @@ -62,6 +62,40 @@ class AmmoPicker(wx.Dialog): for charge in mod.getValidCharges(): if sMkt.getPublicityByItem(charge): charges.add(charge) + # We're not interested in modules which contain no charges if charges: mods.setdefault(frozenset(charges), []).append(mod) return mods + + def getDrones(self, fit): + drones = set() + if fit is not None: + for drone in fit.drones: + if drone.item is None: + continue + # Drones are our "ammo", so we want to pick even those which are inactive + if drone.canDealDamage(ignoreState=True): + drones.add(drone) + continue + if {'remoteWebifierEntity', 'remoteTargetPaintEntity'}.intersection(drone.item.effects): + drones.add(drone) + continue + return drones + + def getFighters(self, fit): + fighters = set() + if fit is not None: + for fighter in fit.fighters: + if fighter.item is None: + continue + # Fighters are our "ammo" as well + if fighter.canDealDamage(ignoreState=True): + fighters.add(fighter) + continue + for ability in fighter.abilities: + if not ability.active: + continue + if ability.effect.name == 'fighterAbilityStasisWebifier': + fighters.add(fighter) + break + return fighters