Refactor non-projected fighter commands

This commit is contained in:
DarkPhoenix
2019-04-13 01:27:26 +03:00
parent 36c19fe6e8
commit 6174bf8a0b
12 changed files with 123 additions and 95 deletions

View File

@@ -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

View File

@@ -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:

View File

@@ -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),

View File

@@ -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)

View File

@@ -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

View File

@@ -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()

View File

@@ -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()

View File

@@ -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

View File

@@ -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

View File

@@ -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))

View File

@@ -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),),)

View File

@@ -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):