diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index cac16af50..b2e19aa42 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -1069,9 +1069,12 @@ class Fit(object): for f in self.fighters: if f.active: amount += 1 - return amount + @property + def fighterTubesTotal(self): + return self.ship.getModifiedItemAttr("fighterTubes") + @property def cargoBayUsed(self): amount = 0 diff --git a/gui/builtinContextMenus/fighterAbilities.py b/gui/builtinContextMenus/fighterAbilities.py index 7565233ef..20365aee0 100644 --- a/gui/builtinContextMenus/fighterAbilities.py +++ b/gui/builtinContextMenus/fighterAbilities.py @@ -62,7 +62,6 @@ class FighterAbility(ContextMenu): fitID = self.mainFrame.getActiveFit() fit = Fit.getInstance().getFit(fitID) - print(self.isProjected) if self.isProjected: index = fit.projectedFighters.index(self.fighter) else: diff --git a/gui/builtinStatsViews/resourcesViewFull.py b/gui/builtinStatsViews/resourcesViewFull.py index 37675a202..ac4364591 100644 --- a/gui/builtinStatsViews/resourcesViewFull.py +++ b/gui/builtinStatsViews/resourcesViewFull.py @@ -203,7 +203,7 @@ class ResourcesViewFull(StatsView): ("label%sUsedDronesActive", lambda: fit.activeDrones, 0, 0, 0), ("label%sTotalDronesActive", lambda: fit.extraAttributes["maxActiveDrones"], 0, 0, 0), ("label%sUsedFighterTubes", lambda: fit.fighterTubesUsed, 3, 0, 9), - ("label%sTotalFighterTubes", lambda: fit.ship.getModifiedItemAttr("fighterTubes"), 3, 0, 9), + ("label%sTotalFighterTubes", lambda: fit.fighterTubesTotal, 3, 0, 9), ("label%sUsedCalibrationPoints", lambda: fit.calibrationUsed, 0, 0, 0), ("label%sTotalCalibrationPoints", lambda: fit.ship.getModifiedItemAttr('upgradeCapacity'), 0, 0, 0), ("label%sUsedPg", lambda: fit.pgUsed, 4, 0, 9), diff --git a/gui/fitCommands/calc/fitAddBooster.py b/gui/fitCommands/calc/fitAddBooster.py index 800da9e96..6b2000c54 100644 --- a/gui/fitCommands/calc/fitAddBooster.py +++ b/gui/fitCommands/calc/fitAddBooster.py @@ -11,11 +11,11 @@ pyfalog = Logger(__name__) class FitAddBoosterCommand(wx.Command): - def __init__(self, fitID, newBoosterInfo, newPosition=None): + def __init__(self, fitID, boosterInfo, position=None): wx.Command.__init__(self, True, 'Add Booster') self.fitID = fitID - self.newBoosterInfo = newBoosterInfo - self.newPosition = newPosition + self.newBoosterInfo = boosterInfo + self.newPosition = position self.oldBoosterInfo = None self.oldPosition = None @@ -40,8 +40,8 @@ class FitAddBoosterCommand(wx.Command): pyfalog.warning('Failed to insert to list') cmd = FitAddBoosterCommand( fitID=self.fitID, - newBoosterInfo=self.oldBoosterInfo, - newPosition=self.oldPosition) + boosterInfo=self.oldBoosterInfo, + position=self.oldPosition) cmd.Do() return False else: @@ -51,8 +51,8 @@ class FitAddBoosterCommand(wx.Command): pyfalog.warning('Failed to append to list') cmd = FitAddBoosterCommand( fitID=self.fitID, - newBoosterInfo=self.oldBoosterInfo, - newPosition=self.oldPosition) + boosterInfo=self.oldBoosterInfo, + position=self.oldPosition) cmd.Do() return False self.newPosition = fit.boosters.index(newBooster) @@ -65,8 +65,8 @@ class FitAddBoosterCommand(wx.Command): if self.oldBoosterInfo and self.oldPosition: cmd = FitAddBoosterCommand( fitID=self.fitID, - newBoosterInfo=self.oldBoosterInfo, - newPosition=self.oldPosition) + boosterInfo=self.oldBoosterInfo, + position=self.oldPosition) return cmd.Do() from .fitRemoveBooster import FitRemoveBoosterCommand cmd = FitRemoveBoosterCommand(self.fitID, self.newPosition) diff --git a/gui/fitCommands/calc/fitAddFighter.py b/gui/fitCommands/calc/fitAddFighter.py index 9c2f456ae..055d9416f 100644 --- a/gui/fitCommands/calc/fitAddFighter.py +++ b/gui/fitCommands/calc/fitAddFighter.py @@ -2,57 +2,63 @@ import wx from logbook import Logger import eos.db -from eos.saveddata.fighter import Fighter +from eos.exception import HandledListActionError from service.fit import Fit -from service.market import Market pyfalog = Logger(__name__) class FitAddFighterCommand(wx.Command): - """" - from sFit.addFighter - """ - def __init__(self, fitID, itemID, state, abilities): - wx.Command.__init__(self, True, "Add Fighter") + + def __init__(self, fitID, fighterInfo, position=None): + wx.Command.__init__(self, True, 'Add Fighter') self.fitID = fitID - self.newItemID = itemID - self.newState = state - self.newAbilities = abilities - self.newIndex = None + self.fighterInfo = fighterInfo + self.position = position def Do(self): + pyfalog.debug('Doing addition of fighter {} to fit {}'.format(self.fighterInfo, self.fitID)) + fighter = self.fighterInfo.toFighter() + if fighter is None: + return False + fit = Fit.getInstance().getFit(self.fitID) - item = Market.getInstance().getItem(self.newItemID, eager=("attributes", "group.category")) - try: - fighter = Fighter(item) - except ValueError: - pyfalog.warning("Invalid fighter: {}", item) - return False if not fighter.fits(fit): + pyfalog.warning('Fighter does not fit') return False - used = fit.getSlotsUsed(fighter.slot) - total = fit.getNumSlots(fighter.slot) - if self.newState is not None: - fighter.active = self.newState - elif used >= total: - fighter.active = False + # If we were not asked to set specific state, figure it out based on available tubes + if self.fighterInfo.state is None: + typeUsed = fit.getSlotsUsed(fighter.slot) + typeTotal = fit.getNumSlots(fighter.slot) + + if fit.fighterTubesUsed >= fit.fighterTubesTotal or typeUsed >= typeTotal: + fighter.active = False + else: + fighter.active = True + + if self.position is None: + try: + fit.fighters.append(fighter) + except HandledListActionError: + pyfalog.warning('Failed to append to list') + eos.db.commit() + return False + self.position = fit.fighters.index(fighter) else: - fighter.active = True - - if self.newAbilities is not None: - for ability in fighter.abilities: - ability.active = self.newAbilities.get(ability.effectID, ability.active) - - fit.fighters.append(fighter) - self.newIndex = fit.fighters.index(fighter) + try: + fit.fighters.insert(self.position, fighter) + except HandledListActionError: + pyfalog.warning('Failed to insert to list') + eos.db.commit() + return False eos.db.commit() return True def Undo(self): - from .fitRemoveFighter import FitRemoveFighterCommand # Avoid circular import - cmd = FitRemoveFighterCommand(self.fitID, self.newIndex) + pyfalog.debug('Undoing addition of fighter {} to fit {}'.format(self.fighterInfo, self.fitID)) + from .fitRemoveFighter import FitRemoveFighterCommand + cmd = FitRemoveFighterCommand(fitID=self.fitID, position=self.position) cmd.Do() return True diff --git a/gui/fitCommands/calc/fitRemoveBooster.py b/gui/fitCommands/calc/fitRemoveBooster.py index b2f4fc189..230703467 100644 --- a/gui/fitCommands/calc/fitRemoveBooster.py +++ b/gui/fitCommands/calc/fitRemoveBooster.py @@ -32,6 +32,6 @@ class FitRemoveBoosterCommand(wx.Command): from .fitAddBooster import FitAddBoosterCommand # Avoid circular import cmd = FitAddBoosterCommand( fitID=self.fitID, - newBoosterInfo=self.savedBoosterInfo, - newPosition=self.position) + boosterInfo=self.savedBoosterInfo, + position=self.position) return cmd.Do() diff --git a/gui/fitCommands/calc/fitRemoveFighter.py b/gui/fitCommands/calc/fitRemoveFighter.py index 397ad7428..8eac0dc65 100644 --- a/gui/fitCommands/calc/fitRemoveFighter.py +++ b/gui/fitCommands/calc/fitRemoveFighter.py @@ -2,6 +2,7 @@ import wx from logbook import Logger import eos.db +from gui.fitCommands.helpers import FighterInfo from service.fit import Fit @@ -9,34 +10,24 @@ pyfalog = Logger(__name__) class FitRemoveFighterCommand(wx.Command): - """" - Fitting command that removes a module at a specified positions - from sFit.removeFighter - """ - def __init__(self, fitID: int, position: int): - wx.Command.__init__(self, True) + def __init__(self, fitID, position): + wx.Command.__init__(self, True, 'Remove Fighter') self.fitID = fitID self.position = position - self.change = None - self.savedItemID = None - self.savedAmount = None - self.savedStatus = None - self.savedAbilities = None + self.savedFighterInfo = None def Do(self): - fitID = self.fitID - fit = Fit.getInstance().getFit(fitID) + pyfalog.debug('Doing removal of fighter at position {} from fit {}'.format(self.position, self.fitID)) + fit = Fit.getInstance().getFit(self.fitID) fighter = fit.fighters[self.position] - self.savedItemID = fighter.itemID - self.savedAmount = fighter.amount - self.savedStatus = fighter.active - self.savedAbilities = {fa.effectID: fa.active for fa in fighter.abilities} + self.savedFighterInfo = FighterInfo.fromFighter(fighter) fit.fighters.remove(fighter) eos.db.commit() return True def Undo(self): - from gui.fitCommands.calc.fitAddFighter import FitAddFighterCommand # avoids circular import - cmd = FitAddFighterCommand(self.fitID, self.savedItemID, self.savedStatus, self.savedAbilities) + pyfalog.debug('Undoing removal of fighter at position {} from fit {}'.format(self.position, self.fitID)) + from gui.fitCommands.calc.fitAddFighter import FitAddFighterCommand + cmd = FitAddFighterCommand(fitID=self.fitID, fighterInfo=self.savedFighterInfo, position=self.position) return cmd.Do() diff --git a/gui/fitCommands/guiAddBooster.py b/gui/fitCommands/guiAddBooster.py index aa20c1c81..32adc3c48 100644 --- a/gui/fitCommands/guiAddBooster.py +++ b/gui/fitCommands/guiAddBooster.py @@ -20,7 +20,7 @@ class GuiAddBoosterCommand(wx.Command): def Do(self): if self.internal_history.Submit(FitAddBoosterCommand( fitID=self.fitID, - newBoosterInfo=BoosterInfo(itemID=self.itemID))): + boosterInfo=BoosterInfo(itemID=self.itemID))): self.sFit.recalc(self.fitID) wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) return True diff --git a/gui/fitCommands/guiAddFighter.py b/gui/fitCommands/guiAddFighter.py index 549f34eba..5ffa88f4d 100644 --- a/gui/fitCommands/guiAddFighter.py +++ b/gui/fitCommands/guiAddFighter.py @@ -1,30 +1,29 @@ import wx -from service.fit import Fit import gui.mainFrame from gui import globalEvents as GE +from gui.fitCommands.helpers import FighterInfo +from service.fit import Fit from .calc.fitAddFighter import FitAddFighterCommand class GuiAddFighterCommand(wx.Command): def __init__(self, fitID, itemID): wx.Command.__init__(self, True, "Fighter Add") - self.mainFrame = gui.mainFrame.MainFrame.getInstance() - self.sFit = Fit.getInstance() self.internal_history = wx.CommandProcessor() self.fitID = fitID self.itemID = itemID def Do(self): - if self.internal_history.Submit(FitAddFighterCommand(self.fitID, self.itemID, None, None)): - self.sFit.recalc(self.fitID) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) + if self.internal_history.Submit(FitAddFighterCommand(fitID=self.fitID, fighterInfo=FighterInfo(itemID=self.itemID))): + Fit.getInstance().recalc(self.fitID) + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitID=self.fitID)) return True return False def Undo(self): for _ in self.internal_history.Commands: self.internal_history.Undo() - self.sFit.recalc(self.fitID) - wx.PostEvent(self.mainFrame, GE.FitChanged(fitID=self.fitID)) + Fit.getInstance().recalc(self.fitID) + wx.PostEvent(gui.mainFrame.MainFrame.getInstance(), GE.FitChanged(fitID=self.fitID)) return True diff --git a/gui/fitCommands/guiImportMutatedModule.py b/gui/fitCommands/guiImportMutatedModule.py index 8f7a1a5f9..8b4c21d6c 100644 --- a/gui/fitCommands/guiImportMutatedModule.py +++ b/gui/fitCommands/guiImportMutatedModule.py @@ -22,7 +22,6 @@ class GuiImportMutatedModuleCommand(wx.Command): baseItemID=baseItem.ID, mutaplasmidID=mutaplasmid.ID, mutations=mutations) - print(self.newModInfo) def Do(self): pyfalog.debug("{} Do()".format(self)) diff --git a/gui/fitCommands/guiMetaSwap.py b/gui/fitCommands/guiMetaSwap.py index a9a0c7fb7..99a7c4c54 100644 --- a/gui/fitCommands/guiMetaSwap.py +++ b/gui/fitCommands/guiMetaSwap.py @@ -3,7 +3,7 @@ from service.fit import Fit import gui.mainFrame from gui import globalEvents as GE -from gui.fitCommands.helpers import ModuleInfo, BoosterInfo +from gui.fitCommands.helpers import ModuleInfo, FighterInfo, BoosterInfo from .calc.fitRemoveImplant import FitRemoveImplantCommand from .calc.fitAddImplant import FitAddImplantCommand from .calc.fitAddBooster import FitAddBoosterCommand @@ -46,9 +46,9 @@ class GuiMetaSwapCommand(wx.Command): self.data.append(((FitRemoveCargoCommand, fitID, x.itemID, 1, True), (FitAddCargoCommand, fitID, itemID, x.amount))) elif context == 'fighterItem': for x in selection: - state = x.active - abilities = {fa.effectID: fa.active for fa in x.abilities} - self.data.append(((FitRemoveFighterCommand, fitID, fit.fighters.index(x)), (FitAddFighterCommand, fitID, itemID, state, abilities))) + fighterInfo = FighterInfo.fromFighter(x) + fighterInfo.itemID = itemID + self.data.append(((FitRemoveFighterCommand, fitID, fit.fighters.index(x)), (FitAddFighterCommand, fitID, fighterInfo))) elif context == 'droneItem': for x in selection: self.data.append(((FitChangeDroneVariationCommand, fitID, fit.drones.index(x), itemID),),) diff --git a/gui/fitCommands/helpers.py b/gui/fitCommands/helpers.py index 748092536..46f59ccf6 100644 --- a/gui/fitCommands/helpers.py +++ b/gui/fitCommands/helpers.py @@ -5,6 +5,7 @@ from eos.const import FittingModuleState from eos.saveddata.booster import Booster from eos.saveddata.cargo import Cargo from eos.saveddata.drone import Drone +from eos.saveddata.fighter import Fighter from eos.saveddata.module import Module from service.market import Market from utils.repr import makeReprStr @@ -51,14 +52,15 @@ class ModuleInfo: baseItem = None mutaplasmid = None try: - mod = Module(item, baseItem, mutaplasmid) + mod = Module(item, baseItem=baseItem, mutaplasmid=mutaplasmid) except ValueError: pyfalog.warning('Invalid item: {}'.format(self.itemID)) return None - for attrID, mutator in mod.mutators.items(): - if attrID in self.mutations: - mutator.value = self.mutations[attrID] + if self.mutations is not None: + for attrID, mutator in mod.mutators.items(): + if attrID in self.mutations: + mutator.value = self.mutations[attrID] if self.spoolType is not None and self.spoolAmount is not None: mod.spoolType = self.spoolType @@ -116,8 +118,7 @@ class BoosterInfo: booster.active = self.state if self.sideEffects is not None: for sideEffect in booster.sideEffects: - if sideEffect.effectID in self.sideEffects: - sideEffect.active = self.sideEffects[sideEffect.effectID] + sideEffect.active = self.sideEffects.get(sideEffect.effectID, sideEffect.active) return booster class CargoInfo: @@ -126,15 +127,6 @@ class CargoInfo: self.itemID = itemID self.amount = amount - @classmethod - def fromCargo(cls, cargo): - if cargo is None: - return None - info = cls( - itemID=cargo.itemID, - amount=cargo.active) - return info - def toCargo(self): item = Market.getInstance().getItem(self.itemID) cargo = Cargo(item) @@ -177,6 +169,45 @@ class DroneInfo: return makeReprStr(self, ['itemID', 'amount', 'amountActive']) +class FighterInfo: + + def __init__(self, itemID, amount=None, state=None, abilities=None): + self.itemID = itemID + self.amount = amount + self.state = state + self.abilities = abilities + + @classmethod + def fromFighter(cls, fighter): + if fighter is None: + return None + info = cls( + itemID=fighter.itemID, + amount=fighter.amount, + state=fighter.active, + abilities={fa.effectID: fa.active for fa in fighter.abilities}) + return info + + def toFighter(self): + item = Market.getInstance().getItem(self.itemID) + try: + fighter = Fighter(item) + except ValueError: + pyfalog.warning('Invalid item: {}'.format(self.itemID)) + return None + if self.amount is not None: + fighter.amount = self.amount + if self.state is not None: + fighter.active = self.state + if self.abilities is not None: + for ability in fighter.abilities: + ability.active = self.abilities.get(ability.effectID, ability.active) + return fighter + + def __repr__(self): + return makeReprStr(self, ['itemID', 'amount', 'state', 'abilities']) + + def stateLimit(itemIdentity): item = Market.getInstance().getItem(itemIdentity) if {'moduleBonusAssaultDamageControl', 'moduleBonusIndustrialInvulnerability'}.intersection(item.effects):